diff --git a/fractal-gtk/res/org.gnome.Fractal.gschema.xml b/fractal-gtk/res/org.gnome.Fractal.gschema.xml
index d9da71fc..7ecdf633 100644
--- a/fractal-gtk/res/org.gnome.Fractal.gschema.xml
+++ b/fractal-gtk/res/org.gnome.Fractal.gschema.xml
@@ -24,6 +24,31 @@
+
+ -1
+ X position of the main window on startup
+
+
+
+ -1
+ Y position of the main window on startup
+
+
+
+ 860
+ Width of the main window on startup
+
+
+
+ 640
+ Height of the main window on startup
+
+
+
+ false
+ Whether the main window is maximized on startup
+
+
diff --git a/fractal-gtk/src/app/mod.rs b/fractal-gtk/src/app/mod.rs
index ea0ae9e2..d77175ee 100644
--- a/fractal-gtk/src/app/mod.rs
+++ b/fractal-gtk/src/app/mod.rs
@@ -18,6 +18,9 @@ use crate::globals;
use crate::uibuilder;
mod connect;
+mod windowstate;
+
+use windowstate::WindowState;
static mut OP: Option>> = None;
#[macro_export]
@@ -104,6 +107,15 @@ impl App {
window.set_application(gtk_app);
window.set_title("Fractal");
+
+ let settings: gio::Settings = gio::Settings::new("org.gnome.Fractal");
+ let window_state = WindowState::load_from_gsettings(&settings);
+ window.set_default_size(window_state.width, window_state.height);
+ if window_state.is_maximized {
+ window.maximize();
+ } else if window_state.x > 0 && window_state.y > 0 {
+ window.move_(window_state.x, window_state.y);
+ }
window.show_all();
if gtk_app
@@ -177,6 +189,16 @@ impl App {
app.op.lock().unwrap().mark_active_room_messages();
});
+ let app_weak = app.downgrade();
+ app.main_window.connect_delete_event(move |window, _| {
+ let app = upgrade_weak!(app_weak, Inhibit(false));
+ let settings: gio::Settings = gio::Settings::new("org.gnome.Fractal");
+ let window_state = WindowState::from_window(window);
+ window_state.save_in_gsettings(&settings);
+ app.op.lock().unwrap().quit();
+ Inhibit(false)
+ });
+
app.op.lock().unwrap().init();
// When the application is shut down we drop our app struct
diff --git a/fractal-gtk/src/app/windowstate.rs b/fractal-gtk/src/app/windowstate.rs
new file mode 100644
index 00000000..485ffb93
--- /dev/null
+++ b/fractal-gtk/src/app/windowstate.rs
@@ -0,0 +1,55 @@
+use gio::SettingsExt;
+use gtk;
+use gtk::prelude::*;
+
+pub struct WindowState {
+ pub x: i32,
+ pub y: i32,
+ pub width: i32,
+ pub height: i32,
+ pub is_maximized: bool,
+}
+
+impl WindowState {
+ pub fn load_from_gsettings(settings: &gio::Settings) -> WindowState {
+ let x = settings.get_int("main-window-state-x");
+ let y = settings.get_int("main-window-state-y");
+ let width = settings.get_int("main-window-state-width");
+ let height = settings.get_int("main-window-state-height");
+ let is_maximized = settings.get_boolean("main-window-state-maximized");
+
+ WindowState {
+ x,
+ y,
+ width,
+ height,
+ is_maximized,
+ }
+ }
+
+ pub fn from_window(window: >k::ApplicationWindow) -> WindowState {
+ let position = window.get_position();
+ let size = window.get_size();
+ let x = position.0;
+ let y = position.1;
+ let width = size.0;
+ let height = size.1;
+ let is_maximized = window.is_maximized();
+
+ WindowState {
+ x,
+ y,
+ width,
+ height,
+ is_maximized,
+ }
+ }
+
+ pub fn save_in_gsettings(&self, settings: &gio::Settings) {
+ settings.set_int("main-window-state-x", self.x);
+ settings.set_int("main-window-state-y", self.y);
+ settings.set_int("main-window-state-width", self.width);
+ settings.set_int("main-window-state-height", self.height);
+ settings.set_boolean("main-window-state-maximized", self.is_maximized);
+ }
+}