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 {