[fractal/fractal-next] chore: Update gtk-rs to 0.4.4



commit 7f4f7cc8f8e12cc688a4e9ee65b6b1472fd24d00
Author: Kévin Commaille <zecakeh tedomum fr>
Date:   Wed Jan 19 23:15:39 2022 +0100

    chore: Update gtk-rs to 0.4.4
    
    Update also:
      - libdwaita to 0.1.0
      - sourceview5 to 0.4.0
      - gstreamer, gstreamer-base and gstreamer video to 0.18
      - ashpd to 0.2.0-beta-1

 Cargo.lock                                         | 469 ++++++++++-----------
 Cargo.toml                                         |  15 +-
 meson.build                                        |   4 +-
 src/application.rs                                 |   2 +-
 src/components/auth_dialog.rs                      |  13 +-
 src/components/avatar.rs                           |   4 +-
 src/components/badge.rs                            |   2 +-
 src/components/context_menu_bin.rs                 |  15 +-
 src/components/in_app_notification.rs              |   2 +-
 src/components/label_with_widgets.rs               |  20 +-
 src/components/loading_listbox_row.rs              |   7 +-
 src/components/pill.rs                             |  10 +-
 src/components/reaction_chooser.rs                 |   5 +-
 src/components/room_title.rs                       |   4 +-
 src/components/spinner_button.rs                   |  11 +-
 src/components/video_player.rs                     |   2 +-
 src/contrib/qr_code.rs                             |   9 +-
 src/contrib/qr_code_scanner/camera_paintable.rs    |  18 +-
 src/contrib/qr_code_scanner/mod.rs                 |  12 +-
 src/contrib/qr_code_scanner/qr_code_detector.rs    |   1 +
 src/contrib/qr_code_scanner/screenshot.rs          |   2 +-
 src/login.rs                                       |   3 +-
 src/main.rs                                        |   1 -
 .../account_settings/devices_page/device.rs        |  12 +-
 .../account_settings/devices_page/device_item.rs   |   6 +-
 .../account_settings/devices_page/device_list.rs   |   4 +-
 .../account_settings/devices_page/device_row.rs    |  12 +-
 src/session/account_settings/devices_page/mod.rs   |   2 +-
 src/session/account_settings/mod.rs                |   2 +-
 src/session/avatar.rs                              |  27 +-
 src/session/content/explore/mod.rs                 |   6 +-
 src/session/content/explore/public_room.rs         |   8 +-
 src/session/content/explore/public_room_list.rs    |   8 +-
 src/session/content/explore/public_room_row.rs     |   4 +-
 src/session/content/invite.rs                      |   4 +-
 src/session/content/markdown_popover.rs            |   2 +-
 src/session/content/mod.rs                         |   8 +-
 .../content/room_details/invite_subpage/invitee.rs |   4 +-
 .../room_details/invite_subpage/invitee_list.rs    |  18 +-
 .../room_details/invite_subpage/invitee_row.rs     |   5 +-
 .../content/room_details/invite_subpage/mod.rs     |  18 +-
 .../room_details/member_page/member_menu.rs        |   4 +-
 .../content/room_details/member_page/member_row.rs |   2 +-
 .../content/room_details/member_page/mod.rs        |  19 +-
 src/session/content/room_details/mod.rs            |  32 +-
 src/session/content/room_history/divider_row.rs    |   2 +-
 src/session/content/room_history/item_row.rs       |  16 +-
 .../content/room_history/message_row/file.rs       |   4 +-
 .../content/room_history/message_row/media.rs      |  71 ++--
 .../content/room_history/message_row/mod.rs        |  11 +-
 .../content/room_history/message_row/reaction.rs   |   2 +-
 .../content/room_history/message_row/text.rs       |   4 +-
 src/session/content/room_history/mod.rs            |  31 +-
 .../content/room_history/verification_info_bar.rs  |   2 +-
 .../verification/identity_verification_widget.rs   |   4 +-
 .../content/verification/session_verification.rs   |  10 +-
 src/session/event_source_dialog.rs                 |   6 +-
 src/session/media_viewer.rs                        |  37 +-
 src/session/mod.rs                                 |  27 +-
 src/session/room/event.rs                          |  20 +-
 src/session/room/event_actions.rs                  |  16 +-
 src/session/room/highlight_flags.rs                |  10 +-
 src/session/room/item.rs                           |  14 +-
 src/session/room/member.rs                         |   2 +-
 src/session/room/member_list.rs                    |   2 +-
 src/session/room/member_role.rs                    |   8 +-
 src/session/room/mod.rs                            |  41 +-
 src/session/room/power_levels.rs                   |  32 +-
 src/session/room/reaction_group.rs                 |   6 +-
 src/session/room/room_type.rs                      |   4 +-
 src/session/room/timeline.rs                       |  10 +-
 src/session/room_creation/mod.rs                   |   4 +-
 src/session/room_list.rs                           |  13 +-
 .../account_switcher/avatar_with_selection.rs      |   6 +-
 src/session/sidebar/account_switcher/item.rs       |   6 +-
 src/session/sidebar/account_switcher/mod.rs        |   4 +-
 src/session/sidebar/account_switcher/user_entry.rs |  11 +-
 src/session/sidebar/category.rs                    |   8 +-
 src/session/sidebar/category_row.rs                |   8 +-
 src/session/sidebar/category_type.rs               |   4 +-
 src/session/sidebar/entry.rs                       |   6 +-
 src/session/sidebar/entry_row.rs                   |   2 +-
 src/session/sidebar/entry_type.rs                  |   4 +-
 src/session/sidebar/item_list.rs                   |   6 +-
 src/session/sidebar/mod.rs                         |  33 +-
 src/session/sidebar/room_row.rs                    |  11 +-
 src/session/sidebar/row.rs                         |  24 +-
 src/session/sidebar/selection.rs                   |   6 +-
 src/session/sidebar/verification_row.rs            |   2 +-
 src/session/user.rs                                |  17 +-
 src/session/verification/identity_verification.rs  |  46 +-
 src/session/verification/verification_list.rs      |   2 +-
 src/utils.rs                                       |  48 +--
 src/window.rs                                      |   6 +-
 94 files changed, 702 insertions(+), 805 deletions(-)
---
diff --git a/Cargo.lock b/Cargo.lock
index b4bf1918..811ca25c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -154,10 +154,11 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 
 [[package]]
 name = "ashpd"
