diff --git a/data/resources/assets/homeserver.svg b/data/resources/assets/homeserver.svg
new file mode 100644
index 00000000..4d0940cf
--- /dev/null
+++ b/data/resources/assets/homeserver.svg
@@ -0,0 +1,62 @@
+
+
diff --git a/data/resources/resources.gresource.xml b/data/resources/resources.gresource.xml
index fb7d7b4e..c8d2868d 100644
--- a/data/resources/resources.gresource.xml
+++ b/data/resources/resources.gresource.xml
@@ -1,6 +1,7 @@
+ assets/homeserver.svg
assets/other-device.svg
assets/setup-complete.svg
assets/welcome.svg
@@ -52,6 +53,7 @@
ui/greeter.ui
ui/identity-verification-widget.ui
ui/in-app-notification.ui
+ ui/login-advanced-dialog.ui
ui/login.ui
ui/media-viewer.ui
ui/member-menu.ui
diff --git a/data/resources/style.css b/data/resources/style.css
index 331a8eab..38dc3fa1 100644
--- a/data/resources/style.css
+++ b/data/resources/style.css
@@ -81,10 +81,14 @@ headerbar .suggested-action {
/* Login */
-.login {
+login {
min-width: 250px;
}
+login entry {
+ padding: 18px 24px;
+}
+
/* Session */
.session-loading-spinner {
diff --git a/data/resources/ui/login-advanced-dialog.ui b/data/resources/ui/login-advanced-dialog.ui
new file mode 100644
index 00000000..762d4407
--- /dev/null
+++ b/data/resources/ui/login-advanced-dialog.ui
@@ -0,0 +1,32 @@
+
+
+
+ True
+ Homeserver Discovery
+ True
+ 500
+ 300
+ false
+
+
+
+
+
diff --git a/data/resources/ui/login.ui b/data/resources/ui/login.ui
index 0743eeee..790c4bf4 100644
--- a/data/resources/ui/login.ui
+++ b/data/resources/ui/login.ui
@@ -12,9 +12,9 @@
-
- app.show-greeter
+
go-previous-symbolic
+ login.prev
@@ -34,82 +34,156 @@
True
- credentials
+ homeserver
- 400
- 300
- center
-
+ 360
+ 360
+ 0
+ 24
+ 24
+ 24
+
vertical
- 18
+ center
+ 24
+
+
+
+
+ resource:///org/gnome/FractalNext/assets/homeserver.svg
+
+
+
+
-
+
+ vertical
+ 6
-
- False
- False
- False
-
-
- True
- GTK_INPUT_PURPOSE_URL
- Homeserver
- 6
- 6
- 6
- 6
-
-
+
+
+ true
+ document-edit-symbolic
+ false
+ false
-
- False
- False
- False
-
-
- True
- Matrix Username
- 6
- 6
- 6
- 6
-
-
+
+
+ left
+ 0.0
+ 6
+ 6
+ true
+ true
+
+
+
+
+
+
+
+ center
+ Advanced…
+ login.open-advanced
+
+
+
+
+
+
+
+
+
+
+ password
+
+
+ 360
+ 360
+ center
+
+
+ vertical
+ 30
+
+
+ vertical
+ 6
+ center
+
+
+
-
- False
- False
- False
-
-
- True
- True
- Password
- 6
- 6
- 6
- 6
+
+ 6
+ center
+
+ Homeserver URL
+
+
+ user-home-symbolic
-
+
+
+
+
+
+
+
+
+
+
+
+ true
+ Matrix Username
+ document-edit-symbolic
+ false
+ false
-
- True
- _Forgot Password?
- https://app.element.io/#/forgot_password
+
+ vertical
+ 12
+
+
+
+ True
+ True
+ Password
+
+
+
+
+ True
+ _Forgot Password?
+ https://app.element.io/#/forgot_password
+
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2275d5bd..39576bb6 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -25,6 +25,7 @@ data/resources/ui/event-menu.ui
data/resources/ui/event-source-dialog.ui
data/resources/ui/greeter.ui
data/resources/ui/identity-verification-widget.ui
+data/resources/ui/login-advanced-dialog.ui
data/resources/ui/login.ui
data/resources/ui/member-menu.ui
data/resources/ui/room-creation.ui
@@ -35,6 +36,7 @@ data/resources/ui/sidebar.ui
# Rust files
src/application.rs
+src/login.rs
src/secret.rs
src/session/account_settings/devices_page/device_list.rs
src/session/account_settings/devices_page/device_row.rs
diff --git a/src/login.rs b/src/login.rs
index 8129f594..c477ea4c 100644
--- a/src/login.rs
+++ b/src/login.rs
@@ -1,12 +1,25 @@
-use adw::subclass::prelude::BinImpl;
-use gtk::{self, glib, glib::clone, prelude::*, subclass::prelude::*, CompositeTemplate};
-use log::debug;
+use adw::{prelude::*, subclass::prelude::BinImpl};
+use gettextrs::gettext;
+use gtk::{self, glib, glib::clone, subclass::prelude::*, CompositeTemplate};
+use log::{debug, warn};
+use matrix_sdk::{
+ config::RequestConfig,
+ ruma::{
+ api::client::unversioned::get_supported_versions, identifiers::Error as IdentifierError,
+ ServerName, UserId,
+ },
+ Client, Result as MatrixResult,
+};
+use tokio::task::JoinHandle;
use url::{ParseError, Url};
-use crate::{components::SpinnerButton, Session};
+use crate::{
+ components::SpinnerButton, error::Error, login_advanced_dialog::LoginAdvancedDialog, spawn,
+ spawn_tokio, user_facing_error::UserFacingError, Session,
+};
mod imp {
- use std::cell::RefCell;
+ use std::cell::{Cell, RefCell};
use glib::{
subclass::{InitializingObject, Signal},
@@ -21,18 +34,28 @@ mod imp {
pub struct Login {
pub current_session: RefCell