diff --git a/data/com.github.bleakgrey.tootle.gschema.xml b/data/com.github.bleakgrey.tootle.gschema.xml
index 35e4ce4..140e5f6 100644
--- a/data/com.github.bleakgrey.tootle.gschema.xml
+++ b/data/com.github.bleakgrey.tootle.gschema.xml
@@ -37,6 +37,9 @@
false
+
+ false
+
-1
diff --git a/src/Desktop.vala b/src/Desktop.vala
index 355424e..dbc7ecc 100644
--- a/src/Desktop.vala
+++ b/src/Desktop.vala
@@ -1,88 +1,100 @@
+using GLib;
+
public class Tootle.Desktop {
- // Open URI in the user's default application associated with it
- public static bool open_uri (string uri) {
- try {
- Gtk.show_uri (null, uri, Gdk.CURRENT_TIME);
- }
- catch (GLib.Error e){
- try {
- string[] spawn_args = {"/usr/bin/xdg-open", uri};
- Process.spawn_sync (null, spawn_args, null, SpawnFlags.SEARCH_PATH, null, null, null);
- }
- catch (GLib.Error e){
- warning ("Can't open %s: %s", uri, e.message);
- if (e.message == "Operation not supported") {
- app.error (_("Open this in a web browser:\n\n"+uri),"");
- } else {
- app.error (_("Error"), e.message);
- }
- }
- }
- return true;
- }
+ // Open a URI in the user's default application
+ public static bool open_uri (string uri) {
+ message (@"Opening URI: $uri");
+ try {
+ Gtk.show_uri (null, uri, Gdk.CURRENT_TIME);
+ }
+ catch (Error e){
+ try {
+ string[] spawn_args = {"/usr/bin/xdg-open", uri};
+ Process.spawn_sync (null, spawn_args, null, SpawnFlags.SEARCH_PATH, null, null, null);
+ }
+ catch (Error e){
+ warning (@"Can't open URI \"$uri\": $(e.message)");
+ app.error (_("Open this URL in your browser:\n\n%s").printf (uri), "");
+ }
+ }
+ return true;
+ }
- // Copy a string to the clipboard
- public static void copy (string str) {
- var display = window.get_display ();
- var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD);
- clipboard.set_text (Widgets.RichLabel.restore_entities (str), -1);
- }
+ // Copy a string to the clipboard
+ public static void copy (string str) {
+ var display = window.get_display ();
+ var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD);
+ clipboard.set_text (Widgets.RichLabel.restore_entities (str), -1);
+ }
- // Download a file from the web to a user's configured Downloads folder
- public delegate void DownloadCallback (string path);
- public static void download (string url, DownloadCallback? cb = null, Network.ErrorCallback? ecb = null) {
- info (@"Downloading file: $url...");
+ public static string get_uri_host (string uri) {
+ var p1 = uri;
+ if ("//" in uri)
+ p1 = uri.split ("//")[1];
- var i = url.last_index_of ("/");
- var name = url.substring (i + 1, url.length - i - 1);
- if (name == null)
- name = _("Unknown Attachment");
+ return p1.split ("/")[0];
+ }
- var downloads = GLib.Environment.get_user_special_dir (UserDirectory.DOWNLOAD);
- var dir_path = @"$downloads/$(Build.NAME)";
- var file_path = @"$dir_path/$name";
+ // Download a file from the web to a user's configured Downloads folder
+ public delegate void DownloadCallback (string path);
+ public static void download (string url, owned DownloadCallback cb, owned Network.ErrorCallback ecb) {
+ message (@"Downloading file: $url...");
- new Request.GET (url)
- .then ((sess, msg) => {
- try {
- var dir = File.new_for_path (dir_path);
- if (!dir.query_exists ())
- dir.make_directory ();
+ var file_name = Path.get_basename (url);
+ var dir_name = Path.get_dirname (url);
- var file = File.new_for_path (file_path);
- if (!file.query_exists ()) {
- var data = msg.response_body.data;
- FileOutputStream stream = file.create (FileCreateFlags.PRIVATE);
- stream.write (data);
- }
- info ("OK");
- cb (file_path);
+ var dir_path = Path.build_path (
+ Path.DIR_SEPARATOR_S,
+ Environment.get_user_special_dir (UserDirectory.DOWNLOAD),
+ Build.NAME,
+ get_uri_host (dir_name));
- } catch (Error e) {
- warning ("Error: %s\n", e.message);
- ecb (0, e.message);
- }
- })
- .on_error ((code, reason) => ecb)
- .exec ();
- }
+ var file_path = Path.build_path (
+ Path.DIR_SEPARATOR_S,
+ dir_path,
+ str_hash (dir_name).to_string () + file_name);
- public static string fallback_icon (string normal, string fallback, string fallback2 = "broken") {
- var theme = Gtk.IconTheme.get_default ();
- if (theme.has_icon (normal))
- return normal;
- else
- return theme.has_icon (fallback) ? fallback : fallback2;
- }
+ new Request.GET (url)
+ .then ((sess, msg) => {
+ try {
+ var dir = File.new_for_path (dir_path);
+ if (!dir.query_exists ())
+ dir.make_directory ();
+
+ var file = File.new_for_path (file_path);
+ if (!file.query_exists ()) {
+ var data = msg.response_body.data;
+ FileOutputStream stream = file.create (FileCreateFlags.PRIVATE);
+ stream.write (data);
+ }
+ message (@"OK: File written to: $file_path");
+ cb (file_path);
+
+ } catch (Error e) {
+ warning ("Error: %s\n", e.message);
+ ecb (0, e.message);
+ }
+ })
+ .on_error ((owned) ecb)
+ .exec ();
+ }
+
+ public static string fallback_icon (string normal, string fallback, string fallback2 = "broken") {
+ var theme = Gtk.IconTheme.get_default ();
+ if (theme.has_icon (normal))
+ return normal;
+ else
+ return theme.has_icon (fallback) ? fallback : fallback2;
+ }
public static Gdk.Pixbuf icon_to_pixbuf (string name) {
var theme = Gtk.IconTheme.get_default ();
return theme.load_icon (name, 32, Gtk.IconLookupFlags.GENERIC_FALLBACK);
}
- public static void set_hotkey_tooltip (Gtk.Widget widget, string? description, string[] accelerators) {
- widget.tooltip_markup = Granite.markup_accel_tooltip (accelerators, description);
- }
+ public static void set_hotkey_tooltip (Gtk.Widget widget, string? description, string[] accelerators) {
+ widget.tooltip_markup = Granite.markup_accel_tooltip (accelerators, description);
+ }
}
diff --git a/src/Services/Settings.vala b/src/Services/Settings.vala
index 6392de7..63b6238 100644
--- a/src/Services/Settings.vala
+++ b/src/Services/Settings.vala
@@ -11,6 +11,7 @@ public class Tootle.Settings : GLib.Settings {
public int post_text_size { get; set; }
public bool live_updates { get; set; }
public bool public_live_updates { get; set; }
+ public bool aggressive_resolving { get; set; }
public int window_x { get; set; }
public int window_y { get; set; }
@@ -28,6 +29,7 @@ public class Tootle.Settings : GLib.Settings {
init ("post-text-size");
init ("live-updates");
init ("public-live-updates");
+ init ("aggressive-resolving");
init ("window-x");
init ("window-y");
diff --git a/src/Widgets/Attachment/Slot.vala b/src/Widgets/Attachment/Slot.vala
index eb890f6..6f9cc69 100644
--- a/src/Widgets/Attachment/Slot.vala
+++ b/src/Widgets/Attachment/Slot.vala
@@ -48,13 +48,16 @@ public class Tootle.Widgets.Attachment.Slot : FlowBoxChild {
void download () {
Desktop.download (attachment.url, path => {
- app.toast (_("Attachment downloaded"));
- });
+ app.toast (_("File saved to Downloads"));
+ },
+ () => {});
}
+
void open () {
Desktop.download (attachment.url, path => {
Desktop.open_uri (path);
- });
+ },
+ () => {});
}
protected virtual bool on_clicked (EventButton ev) {
diff --git a/src/Widgets/RichLabel.vala b/src/Widgets/RichLabel.vala
index 75f9512..af37a73 100644
--- a/src/Widgets/RichLabel.vala
+++ b/src/Widgets/RichLabel.vala
@@ -58,7 +58,7 @@ public class Tootle.Widgets.RichLabel : Label {
return true;
}
- var resolve = "@" in url;
+ var resolve = settings.aggressive_resolving || ("@" in url);
if (!resolve)
Desktop.open_uri (url);
else {