-version = "0.2.0-alpha-5"
-source = 
"git+https://github.com/bilelmoussaoui/ashpd?rev=66d4dc0020181a7174451150ecc711344082b5ce#66d4dc0020181a7174451150ecc711344082b5ce";
+version = "0.2.0-beta-1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "d0e317c257d4733c44475b3cefd53adb2540771ba8bd4adf37eabef3bbf8298e"
 dependencies = [
- "enumflags2",
+ "enumflags2 0.7.3",
  "futures",
  "gdk4-wayland",
  "gdk4-x11",
@@ -168,11 +169,10 @@ dependencies = [
  "serde",
  "serde_repr",
  "tracing",
- "zbus 2.0.0-beta.7",
- "zbus_macros 2.0.0-beta.7",
- "zbus_names",
- "zvariant",
- "zvariant_derive",
+ "zbus 2.0.1",
+ "zbus_macros 2.0.1",
+ "zvariant 3.1.0",
+ "zvariant_derive 3.1.0",
 ]
 
 [[package]]
@@ -365,9 +365,9 @@ dependencies = [
 
 [[package]]
 name = "bitflags"
-version = "1.2.1"
+version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitvec"
@@ -450,9 +450,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
 
 [[package]]
 name = "cairo-rs"
-version = "0.14.9"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "33b5725979db0c586d98abad2193cdb612dd40ef95cd26bd99851bf93b3cb482"
+checksum = "b869e97a87170f96762f9f178eae8c461147e722ba21dd8814105bf5716bf14a"
 dependencies = [
  "bitflags",
  "cairo-sys-rs",
@@ -463,13 +463,13 @@ dependencies = [
 
 [[package]]
 name = "cairo-sys-rs"
-version = "0.14.9"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b448b876970834fda82ba3aeaccadbd760206b75388fc5c1b02f1e343b697570"
+checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8"
 dependencies = [
  "glib-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -809,21 +809,6 @@ dependencies = [
  "generic-array",
 ]
 
-[[package]]
-name = "dlib"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794"
-dependencies = [
- "libloading",
-]
-
-[[package]]
-name = "downcast-rs"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
-
 [[package]]
 name = "easy-parallel"
 version = "3.1.0"
@@ -874,7 +859,17 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0"
 dependencies = [
- "enumflags2_derive",
+ "enumflags2_derive 0.6.4",
+ "serde",
+]
+
+[[package]]
+name = "enumflags2"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def"
+dependencies = [
+ "enumflags2_derive 0.7.3",
  "serde",
 ]
 
@@ -889,6 +884,17 @@ dependencies = [
  "syn 1.0.80",
 ]
 
+[[package]]
+name = "enumflags2_derive"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4"
+dependencies = [
+ "proc-macro2 1.0.30",
+ "quote 1.0.10",
+ "syn 1.0.80",
+]
+
 [[package]]
 name = "env_logger"
 version = "0.8.4"
@@ -1013,6 +1019,12 @@ dependencies = [
  "url",
 ]
 
+[[package]]
+name = "fragile"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "8da1b8f89c5b5a5b7e59405cfcf0bb9588e5ed19f0b57a4cd542bbba3f164a6d"
+
 [[package]]
 name = "fs2"
 version = "0.4.3"
@@ -1197,10 +1209,11 @@ checksum = "e837767888fca507f07e89c90e0b350da7bbb89170f67a4655dc9bdc4cca457b"
 
 [[package]]
 name = "gdk-pixbuf"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f"
+checksum = "172dfe1d9dfb62936bf7ad3ede2913a1b21b1e3db56990e46e00789201de9070"
 dependencies = [
+ "bitflags",
  "gdk-pixbuf-sys",
  "gio",
  "glib",
@@ -1209,22 +1222,22 @@ dependencies = [
 
 [[package]]
 name = "gdk-pixbuf-sys"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590"
+checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171"
 dependencies = [
  "gio-sys",
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gdk4"
-version = "0.3.1"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f97a162c17214d1bf981af3f683156a0b1667dd1927057c4f0a68513251ecf0f"
+checksum = "d0896d44001092e0b85b62b186c9428c6f61646ff6f957a811c81e3f1bbafb3e"
 dependencies = [
  "bitflags",
  "cairo-rs",
@@ -1238,71 +1251,68 @@ dependencies = [
 
 [[package]]
 name = "gdk4-sys"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9498f4e06969fb96a4e4234dfe1d308a3ac6b120b3c6d93e3ec5c77fe88bc6d5"
+checksum = "48a39e34abe35ee2cf54a1e29dd983accecd113ad30bdead5050418fa92f2a1b"
 dependencies = [
  "cairo-sys-rs",
  "gdk-pixbuf-sys",
  "gio-sys",
  "glib-sys",
  "gobject-sys",
- "graphene-sys",
  "libc",
  "pango-sys",
- "system-deps 5.0.0",
+ "pkg-config",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gdk4-wayland"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c930875d2f466207eae96d0110a3233c22744c16087cd0035f73da507f1a1bf5"
+checksum = "12e6dcdd75e7fa114869d89c03a00081a3f54d7b5300f7d02a82bd3a97026c40"
 dependencies = [
  "gdk4",
  "gdk4-wayland-sys",
  "gio",
  "glib",
  "libc",
- "wayland-client",
 ]
 
 [[package]]
 name = "gdk4-wayland-sys"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "89c321379df46fc983d2a6aa0b639832e22ea0f85d64222a10e985b4378565ac"
+checksum = "22cbf7fa3fc7714c72902d82229677f9291f7cceb33855c5cef868f177356c30"
 dependencies = [
  "glib-sys",
  "libc",
- "system-deps 5.0.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gdk4-x11"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "fb34d456170b6293d8d195090e3fd2fa0cb6f44d46b27bb7b729ada679cfa742"
+checksum = "f2a54a4f3405461afa18ddc2b5fbeaecc2558fcd8b132ed0c9c7c4ffa2f9ae22"
 dependencies = [
  "gdk4",
  "gdk4-x11-sys",
  "gio",
  "glib",
  "libc",
- "x11",
 ]
 
 [[package]]
 name = "gdk4-x11-sys"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6b3e38c047b930780e687774a050f65e10cc1186494b36ef0e8ec09271a19fa4"
+checksum = "1eb40aebb4f15b270df2ac2c463bf7f6d82211d9c5df1d13b84541a63a3139d7"
 dependencies = [
  "gdk4-sys",
  "glib-sys",
  "libc",
- "system-deps 5.0.0",
- "x11",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -1381,9 +1391,9 @@ dependencies = [
 
 [[package]]
 name = "gio"
-version = "0.14.8"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "711c3632b3ebd095578a9c091418d10fed492da9443f58ebc8f45efbeb215cb0"
+checksum = "5e14e0166f772d6295cfda361d227a63194497641a42da81b9e531c9f5a4d77f"
 dependencies = [
  "bitflags",
  "futures-channel",
@@ -1398,22 +1408,22 @@ dependencies = [
 
 [[package]]
 name = "gio-sys"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa"
+checksum = "04b57719ccaacf2a0d9c79f151be629f3a3ef3991658ee2af0bb66287e4ea86c"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
  "winapi",
 ]
 
 [[package]]
 name = "glib"
-version = "0.14.8"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4"
+checksum = "30a3e6b2e5ef2ecfb10c1e083074a81160b8f6408fcc08195c872e9de37a361b"
 dependencies = [
  "bitflags",
  "futures-channel",
@@ -1426,16 +1436,17 @@ dependencies = [
  "libc",
  "once_cell",
  "smallvec",
+ "thiserror",
 ]
 
 [[package]]
 name = "glib-macros"
-version = "0.14.1"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518"
+checksum = "54c0c7194ee4c597b334e3ce84d22d929405e94497828e1c54da762cbe8e3d93"
 dependencies = [
  "anyhow",
- "heck",
+ "heck 0.4.0",
  "proc-macro-crate 1.1.0",
  "proc-macro-error",
  "proc-macro2 1.0.30",
@@ -1445,12 +1456,12 @@ dependencies = [
 
 [[package]]
 name = "glib-sys"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae"
+checksum = "c668102c6e15e0a7f6b99b59f602c2e806967bb86414f617b77e19b1de5b3fac"
 dependencies = [
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -1474,20 +1485,20 @@ dependencies = [
 
 [[package]]
 name = "gobject-sys"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5"
+checksum = "6edb1f0b3e4c08e2a0a490d1082ba9e902cdff8ff07091e85c6caec60d17e2ab"
 dependencies = [
  "glib-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "graphene-rs"
-version = "0.14.8"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e3380f132530ef9eb9e0a2bac180e30390aa5e49892d20294f822a974117a563"
+checksum = "7c54f9fbbeefdb62c99f892dfca35f83991e2cb5b46a8dc2a715e58612f85570"
 dependencies = [
  "glib",
  "graphene-sys",
@@ -1496,21 +1507,21 @@ dependencies = [
 
 [[package]]
 name = "graphene-sys"
-version = "0.14.8"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a9ac7450b3aa80792513a3c029920a2ede419de13fb5169a4e51b07a5685332"
+checksum = "03f311acb023cf7af5537f35de028e03706136eead7f25a31e8fd26f5011e0b3"
 dependencies = [
  "glib-sys",
  "libc",
  "pkg-config",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gsk4"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "eff59ca46c4fc5087fd7a0c3770a71ea4b6e94f8c24c12e2c2e8538f9f6fd764"
+checksum = "cc7de6ca62027aea1d3ab5d4a6bb2db24a296f56473d8a9a4d7ee33042745ff3"
 dependencies = [
  "bitflags",
  "cairo-rs",
@@ -1524,9 +1535,9 @@ dependencies = [
 
 [[package]]
 name = "gsk4-sys"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "13aa53ce70234da02f9954339d988d5ab853d746a8f47a4ae17735ff873545b5"
+checksum = "e31d21d7ce02ba261bb24c50c4ab238a10b41a2c97c32afffae29471b7cca69b"
 dependencies = [
  "cairo-sys-rs",
  "gdk4-sys",
@@ -1535,17 +1546,18 @@ dependencies = [
  "graphene-sys",
  "libc",
  "pango-sys",
- "system-deps 5.0.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gstreamer"
-version = "0.17.4"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c6a255f142048ba2c4a4dce39106db1965abe355d23f4b5335edea43a553faa4"
+checksum = "8050dd478c50f1796595275eb8f21b2e1c2604f7797fcd2cc513c7af710bb4ac"
 dependencies = [
  "bitflags",
  "cfg-if 1.0.0",
+ "fragile",
  "futures-channel",
  "futures-core",
  "futures-util",
@@ -1556,6 +1568,7 @@ dependencies = [
  "num-integer",
  "num-rational 0.4.0",
  "once_cell",
+ "option-operations",
  "paste",
  "pretty-hex",
  "thiserror",
@@ -1563,9 +1576,9 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-base"
-version = "0.17.2"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2c0c1d8c62eb5d08fb80173609f2eea71d385393363146e4e78107facbd67715"
+checksum = "224f35f36582407caf58ded74854526beeecc23d0cf64b8d1c3e00584ed6863f"
 dependencies = [
  "bitflags",
  "cfg-if 1.0.0",
@@ -1577,37 +1590,38 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-base-sys"
-version = "0.17.0"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "28169a7b58edb93ad8ac766f0fa12dcd36a2af4257a97ee10194c7103baf3e27"
+checksum = "a083493c3c340e71fa7c66eebda016e9fafc03eb1b4804cf9b2bad61994b078e"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "gstreamer-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gstreamer-sys"
-version = "0.17.3"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a81704feeb3e8599913bdd1e738455c2991a01ff4a1780cb62200993e454cc3e"
+checksum = "e3517a65d3c2e6f8905b456eba5d53bda158d664863aef960b44f651cb7d33e2"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
 name = "gstreamer-video"
-version = "0.17.2"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e3447ee95c8e79daec0b163260cf6a3de9bc19ff47a01b533787f900074a3476"
+checksum = "410c72d885a67aeb7dbfa49c347e6c85d60f54e1cdaf6aadf8b5364892451261"
 dependencies = [
  "bitflags",
  "cfg-if 1.0.0",
+ "fragile",
  "futures-channel",
  "glib",
  "gstreamer",
@@ -1619,16 +1633,16 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-video-sys"
-version = "0.17.0"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b81608f4182bdddd5bd33aaaa341d5544eda12b067a3dab75b1b7d2de01a3ba7"
+checksum = "255c487bf6dd145e23558eaf1c92ef0946ee1999d22bdadc1e492b463609c4b6"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "gstreamer-base-sys",
  "gstreamer-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -1639,9 +1653,9 @@ checksum = "da5bf7748fd4cd0b2490df8debcc911809dbcbee4ece9531b96c29a9c729de5a"
 
 [[package]]
 name = "gtk4"
-version = "0.3.1"
+version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "58a04f421d1485ba4739e723199f5828bca05ab4e622ed39a96a342b6b1a6a3d"
+checksum = "b5020aeb559e0431930d66d85b8f16fc453fc0863466b13b7e1e1b800cf1a47b"
 dependencies = [
  "bitflags",
  "cairo-rs",
@@ -1662,13 +1676,11 @@ dependencies = [
 
 [[package]]
 name = "gtk4-macros"
-version = "0.3.1"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5068d4354af02454f44687adc613100aa98ae11e273cdcac84f89dc08be2b4a1"
+checksum = "573db42bb64973a4d5f718b73caa7204285a1a665308a23b11723d0ee56ec305"
 dependencies = [
  "anyhow",
- "heck",
- "itertools",
  "proc-macro-crate 1.1.0",
  "proc-macro-error",
  "proc-macro2 1.0.30",
@@ -1678,9 +1690,9 @@ dependencies = [
 
 [[package]]
 name = "gtk4-sys"
-version = "0.3.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e20a64c8f0ddcff8902ff04c130747f2fb7834a43530f75d03d6c71335733b49"
+checksum = "1544614a8d44f38719a2fdfd608d644d5f385beab33e5852688f48a983a2b583"
 dependencies = [
  "cairo-sys-rs",
  "gdk-pixbuf-sys",
@@ -1692,7 +1704,7 @@ dependencies = [
  "gsk4-sys",
  "libc",
  "pango-sys",
- "system-deps 5.0.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -1732,6 +1744,12 @@ dependencies = [
  "unicode-segmentation",
 ]
 
+[[package]]
+name = "heck"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+
 [[package]]
 name = "hermit-abi"
 version = "0.1.19"
@@ -2021,9 +2039,9 @@ dependencies = [
 
 [[package]]
 name = "libadwaita"
-version = "0.1.0-alpha-6"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d8d01ba5036df1c3e09be88b4b8e0906af977bb7ec28d5faec81a1de94bc775c"
+checksum = "0d4b1d54d907dfa5d6663fdf4bdbe46c34747258b85c787adbf66187ccbaac81"
 dependencies = [
  "gdk-pixbuf",
  "gdk4",
@@ -2038,19 +2056,17 @@ dependencies = [
 
 [[package]]
 name = "libadwaita-sys"
-version = "0.1.0-alpha-6"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3127d83c55f64c466925b9d1e27a964187f193e94c7c8820ad6b29d6e5f487d8"
+checksum = "f18b6ac4cadd252a89f5cba0a5a4e99836131795d6fad37b859ac79e8cb7d2c8"
 dependencies = [
- "gdk-pixbuf-sys",
  "gdk4-sys",
  "gio-sys",
  "glib-sys",
  "gobject-sys",
  "gtk4-sys",
  "libc",
- "pango-sys",
- "system-deps 4.0.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -2461,22 +2477,9 @@ dependencies = [
 
 [[package]]
 name = "nix"
-version = "0.20.2"
+version = "0.23.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f5e06129fb611568ef4e868c14b326274959aa70ff7776e9d55323531c374945"
-dependencies = [
- "bitflags",
- "cc",
- "cfg-if 1.0.0",
- "libc",
- "memoffset",
-]
-
-[[package]]
-name = "nix"
-version = "0.21.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "77d9f3521ea8e0641a153b3cddaf008dcbf26acd4ed739a2517295e0760d12c7"
+checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6"
 dependencies = [
  "bitflags",
  "cc",
@@ -2721,11 +2724,30 @@ dependencies = [
  "vcpkg",
 ]
 
+[[package]]
+name = "option-operations"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "95d6113415f41b268f1195907427519769e40ee6f28cbb053795098a2c16f447"
+dependencies = [
+ "paste",
+]
+
+[[package]]
+name = "ordered-stream"
+version = "0.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+]
+
 [[package]]
 name = "pango"
-version = "0.14.8"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "546fd59801e5ca735af82839007edd226fe7d3bb06433ec48072be4439c28581"
+checksum = "79211eff430c29cc38c69e0ab54bc78fa1568121ca9737707eee7f92a8417a94"
 dependencies = [
  "bitflags",
  "glib",
@@ -2736,14 +2758,14 @@ dependencies = [
 
 [[package]]
 name = "pango-sys"
-version = "0.14.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe"
+checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 3.2.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -2925,9 +2947,9 @@ dependencies = [
 
 [[package]]
 name = "pkg-config"
-version = "0.3.20"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb"
+checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
 
 [[package]]
 name = "png"
@@ -3598,8 +3620,8 @@ dependencies = [
  "sha2",
  "zbus 1.9.1",
  "zbus_macros 1.9.1",
- "zvariant",
- "zvariant_derive",
+ "zvariant 2.9.0",
+ "zvariant_derive 2.9.0",
 ]
 
 [[package]]
@@ -3781,15 +3803,6 @@ dependencies = [
  "parking_lot",
 ]
 
-[[package]]
-name = "slotmap"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
-dependencies = [
- "version_check",
-]
-
 [[package]]
 name = "smallvec"
 version = "1.7.0"
@@ -3808,9 +3821,9 @@ dependencies = [
 
 [[package]]
 name = "sourceview5"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7f2f8375300de56f43ef03876a8c6ede4be89ea994b76e0f07e080aeb43c6dc3"
+checksum = "a5c1e4191e6387d0542caf6761c9c101e4648cb588b965f8efec8a3943a1ad22"
 dependencies = [
  "bitflags",
  "gdk-pixbuf",
@@ -3825,9 +3838,9 @@ dependencies = [
 
 [[package]]
 name = "sourceview5-sys"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1be3031333cb0f2300aa9e57a25b82f9c9c915dce25b81ac703fbe9a4e6e8986"
+checksum = "900965718bc3384c7d3f08976b35b47810ee73810b2882d30453b33ba7622337"
 dependencies = [
  "gdk-pixbuf-sys",
  "gdk4-sys",
@@ -3837,7 +3850,7 @@ dependencies = [
  "gtk4-sys",
  "libc",
  "pango-sys",
- "system-deps 4.0.0",
+ "system-deps 6.0.0",
 ]
 
 [[package]]
@@ -3899,7 +3912,7 @@ version = "0.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
 dependencies = [
- "heck",
+ "heck 0.3.3",
  "proc-macro2 1.0.30",
  "quote 1.0.10",
  "syn 1.0.80",
@@ -3953,40 +3966,27 @@ checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6"
 dependencies = [
  "anyhow",
  "cfg-expr 0.8.1",
- "heck",
+ "heck 0.3.3",
  "itertools",
  "pkg-config",
  "strum",
  "strum_macros",
  "thiserror",
  "toml",
- "version-compare",
-]
-
-[[package]]
-name = "system-deps"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6c1889ab44c2a423ba9ba4d64cd04989b25c0280ca7ade813f05368418722a04"
-dependencies = [
- "cfg-expr 0.9.0",
- "heck",
- "pkg-config",
- "toml",
- "version-compare",
+ "version-compare 0.0.11",
 ]
 
 [[package]]
 name = "system-deps"
-version = "5.0.0"
+version = "6.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e"
+checksum = "7b1487aaddaacbc5d60a2a507ba1617c5ca66c57dd0dd07d0c5efd5b693841d4"
 dependencies = [
  "cfg-expr 0.9.0",
- "heck",
+ "heck 0.3.3",
  "pkg-config",
  "toml",
- "version-compare",
+ "version-compare 0.1.0",
 ]
 
 [[package]]
@@ -4378,6 +4378,12 @@ version = "0.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
 
+[[package]]
+name = "version-compare"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
+
 [[package]]
 name = "version_check"
 version = "0.9.3"
@@ -4484,55 +4490,6 @@ version = "0.2.78"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc"
 
-[[package]]
-name = "wayland-client"
-version = "0.28.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355"
-dependencies = [
- "bitflags",
- "downcast-rs",
- "libc",
- "nix 0.20.2",
- "scoped-tls",
- "wayland-commons",
- "wayland-scanner",
- "wayland-sys",
-]
-
-[[package]]
-name = "wayland-commons"
-version = "0.28.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda"
-dependencies = [
- "nix 0.20.2",
- "once_cell",
- "smallvec",
- "wayland-sys",
-]
-
-[[package]]
-name = "wayland-scanner"
-version = "0.28.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1"
-dependencies = [
- "proc-macro2 1.0.30",
- "quote 1.0.10",
- "xml-rs",
-]
-
-[[package]]
-name = "wayland-sys"
-version = "0.28.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8"
-dependencies = [
- "dlib",
- "pkg-config",
-]
-
 [[package]]
 name = "web-sys"
 version = "0.3.55"
@@ -4619,22 +4576,6 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
 
-[[package]]
-name = "x11"
-version = "2.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6dd0565fa8bfba8c5efe02725b14dff114c866724eff2cfd44d76cea74bcd87a"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "xml-rs"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
-
 [[package]]
 name = "xml5ever"
 version = "0.16.2"
@@ -4656,7 +4597,7 @@ dependencies = [
  "async-io",
  "byteorder",
  "derivative",
- "enumflags2",
+ "enumflags2 0.6.4",
  "fastrand",
  "futures",
  "nb-connect",
@@ -4667,14 +4608,14 @@ dependencies = [
  "serde",
  "serde_repr",
  "zbus_macros 1.9.1",
- "zvariant",
+ "zvariant 2.9.0",
 ]
 
 [[package]]
 name = "zbus"
-version = "2.0.0-beta.7"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6b2e14e7c15f04af391e91950081f5ac19c6a595a8906bc156f5d914ab57b681"
+checksum = "2ac8424f5aa1f239d2d7ecb32f9d5ffc6fcf5fb9298d2d524a7e7c8b258c3f80"
 dependencies = [
  "async-broadcast",
  "async-channel",
@@ -4686,23 +4627,23 @@ dependencies = [
  "async-trait",
  "byteorder",
  "derivative",
- "enumflags2",
+ "enumflags2 0.7.3",
  "event-listener",
  "futures-core",
  "futures-sink",
  "futures-util",
  "hex",
- "nix 0.21.2",
+ "nix 0.23.1",
  "once_cell",
+ "ordered-stream",
  "rand 0.8.4",
  "serde",
  "serde_repr",
  "sha1",
- "slotmap",
  "static_assertions",
- "zbus_macros 2.0.0-beta.7",
+ "zbus_macros 2.0.1",
  "zbus_names",
- "zvariant",
+ "zvariant 3.1.0",
 ]
 
 [[package]]
@@ -4719,9 +4660,9 @@ dependencies = [
 
 [[package]]
 name = "zbus_macros"
-version = "2.0.0-beta.7"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6d54aa0d29b3e36e112361c54bc3b750e12a45d704f86ca543e3101b338834ad"
+checksum = "3e03af45fc15e2c977161c5ffea56c43c41f425a963affd7074bf91b5bf5a8cf"
 dependencies = [
  "proc-macro-crate 1.1.0",
  "proc-macro2 1.0.30",
@@ -4732,13 +4673,13 @@ dependencies = [
 
 [[package]]
 name = "zbus_names"
-version = "1.1.0"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a45b644a32f28e5fc17974d63d3d8ee9f9f7985f9f4fb6f4e12d8be2fa3eaa31"
+checksum = "45dfcdcf87b71dad505d30cc27b1b7b88a64b6d1c435648f48f9dbc1fdc4b7e1"
 dependencies = [
  "serde",
  "static_assertions",
- "zvariant",
+ "zvariant 3.1.0",
 ]
 
 [[package]]
@@ -4769,11 +4710,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e1a9373dead84d640ccf5798f2928917e6aa1ab3f130751406bb13e0a9dd9913"
 dependencies = [
  "byteorder",
- "enumflags2",
+ "enumflags2 0.6.4",
  "libc",
  "serde",
  "static_assertions",
- "zvariant_derive",
+ "zvariant_derive 2.9.0",
+]
+
+[[package]]
+name = "zvariant"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "bbb31b009e0b0c4f2c1283c9c23129e4f76020da4b3c4dfa032abfbfe30a2c02"
+dependencies = [
+ "byteorder",
+ "enumflags2 0.7.3",
+ "libc",
+ "serde",
+ "static_assertions",
+ "zvariant_derive 3.1.0",
 ]
 
 [[package]]
@@ -4787,3 +4742,15 @@ dependencies = [
  "quote 1.0.10",
  "syn 1.0.80",
 ]
+
+[[package]]
+name = "zvariant_derive"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "5295bdc2688c7239423889191d730ad071f814dc36c48edf7cda23f38dd28b2a"
+dependencies = [
+ "proc-macro-crate 1.1.0",
+ "proc-macro2 1.0.30",
+ "quote 1.0.10",
+ "syn 1.0.80",
+]
diff --git a/Cargo.toml b/Cargo.toml
index bebe547d..ee2c5b61 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,14 +29,14 @@ futures = "0.3"
 rand = "0.8"
 indexmap = "1.6.2"
 qrcode = "0.12.0"
-ashpd = { git = "https://github.com/bilelmoussaoui/ashpd";, rev = "66d4dc0020181a7174451150ecc711344082b5ce", 
features = [
+ashpd = { version = "0.2.0-beta-1", features = [
     "feature_gtk4",
     "feature_pipewire",
     "log",
 ] }
-gst = { version = "0.17", package = "gstreamer" }
-gst_base = { version = "0.17", package = "gstreamer-base" }
-gst_video = { version = "0.17", package = "gstreamer-video" }
+gst = { version = "0.18", package = "gstreamer" }
+gst_base = { version = "0.18", package = "gstreamer-base" }
+gst_video = { version = "0.18", package = "gstreamer-video" }
 image = { version = "0.23", default-features = false, features = ["png"] }
 regex = "1.5.4"
 mime_guess = "2.0.3"
@@ -44,15 +44,16 @@ num_enum = "0.5.6"
 
 [dependencies.sourceview]
 package = "sourceview5"
-version = "0.3.0"
+version = "0.4.0"
 
 [dependencies.gtk]
 package = "gtk4"
-version = "0.3"
+version = "0.4.4"
+features = ["v4_6"]
 
 [dependencies.adw]
 package = "libadwaita"
-version = "0.1.0-alpha-6"
+version = "0.1.0"
 
 [dependencies.matrix-sdk]
 git = "https://github.com/jsparber/matrix-rust-sdk.git";
diff --git a/meson.build b/meson.build
index 851b600c..08c423fe 100644
--- a/meson.build
+++ b/meson.build
@@ -11,9 +11,9 @@ base_id = 'org.gnome.FractalNext'
 
 dependency('glib-2.0', version: '>= 2.66')
 dependency('gio-2.0', version: '>= 2.66')
-dependency('gtk4', version: '>= 4.0.0')
+dependency('gtk4', version: '>= 4.6.0')
 dependency(
-  'libadwaita-1', version: '>= 1.0.0-alpha.1',
+  'libadwaita-1', version: '>= 1.0.0',
   fallback: ['libadwaita', 'libadwaita_dep'],
   default_options: ['tests=false', 'examples=false', 'vapi=false']
 )
diff --git a/src/application.rs b/src/application.rs
index b6e81dd0..bb4e4b86 100644
--- a/src/application.rs
+++ b/src/application.rs
@@ -145,7 +145,7 @@ impl Application {
     }
 
     fn show_about_dialog(&self) {
-        let dialog = gtk::AboutDialogBuilder::new()
+        let dialog = gtk::AboutDialog::builder()
             .logo_icon_name(config::APP_ID)
             .license_type(gtk::License::Gpl30)
             .website("https://gitlab.gnome.org/GNOME/fractal/";)
diff --git a/src/components/auth_dialog.rs b/src/components/auth_dialog.rs
index e81e5f87..62395123 100644
--- a/src/components/auth_dialog.rs
+++ b/src/components/auth_dialog.rs
@@ -104,9 +104,9 @@ mod imp {
 
         fn class_init(klass: &mut Self::Class) {
             Self::bind_template(klass);
-            let response = glib::Variant::from_tuple(&[false.to_variant()]);
+            let response = (&[false]).to_variant();
             klass.add_binding_signal(
-                gdk::keys::constants::Escape,
+                gdk::Key::Escape,
                 gdk::ModifierType::empty(),
                 "response",
                 Some(&response),
@@ -121,7 +121,7 @@ mod imp {
     impl ObjectImpl for AuthDialog {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "session",
                     "Session",
                     "The session",
@@ -161,17 +161,17 @@ mod imp {
 
             self.button_cancel
                 .connect_clicked(clone!(@weak obj => move |_| {
-                    obj.emit_by_name("response", &[&false]).unwrap();
+                    obj.emit_by_name::<()>("response", &[&false]);
                 }));
 
             self.button_ok
                 .connect_clicked(clone!(@weak obj => move |_| {
-                    obj.emit_by_name("response", &[&true]).unwrap();
+                    obj.emit_by_name::<()>("response", &[&true]);
                 }));
 
             obj.connect_close_request(
                 clone!(@weak obj => @default-return gtk::Inhibit(false), move |_| {
-                    obj.emit_by_name("response", &[&false]).unwrap();
+                    obj.emit_by_name::<()>("response", &[&false]);
                     gtk::Inhibit(false)
                 }),
             );
@@ -355,6 +355,5 @@ impl AuthDialog {
 
             None
         })
-        .unwrap()
     }
 }
diff --git a/src/components/avatar.rs b/src/components/avatar.rs
index deb9a7c1..d685a3d9 100644
--- a/src/components/avatar.rs
+++ b/src/components/avatar.rs
@@ -37,14 +37,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item",
                         "Item",
                         "The Avatar item displayed by this widget",
                         AvatarItem::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_int(
+                    glib::ParamSpecInt::new(
                         "size",
                         "Size",
                         "The size of the Avatar",
diff --git a/src/components/badge.rs b/src/components/badge.rs
index 96a49af5..d8500770 100644
--- a/src/components/badge.rs
+++ b/src/components/badge.rs
@@ -25,7 +25,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_int64(
+                vec![glib::ParamSpecInt64::new(
                     "power-level",
                     "Power level",
                     "The power level this badge displays",
diff --git a/src/components/context_menu_bin.rs b/src/components/context_menu_bin.rs
index 3a47a6fb..bc39407a 100644
--- a/src/components/context_menu_bin.rs
+++ b/src/components/context_menu_bin.rs
@@ -24,7 +24,7 @@ mod imp {
                 click_gesture: Default::default(),
                 long_press_gesture: Default::default(),
                 // WORKAROUND: there is some issue with creating the popover from the template
-                popover: gtk::PopoverMenuBuilder::new()
+                popover: gtk::PopoverMenu::builder()
                     .position(gtk::PositionType::Bottom)
                     .has_arrow(false)
                     .halign(gtk::Align::Start)
@@ -46,13 +46,13 @@ mod imp {
                 widget.open_menu_at(0, 0)
             });
             klass.add_binding_action(
-                gdk::keys::constants::F10,
+                gdk::Key::F10,
                 gdk::ModifierType::SHIFT_MASK,
                 "context-menu.activate",
                 None,
             );
             klass.add_binding_action(
-                gdk::keys::constants::Menu,
+                gdk::Key::Menu,
                 gdk::ModifierType::empty(),
                 "context-menu.activate",
                 None,
@@ -73,7 +73,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "context-menu",
                     "Context Menu",
                     "The context menu",
@@ -160,12 +160,7 @@ impl ContextMenuBin {
             return;
         }
 
-        popover.set_pointing_to(&gdk::Rectangle {
-            x,
-            y,
-            width: 0,
-            height: 0,
-        });
+        popover.set_pointing_to(Some(&gdk::Rectangle::new(x, y, 0, 0)));
         popover.popup();
     }
 }
diff --git a/src/components/in_app_notification.rs b/src/components/in_app_notification.rs
index 821f4022..d0bd9a66 100644
--- a/src/components/in_app_notification.rs
+++ b/src/components/in_app_notification.rs
@@ -45,7 +45,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "error-list",
                     "Error List",
                     "The list of errors to display",
diff --git a/src/components/label_with_widgets.rs b/src/components/label_with_widgets.rs
index 07f6ce78..7a18071c 100644
--- a/src/components/label_with_widgets.rs
+++ b/src/components/label_with_widgets.rs
@@ -27,7 +27,7 @@ mod imp {
     impl Default for LabelWithWidgets {
         fn default() -> Self {
             Self {
-                label: gtk::LabelBuilder::new().wrap(true).build(),
+                label: gtk::Label::builder().wrap(true).build(),
                 widgets: Default::default(),
                 widgets_sizes: Default::default(),
                 placeholder: Default::default(),
@@ -49,14 +49,14 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "label",
                         "Label",
                         "The label",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "placeholder",
                         "Placeholder",
                         "The placeholder that is replaced with widgets",
@@ -277,8 +277,8 @@ impl LabelWithWidgets {
         let mut child_size_changed = false;
         for (i, child) in priv_.widgets.borrow().iter().enumerate() {
             let (_, natural_size) = child.preferred_size();
-            let width = natural_size.width;
-            let height = natural_size.height;
+            let width = natural_size.width();
+            let height = natural_size.height();
             if let Some((old_width, old_height)) = widgets_sizes.get(i) {
                 if old_width != &width || old_height != &height {
                     let _ = std::mem::replace(&mut widgets_sizes[i], (width, height));
@@ -310,7 +310,7 @@ impl LabelWithWidgets {
                     height * PANGO_SCALE,
                 );
 
-                let mut shape = pango::Attribute::new_shape(&logical_rect, &logical_rect);
+                let mut shape = pango::AttrShape::new(&logical_rect, &logical_rect);
                 shape.set_start_index(start_index as u32);
                 shape.set_end_index((start_index + OBJECT_REPLACEMENT_CHARACTER.len()) as u32);
                 attrs.insert(shape);
@@ -342,12 +342,12 @@ impl LabelWithWidgets {
                         let (_, extents) = run_iter.run_extents();
 
                         let (offset_x, offset_y) = priv_.label.layout_offsets();
-                        let allocation = gtk::Allocation {
-                            x: pango_pixels(extents.x) + offset_x,
-                            y: pango_pixels(extents.y) + offset_y,
+                        let allocation = gtk::Allocation::new(
+                            pango_pixels(extents.x()) + offset_x,
+                            pango_pixels(extents.y()) + offset_y,
                             width,
                             height,
-                        };
+                        );
                         widget.size_allocate(&allocation, -1);
                         i += 1;
                     } else {
diff --git a/src/components/loading_listbox_row.rs b/src/components/loading_listbox_row.rs
index 712383ba..d0e92830 100644
--- a/src/components/loading_listbox_row.rs
+++ b/src/components/loading_listbox_row.rs
@@ -42,14 +42,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "loading",
                         "Loading",
                         "Whether to show the loading spinner",
                         true,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "error",
                         "Error",
                         "The error message to show",
@@ -100,7 +100,7 @@ mod imp {
 
             self.retry_button
                 .connect_clicked(clone!(@weak obj => move |_| {
-                    obj.emit_by_name("retry", &[]).unwrap();
+                    obj.emit_by_name::<()>("retry", &[]);
                 }));
         }
     }
@@ -175,6 +175,5 @@ impl LoadingListBoxRow {
             f(&obj);
             None
         })
-        .unwrap()
     }
 }
diff --git a/src/components/pill.rs b/src/components/pill.rs
index 0e1f4f4f..694c6d8b 100644
--- a/src/components/pill.rs
+++ b/src/components/pill.rs
@@ -46,14 +46,14 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "user",
                         "User",
                         "The user displayed by this widget",
                         User::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room displayed by this widget",
@@ -120,8 +120,7 @@ impl Pill {
             let display_name_binding = user
                 .bind_property("display-name", &*priv_.display_name, "label")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             priv_.bindings.borrow_mut().push(display_name_binding);
         }
@@ -154,8 +153,7 @@ impl Pill {
             let display_name_binding = room
                 .bind_property("display-name", &*priv_.display_name, "label")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             priv_.bindings.borrow_mut().push(display_name_binding);
         }
diff --git a/src/components/reaction_chooser.rs b/src/components/reaction_chooser.rs
index 211f4a5c..7bddd94f 100644
--- a/src/components/reaction_chooser.rs
+++ b/src/components/reaction_chooser.rs
@@ -92,7 +92,7 @@ mod imp {
                     .css_classes(vec!["flat".to_string(), "circular".to_string()])
                     .build();
                 button.connect_clicked(|button| {
-                    button.activate_action("context-menu.close", None);
+                    button.activate_action("context-menu.close", None).unwrap();
                 });
                 grid.attach(&button, reaction_item.column, reaction_item.row, 1, 1);
             }
@@ -166,8 +166,7 @@ impl ReactionChooser {
                     let binding = reaction
                         .bind_property("has-user", &button, "active")
                         .flags(glib::BindingFlags::SYNC_CREATE)
-                        .build()
-                        .unwrap();
+                        .build();
                     reaction_bindings.insert(reaction_item.key.to_string(), binding);
                 }
             } else if let Some(binding) = reaction_bindings.remove(reaction_item.key) {
diff --git a/src/components/room_title.rs b/src/components/room_title.rs
index 6e1efb53..6f9dda09 100644
--- a/src/components/room_title.rs
+++ b/src/components/room_title.rs
@@ -42,14 +42,14 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "title",
                         "Title",
                         "The title of the room",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "subtitle",
                         "Subtitle",
                         "The subtitle of the room",
diff --git a/src/components/spinner_button.rs b/src/components/spinner_button.rs
index 6d94833e..40cf2fbe 100644
--- a/src/components/spinner_button.rs
+++ b/src/components/spinner_button.rs
@@ -5,7 +5,6 @@ use gtk::{glib, CompositeTemplate};
 
 mod imp {
     use super::*;
-    use glib::object::ObjectClass;
     use glib::subclass::InitializingObject;
 
     #[derive(Debug, Default, CompositeTemplate)]
@@ -39,14 +38,8 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_override(
-                        "label",
-                        &ObjectClass::from_type(gtk::Button::static_type())
-                            .unwrap()
-                            .find_property("label")
-                            .unwrap(),
-                    ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecOverride::for_class::<gtk::Button>("label"),
+                    glib::ParamSpecBoolean::new(
                         "loading",
                         "Loading",
                         "Whether to display the loading spinner or the content",
diff --git a/src/components/video_player.rs b/src/components/video_player.rs
index 5f6e38d3..5eb142e5 100644
--- a/src/components/video_player.rs
+++ b/src/components/video_player.rs
@@ -37,7 +37,7 @@ mod imp {
     impl ObjectImpl for VideoPlayer {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_boolean(
+                vec![glib::ParamSpecBoolean::new(
                     "compact",
                     "Compact",
                     "Whether this player should be displayed in a compact format",
diff --git a/src/contrib/qr_code.rs b/src/contrib/qr_code.rs
index 28a37f95..6771bea0 100644
--- a/src/contrib/qr_code.rs
+++ b/src/contrib/qr_code.rs
@@ -43,7 +43,7 @@ pub(crate) mod imp {
 
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_uint(
+                vec![glib::ParamSpecUInt::new(
                     "block-size",
                     "block-size",
                     "block-size",
@@ -94,12 +94,7 @@ pub(crate) mod imp {
                             widget
                                 .style_context()
                                 .lookup_color("background")
-                                .unwrap_or(gdk::RGBA {
-                                    red: 0.0,
-                                    blue: 0.0,
-                                    green: 0.0,
-                                    alpha: 0.0,
-                                })
+                                .unwrap_or_else(|| gdk::RGBA::new(0.0, 0.0, 0.0, 0.0))
                         };
                         let position = graphene::Rect::new(
                             (x as f32) * square_width,
diff --git a/src/contrib/qr_code_scanner/camera_paintable.rs b/src/contrib/qr_code_scanner/camera_paintable.rs
index 8397187f..766c5ddf 100644
--- a/src/contrib/qr_code_scanner/camera_paintable.rs
+++ b/src/contrib/qr_code_scanner/camera_paintable.rs
@@ -13,8 +13,8 @@ use glib::{clone, Receiver, Sender};
 use gst::prelude::*;
 use gtk::gdk::prelude::TextureExt;
 use gtk::glib;
-use gtk::prelude::*;
-use gtk::subclass::prelude::*;
+use gtk::glib::subclass::prelude::*;
+use gtk::{prelude::*, subclass::prelude::*};
 use once_cell::sync::Lazy;
 
 use std::os::unix::io::AsRawFd;
@@ -111,6 +111,7 @@ mod camera_sink {
         }
 
         impl ObjectImpl for CameraSink {}
+        impl GstObjectImpl for CameraSink {}
         impl ElementImpl for CameraSink {
             fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
                 static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
@@ -316,7 +317,7 @@ mod imp {
                 image.snapshot(snapshot.upcast_ref(), new_width, new_height);
             } else {
                 snapshot.append_color(
-                    &gdk::RGBA::black(),
+                    &gdk::RGBA::BLACK,
                     &graphene::Rect::new(0f32, 0f32, width as f32, height as f32),
                 );
             }
@@ -338,12 +339,8 @@ impl CameraPaintable {
     pub fn set_pipewire_fd<F: AsRawFd>(&self, fd: F, node_id: u32) {
         self.close_pipeline();
         let pipewire_element = gst::ElementFactory::make("pipewiresrc", None).unwrap();
-        pipewire_element
-            .set_property("fd", &fd.as_raw_fd())
-            .unwrap();
-        pipewire_element
-            .set_property("path", &node_id.to_string())
-            .unwrap();
+        pipewire_element.set_property("fd", &fd.as_raw_fd());
+        pipewire_element.set_property("path", &node_id.to_string());
         self.init_pipeline(pipewire_element);
     }
 
@@ -452,8 +449,7 @@ impl CameraPaintable {
                 }
             }
             Action::QrCodeDetected(code) => {
-                self.emit_by_name("code-detected", &[&QrVerificationDataBoxed(code)])
-                    .unwrap();
+                self.emit_by_name::<()>("code-detected", &[&QrVerificationDataBoxed(code)]);
             }
         }
         glib::Continue(true)
diff --git a/src/contrib/qr_code_scanner/mod.rs b/src/contrib/qr_code_scanner/mod.rs
index 73156237..630e8d1b 100644
--- a/src/contrib/qr_code_scanner/mod.rs
+++ b/src/contrib/qr_code_scanner/mod.rs
@@ -51,7 +51,7 @@ mod imp {
     impl ObjectImpl for QrCodeScanner {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_boolean(
+                vec![glib::ParamSpecBoolean::new(
                     "has-camera",
                     "Has Camera",
                     "Whether we have a working camera",
@@ -75,13 +75,12 @@ mod imp {
 
             let callback = glib::clone!(@weak obj => @default-return None, move |args: &[glib::Value]| {
                 let code = args.get(1).unwrap().get::<QrVerificationDataBoxed>().unwrap();
-                obj.emit_by_name("code-detected", &[&code]).unwrap();
+                obj.emit_by_name::<()>("code-detected", &[&code]);
 
                 None
             });
             self.paintable
-                .connect_local("code-detected", false, callback)
-                .unwrap();
+                .connect_local("code-detected", false, callback);
             obj.init_has_camera();
         }
 
@@ -194,10 +193,9 @@ impl QrCodeScanner {
 
             None
         })
-        .unwrap()
     }
 }
 
-#[derive(Clone, Debug, PartialEq, glib::GBoxed)]
-#[gboxed(type_name = "QrVerificationDataBoxed")]
+#[derive(Clone, Debug, PartialEq, glib::Boxed)]
+#[boxed_type(name = "QrVerificationDataBoxed")]
 struct QrVerificationDataBoxed(QrVerificationData);
diff --git a/src/contrib/qr_code_scanner/qr_code_detector.rs b/src/contrib/qr_code_scanner/qr_code_detector.rs
index a7ae8e14..cdbb48a5 100644
--- a/src/contrib/qr_code_scanner/qr_code_detector.rs
+++ b/src/contrib/qr_code_scanner/qr_code_detector.rs
@@ -33,6 +33,7 @@ mod imp {
     }
 
     impl ObjectImpl for QrCodeDetector {}
+    impl GstObjectImpl for QrCodeDetector {}
     impl ElementImpl for QrCodeDetector {
         fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
             static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
diff --git a/src/contrib/qr_code_scanner/screenshot.rs b/src/contrib/qr_code_scanner/screenshot.rs
index a0a11ff3..d40a7693 100644
--- a/src/contrib/qr_code_scanner/screenshot.rs
+++ b/src/contrib/qr_code_scanner/screenshot.rs
@@ -7,7 +7,7 @@ pub async fn capture(root: &gtk::Root) -> Option<QrVerificationData> {
     let identifier = ashpd::WindowIdentifier::from_native(root).await;
     let uri = screenshot::take(&identifier, true, true).await.ok()?;
     let screenshot = gio::File::for_uri(&uri);
-    let (data, _) = screenshot.load_contents(gio::NONE_CANCELLABLE).ok()?;
+    let (data, _) = screenshot.load_contents(gio::Cancellable::NONE).ok()?;
     let image = image::load_from_memory(&data).ok()?;
 
     QrVerificationData::from_image(image).ok()
diff --git a/src/login.rs b/src/login.rs
index f748ce22..91cc41ea 100644
--- a/src/login.rs
+++ b/src/login.rs
@@ -177,7 +177,6 @@ impl Login {
 
             None
         })
-        .unwrap()
     }
 
     fn drop_session_reference(&self) {
@@ -219,7 +218,7 @@ impl Login {
                         },
                         None => {
                             debug!("A new session was prepared");
-                            login.emit_by_name("new-session", &[&session]).unwrap();
+                            login.emit_by_name::<()>("new-session", &[&session]);
                         }
                     }
                 }),
diff --git a/src/main.rs b/src/main.rs
index cf0afab2..21775c14 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -53,7 +53,6 @@ fn main() {
     gio::resources_register(&res);
 
     IconTheme::for_display(&Display::default().unwrap())
-        .unwrap()
         .add_resource_path("/org/gnome/FractalNext/icons");
 
     let app = Application::new();
diff --git a/src/session/account_settings/devices_page/device.rs 
b/src/session/account_settings/devices_page/device.rs
index 8d585584..de44a7f0 100644
--- a/src/session/account_settings/devices_page/device.rs
+++ b/src/session/account_settings/devices_page/device.rs
@@ -36,41 +36,41 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "device-id",
                         "Device Id",
                         "The Id of this device",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name of the device",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "last-seen-ip",
                         "Last Seen Ip",
                         "The last ip the device used",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_pointer(
+                    glib::ParamSpecPointer::new(
                         "last-seen-ts",
                         "Last Seen Ts",
                         "The last time the device was used",
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_pointer(
+                    glib::ParamSpecPointer::new(
                         "verified",
                         "Verified",
                         "Whether this devices is verified",
diff --git a/src/session/account_settings/devices_page/device_item.rs 
b/src/session/account_settings/devices_page/device_item.rs
index e925d956..76c6dc2c 100644
--- a/src/session/account_settings/devices_page/device_item.rs
+++ b/src/session/account_settings/devices_page/device_item.rs
@@ -10,8 +10,8 @@ pub enum ItemType {
     LoadingSpinner,
 }
 
-#[derive(Clone, Debug, glib::GBoxed)]
-#[gboxed(type_name = "BoxedDeviceItemType")]
+#[derive(Clone, Debug, glib::Boxed)]
+#[boxed_type(name = "BoxedDeviceItemType")]
 pub struct BoxedItemType(ItemType);
 
 impl From<ItemType> for BoxedItemType {
@@ -39,7 +39,7 @@ mod imp {
     impl ObjectImpl for Item {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_boxed(
+                vec![glib::ParamSpecBoxed::new(
                     "type",
                     "Type",
                     "The type of this item",
diff --git a/src/session/account_settings/devices_page/device_list.rs 
b/src/session/account_settings/devices_page/device_list.rs
index d9dbb9a3..9124c92c 100644
--- a/src/session/account_settings/devices_page/device_list.rs
+++ b/src/session/account_settings/devices_page/device_list.rs
@@ -36,14 +36,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "current-device",
                         "Current Device",
                         "The device of this session",
diff --git a/src/session/account_settings/devices_page/device_row.rs 
b/src/session/account_settings/devices_page/device_row.rs
index 1048aee4..998aedcf 100644
--- a/src/session/account_settings/devices_page/device_row.rs
+++ b/src/session/account_settings/devices_page/device_row.rs
@@ -5,8 +5,6 @@ use super::Device;
 use crate::components::SpinnerButton;
 use crate::spawn;
 
-const G_TIME_SPAN_DAY: i64 = 86400000000;
-
 mod imp {
     use super::*;
     use glib::subclass::InitializingObject;
@@ -49,7 +47,7 @@ mod imp {
     impl ObjectImpl for DeviceRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "device",
                     "Device",
                     "The device this row is showing",
@@ -174,14 +172,14 @@ impl DeviceRow {
 // This was ported from Nautilus and simplified for our use case.
 // See: https://gitlab.gnome.org/GNOME/nautilus/-/blob/master/src/nautilus-file.c#L5488
 pub fn format_date_time_as_string(datetime: glib::DateTime) -> glib::GString {
-    let now = glib::DateTime::new_now_local().unwrap();
+    let now = glib::DateTime::now_local().unwrap();
     let format;
     let days_ago = {
         let today_midnight =
-            glib::DateTime::new_local(now.year(), now.month(), now.day_of_month(), 0, 0, 0f64)
+            glib::DateTime::from_local(now.year(), now.month(), now.day_of_month(), 0, 0, 0f64)
                 .unwrap();
 
-        let date = glib::DateTime::new_local(
+        let date = glib::DateTime::from_local(
             datetime.year(),
             datetime.month(),
             datetime.day_of_month(),
@@ -191,7 +189,7 @@ pub fn format_date_time_as_string(datetime: glib::DateTime) -> glib::GString {
         )
         .unwrap();
 
-        today_midnight.difference(&date) / G_TIME_SPAN_DAY
+        today_midnight.difference(&date).as_days()
     };
 
     let use_24 = {
diff --git a/src/session/account_settings/devices_page/mod.rs 
b/src/session/account_settings/devices_page/mod.rs
index 168fc119..393b18b0 100644
--- a/src/session/account_settings/devices_page/mod.rs
+++ b/src/session/account_settings/devices_page/mod.rs
@@ -51,7 +51,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "user",
                     "User",
                     "The user of this account",
diff --git a/src/session/account_settings/mod.rs b/src/session/account_settings/mod.rs
index a22c7d87..59ba668d 100644
--- a/src/session/account_settings/mod.rs
+++ b/src/session/account_settings/mod.rs
@@ -37,7 +37,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "user",
                     "User",
                     "The user of this account",
diff --git a/src/session/avatar.rs b/src/session/avatar.rs
index f152fe28..cf9f2c97 100644
--- a/src/session/avatar.rs
+++ b/src/session/avatar.rs
@@ -1,6 +1,6 @@
 use std::path::Path;
 
-use gtk::{gdk, gdk_pixbuf::Pixbuf, gio, glib, glib::clone, prelude::*, subclass::prelude::*};
+use gtk::{gdk, gio, glib, glib::clone, prelude::*, subclass::prelude::*};
 
 use log::{debug, error, info};
 use matrix_sdk::room::Room as MatrixRoom;
@@ -42,14 +42,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "image",
                         "Image",
                         "The user defined image if any",
                         gdk::Paintable::static_type(),
                         glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_int(
+                    glib::ParamSpecInt::new(
                         "needed-size",
                         "Needed Size",
                         "The size needed of the user defined image. If -1 no image will be loaded",
@@ -58,21 +58,21 @@ mod imp {
                         -1,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "url",
                         "Url",
                         "The url of the Avatar",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name used for this avatar",
                         None,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
@@ -151,14 +151,9 @@ impl Avatar {
     fn set_image_data(&self, data: Option<Vec<u8>>) {
         let priv_ = imp::Avatar::from_instance(self);
 
-        let image = if let Some(data) = data {
-            let stream = gio::MemoryInputStream::from_bytes(&glib::Bytes::from(&data));
-            Pixbuf::from_stream(&stream, gio::NONE_CANCELLABLE)
-                .ok()
-                .map(|pixbuf| gdk::Texture::for_pixbuf(&pixbuf).upcast())
-        } else {
-            None
-        };
+        let image = data
+            .and_then(|data| gdk::Texture::from_bytes(&glib::Bytes::from(&data)).ok())
+            .map(|texture| texture.upcast());
         priv_.image.replace(image);
         self.notify("image");
     }
@@ -298,7 +293,9 @@ where
 {
     debug!("Getting mime type of file {:?}", filename);
     let image = tokio::fs::read(filename).await?;
-    let content_type = gio::content_type_guess(None, &image).0.to_string();
+    let content_type = gio::content_type_guess(Option::<String>::None, &image)
+        .0
+        .to_string();
 
     info!("Uploading avatar from file {:?}", filename);
     // TODO: Use blurhash
diff --git a/src/session/content/explore/mod.rs b/src/session/content/explore/mod.rs
index 7508a0f3..f515c30b 100644
--- a/src/session/content/explore/mod.rs
+++ b/src/session/content/explore/mod.rs
@@ -66,14 +66,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether a compact view is used",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
@@ -110,7 +110,7 @@ mod imp {
 
         fn constructed(&self, obj: &Self::Type) {
             self.parent_constructed(obj);
-            let adj = self.scrolled_window.vadjustment().unwrap();
+            let adj = self.scrolled_window.vadjustment();
 
             adj.connect_value_changed(clone!(@weak obj => move |adj| {
                 if adj.upper() - adj.value() < adj.page_size() * 2.0 {
diff --git a/src/session/content/explore/public_room.rs b/src/session/content/explore/public_room.rs
index e49ad226..c9b177ff 100644
--- a/src/session/content/explore/public_room.rs
+++ b/src/session/content/explore/public_room.rs
@@ -33,28 +33,28 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room-list",
                         "Room List",
                         "The list of rooms in this session",
                         RoomList::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room, this is only set if the user is already a member",
                         Room::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "pending",
                         "Pending",
                         "A room is pending when the user already clicked to join a room",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "avatar",
                         "Avatar",
                         "The Avatar of this room",
diff --git a/src/session/content/explore/public_room_list.rs b/src/session/content/explore/public_room_list.rs
index 8643ec71..a98ddd11 100644
--- a/src/session/content/explore/public_room_list.rs
+++ b/src/session/content/explore/public_room_list.rs
@@ -48,28 +48,28 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "loading",
                         "Loading",
                         "Whether a response is loaded",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "empty",
                         "Empty",
                         "Whether any matching rooms are found",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "complete",
                         "Complete",
                         "Whether all search results are loaded",
diff --git a/src/session/content/explore/public_room_row.rs b/src/session/content/explore/public_room_row.rs
index 69ba1bb8..bf40f1c5 100644
--- a/src/session/content/explore/public_room_row.rs
+++ b/src/session/content/explore/public_room_row.rs
@@ -51,7 +51,7 @@ mod imp {
     impl ObjectImpl for PublicRoomRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "public-room",
                     "Public Room",
                     "The public room displayed by this row",
@@ -201,7 +201,7 @@ impl PublicRoomRow {
 
                 self.update_button(public_room);
             } else if priv_.original_child.borrow().is_none() {
-                let spinner = gtk::SpinnerBuilder::new()
+                let spinner = gtk::Spinner::builder()
                     .spinning(true)
                     .margin_top(12)
                     .margin_bottom(12)
diff --git a/src/session/content/invite.rs b/src/session/content/invite.rs
index 6b3ce0a8..fd6fe1c4 100644
--- a/src/session/content/invite.rs
+++ b/src/session/content/invite.rs
@@ -62,14 +62,14 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether a compact view is used",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room currently shown",
diff --git a/src/session/content/markdown_popover.rs b/src/session/content/markdown_popover.rs
index 0dfbfd80..e4041f3a 100644
--- a/src/session/content/markdown_popover.rs
+++ b/src/session/content/markdown_popover.rs
@@ -31,7 +31,7 @@ pub mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_boolean(
+                vec![glib::ParamSpecBoolean::new(
                     "markdown-enabled",
                     "Markdown enabled",
                     "Whether outgoing messages should be interpreted as markdown",
diff --git a/src/session/content/mod.rs b/src/session/content/mod.rs
index 1b47b395..ecc6eb55 100644
--- a/src/session/content/mod.rs
+++ b/src/session/content/mod.rs
@@ -80,28 +80,28 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether a compact view is used",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item",
                         "Item",
                         "The item currently shown",
                         glib::Object::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "error-list",
                         "Error List",
                         "A list of errors shown as in-app-notification",
diff --git a/src/session/content/room_details/invite_subpage/invitee.rs 
b/src/session/content/room_details/invite_subpage/invitee.rs
index fb9ea8a6..a3829a13 100644
--- a/src/session/content/room_details/invite_subpage/invitee.rs
+++ b/src/session/content/room_details/invite_subpage/invitee.rs
@@ -28,14 +28,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "invited",
                         "Invited",
                         "Whether this Invitee is actually invited",
                         false,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "anchor",
                         "Anchor",
                         "The anchor location in the text buffer",
diff --git a/src/session/content/room_details/invite_subpage/invitee_list.rs 
b/src/session/content/room_details/invite_subpage/invitee_list.rs
index 8cb9770e..798ec554 100644
--- a/src/session/content/room_details/invite_subpage/invitee_list.rs
+++ b/src/session/content/room_details/invite_subpage/invitee_list.rs
@@ -9,9 +9,9 @@ use crate::{session::Room, spawn, spawn_tokio};
 
 use super::Invitee;
 
-#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "ContentInviteeListState")]
+#[enum_type(name = "ContentInviteeListState")]
 pub enum InviteeListState {
     Initial = 0,
     Loading = 1,
@@ -57,28 +57,28 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room this invitee list refers to",
                         Room::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "search-term",
                         "Search Term",
                         "The search term",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "has-selected",
                         "Has Selected",
                         "Whether the user has selected some users",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "state",
                         "InviteeListState",
                         "The state of the list",
@@ -334,7 +334,7 @@ impl InviteeList {
             .invitee_list
             .borrow_mut()
             .insert(user.user_id(), user.clone());
-        self.emit_by_name("invitee-added", &[&user]).unwrap();
+        self.emit_by_name::<()>("invitee-added", &[&user]);
         self.notify("has-selected");
     }
 
@@ -353,7 +353,7 @@ impl InviteeList {
         let removed = priv_.invitee_list.borrow_mut().remove(&user_id);
         if let Some(user) = removed {
             user.set_invited(false);
-            self.emit_by_name("invitee-removed", &[&user]).unwrap();
+            self.emit_by_name::<()>("invitee-removed", &[&user]);
             self.notify("has-selected");
         }
     }
@@ -373,7 +373,6 @@ impl InviteeList {
             f(&obj, &invitee);
             None
         })
-        .unwrap()
     }
 
     pub fn connect_invitee_removed<F: Fn(&Self, &Invitee) + 'static>(
@@ -386,6 +385,5 @@ impl InviteeList {
             f(&obj, &invitee);
             None
         })
-        .unwrap()
     }
 }
diff --git a/src/session/content/room_details/invite_subpage/invitee_row.rs 
b/src/session/content/room_details/invite_subpage/invitee_row.rs
index 40c4a21e..f6c4b5c0 100644
--- a/src/session/content/room_details/invite_subpage/invitee_row.rs
+++ b/src/session/content/room_details/invite_subpage/invitee_row.rs
@@ -36,7 +36,7 @@ mod imp {
     impl ObjectImpl for InviteeRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "user",
                     "User",
                     "The user this row is showing",
@@ -105,8 +105,7 @@ impl InviteeRow {
             let binding = user
                 .bind_property("invited", &*priv_.check_button, "active")
                 .flags(glib::BindingFlags::BIDIRECTIONAL | glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             priv_.binding.replace(Some(binding));
         }
diff --git a/src/session/content/room_details/invite_subpage/mod.rs 
b/src/session/content/room_details/invite_subpage/mod.rs
index 45843fda..0f79a086 100644
--- a/src/session/content/room_details/invite_subpage/mod.rs
+++ b/src/session/content/room_details/invite_subpage/mod.rs
@@ -60,7 +60,7 @@ mod imp {
             Self::bind_template(klass);
 
             klass.add_binding(
-                gdk::keys::constants::Escape,
+                gdk::Key::Escape,
                 gdk::ModifierType::empty(),
                 |obj, _| {
                     obj.close();
@@ -79,7 +79,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "room",
                     "Room",
                     "The room users will be invited to",
@@ -120,7 +120,7 @@ mod imp {
                 }));
 
             self.text_buffer.connect_delete_range(clone!(@weak obj => move |_, start, end| {
-                let mut current = start.clone();
+                let mut current = start.to_owned();
                 loop {
                     if let Some(anchor) = current.child_anchor() {
                         let user = 
anchor.widgets()[0].downcast_ref::<Pill>().unwrap().user().unwrap().downcast::<Invitee>().unwrap();
@@ -154,7 +154,7 @@ mod imp {
 
                     if changed {
                         text_buffer.place_cursor(location);
-                        text_buffer.stop_signal_emission("insert-text");
+                        text_buffer.stop_signal_emission_by_name("insert-text");
                         text_buffer.insert(location, text);
                     }
                 }),
@@ -227,20 +227,18 @@ impl InviteSubpage {
                 .text_buffer
                 .bind_property("text", &user_list, "search-term")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             user_list
                 .bind_property("has-selected", &*priv_.invite_button, "sensitive")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             priv_
                 .list_view
                 .set_model(Some(&gtk::NoSelection::new(Some(&user_list))));
         } else {
-            priv_.list_view.set_model(gtk::NONE_SELECTION_MODEL);
+            priv_.list_view.set_model(gtk::SelectionModel::NONE);
         }
 
         priv_.room.replace(room);
@@ -285,7 +283,7 @@ impl InviteSubpage {
         if let Some(anchor) = user.take_anchor() {
             if !anchor.is_deleted() {
                 let mut start_iter = priv_.text_buffer.iter_at_child_anchor(&anchor);
-                let mut end_iter = start_iter.clone();
+                let mut end_iter = start_iter;
                 end_iter.forward_char();
                 priv_.text_buffer.delete(&mut start_iter, &mut end_iter);
             }
diff --git a/src/session/content/room_details/member_page/member_menu.rs 
b/src/session/content/room_details/member_page/member_menu.rs
index 8a629b12..c095409b 100644
--- a/src/session/content/room_details/member_page/member_menu.rs
+++ b/src/session/content/room_details/member_page/member_menu.rs
@@ -26,14 +26,14 @@ mod imp {
     impl ObjectImpl for MemberMenu {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "member",
                     "Member",
                     "The member this row is showing",
                     Member::static_type(),
                     glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                 ),
-                glib::ParamSpec::new_flags(
+                glib::ParamSpecFlags::new(
                         "allowed-actions",
                         "Allowed Actions",
                         "The actions the currently logged-in user is allowed to perform on the selected 
member.",
diff --git a/src/session/content/room_details/member_page/member_row.rs 
b/src/session/content/room_details/member_page/member_row.rs
index f3509f83..37294525 100644
--- a/src/session/content/room_details/member_page/member_row.rs
+++ b/src/session/content/room_details/member_page/member_row.rs
@@ -36,7 +36,7 @@ mod imp {
     impl ObjectImpl for MemberRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "member",
                     "Member",
                     "The member this row is showing",
diff --git a/src/session/content/room_details/member_page/mod.rs 
b/src/session/content/room_details/member_page/mod.rs
index bbbe11b1..d61562e6 100644
--- a/src/session/content/room_details/member_page/mod.rs
+++ b/src/session/content/room_details/member_page/mod.rs
@@ -1,7 +1,7 @@
 use adw::prelude::*;
 use adw::subclass::prelude::*;
 use gettextrs::ngettext;
-use gtk::glib::{self, clone};
+use gtk::glib::{self, clone, closure};
 use gtk::subclass::prelude::*;
 use gtk::CompositeTemplate;
 
@@ -69,14 +69,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room backing all details of the member page",
                         Room::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "member-menu",
                         "Member Menu",
                         "The object holding information needed for the menu of each MemberRow",
@@ -152,7 +152,7 @@ impl MemberPage {
             &gtk::NumericSorter::builder()
                 .expression(&gtk::PropertyExpression::new(
                     Member::static_type(),
-                    gtk::NONE_EXPRESSION,
+                    gtk::Expression::NONE,
                     "power-level",
                 ))
                 .sort_order(gtk::SortType::Descending)
@@ -161,7 +161,7 @@ impl MemberPage {
         sorter.append(&gtk::StringSorter::new(Some(
             &gtk::PropertyExpression::new(
                 Member::static_type(),
-                gtk::NONE_EXPRESSION,
+                gtk::Expression::NONE,
                 "display-name",
             ),
         )));
@@ -177,14 +177,9 @@ impl MemberPage {
             )
         }
 
-        let member_expr = gtk::ClosureExpression::new(
-            |value| {
-                value[0]
-                    .get::<Member>()
-                    .map(search_string)
-                    .unwrap_or_default()
-            },
+        let member_expr = gtk::ClosureExpression::new::<String, &[gtk::Expression], _>(
             &[],
+            closure!(|member: Option<Member>| { member.map(search_string).unwrap_or_default() }),
         );
         let filter = gtk::StringFilter::builder()
             .match_mode(gtk::StringFilterMatchMode::Substring)
diff --git a/src/session/content/room_details/mod.rs b/src/session/content/room_details/mod.rs
index b35191bf..038d17a2 100644
--- a/src/session/content/room_details/mod.rs
+++ b/src/session/content/room_details/mod.rs
@@ -6,7 +6,7 @@ use adw::subclass::prelude::*;
 use gettextrs::gettext;
 use gtk::gdk;
 use gtk::{
-    glib::{self, clone},
+    glib::{self, clone, closure},
     subclass::prelude::*,
     CompositeTemplate,
 };
@@ -17,7 +17,7 @@ pub use self::member_page::MemberPage;
 use crate::components::CustomEntry;
 use crate::session::room::RoomAction;
 use crate::session::{self, Room};
-use crate::utils::{and_expr, or_expr, prop_expr};
+use crate::utils::{and_expr, or_expr};
 
 mod imp {
     use super::*;
@@ -68,7 +68,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "room",
                     "Room",
                     "The room backing all details of the preference window",
@@ -150,25 +150,19 @@ impl RoomDetails {
         // Hide avatar controls when the user is not eligible to perform the actions.
         let room = self.room();
 
-        let avatar = prop_expr(room, "avatar");
-        let avatar_image =
-            gtk::PropertyExpression::new(session::Avatar::static_type(), Some(&avatar), "image")
-                .upcast();
-        let room_avatar_exists = gtk::ClosureExpression::new(
-            move |args| {
-                let image: Option<gdk::Paintable> = args[1].get().unwrap();
-                image.is_some()
-            },
-            &[avatar_image],
-        )
-        .upcast();
+        let room_avatar_exists = room
+            .property_expression("avatar")
+            .chain_property::<session::Avatar>("image")
+            .chain_closure::<bool>(closure!(
+                |_: Option<glib::Object>, image: Option<gdk::Paintable>| { image.is_some() }
+            ));
 
         let room_avatar_changeable =
             room.new_allowed_expr(RoomAction::StateEvent(EventType::RoomAvatar));
-        let room_avatar_removable = and_expr(room_avatar_changeable.clone(), room_avatar_exists);
+        let room_avatar_removable = and_expr(&room_avatar_changeable, &room_avatar_exists);
 
-        room_avatar_removable.bind(&avatar_remove_button.get(), "visible", gtk::NONE_WIDGET);
-        room_avatar_changeable.bind(&avatar_edit_button.get(), "visible", gtk::NONE_WIDGET);
+        room_avatar_removable.bind(&avatar_remove_button.get(), "visible", gtk::Widget::NONE);
+        room_avatar_changeable.bind(&avatar_edit_button.get(), "visible", gtk::Widget::NONE);
     }
 
     fn init_edit_toggle(&self) {
@@ -214,7 +208,7 @@ impl RoomDetails {
             room.new_allowed_expr(RoomAction::StateEvent(EventType::RoomTopic));
 
         let edit_toggle_visible = or_expr(room_name_changeable, room_topic_changeable);
-        edit_toggle_visible.bind(&edit_toggle.get(), "visible", gtk::NONE_WIDGET);
+        edit_toggle_visible.bind(&edit_toggle.get(), "visible", gtk::Widget::NONE);
     }
 
     fn init_avatar_chooser(&self) {
diff --git a/src/session/content/room_history/divider_row.rs b/src/session/content/room_history/divider_row.rs
index a27ba5fb..3009cb76 100644
--- a/src/session/content/room_history/divider_row.rs
+++ b/src/session/content/room_history/divider_row.rs
@@ -31,7 +31,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_string(
+                vec![glib::ParamSpecString::new(
                     "label",
                     "Label",
                     "The label for this divider",
diff --git a/src/session/content/room_history/item_row.rs b/src/session/content/room_history/item_row.rs
index f32d806a..862e8a0a 100644
--- a/src/session/content/room_history/item_row.rs
+++ b/src/session/content/room_history/item_row.rs
@@ -32,7 +32,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "item",
                     "item",
                     "The item represented by this row",
@@ -158,7 +158,7 @@ impl ItemRow {
                         self.remove_reaction_chooser();
                     }
 
-                    let fmt = if date.year() == glib::DateTime::new_now_local().unwrap().year() {
+                    let fmt = if date.year() == glib::DateTime::now_local().unwrap().year() {
                         // Translators: This is a date format in the day divider without the year
                         gettext("%A, %B %e")
                     } else {
@@ -195,7 +195,7 @@ impl ItemRow {
                         .child()
                         .map_or(false, |widget| widget.is::<gtk::Spinner>())
                     {
-                        let spinner = gtk::SpinnerBuilder::new()
+                        let spinner = gtk::Spinner::builder()
                             .spinning(true)
                             .margin_top(12)
                             .margin_bottom(12)
@@ -275,16 +275,18 @@ impl ItemRow {
         if priv_.emoji_chooser.borrow().is_none() {
             let emoji_chooser = gtk::EmojiChooser::builder().has_arrow(false).build();
             emoji_chooser.connect_emoji_picked(|emoji_chooser, emoji| {
-                emoji_chooser.activate_action("event.toggle-reaction", Some(&emoji.to_variant()));
+                emoji_chooser
+                    .activate_action("event.toggle-reaction", Some(&emoji.to_variant()))
+                    .unwrap();
             });
             emoji_chooser.set_parent(self);
             priv_.emoji_chooser.replace(Some(emoji_chooser));
         }
 
         let emoji_chooser = priv_.emoji_chooser.borrow().clone().unwrap();
-        if let Some(rectangle) = self.popover().pointing_to() {
-            emoji_chooser.set_pointing_to(&rectangle);
-        }
+        let (_, rectangle) = self.popover().pointing_to();
+        emoji_chooser.set_pointing_to(Some(&rectangle));
+
         self.popover().popdown();
         emoji_chooser.popup();
     }
diff --git a/src/session/content/room_history/message_row/file.rs 
b/src/session/content/room_history/message_row/file.rs
index 2ea65e8f..f1b1d7d5 100644
--- a/src/session/content/room_history/message_row/file.rs
+++ b/src/session/content/room_history/message_row/file.rs
@@ -35,14 +35,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "filename",
                         "Filename",
                         "The filename of the file",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether this file should be displayed in a compact format",
diff --git a/src/session/content/room_history/message_row/media.rs 
b/src/session/content/room_history/message_row/media.rs
index 24597991..1b9f6415 100644
--- a/src/session/content/room_history/message_row/media.rs
+++ b/src/session/content/room_history/message_row/media.rs
@@ -1,9 +1,7 @@
 use adw::{prelude::*, subclass::prelude::*};
 use gettextrs::gettext;
 use gtk::{
-    gdk,
-    gdk_pixbuf::Pixbuf,
-    gio,
+    gdk, gio,
     glib::{self, clone},
     subclass::prelude::*,
     CompositeTemplate,
@@ -35,18 +33,18 @@ const FALLBACK_HEIGHT: i32 = 360;
 const MAX_COMPACT_THUMBNAIL_WIDTH: i32 = 75;
 const MAX_COMPACT_THUMBNAIL_HEIGHT: i32 = 50;
 
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "MediaType")]
+#[enum_type(name = "MediaType")]
 pub enum MediaType {
     Image = 0,
     Sticker = 1,
     Video = 2,
 }
 
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "MediaState")]
+#[enum_type(name = "MediaState")]
 pub enum MediaState {
     Initial = 0,
     Loading = 1,
@@ -106,7 +104,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_int(
+                    glib::ParamSpecInt::new(
                         "width",
                         "Width",
                         "The intended display width of the media",
@@ -115,7 +113,7 @@ mod imp {
                         -1,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_int(
+                    glib::ParamSpecInt::new(
                         "height",
                         "Height",
                         "The intended display height of the media",
@@ -124,7 +122,7 @@ mod imp {
                         -1,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "state",
                         "State",
                         "The state of the media",
@@ -132,7 +130,7 @@ mod imp {
                         MediaState::default() as i32,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether to display this media in a compact format",
@@ -429,28 +427,33 @@ impl MessageMedia {
                     Ok((Some(data), id)) => {
                         match media_type {
                             MediaType::Image | MediaType::Sticker => {
-                                let stream = gio::MemoryInputStream::from_bytes(&glib::Bytes::from(&data));
-                                let texture = Pixbuf::from_stream(&stream, gio::NONE_CANCELLABLE)
-                                    .ok()
-                                    .map(|pixbuf| gdk::Texture::for_pixbuf(&pixbuf));
-
-                                let child = if let Some(Ok(child)) =
-                                    priv_.media.child().map(|w| w.downcast::<gtk::Picture>())
-                                {
-                                    child
-                                } else {
-                                    let child = gtk::Picture::new();
-                                    priv_.media.set_child(Some(&child));
-                                    child
-                                };
-                                child.set_paintable(texture.as_ref());
-
-                                child.set_tooltip_text(body.as_deref());
-                                if media_type == MediaType::Sticker && 
priv_.media.has_css_class("thumbnail") {
-                                    priv_.media.remove_css_class("thumbnail");
-                                } else if !priv_.media.has_css_class("thumbnail") {
-                                    priv_.media.add_css_class("thumbnail");
-                                }
+                                match gdk::Texture::from_bytes(&glib::Bytes::from(&data))
+                                    {
+                                        Ok(texture) => {
+                                            let child = if let Some(Ok(child)) =
+                                                priv_.media.child().map(|w| w.downcast::<gtk::Picture>())
+                                            {
+                                                child
+                                            } else {
+                                                let child = gtk::Picture::new();
+                                                priv_.media.set_child(Some(&child));
+                                                child
+                                            };
+                                            child.set_paintable(Some(&texture));
+
+                                            child.set_tooltip_text(body.as_deref());
+                                            if media_type == MediaType::Sticker && 
priv_.media.has_css_class("thumbnail") {
+                                                priv_.media.remove_css_class("thumbnail");
+                                            } else if !priv_.media.has_css_class("thumbnail") {
+                                                priv_.media.add_css_class("thumbnail");
+                                            }
+                                        }
+                                        Err(error) => {
+                                            warn!("Image file not supported: {}", error);
+                                            priv_.overlay_error.set_tooltip_text(Some(&gettext("Image file 
not supported")));
+                                            obj.set_state(MediaState::Error);
+                                        }
+                                    }
                             }
                             MediaType::Video => {
                                 // The GStreamer backend of GtkVideo doesn't work with input streams so
@@ -464,7 +467,7 @@ impl MessageMedia {
                                     None,
                                     false,
                                     gio::FileCreateFlags::REPLACE_DESTINATION,
-                                    gio::NONE_CANCELLABLE,
+                                    gio::Cancellable::NONE,
                                 )
                                 .unwrap();
                                 let media_file = gtk::MediaFile::for_file(&file);
diff --git a/src/session/content/room_history/message_row/mod.rs 
b/src/session/content/room_history/message_row/mod.rs
index 7bf1f212..024af95f 100644
--- a/src/session/content/room_history/message_row/mod.rs
+++ b/src/session/content/room_history/message_row/mod.rs
@@ -70,7 +70,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "show-header",
                         "Show Header",
                         "Whether this item should show a header. This does nothing if this event doesn’t 
have a header. ",
@@ -162,20 +162,17 @@ impl MessageRow {
             .sender()
             .bind_property("display-name", &priv_.display_name.get(), "label")
             .flags(glib::BindingFlags::SYNC_CREATE)
-            .build()
-            .unwrap();
+            .build();
 
         let show_header_binding = event
             .bind_property("show-header", self, "show-header")
             .flags(glib::BindingFlags::SYNC_CREATE)
-            .build()
-            .unwrap();
+            .build();
 
         let timestamp_binding = event
             .bind_property("time", &*priv_.timestamp, "label")
             .flags(glib::BindingFlags::SYNC_CREATE)
-            .build()
-            .unwrap();
+            .build();
 
         priv_.bindings.borrow_mut().append(&mut vec![
             display_name_binding,
diff --git a/src/session/content/room_history/message_row/reaction.rs 
b/src/session/content/room_history/message_row/reaction.rs
index ef4d9145..65fb9df6 100644
--- a/src/session/content/room_history/message_row/reaction.rs
+++ b/src/session/content/room_history/message_row/reaction.rs
@@ -39,7 +39,7 @@ mod imp {
     impl ObjectImpl for MessageReaction {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "group",
                     "Group",
                     "The reaction group to display",
diff --git a/src/session/content/room_history/message_row/text.rs 
b/src/session/content/room_history/message_row/text.rs
index 19dbcd2d..09f466d2 100644
--- a/src/session/content/room_history/message_row/text.rs
+++ b/src/session/content/room_history/message_row/text.rs
@@ -51,14 +51,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "body",
                         "Body",
                         "The displayed content of the message",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "sender",
                         "Sender",
                         "The sender of the message",
diff --git a/src/session/content/room_history/mod.rs b/src/session/content/room_history/mod.rs
index ec89e26a..2cad72ad 100644
--- a/src/session/content/room_history/mod.rs
+++ b/src/session/content/room_history/mod.rs
@@ -115,35 +115,35 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether a compact view is used",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room currently shown",
                         Room::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "empty",
                         "Empty",
                         "Wheter there is currently a room shown",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "markdown-enabled",
                         "Markdown enabled",
                         "Whether outgoing messages should be interpreted as markdown",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "sticky",
                         "Sticky",
                         "Whether the room history should stick to the newest message in the timeline",
@@ -245,8 +245,8 @@ mod imp {
 
             key_events
                 .connect_key_pressed(clone!(@weak obj => @default-return Inhibit(false), move |_, key, _, 
modifier| {
-                if !modifier.contains(gdk::ModifierType::SHIFT_MASK) && (key == gdk::keys::constants::Return 
|| key == gdk::keys::constants::KP_Enter) {
-                    obj.activate_action("room-history.send-text-message", None);
+                if !modifier.contains(gdk::ModifierType::SHIFT_MASK) && (key == gdk::Key::Return || key == 
gdk::Key::KP_Enter) {
+                    obj.activate_action("room-history.send-text-message", None).unwrap();
                     Inhibit(true)
                 } else {
                     Inhibit(false)
@@ -268,8 +268,7 @@ mod imp {
             let (start_iter, end_iter) = buffer.bounds();
             obj.action_set_enabled("room-history.send-text-message", start_iter != end_iter);
 
-            let md_lang =
-                sourceview::LanguageManager::default().and_then(|lm| lm.language("markdown"));
+            let md_lang = sourceview::LanguageManager::default().language("markdown");
             buffer.set_language(md_lang.as_ref());
             obj.bind_property("markdown-enabled", &buffer, "highlight-syntax")
                 .flags(glib::BindingFlags::SYNC_CREATE)
@@ -390,8 +389,9 @@ impl RoomHistory {
         let mut plain_body = String::with_capacity(body_len);
         // formatted_body is Markdown if is_markdown is true, and HTML if false.
         let mut formatted_body = String::with_capacity(body_len);
-        // uncopied_text_location is the start of the text we haven't copied to plain_body and 
formatted_body.
-        let mut uncopied_text_location = start_iter.clone();
+        // uncopied_text_location is the start of the text we haven't copied to
+        // plain_body and formatted_body.
+        let mut uncopied_text_location = start_iter;
 
         let mut iter = start_iter;
         loop {
@@ -421,7 +421,7 @@ impl RoomHistory {
                 let some_text = buffer.text(&uncopied_text_location, &iter, false);
                 plain_body.push_str(&some_text);
                 formatted_body.push_str(&some_text);
-                uncopied_text_location = iter.clone();
+                uncopied_text_location = iter;
 
                 // Add mention
                 has_mentions = true;
@@ -486,7 +486,7 @@ impl RoomHistory {
     pub fn open_room_details(&self, page_name: &str) {
         if let Some(room) = self.room() {
             let window = RoomDetails::new(&self.parent_window(), &room);
-            window.set_property("visible-page-name", page_name).unwrap();
+            window.set_property("visible-page-name", page_name);
             window.show();
         }
     }
@@ -494,7 +494,7 @@ impl RoomHistory {
     pub fn open_invite_members(&self) {
         if let Some(room) = self.room() {
             let window = RoomDetails::new(&self.parent_window(), &room);
-            window.set_property("visible-page-name", "members").unwrap();
+            window.set_property("visible-page-name", "members");
             window.present_invite_subpage();
             window.show();
         }
@@ -571,8 +571,7 @@ impl RoomHistory {
 
         priv_
             .scrolled_window
-            .emit_by_name("scroll-child", &[&gtk::ScrollType::End, &false])
-            .unwrap();
+            .emit_by_name::<bool>("scroll-child", &[&gtk::ScrollType::End, &false]);
     }
 }
 
diff --git a/src/session/content/room_history/verification_info_bar.rs 
b/src/session/content/room_history/verification_info_bar.rs
index e180c5e2..489bf0e9 100644
--- a/src/session/content/room_history/verification_info_bar.rs
+++ b/src/session/content/room_history/verification_info_bar.rs
@@ -58,7 +58,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "request",
                     "Request",
                     "The verification request this InfoBar is showing",
diff --git a/src/session/content/verification/identity_verification_widget.rs 
b/src/session/content/verification/identity_verification_widget.rs
index a9b05f0e..f06c3267 100644
--- a/src/session/content/verification/identity_verification_widget.rs
+++ b/src/session/content/verification/identity_verification_widget.rs
@@ -120,7 +120,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "request",
                     "Request",
                     "The Object holding the data for the verification",
@@ -241,7 +241,7 @@ mod imp {
             self.done_btn.connect_clicked(clone!(@weak obj => move |_| {
                 if let Some(request) = obj.request() {
                     if request.mode() == VerificationMode::CurrentSession {
-                        obj.activate_action("session.show-content", None);
+                        obj.activate_action("session.show-content", None).unwrap();
                     }
                 }
             }));
diff --git a/src/session/content/verification/session_verification.rs 
b/src/session/content/verification/session_verification.rs
index a4101eec..c2ad31c8 100644
--- a/src/session/content/verification/session_verification.rs
+++ b/src/session/content/verification/session_verification.rs
@@ -75,7 +75,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "session",
                     "Session",
                     "The session",
@@ -282,12 +282,12 @@ impl SessionVerification {
         if let Some(request) = self.request() {
             if request.state() == VerificationState::RequestSend {
                 self.set_request(None);
-                self.activate_action("session.logout", None);
+                self.activate_action("session.logout", None).unwrap();
             } else {
                 self.start_request();
             }
         } else {
-            self.activate_action("session.logout", None);
+            self.activate_action("session.logout", None).unwrap();
         }
     }
 
@@ -321,7 +321,7 @@ impl SessionVerification {
 
             if let Some(error_message) = error_message {
                 let error = Error::new(move |_| {
-                    let error_label = gtk::LabelBuilder::new()
+                    let error_label = gtk::Label::builder()
                         .label(&error_message)
                         .wrap(true)
                         .build();
@@ -333,7 +333,7 @@ impl SessionVerification {
                 }
             } else {
                 // TODO tell user that the a crypto identity was created
-                obj.activate_action("session.show-content", None);
+                obj.activate_action("session.show-content", None).unwrap();
             }
         }));
     }
diff --git a/src/session/event_source_dialog.rs b/src/session/event_source_dialog.rs
index 5006abd6..7ec7802d 100644
--- a/src/session/event_source_dialog.rs
+++ b/src/session/event_source_dialog.rs
@@ -38,7 +38,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "event",
                     "Event",
                     "The event that is displayed in the Dialog",
@@ -80,8 +80,8 @@ mod imp {
                 .downcast::<sourceview::Buffer>()
                 .unwrap();
 
-            let md_lang = sourceview::LanguageManager::default().and_then(|lm| lm.language("json"));
-            buffer.set_language(md_lang.as_ref());
+            let json_lang = sourceview::LanguageManager::default().language("json");
+            buffer.set_language(json_lang.as_ref());
             crate::utils::setup_style_scheme(&buffer);
 
             self.parent_constructed(obj);
diff --git a/src/session/media_viewer.rs b/src/session/media_viewer.rs
index 6bd29420..e4522e2b 100644
--- a/src/session/media_viewer.rs
+++ b/src/session/media_viewer.rs
@@ -1,8 +1,6 @@
 use adw::{prelude::*, subclass::prelude::*};
 use gettextrs::gettext;
-use gtk::{
-    gdk, gdk_pixbuf::Pixbuf, gio, glib, glib::clone, subclass::prelude::*, CompositeTemplate,
-};
+use gtk::{gdk, gio, glib, glib::clone, subclass::prelude::*, CompositeTemplate};
 use log::warn;
 use matrix_sdk::ruma::events::{room::message::MessageType, AnyMessageEventContent};
 
@@ -55,10 +53,10 @@ mod imp {
                         stream.seek(0);
                     }
                 }
-                obj.activate_action("session.show-content", None);
+                obj.activate_action("session.show-content", None).unwrap();
             });
             klass.add_binding_action(
-                gdk::keys::constants::Escape,
+                gdk::Key::Escape,
                 gdk::ModifierType::empty(),
                 "media-viewer.close",
                 None,
@@ -74,21 +72,21 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "fullscreened",
                         "Fullscreened",
                         "Whether the viewer is fullscreen",
                         false,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "event",
                         "Event",
                         "The media event to display",
                         Event::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "body",
                         "Body",
                         "The body of the media event",
@@ -145,7 +143,7 @@ mod imp {
             let click_gesture = gtk::GestureClick::builder().button(1).build();
             click_gesture.connect_pressed(clone!(@weak obj => move |_, n_pressed, _, _| {
                 if n_pressed == 2 {
-                    obj.activate_action("win.toggle-fullscreen", None);
+                    obj.activate_action("win.toggle-fullscreen", None).unwrap();
                 }
             }));
             obj.add_controller(&click_gesture);
@@ -265,13 +263,18 @@ impl MediaViewer {
 
                                 match event.get_media_content().await {
                                     Ok((_, _, data)) => {
-                                        let stream = 
gio::MemoryInputStream::from_bytes(&glib::Bytes::from(&data));
-                                        let texture = Pixbuf::from_stream(&stream, gio::NONE_CANCELLABLE)
-                                            .ok()
-                                            .map(|pixbuf| gdk::Texture::for_pixbuf(&pixbuf));
-                                        let child = gtk::Picture::for_paintable(texture.as_ref());
-
-                                        priv_.media.set_child(Some(&child));
+                                        match gdk::Texture::from_bytes(&glib::Bytes::from(&data))
+                                            {
+                                                Ok(texture) => {
+                                                    let child = gtk::Picture::for_paintable(&texture);
+                                                    priv_.media.set_child(Some(&child));
+                                                }
+                                                Err(error) => {
+                                                    warn!("Image file not supported: {}", error);
+                                                    let child = gtk::Label::new(Some(&gettext("Image file 
not supported")));
+                                                    priv_.media.set_child(Some(&child));
+                                                }
+                                            }
                                     }
                                     Err(error) => {
                                         warn!("Could not retrieve image file: {}", error);
@@ -303,7 +306,7 @@ impl MediaViewer {
                                             None,
                                             false,
                                             gio::FileCreateFlags::REPLACE_DESTINATION,
-                                            gio::NONE_CANCELLABLE,
+                                            gio::Cancellable::NONE,
                                         )
                                         .unwrap();
                                         let child = gtk::Video::builder().file(&file).autoplay(true).build();
diff --git a/src/session/mod.rs b/src/session/mod.rs
index 56eba475..9f42be83 100644
--- a/src/session/mod.rs
+++ b/src/session/mod.rs
@@ -137,7 +137,7 @@ mod imp {
             });
 
             klass.add_binding_action(
-                gdk::keys::constants::Escape,
+                gdk::Key::Escape,
                 gdk::ModifierType::empty(),
                 "session.close-room",
                 None,
@@ -148,7 +148,7 @@ mod imp {
             });
 
             klass.add_binding_action(
-                gdk::keys::constants::k,
+                gdk::Key::k,
                 gdk::ModifierType::CONTROL_MASK,
                 "session.toggle-room-search",
                 None,
@@ -174,14 +174,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item-list",
                         "Item List",
                         "The list of items in the sidebar",
                         ItemList::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "user",
                         "User",
                         "The user of this session",
@@ -237,7 +237,7 @@ mod imp {
 
         fn dispose(&self, obj: &Self::Type) {
             if let Some(source_id) = self.source_id.take() {
-                let _ = glib::Source::remove(source_id);
+                source_id.remove();
             }
 
             if let Some(handle) = self.sync_tokio_handle.take() {
@@ -410,7 +410,7 @@ impl Session {
                             warn!("Couldn't store session: {:?}", error);
                             let error_string = error.to_user_facing();
                             Some(Error::new(move |_| {
-                                let error_label = gtk::LabelBuilder::new()
+                                let error_label = gtk::Label::builder()
                                     .label(
                                         &(gettext("Unable to store session")
                                             + ": "
@@ -442,7 +442,7 @@ impl Session {
                 let error_string = error.to_user_facing();
 
                 Some(Error::new(move |_| {
-                    let error_label = gtk::LabelBuilder::new()
+                    let error_label = gtk::Label::builder()
                         .label(&error_string)
                         .wrap(true)
                         .build();
@@ -451,7 +451,7 @@ impl Session {
             }
         };
 
-        self.emit_by_name("prepared", &[&error]).unwrap();
+        self.emit_by_name::<()>("prepared", &[&error]);
     }
 
     fn sync(&self) {
@@ -616,7 +616,6 @@ impl Session {
 
             None
         })
-        .unwrap()
     }
 
     pub fn connect_logged_out<F: Fn(&Self) + 'static>(&self, f: F) -> glib::SignalHandlerId {
@@ -627,7 +626,6 @@ impl Session {
 
             None
         })
-        .unwrap()
     }
 
     pub fn connect_ready<F: Fn(&Self) + 'static>(&self, f: F) -> glib::SignalHandlerId {
@@ -638,7 +636,6 @@ impl Session {
 
             None
         })
-        .unwrap()
     }
 
     fn handle_sync_response(&self, response: Result<SyncResponse, matrix_sdk::Error>) {
@@ -658,7 +655,7 @@ impl Session {
                 ))) = error
                 {
                     if let ErrorKind::UnknownToken { soft_logout: _ } = error.kind {
-                        self.emit_by_name("logged-out", &[]).unwrap();
+                        self.emit_by_name::<()>("logged-out", &[]);
                         self.cleanup_session();
                     }
                 }
@@ -693,7 +690,7 @@ impl Session {
 
     pub async fn logout(&self) {
         let priv_ = imp::Session::from_instance(self);
-        self.emit_by_name("logged-out", &[]).unwrap();
+        self.emit_by_name::<()>("logged-out", &[]);
 
         debug!("The session is about to be logout");
 
@@ -731,7 +728,7 @@ impl Session {
         priv_.is_ready.set(false);
 
         if let Some(source_id) = priv_.source_id.take() {
-            let _ = glib::Source::remove(source_id);
+            source_id.remove();
         }
 
         if let Some(handle) = priv_.sync_tokio_handle.take() {
@@ -764,7 +761,7 @@ impl Session {
             priv_.stack.remove(&session_verificiation);
         }
 
-        self.emit_by_name("ready", &[]).unwrap();
+        self.emit_by_name::<()>("ready", &[]);
     }
 
     /// Show a media event
diff --git a/src/session/room/event.rs b/src/session/room/event.rs
index 820c2b6d..d523267b 100644
--- a/src/session/room/event.rs
+++ b/src/session/room/event.rs
@@ -26,8 +26,8 @@ use crate::{
     utils::{filename_for_mime, media_type_uid},
 };
 
-#[derive(Clone, Debug, glib::GBoxed)]
-#[gboxed(type_name = "BoxedSyncRoomEvent")]
+#[derive(Clone, Debug, glib::Boxed)]
+#[boxed_type(name = "BoxedSyncRoomEvent")]
 pub struct BoxedSyncRoomEvent(SyncRoomEvent);
 
 mod imp {
@@ -62,56 +62,56 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boxed(
+                    glib::ParamSpecBoxed::new(
                         "event",
                         "event",
                         "The matrix event of this Event",
                         BoxedSyncRoomEvent::static_type(),
                         glib::ParamFlags::WRITABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "source",
                         "Source",
                         "The source (JSON) of this Event",
                         None,
                         glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "show-header",
                         "Show Header",
                         "Whether this event should show a header. This does nothing if this event doesn’t 
have a header. ",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "can-hide-header",
                         "Can hide header",
                         "Whether this event is allowed to hide it's header or not.",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "sender",
                         "Sender",
                         "The sender of this matrix event",
                         Member::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The room containing this event",
                         Room::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "time",
                         "Time",
                         "The locally formatted time of this matrix event",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "can-view-media",
                         "Can View Media",
                         "Whether this is a media event that can be viewed",
diff --git a/src/session/room/event_actions.rs b/src/session/room/event_actions.rs
index e9421488..1f33b585 100644
--- a/src/session/room/event_actions.rs
+++ b/src/session/room/event_actions.rs
@@ -67,7 +67,7 @@ where
     /// Should be paired with the `EventActions` menu models.
     fn set_event_actions(&self, event: Option<&Event>) -> Option<gio::SimpleActionGroup> {
         if event.is_none() {
-            self.insert_action_group("event", gio::NONE_ACTION_GROUP);
+            self.insert_action_group("event", gio::ActionGroup::NONE);
             return None;
         }
 
@@ -143,7 +143,7 @@ where
 
                         let error_message = err.to_user_facing();
                         let error = Error::new(move |_| {
-                            let error_label = gtk::LabelBuilder::new()
+                            let error_label = gtk::Label::builder()
                                 .label(&error_message)
                                 .wrap(true)
                                 .build();
@@ -174,7 +174,7 @@ where
                             None,
                             false,
                             gio::FileCreateFlags::REPLACE_DESTINATION,
-                            gio::NONE_CANCELLABLE,
+                            gio::Cancellable::NONE,
                         )
                         .unwrap();
                     }
@@ -200,7 +200,7 @@ where
 
                         let error_message = err.to_user_facing();
                         let error = Error::new(move |_| {
-                            let error_label = gtk::LabelBuilder::new()
+                            let error_label = gtk::Label::builder()
                                 .label(&error_message)
                                 .wrap(true)
                                 .build();
@@ -216,7 +216,7 @@ where
                 path.push(uid);
                 if !path.exists() {
                     let dir = gio::File::for_path(path.clone());
-                    dir.make_directory_with_parents(gio::NONE_CANCELLABLE)
+                    dir.make_directory_with_parents(gio::Cancellable::NONE)
                         .unwrap();
                 }
 
@@ -228,13 +228,13 @@ where
                     None,
                     false,
                     gio::FileCreateFlags::REPLACE_DESTINATION,
-                    gio::NONE_CANCELLABLE,
+                    gio::Cancellable::NONE,
                 )
                 .unwrap();
 
-                if let Err(error) = gio::AppInfo::launch_default_for_uri_async_future(
+                if let Err(error) = gio::AppInfo::launch_default_for_uri_future(
                     &file.uri(),
-                    gio::NONE_APP_LAUNCH_CONTEXT,
+                    gio::AppLaunchContext::NONE,
                 )
                 .await
                 {
diff --git a/src/session/room/highlight_flags.rs b/src/session/room/highlight_flags.rs
index cd61adeb..d4d09616 100644
--- a/src/session/room/highlight_flags.rs
+++ b/src/session/room/highlight_flags.rs
@@ -1,14 +1,14 @@
 use gtk::glib;
 
-#[glib::gflags("HighlightFlags")]
+#[glib::flags(name = "HighlightFlags")]
 pub enum HighlightFlags {
-    #[glib::gflags(name = "NONE")]
+    #[flags_value(name = "NONE")]
     NONE = 0b00000000,
-    #[glib::gflags(name = "HIGHLIGHT")]
+    #[flags_value(name = "HIGHLIGHT")]
     HIGHLIGHT = 0b00000001,
-    #[glib::gflags(name = "BOLD")]
+    #[flags_value(name = "BOLD")]
     BOLD = 0b00000010,
-    #[glib::gflags(skip)]
+    #[flags_value(skip)]
     HIGHLIGHT_BOLD = Self::HIGHLIGHT.bits() | Self::BOLD.bits(),
 }
 
diff --git a/src/session/room/item.rs b/src/session/room/item.rs
index 46ca8449..d444d3f9 100644
--- a/src/session/room/item.rs
+++ b/src/session/room/item.rs
@@ -17,8 +17,8 @@ pub enum ItemType {
     LoadingSpinner,
 }
 
-#[derive(Clone, Debug, glib::GBoxed)]
-#[gboxed(type_name = "BoxedItemType")]
+#[derive(Clone, Debug, glib::Boxed)]
+#[boxed_type(name = "BoxedItemType")]
 pub struct BoxedItemType(ItemType);
 
 impl From<ItemType> for BoxedItemType {
@@ -50,35 +50,35 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_boxed(
+                    glib::ParamSpecBoxed::new(
                         "type",
                         "Type",
                         "The type of this item",
                         BoxedItemType::static_type(),
                         glib::ParamFlags::WRITABLE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "selectable",
                         "Selectable",
                         "Whether this item is selectable.",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "show-header",
                         "Show Header",
                         "Whether this item should show a header. This does do nothing if this event doesn’t 
have a header. ",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "can-hide-header",
                         "Can hide header",
                         "Whether this item is allowed to hide its header.",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "activatable",
                         "Activatable",
                         "Whether this item is activatable.",
diff --git a/src/session/room/member.rs b/src/session/room/member.rs
index 1af7a0f8..4b32341b 100644
--- a/src/session/room/member.rs
+++ b/src/session/room/member.rs
@@ -31,7 +31,7 @@ mod imp {
     impl ObjectImpl for Member {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_int64(
+                vec![glib::ParamSpecInt64::new(
                     "power-level",
                     "Power level",
                     "Power level of the member in its room.",
diff --git a/src/session/room/member_list.rs b/src/session/room/member_list.rs
index dde8bf3b..e550cd94 100644
--- a/src/session/room/member_list.rs
+++ b/src/session/room/member_list.rs
@@ -28,7 +28,7 @@ mod imp {
     impl ObjectImpl for MemberList {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "room",
                     "Room",
                     "The associated room",
diff --git a/src/session/room/member_role.rs b/src/session/room/member_role.rs
index f444ce31..21215d8e 100644
--- a/src/session/room/member_role.rs
+++ b/src/session/room/member_role.rs
@@ -6,13 +6,13 @@ use gtk::glib;
 use crate::session::room::power_levels::PowerLevel;
 
 /// Role of a room member, like admin or moderator.
-#[glib::gflags("MemberRole")]
+#[glib::flags(name = "MemberRole")]
 pub enum MemberRole {
-    #[glib::gflags(name = "ADMIN")]
+    #[flags_value(name = "ADMIN")]
     ADMIN = 1,
-    #[glib::gflags(name = "MOD")]
+    #[flags_value(name = "MOD")]
     MOD = 2,
-    #[glib::gflags(name = "PEASANT")]
+    #[flags_value(name = "PEASANT")]
     PEASANT = 0,
 }
 
diff --git a/src/session/room/mod.rs b/src/session/room/mod.rs
index 451b2df0..41b79100 100644
--- a/src/session/room/mod.rs
+++ b/src/session/room/mod.rs
@@ -107,49 +107,49 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "room-id",
                         "Room id",
                         "The room id of this Room",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name of this room",
                         None,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "inviter",
                         "Inviter",
                         "The user who sent the invite to this room, this is only set when this room 
represents an invite",
                         Member::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "avatar",
                         "Avatar",
                         "The Avatar of this room",
                         Avatar::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "timeline",
                         "Timeline",
                         "The timeline of this room",
                         Timeline::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_flags(
+                    glib::ParamSpecFlags::new(
                         "highlight",
                         "Highlight",
                         "How this room is highlighted",
@@ -157,7 +157,7 @@ mod imp {
                         HighlightFlags::default().bits(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_uint64(
+                    glib::ParamSpecUInt64::new(
                         "notification-count",
                         "Notification count",
                         "The notification count of this room",
@@ -166,7 +166,7 @@ mod imp {
                         0,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "category",
                         "Category",
                         "The category of this room",
@@ -174,35 +174,35 @@ mod imp {
                         RoomType::default() as i32,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "topic",
                         "Topic",
                         "The topic of this room",
                         None,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boxed(
+                    glib::ParamSpecBoxed::new(
                         "latest-change",
                         "Latest Change",
                         "Latest origin_server_ts of all loaded invents",
                         glib::DateTime::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "members",
                         "Members",
                         "Model of the room’s members",
                         MemberList::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "predecessor",
                         "Predecessor",
                         "The room id of predecessor of this Room",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "successor",
                         "Successor",
                         "The room id of successor of this Room",
@@ -318,8 +318,7 @@ mod imp {
 
             obj.bind_property("display-name", obj.avatar(), "display-name")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
         }
     }
 }
@@ -399,7 +398,7 @@ impl Room {
             clone!(@weak self as obj => async move {
                 match handle.await.unwrap() {
                     Ok(_) => {
-                        obj.emit_by_name("room-forgotten", &[]).unwrap();
+                        obj.emit_by_name::<()>("room-forgotten", &[]);
                     }
                     Err(error) => {
                             error!("Couldn’t forget the room: {}", error);
@@ -442,7 +441,7 @@ impl Room {
 
         priv_.category.set(category);
         self.notify("category");
-        self.emit_by_name("order-changed", &[]).unwrap();
+        self.emit_by_name::<()>("order-changed", &[]);
     }
 
     /// Set the category of this room.
@@ -852,7 +851,7 @@ impl Room {
         priv_.timeline.get().unwrap().append(batch);
         priv_.latest_change.replace(latest_change);
         self.notify("latest-change");
-        self.emit_by_name("order-changed", &[]).unwrap();
+        self.emit_by_name::<()>("order-changed", &[]);
     }
 
     /// Returns the point in time this room received its latest event.
@@ -1024,7 +1023,7 @@ impl Room {
     }
 
     /// Creates an expression that is true when the user is allowed the given action.
-    pub fn new_allowed_expr(&self, room_action: RoomAction) -> gtk::Expression {
+    pub fn new_allowed_expr(&self, room_action: RoomAction) -> gtk::ClosureExpression {
         let session = self.session();
         let user_id = session.user().unwrap().user_id();
         let member = self.members().member_by_id(user_id);
@@ -1174,7 +1173,6 @@ impl Room {
             f(&obj);
             None
         })
-        .unwrap()
     }
 
     /// Connect to the signal sent when a room was forgotten.
@@ -1184,7 +1182,6 @@ impl Room {
             f(&obj);
             None
         })
-        .unwrap()
     }
 
     pub fn predecessor(&self) -> Option<&RoomId> {
diff --git a/src/session/room/power_levels.rs b/src/session/room/power_levels.rs
index 0d538a75..cae816d3 100644
--- a/src/session/room/power_levels.rs
+++ b/src/session/room/power_levels.rs
@@ -1,14 +1,13 @@
-use gtk::glib;
 use gtk::prelude::*;
 use gtk::subclass::prelude::*;
+use gtk::{glib, glib::closure};
 use matrix_sdk::ruma::events::room::power_levels::RoomPowerLevelsEventContent;
 use matrix_sdk::ruma::events::{EventType, SyncStateEvent};
 
 use crate::session::room::Member;
-use crate::utils::prop_expr;
 
-#[derive(Clone, Debug, Default, glib::GBoxed)]
-#[gboxed(type_name = "BoxedPowerLevelsEventContent")]
+#[derive(Clone, Debug, Default, glib::Boxed)]
+#[boxed_type(name = "BoxedPowerLevelsEventContent")]
 pub struct BoxedPowerLevelsEventContent(RoomPowerLevelsEventContent);
 
 /// Power level of a user.
@@ -39,7 +38,7 @@ mod imp {
     impl ObjectImpl for PowerLevels {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_boxed(
+                vec![glib::ParamSpecBoxed::new(
                     "power-levels",
                     "Power levels",
                     "Ruma struct containing all power level information of a room",
@@ -82,19 +81,22 @@ impl PowerLevels {
     }
 
     /// Creates an expression that is true when the user is allowed the given action.
-    pub fn new_allowed_expr(&self, member: &Member, room_action: RoomAction) -> gtk::Expression {
-        gtk::ClosureExpression::new(
-            move |args| {
-                let power_level: PowerLevel = args[1].get().unwrap();
-                let content = args[2].get::<BoxedPowerLevelsEventContent>().unwrap().0;
-                power_level >= min_level_for_room_action(&content, &room_action)
-            },
+    pub fn new_allowed_expr(
+        &self,
+        member: &Member,
+        room_action: RoomAction,
+    ) -> gtk::ClosureExpression {
+        gtk::ClosureExpression::new::<bool, _, _>(
             &[
-                prop_expr(member, "power-level"),
-                prop_expr(self, "power-levels"),
+                member.property_expression("power-level"),
+                self.property_expression("power-levels"),
             ],
+            closure!(|_: Option<glib::Object>,
+                      power_level: PowerLevel,
+                      content: BoxedPowerLevelsEventContent| {
+                power_level >= min_level_for_room_action(&content.0, &room_action)
+            }),
         )
-        .upcast()
     }
 
     /// Updates the power levels from the given event.
diff --git a/src/session/room/reaction_group.rs b/src/session/room/reaction_group.rs
index 2da25cee..328add38 100644
--- a/src/session/room/reaction_group.rs
+++ b/src/session/room/reaction_group.rs
@@ -29,14 +29,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "key",
                         "Key",
                         "The key of the group",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_uint(
+                    glib::ParamSpecUInt::new(
                         "count",
                         "Count",
                         "The number of reactions in this group",
@@ -45,7 +45,7 @@ mod imp {
                         0,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "has-user",
                         "Has User",
                         "Whether this group has a reaction from this user",
diff --git a/src/session/room/room_type.rs b/src/session/room/room_type.rs
index 100f89bf..6570cfec 100644
--- a/src/session/room/room_type.rs
+++ b/src/session/room/room_type.rs
@@ -6,9 +6,9 @@ use num_enum::{IntoPrimitive, TryFromPrimitive};
 use crate::session::sidebar::CategoryType;
 
 // TODO: do we also want the category `People` and a custom category support?
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum, IntoPrimitive, TryFromPrimitive)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum, IntoPrimitive, TryFromPrimitive)]
 #[repr(u32)]
-#[genum(type_name = "RoomType")]
+#[enum_type(name = "RoomType")]
 pub enum RoomType {
     Invited = 0,
     Favorite = 1,
diff --git a/src/session/room/timeline.rs b/src/session/room/timeline.rs
index ea21dace..a7b76320 100644
--- a/src/session/room/timeline.rs
+++ b/src/session/room/timeline.rs
@@ -58,35 +58,35 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room",
                         "Room",
                         "The Room containing this timeline",
                         Room::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "loading",
                         "Loading",
                         "Whether a response is loaded or not",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "empty",
                         "Empty",
                         "Whether the timeline is empty",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "complete",
                         "Complete",
                         "Whether the full timeline is loaded",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "verification",
                         "Verification",
                         "The most recent active verification for a user in this timeline",
diff --git a/src/session/room_creation/mod.rs b/src/session/room_creation/mod.rs
index c8e806d6..e8174484 100644
--- a/src/session/room_creation/mod.rs
+++ b/src/session/room_creation/mod.rs
@@ -77,7 +77,7 @@ mod imp {
             Self::bind_template(klass);
 
             klass.add_binding(
-                gdk::keys::constants::Escape,
+                gdk::Key::Escape,
                 gdk::ModifierType::empty(),
                 |obj, _| {
                     obj.cancel();
@@ -96,7 +96,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "session",
                     "Session",
                     "The session",
diff --git a/src/session/room_list.rs b/src/session/room_list.rs
index 9be478ec..ec6d3270 100644
--- a/src/session/room_list.rs
+++ b/src/session/room_list.rs
@@ -40,7 +40,7 @@ mod imp {
     impl ObjectImpl for RoomList {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "session",
                     "Session",
                     "The session",
@@ -108,7 +108,7 @@ glib::wrapper! {
     ///
     /// This is the parent ListModel of the sidebar from which all other models
     /// are derived. If a room is updated in an order-relevant manner, use
-    /// `room.emit_by_name("order-changed", &[])` to fix the sorting.
+    /// `room.emit_by_name::<()>("order-changed", &[])` to fix the sorting.
     ///
     /// The `RoomList` also takes care of all so called *pending rooms*, i.e.
     /// rooms the user requested to join, but received no response from the
@@ -135,13 +135,13 @@ impl RoomList {
     fn pending_rooms_remove(&self, identifier: &RoomOrAliasId) {
         let priv_ = imp::RoomList::from_instance(self);
         priv_.pending_rooms.borrow_mut().remove(identifier);
-        self.emit_by_name("pending-rooms-changed", &[]).unwrap();
+        self.emit_by_name::<()>("pending-rooms-changed", &[]);
     }
 
     fn pending_rooms_insert(&self, identifier: Box<RoomOrAliasId>) {
         let priv_ = imp::RoomList::from_instance(self);
         priv_.pending_rooms.borrow_mut().insert(identifier);
-        self.emit_by_name("pending-rooms-changed", &[]).unwrap();
+        self.emit_by_name::<()>("pending-rooms-changed", &[]);
     }
 
     fn pending_rooms_replace_or_remove(&self, identifier: &RoomOrAliasId, room_id: &RoomId) {
@@ -153,7 +153,7 @@ impl RoomList {
                 pending_rooms.insert(room_id.to_owned().into());
             }
         }
-        self.emit_by_name("pending-rooms-changed", &[]).unwrap();
+        self.emit_by_name::<()>("pending-rooms-changed", &[]);
     }
 
     pub fn get(&self, room_id: &RoomId) -> Option<Room> {
@@ -340,7 +340,7 @@ impl RoomList {
                                     let error_message = gettext!(
                                         "Failed to join room {}. Try again later.", identifier
                                     );
-                                    let error_label = 
gtk::LabelBuilder::new().label(&error_message).wrap(true).build();
+                                    let error_label = 
gtk::Label::builder().label(&error_message).wrap(true).build();
                                     Some(error_label.upcast())
                             }),
                         );
@@ -365,6 +365,5 @@ impl RoomList {
 
             None
         })
-        .unwrap()
     }
 }
diff --git a/src/session/sidebar/account_switcher/avatar_with_selection.rs 
b/src/session/sidebar/account_switcher/avatar_with_selection.rs
index 827d5e66..d6a4ddb1 100644
--- a/src/session/sidebar/account_switcher/avatar_with_selection.rs
+++ b/src/session/sidebar/account_switcher/avatar_with_selection.rs
@@ -38,14 +38,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item",
                         "Item",
                         "The Avatar item displayed by this widget",
                         AvatarItem::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_int(
+                    glib::ParamSpecInt::new(
                         "size",
                         "Size",
                         "The size of the Avatar",
@@ -54,7 +54,7 @@ mod imp {
                         -1,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "selected",
                         "Selected",
                         "Style helper for the inner Avatar",
diff --git a/src/session/sidebar/account_switcher/item.rs b/src/session/sidebar/account_switcher/item.rs
index 3506c8a2..ef27e0c6 100644
--- a/src/session/sidebar/account_switcher/item.rs
+++ b/src/session/sidebar/account_switcher/item.rs
@@ -22,7 +22,7 @@ mod imp {
     impl ObjectImpl for ExtraItemObj {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_enum(
+                vec![glib::ParamSpecEnum::new(
                     "inner",
                     "Inner",
                     "Inner value of ExtraItem",
@@ -57,9 +57,9 @@ mod imp {
     }
 }
 
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "ExtraItem")]
+#[enum_type(name = "ExtraItem")]
 pub enum ExtraItem {
     Separator = 0,
     AddAccount = 1,
diff --git a/src/session/sidebar/account_switcher/mod.rs b/src/session/sidebar/account_switcher/mod.rs
index dc3e470c..769054da 100644
--- a/src/session/sidebar/account_switcher/mod.rs
+++ b/src/session/sidebar/account_switcher/mod.rs
@@ -67,7 +67,7 @@ mod imp {
                                 .set_visible_child(&session_widget);
                         }
                         AccountSwitcherItem::AddAccount => {
-                            list_view.activate_action("app.new-login", None);
+                            list_view.activate_action("app.new-login", None).unwrap();
                         }
                         _ => {}
                     }
@@ -122,7 +122,7 @@ impl AccountSwitcher {
         }));
 
         factory.connect_unbind(|_, list_item| {
-            list_item.set_child(gtk::NONE_WIDGET);
+            list_item.set_child(gtk::Widget::NONE);
         });
 
         entries.set_factory(Some(factory));
diff --git a/src/session/sidebar/account_switcher/user_entry.rs 
b/src/session/sidebar/account_switcher/user_entry.rs
index 589b51b6..bfe1faa2 100644
--- a/src/session/sidebar/account_switcher/user_entry.rs
+++ b/src/session/sidebar/account_switcher/user_entry.rs
@@ -36,7 +36,8 @@ mod imp {
                 "user-entry-row.open-account-settings",
                 None,
                 move |item, _, _| {
-                    item.activate_action("account-switcher.close", None);
+                    item.activate_action("account-switcher.close", None)
+                        .unwrap();
                     item.show_account_settings();
                 },
             );
@@ -51,14 +52,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session-page",
                         "Session StackPage",
                         "The stack page of the session that this entry represents",
                         gtk::StackPage::static_type(),
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "hint",
                         "Selection hint",
                         "The hint of the session that owns the account switcher which this entry belongs to",
@@ -131,6 +132,8 @@ impl UserEntryRow {
             .downcast::<Session>()
             .unwrap();
 
-        session.activate_action("session.open-account-settings", None);
+        session
+            .activate_action("session.open-account-settings", None)
+            .unwrap();
     }
 }
diff --git a/src/session/sidebar/category.rs b/src/session/sidebar/category.rs
index b604107d..8c177f43 100644
--- a/src/session/sidebar/category.rs
+++ b/src/session/sidebar/category.rs
@@ -29,7 +29,7 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "type",
                         "Type",
                         "The type of this category",
@@ -37,21 +37,21 @@ mod imp {
                         CategoryType::default() as i32,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name of this category",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "model",
                         "Model",
                         "The filter list model in that category",
                         gio::ListModel::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "empty",
                         "Empty",
                         "Whether this category is empty",
diff --git a/src/session/sidebar/category_row.rs b/src/session/sidebar/category_row.rs
index f1c04624..bc03b357 100644
--- a/src/session/sidebar/category_row.rs
+++ b/src/session/sidebar/category_row.rs
@@ -43,28 +43,28 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "category",
                         "Category",
                         "The category of this row",
                         Category::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "expanded",
                         "Expanded",
                         "The expanded state of this row",
                         true,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "label",
                         "Label",
                         "The label to show for this row",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "show-label-for-category",
                         "Show Label for Category",
                         "The CategoryType to show a label for",
diff --git a/src/session/sidebar/category_type.rs b/src/session/sidebar/category_type.rs
index bd3d20cb..b736aa13 100644
--- a/src/session/sidebar/category_type.rs
+++ b/src/session/sidebar/category_type.rs
@@ -2,9 +2,9 @@ use crate::session::room::RoomType;
 use gettextrs::gettext;
 use gtk::glib;
 
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(i32)]
-#[genum(type_name = "CategoryType")]
+#[enum_type(name = "CategoryType")]
 pub enum CategoryType {
     None = -1,
     VerificationRequest = 0,
diff --git a/src/session/sidebar/entry.rs b/src/session/sidebar/entry.rs
index 6e57fe16..8bb50f0f 100644
--- a/src/session/sidebar/entry.rs
+++ b/src/session/sidebar/entry.rs
@@ -25,7 +25,7 @@ mod imp {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "type",
                         "Type",
                         "The type of this category",
@@ -33,14 +33,14 @@ mod imp {
                         EntryType::default() as i32,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name of this Entry",
                         None,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "icon-name",
                         "Icon Name",
                         "The icon name used for this Entry",
diff --git a/src/session/sidebar/entry_row.rs b/src/session/sidebar/entry_row.rs
index 935c4427..3a2e5a14 100644
--- a/src/session/sidebar/entry_row.rs
+++ b/src/session/sidebar/entry_row.rs
@@ -35,7 +35,7 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             use once_cell::sync::Lazy;
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "entry",
                     "Entry",
                     "The entry of this row",
diff --git a/src/session/sidebar/entry_type.rs b/src/session/sidebar/entry_type.rs
index 791b6722..36673937 100644
--- a/src/session/sidebar/entry_type.rs
+++ b/src/session/sidebar/entry_type.rs
@@ -1,9 +1,9 @@
 use gettextrs::gettext;
 use gtk::glib;
 
-#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "EntryType")]
+#[enum_type(name = "EntryType")]
 pub enum EntryType {
     Explore = 0,
     Forget = 1,
diff --git a/src/session/sidebar/item_list.rs b/src/session/sidebar/item_list.rs
index b47df0b5..eb51bdc2 100644
--- a/src/session/sidebar/item_list.rs
+++ b/src/session/sidebar/item_list.rs
@@ -41,21 +41,21 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "room-list",
                         "Room list",
                         "The list of rooms",
                         RoomList::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "verification-list",
                         "Verification list",
                         "The list of verification requests",
                         VerificationList::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "show-all-for-category",
                         "Show All For Category",
                         "The `CategoryType` to show all compatible categories for",
diff --git a/src/session/sidebar/mod.rs b/src/session/sidebar/mod.rs
index 45622c6e..8815d56a 100644
--- a/src/session/sidebar/mod.rs
+++ b/src/session/sidebar/mod.rs
@@ -24,7 +24,7 @@ use self::selection::Selection;
 use self::verification_row::VerificationRow;
 
 use adw::{prelude::*, subclass::prelude::*};
-use gtk::{gio, glib, subclass::prelude::*, CompositeTemplate, SelectionModel};
+use gtk::{gio, glib, glib::closure, subclass::prelude::*, CompositeTemplate, SelectionModel};
 
 use crate::components::Avatar;
 use crate::session::room::{Room, RoomType};
@@ -114,35 +114,35 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "user",
                         "User",
                         "The logged in user",
                         User::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "compact",
                         "Compact",
                         "Whether a compact view is used",
                         false,
                         glib::ParamFlags::READWRITE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item-list",
                         "Item List",
                         "The list of items in the sidebar",
                         ItemList::static_type(),
                         glib::ParamFlags::WRITABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "selected-item",
                         "Selected Item",
                         "The selected item in this sidebar",
                         glib::Object::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "drop-source-type",
                         "Drop Source Type",
                         "The type of the source that activated drop mode",
@@ -256,33 +256,30 @@ impl Sidebar {
         let item_list = match item_list {
             Some(item_list) => item_list,
             None => {
-                priv_.listview.set_model(gtk::NONE_SELECTION_MODEL);
+                priv_.listview.set_model(gtk::SelectionModel::NONE);
                 return;
             }
         };
 
-        priv_.drop_binding.replace(
+        priv_.drop_binding.replace(Some(
             self.bind_property("drop-source-type", &item_list, "show-all-for-category")
                 .flags(glib::BindingFlags::SYNC_CREATE)
                 .build(),
-        );
+        ));
 
         let tree_model = gtk::TreeListModel::new(&item_list, false, true, |item| {
             item.clone().downcast::<gio::ListModel>().ok()
         });
 
-        let room_expression = gtk::ClosureExpression::new(
-            |value| {
-                value[0]
-                    .get::<gtk::TreeListRow>()
-                    .unwrap()
-                    .item()
+        let room_expression = gtk::ClosureExpression::new::<String, &[gtk::Expression], _>(
+            &[],
+            closure!(|row: gtk::TreeListRow| {
+                row.item()
                     .and_then(|o| o.downcast::<Room>().ok())
                     .map_or(String::new(), |o| o.display_name())
-            },
-            &[],
+            }),
         );
-        let filter = gtk::StringFilterBuilder::new()
+        let filter = gtk::StringFilter::builder()
             .match_mode(gtk::StringFilterMatchMode::Substring)
             .expression(&room_expression)
             .ignore_case(true)
diff --git a/src/session/sidebar/room_row.rs b/src/session/sidebar/room_row.rs
index eafef47a..a78c9bac 100644
--- a/src/session/sidebar/room_row.rs
+++ b/src/session/sidebar/room_row.rs
@@ -72,7 +72,7 @@ mod imp {
     impl ObjectImpl for RoomRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "room",
                     "Room",
                     "The room of this row",
@@ -180,8 +180,7 @@ impl RoomRow {
                 )
                 .flags(glib::BindingFlags::SYNC_CREATE)
                 .transform_from(|_, value| Some((value.get::<u64>().unwrap() > 0).to_value()))
-                .build()
-                .unwrap(),
+                .build(),
             ));
 
             priv_.signal_handler.replace(Some(room.connect_notify_local(
@@ -319,11 +318,13 @@ impl RoomRow {
     fn drag_begin(&self) {
         self.parent().unwrap().add_css_class("drag");
         let category = Some(u32::from(self.room().unwrap().category()));
-        self.activate_action("sidebar.set-drop-source-type", Some(&category.to_variant()));
+        self.activate_action("sidebar.set-drop-source-type", Some(&category.to_variant()))
+            .unwrap();
     }
 
     fn drag_end(&self) {
-        self.activate_action("sidebar.set-drop-source-type", None);
+        self.activate_action("sidebar.set-drop-source-type", None)
+            .unwrap();
         self.parent().unwrap().remove_css_class("drag");
     }
 }
diff --git a/src/session/sidebar/row.rs b/src/session/sidebar/row.rs
index 41f71f05..218191f8 100644
--- a/src/session/sidebar/row.rs
+++ b/src/session/sidebar/row.rs
@@ -37,14 +37,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "item",
                         "Item",
                         "The sidebar item of this row",
                         glib::Object::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "list-row",
                         "List Row",
                         "The list row to track for expander state",
@@ -160,8 +160,7 @@ impl Row {
                 let binding = row
                     .bind_property("expanded", &child, "expanded")
                     .flags(glib::BindingFlags::SYNC_CREATE)
-                    .build()
-                    .unwrap();
+                    .build();
 
                 priv_.binding.replace(Some(binding));
 
@@ -220,7 +219,8 @@ impl Row {
             } else {
                 panic!("Wrong row item: {:?}", item);
             }
-            self.activate_action("sidebar.update-drop-targets", None);
+            self.activate_action("sidebar.update-drop-targets", None)
+                .unwrap();
         }
 
         self.notify("item");
@@ -252,7 +252,7 @@ impl Row {
     fn drop_accept(&self, drop: &gdk::Drop) -> bool {
         let room = drop
             .drag()
-            .and_then(|drag| drag.content())
+            .map(|drag| drag.content())
             .and_then(|content| content.value(Room::static_type()).ok())
             .and_then(|value| value.get::<Room>().ok());
         if let Some(room) = room {
@@ -261,13 +261,15 @@ impl Row {
                     self.activate_action(
                         "sidebar.set-active-drop-category",
                         Some(&Some(u32::from(target_type)).to_variant()),
-                    );
+                    )
+                    .unwrap();
                     return true;
                 }
             } else if let Some(entry_type) = self.entry_type() {
                 if room.category() == RoomType::Left && entry_type == EntryType::Forget {
                     self.parent().unwrap().add_css_class("drop-active");
-                    self.activate_action("sidebar.set-active-drop-category", None);
+                    self.activate_action("sidebar.set-active-drop-category", None)
+                        .unwrap();
                     return true;
                 }
             }
@@ -277,7 +279,8 @@ impl Row {
 
     fn drop_leave(&self) {
         self.parent().unwrap().remove_css_class("drop-active");
-        self.activate_action("sidebar.set-active-drop-category", None);
+        self.activate_action("sidebar.set-active-drop-category", None)
+            .unwrap();
     }
 
     fn drop_end(&self, value: &glib::Value) -> bool {
@@ -295,7 +298,8 @@ impl Row {
                 }
             }
         }
-        self.activate_action("sidebar.set-drop-source-type", None);
+        self.activate_action("sidebar.set-drop-source-type", None)
+            .unwrap();
         ret
     }
 }
diff --git a/src/session/sidebar/selection.rs b/src/session/sidebar/selection.rs
index a0fc77b5..f4f211e5 100644
--- a/src/session/sidebar/selection.rs
+++ b/src/session/sidebar/selection.rs
@@ -32,14 +32,14 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "model",
                         "Model",
                         "The model being managed",
                         gio::ListModel::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_uint(
+                    glib::ParamSpecUInt::new(
                         "selected",
                         "Selected",
                         "The position of the selected item",
@@ -48,7 +48,7 @@ mod imp {
                         gtk::INVALID_LIST_POSITION,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "selected-item",
                         "Selected Item",
                         "The selected item",
diff --git a/src/session/sidebar/verification_row.rs b/src/session/sidebar/verification_row.rs
index fdc30c3d..95ccd770 100644
--- a/src/session/sidebar/verification_row.rs
+++ b/src/session/sidebar/verification_row.rs
@@ -33,7 +33,7 @@ mod imp {
     impl ObjectImpl for VerificationRow {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "identity-verification",
                     "Identity Verification",
                     "The identity verification of this row",
diff --git a/src/session/user.rs b/src/session/user.rs
index beb205e4..5b47b770 100644
--- a/src/session/user.rs
+++ b/src/session/user.rs
@@ -11,7 +11,7 @@ use std::sync::Arc;
 
 use log::error;
 
-#[glib::gflags("UserActions")]
+#[glib::flags(name = "UserActions")]
 pub enum UserActions {
     NONE = 0b00000000,
     VERIFY = 0b00000001,
@@ -49,42 +49,42 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "user-id",
                         "User id",
                         "The user id of this user",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display Name",
                         "The display name of the user",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "avatar",
                         "Avatar",
                         "The avatar of this user",
                         Avatar::static_type(),
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boolean(
+                    glib::ParamSpecBoolean::new(
                         "verified",
                         "Verified",
                         "Whether this user has been verified",
                         false,
                         glib::ParamFlags::READABLE,
                     ),
-                    glib::ParamSpec::new_flags(
+                    glib::ParamSpecFlags::new(
                         "allowed-actions",
                         "Allowed Actions",
                         "The actions the currently logged-in user is allowed to perform on this user.",
@@ -142,8 +142,7 @@ mod imp {
 
             obj.bind_property("display-name", obj.avatar(), "display-name")
                 .flags(glib::BindingFlags::SYNC_CREATE)
-                .build()
-                .unwrap();
+                .build();
 
             obj.init_is_verified();
         }
diff --git a/src/session/verification/identity_verification.rs 
b/src/session/verification/identity_verification.rs
index 4d4ef19d..1be3668f 100644
--- a/src/session/verification/identity_verification.rs
+++ b/src/session/verification/identity_verification.rs
@@ -26,9 +26,9 @@ use qrcode::QrCode;
 use std::time::Duration;
 use tokio::sync::mpsc;
 
-#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "VerificationState")]
+#[enum_type(name = "VerificationState")]
 pub enum State {
     Requested,
     RequestSend,
@@ -48,9 +48,9 @@ impl Default for State {
     }
 }
 
-#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::GEnum)]
+#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::Enum)]
 #[repr(u32)]
-#[genum(type_name = "VerificationMode")]
+#[enum_type(name = "VerificationMode")]
 pub enum Mode {
     CurrentSession,
     OtherSession,
@@ -63,7 +63,7 @@ impl Default for Mode {
     }
 }
 
-#[glib::gflags("VerificationSupportedMethods")]
+#[glib::flags(name = "VerificationSupportedMethods")]
 pub enum SupportedMethods {
     NONE = 0b00000000,
     SAS = 0b00000001,
@@ -154,21 +154,21 @@ mod imp {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                 vec![
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "user",
                         "User",
                         "The user to be verified",
                         User::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_object(
+                    glib::ParamSpecObject::new(
                         "session",
                         "Session",
                         "The current session",
                         Session::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "state",
                         "State",
                         "The current state of this verification",
@@ -176,7 +176,7 @@ mod imp {
                         State::default() as i32,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_enum(
+                    glib::ParamSpecEnum::new(
                         "mode",
                         "Mode",
                         "The mode of this verification",
@@ -184,7 +184,7 @@ mod imp {
                         Mode::default() as i32,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_flags(
+                    glib::ParamSpecFlags::new(
                         "supported-methods",
                         "Supported Methods",
                         "The supported methods of this verification",
@@ -192,28 +192,28 @@ mod imp {
                         SupportedMethods::default().bits(),
                         glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "display-name",
                         "Display name",
                         "The display name of this verification request",
                         None,
                         glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
-                    glib::ParamSpec::new_string(
+                    glib::ParamSpecString::new(
                         "flow-id",
                         "Flow Id",
                         "The flow id of this verification request",
                         None,
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boxed(
+                    glib::ParamSpecBoxed::new(
                         "start-time",
                         "Start Time",
                         "The time when this verification request was started",
                         glib::DateTime::static_type(),
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
-                    glib::ParamSpec::new_boxed(
+                    glib::ParamSpecBoxed::new(
                         "receive-time",
                         "Receive Time",
                         "The time when this verification request was received",
@@ -294,7 +294,7 @@ mod imp {
             }
 
             self.receive_time
-                .set(glib::DateTime::new_now_local().unwrap())
+                .set(glib::DateTime::now_local().unwrap())
                 .unwrap();
             obj.setup_timeout();
             obj.start_handler();
@@ -368,7 +368,7 @@ impl IdentityVerification {
                         ("flow-id", &request.flow_id()),
                         ("session", session),
                         ("user", user),
-                        ("start-time", &glib::DateTime::new_now_local().unwrap()),
+                        ("start-time", &glib::DateTime::now_local().unwrap()),
                     ])
                     .expect("Failed to create IdentityVerification");
 
@@ -382,12 +382,7 @@ impl IdentityVerification {
             error!("Starting a verification failed: Crypto identity wasn't found");
         }
 
-        Self::for_error(
-            mode,
-            session,
-            user,
-            &glib::DateTime::new_now_local().unwrap(),
-        )
+        Self::for_error(mode, session, user, &glib::DateTime::now_local().unwrap())
     }
 
     fn start_handler(&self) {
@@ -459,9 +454,10 @@ impl IdentityVerification {
     }
 
     fn setup_timeout(&self) {
-        let difference = glib::DateTime::new_now_local()
+        let difference = glib::DateTime::now_local()
             .unwrap()
-            .difference(self.start_time());
+            .difference(self.start_time())
+            .as_seconds();
 
         if difference < 0 {
             warn!("The verification request was sent in the future.");
@@ -620,7 +616,7 @@ impl IdentityVerification {
         });
 
         let error = Error::new(move |_| {
-            let error_label = gtk::LabelBuilder::new()
+            let error_label = gtk::Label::builder()
                 .label(&error_message)
                 .wrap(true)
                 .build();
diff --git a/src/session/verification/verification_list.rs b/src/session/verification/verification_list.rs
index 4618ca32..6d919cc6 100644
--- a/src/session/verification/verification_list.rs
+++ b/src/session/verification/verification_list.rs
@@ -65,7 +65,7 @@ mod imp {
     impl ObjectImpl for VerificationList {
         fn properties() -> &'static [glib::ParamSpec] {
             static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
-                vec![glib::ParamSpec::new_object(
+                vec![glib::ParamSpecObject::new(
                     "session",
                     "Session",
                     "The session",
diff --git a/src/utils.rs b/src/utils.rs
index be967414..6eec9379 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -66,7 +66,7 @@ use std::str::FromStr;
 
 use gettextrs::gettext;
 use gtk::gio::{self, prelude::*};
-use gtk::glib::{self, Object};
+use gtk::glib::{self, closure, Object};
 use matrix_sdk::{
     media::MediaType,
     ruma::{EventId, UInt},
@@ -74,50 +74,30 @@ use matrix_sdk::{
 };
 use mime::Mime;
 
-/// Returns an expression looking up the given property on `object`.
-pub fn prop_expr<T: IsA<Object>>(object: &T, prop: &str) -> gtk::Expression {
-    let obj_expr = gtk::ConstantExpression::new(object).upcast();
-    gtk::PropertyExpression::new(T::static_type(), Some(&obj_expr), prop).upcast()
-}
-
 // Returns an expression that is the and’ed result of the given boolean expressions.
 #[allow(dead_code)]
-pub fn and_expr(a_expr: gtk::Expression, b_expr: gtk::Expression) -> gtk::Expression {
-    gtk::ClosureExpression::new(
-        move |args| {
-            let a: bool = args[1].get().unwrap();
-            let b: bool = args[2].get().unwrap();
-            a && b
-        },
+pub fn and_expr<E: AsRef<gtk::Expression>>(a_expr: E, b_expr: E) -> gtk::ClosureExpression {
+    gtk::ClosureExpression::new::<bool, _, _>(
         &[a_expr, b_expr],
+        closure!(|_: Option<Object>, a: bool, b: bool| { a && b }),
     )
-    .upcast()
 }
 
 // Returns an expression that is the or’ed result of the given boolean expressions.
-pub fn or_expr(a_expr: gtk::Expression, b_expr: gtk::Expression) -> gtk::Expression {
-    gtk::ClosureExpression::new(
-        move |args| {
-            let a: bool = args[1].get().unwrap();
-            let b: bool = args[2].get().unwrap();
-            a || b
-        },
+pub fn or_expr<E: AsRef<gtk::Expression>>(a_expr: E, b_expr: E) -> gtk::ClosureExpression {
+    gtk::ClosureExpression::new::<bool, _, _>(
         &[a_expr, b_expr],
+        closure!(|_: Option<Object>, a: bool, b: bool| { a || b }),
     )
-    .upcast()
 }
 
 // Returns an expression that is the inverted result of the given boolean expressions.
 #[allow(dead_code)]
-pub fn not_expr(a_expr: gtk::Expression) -> gtk::Expression {
-    gtk::ClosureExpression::new(
-        move |args| {
-            let a: bool = args[1].get().unwrap();
-            !a
-        },
+pub fn not_expr<E: AsRef<gtk::Expression>>(a_expr: E) -> gtk::ClosureExpression {
+    gtk::ClosureExpression::new::<bool, _, _>(
         &[a_expr],
+        closure!(|_: Option<Object>, a: bool| { !a }),
     )
-    .upcast()
 }
 
 pub fn cache_dir() -> PathBuf {
@@ -126,7 +106,7 @@ pub fn cache_dir() -> PathBuf {
 
     if !path.exists() {
         let dir = gio::File::for_path(path.clone());
-        dir.make_directory_with_parents(gio::NONE_CANCELLABLE)
+        dir.make_directory_with_parents(gio::Cancellable::NONE)
             .unwrap();
     }
 
@@ -149,7 +129,7 @@ pub fn uint_to_i32(u: Option<UInt>) -> i32 {
 }
 
 pub fn setup_style_scheme(buffer: &sourceview::Buffer) {
-    let manager = adw::StyleManager::default().unwrap();
+    let manager = adw::StyleManager::default();
 
     buffer.set_style_scheme(style_scheme().as_ref());
 
@@ -159,14 +139,14 @@ pub fn setup_style_scheme(buffer: &sourceview::Buffer) {
 }
 
 pub fn style_scheme() -> Option<sourceview::StyleScheme> {
-    let manager = adw::StyleManager::default().unwrap();
+    let manager = adw::StyleManager::default();
     let scheme_name = if manager.is_dark() {
         "Adwaita-dark"
     } else {
         "Adwaita"
     };
 
-    sourceview::StyleSchemeManager::default().and_then(|scm| scm.scheme(scheme_name))
+    sourceview::StyleSchemeManager::default().scheme(scheme_name)
 }
 
 /// Get the unique id of the given `MediaType`.
diff --git a/src/window.rs b/src/window.rs
index 2b07cd2b..91b0de3d 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -153,7 +153,7 @@ impl Window {
                 warn!("Failed to restore previous sessions: {:?}", error);
                 let error_string = error.to_user_facing();
                 self.append_error(&Error::new(move |_| {
-                    let error_label = gtk::LabelBuilder::new()
+                    let error_label = gtk::Label::builder()
                         .label(
                             &(gettext("Unable to restore previous sessions")
                                 + ": "
@@ -188,7 +188,7 @@ impl Window {
         let is_maximized = settings.boolean("is-maximized");
 
         self.set_default_size(width, height);
-        self.set_property("maximized", &is_maximized).unwrap();
+        self.set_property("maximized", &is_maximized);
     }
 
     /// Change the default widget of the window based on the visible child
@@ -198,7 +198,7 @@ impl Window {
         if priv_.main_stack.visible_child() == Some(priv_.login.get().upcast()) {
             self.set_default_widget(Some(&priv_.login.default_widget()));
         } else {
-            self.set_default_widget(gtk::NONE_WIDGET);
+            self.set_default_widget(gtk::Widget::NONE);
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]