|
|
|
|
@ -1,20 +1,17 @@
|
|
|
|
|
use gio; |
|
|
|
|
use gtk; |
|
|
|
|
use gtk::prelude::*; |
|
|
|
|
use ruma_client_api::r0 as api; |
|
|
|
|
use std::env; |
|
|
|
|
use std::{env, sync, time, thread}; |
|
|
|
|
use matrix_client; |
|
|
|
|
|
|
|
|
|
// TODO: Is this the correct format for GApplication IDs?
|
|
|
|
|
const APP_ID: &'static str = "jplatte.ruma_gtk"; |
|
|
|
|
|
|
|
|
|
pub struct App { |
|
|
|
|
gtk_app: gtk::Application, |
|
|
|
|
matrix_connection: Option<MatrixConnection>, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub struct MatrixConnection { |
|
|
|
|
// reqwest::Client
|
|
|
|
|
matrix_access_token: String, |
|
|
|
|
matrix_user_id: String, |
|
|
|
|
gtk_builder: gtk::Builder, |
|
|
|
|
dispatch_rx: sync::mpsc::Receiver<Box<Fn(>k::Builder) + Send>>, |
|
|
|
|
matrix_client_thread_join_handle: thread::JoinHandle<()>, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl App { |
|
|
|
|
@ -25,32 +22,46 @@ impl App {
|
|
|
|
|
let gtk_app = gtk::Application::new(Some(APP_ID), gio::ApplicationFlags::empty()) |
|
|
|
|
.expect("Failed to initialize GtkApplication"); |
|
|
|
|
|
|
|
|
|
let builder = gtk::Builder::new_from_file("res/main_window.glade"); |
|
|
|
|
let gtk_builder = gtk::Builder::new_from_file("res/main_window.glade"); |
|
|
|
|
|
|
|
|
|
let gtk_builder2 = gtk_builder.clone(); |
|
|
|
|
gtk_app.connect_activate(move |app| { |
|
|
|
|
let user_button: gtk::Button = builder.get_object("user_button") |
|
|
|
|
let user_button: gtk::Button = gtk_builder2.get_object("user_button") |
|
|
|
|
.expect("Couldn't find user_button in ui file."); |
|
|
|
|
|
|
|
|
|
let user_menu: gtk::Popover = builder.get_object("user_menu") |
|
|
|
|
let user_menu: gtk::Popover = gtk_builder2.get_object("user_menu") |
|
|
|
|
.expect("Couldn't find user_menu in ui file."); |
|
|
|
|
|
|
|
|
|
user_button.connect_clicked(move |_| user_menu.show()); |
|
|
|
|
|
|
|
|
|
// Set up shutdown callback
|
|
|
|
|
let window: gtk::Window = builder.get_object("main_window") |
|
|
|
|
let window: gtk::Window = gtk_builder2.get_object("main_window") |
|
|
|
|
.expect("Couldn't find main_window in ui file."); |
|
|
|
|
|
|
|
|
|
let app2 = app.clone(); |
|
|
|
|
window.connect_delete_event(move |_, _| { |
|
|
|
|
app2.quit(); |
|
|
|
|
Inhibit(false) |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
window.set_application(Some(app)); |
|
|
|
|
window.show_all(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
let (dispatch_tx, dispatch_rx) = sync::mpsc::channel::<Box<Fn(>k::Builder) + Send>>(); |
|
|
|
|
|
|
|
|
|
let matrix_client_thread_join_handle = |
|
|
|
|
thread::spawn(move || matrix_client::run_client_main(dispatch_tx)); |
|
|
|
|
|
|
|
|
|
App { |
|
|
|
|
gtk_app: gtk_app, |
|
|
|
|
matrix_connection: None, |
|
|
|
|
gtk_builder: gtk_builder, |
|
|
|
|
dispatch_rx: dispatch_rx, |
|
|
|
|
matrix_client_thread_join_handle: matrix_client_thread_join_handle, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub fn run(&self) { |
|
|
|
|
pub fn run(self) { |
|
|
|
|
// Might just be the only way to go from impl Iterator<Item=String> to &[&str]
|
|
|
|
|
let args = env::args().collect::<Vec<_>>(); |
|
|
|
|
let mut args_refs = Vec::<&str>::new(); |
|
|
|
|
@ -59,15 +70,19 @@ impl App {
|
|
|
|
|
args_refs.push(r); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
self.gtk_app.run(args_refs.len() as i32, &args_refs); |
|
|
|
|
let dispatch_rx = self.dispatch_rx; |
|
|
|
|
let gtk_builder = self.gtk_builder; |
|
|
|
|
gtk::idle_add(move || { |
|
|
|
|
if let Ok(dispatch_fn) = dispatch_rx.recv_timeout(time::Duration::from_millis(5)) { |
|
|
|
|
dispatch_fn(>k_builder); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Continue(true) |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
/*let client = reqwest::Client::new().unwrap();
|
|
|
|
|
let res = client.post("https://matrix.org/_matrix/client/r0/register?kind=guest") |
|
|
|
|
.body("{}") |
|
|
|
|
.send() |
|
|
|
|
.unwrap() |
|
|
|
|
.json::<api::account::register::Response>(); |
|
|
|
|
self.gtk_app.run(args_refs.len() as i32, &args_refs); |
|
|
|
|
|
|
|
|
|
println!("{:?}", res);*/ |
|
|
|
|
// Clean up
|
|
|
|
|
self.matrix_client_thread_join_handle.join(); |
|
|
|
|
} |
|
|
|
|
} |