Restore window state (size, maximized, position)

This commit is contained in:
fiaxh 2017-12-31 20:19:51 +01:00
parent 119e7cce4f
commit c7c1fb5124
6 changed files with 118 additions and 26 deletions

View file

@ -121,7 +121,7 @@ if(NOT VALA_EXECUTABLE)
unset(VALA_EXECUTABLE CACHE) unset(VALA_EXECUTABLE CACHE)
endif() endif()
find_package(Vala 0.30 REQUIRED) find_package(Vala 0.34 REQUIRED)
if(VALA_VERSION VERSION_GREATER "0.34.90" AND VALA_VERSION VERSION_LESS "0.36.1") if(VALA_VERSION VERSION_GREATER "0.34.90" AND VALA_VERSION VERSION_LESS "0.36.1")
# Due to a bug on 0.36.0 (and pre-releases), we need to disable FAST_VAPI # Due to a bug on 0.36.0 (and pre-releases), we need to disable FAST_VAPI
set(DISABLE_FAST_VAPI yes) set(DISABLE_FAST_VAPI yes)

View file

@ -12,7 +12,7 @@ Build
* C compiler * C compiler
* gettext * gettext
* ninja(-build) (recommend) * ninja(-build) (recommend)
* valac (≥ 0.30) * valac (≥ 0.34)
**Run-time dependencies** **Run-time dependencies**

View file

@ -47,7 +47,7 @@
# Search for the valac executable in the usual system paths # Search for the valac executable in the usual system paths
# Some distributions rename the valac to contain the major.minor in the binary name # Some distributions rename the valac to contain the major.minor in the binary name
find_package(GObject REQUIRED) find_package(GObject REQUIRED)
find_program(VALA_EXECUTABLE NAMES valac valac-0.36 valac-0.34 valac-0.32 valac-0.30) find_program(VALA_EXECUTABLE NAMES valac valac-0.38 valac-0.36 valac-0.34 valac-0.32)
mark_as_advanced(VALA_EXECUTABLE) mark_as_advanced(VALA_EXECUTABLE)
# Determine the valac version # Determine the valac version

View file

@ -11,6 +11,12 @@ public class Settings : Object {
send_marker_ = col_to_bool_or_default("send_marker", true); send_marker_ = col_to_bool_or_default("send_marker", true);
notifications_ = col_to_bool_or_default("notifications", true); notifications_ = col_to_bool_or_default("notifications", true);
convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true); convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true);
current_width = col_to_int_or_default("window_width", 1200);
current_height = col_to_int_or_default("window_height", 700);
is_maximized = col_to_bool_or_default("window_maximized", false);
position_x = col_to_int_or_default("window_position_x", -1);
position_y = col_to_int_or_default("window_position_y", -1);
} }
private bool col_to_bool_or_default(string key, bool def) { private bool col_to_bool_or_default(string key, bool def) {
@ -18,6 +24,11 @@ public class Settings : Object {
return val != null ? bool.parse(val) : def; return val != null ? bool.parse(val) : def;
} }
private int col_to_int_or_default(string key, int def) {
string? val = db.settings.select({db.settings.value}).with(db.settings.key, "=", key)[db.settings.value];
return val != null ? int.parse(val) : def;
}
private bool send_typing_; private bool send_typing_;
public bool send_typing { public bool send_typing {
get { return send_typing_; } get { return send_typing_; }
@ -53,6 +64,56 @@ public class Settings : Object {
convert_utf8_smileys_ = value; convert_utf8_smileys_ = value;
} }
} }
private int current_width_;
public int current_width {
get { return current_width_; }
set {
if (value == current_width_) return;
db.settings.insert().or("REPLACE").value(db.settings.key, "window_width").value(db.settings.value, value.to_string()).perform();
current_width_ = value;
}
}
private int current_height_;
public int current_height {
get { return current_height_; }
set {
if (value == current_height_) return;
db.settings.insert().or("REPLACE").value(db.settings.key, "window_height").value(db.settings.value, value.to_string()).perform();
current_height_ = value;
}
}
private bool is_maximized_;
public bool is_maximized {
get { return is_maximized_; }
set {
if (value == is_maximized_) return;
db.settings.insert().or("REPLACE").value(db.settings.key, "window_maximized").value(db.settings.value, value.to_string()).perform();
is_maximized_ = value;
}
}
private int position_x_;
public int position_x {
get { return position_x_; }
set {
if (value == position_x_) return;
db.settings.insert().or("REPLACE").value(db.settings.key, "window_position_x").value(db.settings.value, value.to_string()).perform();
position_x_ = value;
}
}
private int position_y_;
public int position_y {
get { return position_y_; }
set {
if (value == position_y_) return;
db.settings.insert().or("REPLACE").value(db.settings.key, "window_position_y").value(db.settings.value, value.to_string()).perform();
position_y_ = value;
}
}
} }
} }

View file

@ -21,10 +21,15 @@ public class UnifiedWindow : Window {
private StreamInteractor stream_interactor; private StreamInteractor stream_interactor;
private Conversation? conversation; private Conversation? conversation;
private Application app;
public UnifiedWindow(Application application, StreamInteractor stream_interactor) { public UnifiedWindow(Application application, StreamInteractor stream_interactor) {
Object(application : application, default_width : 1200, default_height : 700); Object(application : application);
this.stream_interactor = stream_interactor; this.stream_interactor = stream_interactor;
this.app = application;
restore_window_size();
this.get_style_context().add_class("dino-main"); this.get_style_context().add_class("dino-main");
setup_headerbar(); setup_headerbar();
@ -120,6 +125,30 @@ public class UnifiedWindow : Window {
} }
} }
private void restore_window_size() {
default_width = app.settings.current_width;
default_height = app.settings.current_height;
if (app.settings.is_maximized) this.maximize();
if (app.settings.position_x != -1 && app.settings.position_y != -1) {
move(app.settings.position_x, app.settings.position_y);
}
delete_event.connect(() => {
int x, y;
get_position(out x, out y);
app.settings.position_x = x;
app.settings.position_y = y;
int width, height;
get_size(out width, out height);
app.settings.current_width = width;
app.settings.current_height = height;
app.settings.is_maximized = is_maximized;
return false;
});
}
private bool on_focus_in_event() { private bool on_focus_in_event() {
stream_interactor.get_module(ChatInteraction.IDENTITY).on_window_focus_in(conversation); stream_interactor.get_module(ChatInteraction.IDENTITY).on_window_focus_in(conversation);
urgency_hint = false; urgency_hint = false;

View file

@ -62,6 +62,7 @@ public class FileProvider : Dino.FileProvider, Object {
}); });
if (content_length != null && int.parse(content_length) < 5000000) { if (content_length != null && int.parse(content_length) < 5000000) {
FileTransfer file_transfer = new FileTransfer(); FileTransfer file_transfer = new FileTransfer();
try {
Soup.Request request = session.request(message.body); Soup.Request request = session.request(message.body);
request.send_async.begin(null, (obj, res) => { request.send_async.begin(null, (obj, res) => {
try { try {
@ -84,6 +85,7 @@ public class FileProvider : Dino.FileProvider, Object {
file_transfer.info = message.body; file_transfer.info = message.body;
file_incoming(file_transfer); file_incoming(file_transfer);
}); });
} catch (Error e) { }
} }
}); });
} }