From d443a3c2509889533ca812c163056bace396b586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Wed, 14 Jun 2023 20:35:58 +0200 Subject: New upstream version 0.32.1 --- src/util/Util.vala | 2 ++ src/util/file.vala | 26 ++++++++------------------ src/util/image.vala | 8 ++++++-- src/util/misc.vala | 30 ++++++++++++------------------ src/util/string.vala | 14 ++++++++------ src/util/system.vala | 5 +++-- src/util/ui.vala | 11 +++++------ 7 files changed, 44 insertions(+), 52 deletions(-) (limited to 'src/util') diff --git a/src/util/Util.vala b/src/util/Util.vala index b87ea3a..45943d7 100644 --- a/src/util/Util.vala +++ b/src/util/Util.vala @@ -8,6 +8,8 @@ namespace Util { // Use these file attributes when loading file information for a complete FileInfo objects public const string FILE_ATTRIBUTES = "standard::*,time::*,id::file,id::filesystem,etag::value"; + public const int64 USEC_PER_SEC = 1000000; + public void init() throws Error { } diff --git a/src/util/file.vala b/src/util/file.vala index c1ee06d..652a141 100644 --- a/src/util/file.vala +++ b/src/util/file.vala @@ -31,9 +31,11 @@ public bool claim_file(File file) throws Error { // same or similar as what has been requested (adds numerals to the end of the name until a unique // one has been found). The file may exist when this function returns, and it should be // overwritten. It does *not* attempt to create the parent directory, however. +// The used parameter allows you to pass in a collection of names which should be deemed to be +// already claimed but which may not yet exist in the file system. // // This function is thread-safe. -public File? generate_unique_file(File dir, string basename, out bool collision) throws Error { +public File? generate_unique_file(File dir, string basename, out bool collision, Gee.Collection? used = null) throws Error { // create the file to atomically "claim" it File file = dir.get_child(basename); if (claim_file(file)) { @@ -51,7 +53,9 @@ public File? generate_unique_file(File dir, string basename, out bool collision) // generate a unique filename for (int ctr = 1; ctr < int.MAX; ctr++) { string new_name = (ext != null) ? "%s_%d.%s".printf(name, ctr, ext) : "%s_%d".printf(name, ctr); - + if (used != null && used.contains(new_name)) { + continue; + } file = dir.get_child(new_name); if (claim_file(file)) return file; @@ -151,11 +155,11 @@ public void delete_all_files(File dir, Gee.Set? exceptions = null, Progr } } -public time_t query_file_modified(File file) throws Error { +public DateTime query_file_modified(File file) throws Error { FileInfo info = file.query_info(FileAttribute.TIME_MODIFIED, FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null); - return info.get_modification_time().tv_sec; + return info.get_modification_date_time(); } public bool query_is_directory(File file) { @@ -199,20 +203,6 @@ public string? get_file_info_id(FileInfo info) { return info.get_attribute_string(FileAttribute.ID_FILE); } -// Breaks a uint64 skip amount into several smaller skips. -public void skip_uint64(InputStream input, uint64 skip_amount) throws GLib.Error { - while (skip_amount > 0) { - // skip() throws an error if the amount is too large, so check against ssize_t.MAX - if (skip_amount >= ssize_t.MAX) { - input.skip(ssize_t.MAX); - skip_amount -= ssize_t.MAX; - } else { - input.skip((size_t) skip_amount); - skip_amount = 0; - } - } -} - // Returns the number of files (and/or directories) within a directory. public uint64 count_files_in_directory(File dir) throws GLib.Error { if (!query_is_directory(dir)) diff --git a/src/util/image.vala b/src/util/image.vala index 0a30339..95ac998 100644 --- a/src/util/image.vala +++ b/src/util/image.vala @@ -343,7 +343,7 @@ private Cairo.Surface get_background_surface() { string color_b; var config = Config.Facade.get_instance(); - var type = config.get_transparent_background_type(); + var type = "checkered"; //config.get_transparent_background_type(); switch (type) { case "checkered": color_a = "#808080"; @@ -386,7 +386,8 @@ public void paint_pixmap_with_background (Cairo.Context ctx, Gdk.Pixbuf pixbuf, } Gdk.cairo_set_source_pixbuf(ctx, pixbuf, x, y); - ctx.paint(); + ctx.rectangle(x, y, pixbuf.width , pixbuf.height); + ctx.fill(); } // Force an axially-aligned box to be inside a rotated rectangle. @@ -422,3 +423,6 @@ Box clamp_inside_rotated_image(Box src, int img_w, int img_h, double angle_deg, src.right + right_offset, src.bottom + bottom_offset); } +double degrees_to_radians(double theta) { + return (theta * (GLib.Math.PI / 180.0)); +} diff --git a/src/util/misc.vala b/src/util/misc.vala index 6111ea3..2106621 100644 --- a/src/util/misc.vala +++ b/src/util/misc.vala @@ -54,22 +54,12 @@ public bool int_value_equals(Value a, Value b) { return (int) a == (int) b; } -public ulong timeval_to_ms(TimeVal time_val) { - return (((ulong) time_val.tv_sec) * 1000) + (((ulong) time_val.tv_usec) / 1000); -} - public ulong now_ms() { - return timeval_to_ms(TimeVal()); -} - -public ulong now_sec() { - TimeVal time_val = TimeVal(); - - return time_val.tv_sec; + return (ulong) (GLib.get_real_time() / 1000); } -public inline time_t now_time_t() { - return (time_t) now_sec(); +public int64 now_sec() { + return (ulong) (GLib.get_real_time() / Util.USEC_PER_SEC); } public string md5_file(File file) throws Error { @@ -216,14 +206,16 @@ public Gee.List? unserialize_media_sources(uchar* serialized, int s return list; } -public string format_local_datespan(Time from_date, Time to_date) { +public string format_local_datespan(DateTime from_date, DateTime to_date) { string from_format, to_format; // Ticket #3240 - Change the way date ranges are pretty- // printed if the start and end date occur on consecutive days. - if (from_date.year == to_date.year) { + if (from_date.get_year() == to_date.get_year()) { // are these consecutive dates? - if ((from_date.month == to_date.month) && (from_date.day == (to_date.day - 1))) { + // get_day_of_year() looks like it saves a bit of code, but then we would + // not recognize the change of months + if ((from_date.get_month() == to_date.get_month()) && (from_date.get_day_of_month() == (to_date.get_day_of_month() - 1))) { // Yes; display like so: Sat, July 4 - 5, 20X6 from_format = Resources.get_start_multiday_span_format_string(); to_format = Resources.get_end_multiday_span_format_string(); @@ -244,7 +236,7 @@ public string format_local_datespan(Time from_date, Time to_date) { to_date.format(to_format))); } -public string format_local_date(Time date) { +public string format_local_date(DateTime date) { return String.strip_leading_zeroes(date.format(Resources.get_long_date_format_string())); } @@ -273,7 +265,9 @@ public class OneShotScheduler { } public void at_idle() { - at_priority_idle(Priority.DEFAULT_IDLE); + // needs to be lower (higher priority) than Clutter.PRIORITY_REDRAW which is + // set at Priority.HIGH_IDLE + 50 + at_priority_idle(Priority.HIGH_IDLE + 40); } public void at_priority_idle(int priority) { diff --git a/src/util/string.vala b/src/util/string.vala index bf7e605..89424d0 100644 --- a/src/util/string.vala +++ b/src/util/string.vala @@ -13,13 +13,13 @@ public inline bool is_string_empty(string? s) { } // utf8 case sensitive compare -public int utf8_cs_compare(void *a, void *b) { - return ((string) a).collate((string) b); +public int utf8_cs_compare(string a, string b) { + return a.collate(b); } // utf8 case insensitive compare -public int utf8_ci_compare(void *a, void *b) { - return ((string) a).down().collate(((string) b).down()); +public int utf8_ci_compare(string a, string b) { + return a.down().collate(b.down()); } // utf8 array to string @@ -145,7 +145,7 @@ public string? prepare_input_text(string? text, PrepareInputTextOptions options, // Using composed form rather than GLib's default (decomposed) as NFC is the preferred form in // Linux and WWW. More importantly, Pango seems to have serious problems displaying decomposed // forms of Korean language glyphs (and perhaps others). See: - // http://trac.yorba.org/ticket/2952 + // https://bugzilla.gnome.org/show_bug.cgi?id=716914 if ((options & PrepareInputTextOptions.NORMALIZE) != 0) prepped = prepped.normalize(-1, NormalizeMode.NFC); @@ -237,6 +237,8 @@ public string remove_diacritics(string istring) { case UnicodeType.ENCLOSING_MARK: // Ignore those continue; + default: + break; } builder.append_unichar(ch); } @@ -255,7 +257,7 @@ public string to_hex_string(string str) { // A note on the collated_* and precollated_* methods: // -// A bug report (http://trac.yorba.org/ticket/3152) indicated that two different Hirigana characters +// A bug report (https://bugzilla.gnome.org/show_bug.cgi?id=717135) indicated that two different Hirigana characters // as Tag names would trigger an assertion. Investigation showed that the characters' collation // keys computed as equal when the locale was set to anything but the default locale (C) or // Japanese. A related bug was that another hash table was using str_equal, which does not use diff --git a/src/util/system.vala b/src/util/system.vala index 1e69304..48e2cc9 100644 --- a/src/util/system.vala +++ b/src/util/system.vala @@ -6,7 +6,7 @@ // Return the directory in which Shotwell is installed, or null if uninstalled. File? get_sys_install_dir(File exec_dir) { - // Assume that if the ui folder lives next to the binary, we runn in-tree + // Assume that if the ui folder lives next to the binary, we run in-tree File child = exec_dir.get_child("ui"); if (!FileUtils.test(child.get_path(), FileTest.IS_DIR | FileTest.EXISTS)) { @@ -39,7 +39,8 @@ async void show_file_in_filemanager(File file) throws Error { DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | DBusProxyFlags.DO_NOT_CONNECT_SIGNALS); var id = "%s_%s_%d_%s".printf(Environment.get_prgname(), Environment.get_host_name(), - Posix.getpid(), TimeVal().to_iso8601()); + Posix.getpid(), + GLib.get_monotonic_time().to_string()); yield manager.show_items({file.get_uri()}, id); } catch (Error e) { warning("Failed to launch file manager using DBus, using fall-back: %s", e.message); diff --git a/src/util/ui.vala b/src/util/ui.vala index 6d32738..bdc7157 100644 --- a/src/util/ui.vala +++ b/src/util/ui.vala @@ -60,7 +60,7 @@ public Gdk.Rectangle get_adjustment_page(Gtk.Adjustment hadj, Gtk.Adjustment vad } // Verifies that only the mask bits are set in the modifier field, disregarding mouse and -// key modifers that are not normally of concern (i.e. Num Lock, Caps Lock, etc.). Mask can be +// key modifiers that are not normally of concern (i.e. Num Lock, Caps Lock, etc.). Mask can be // one or more bits set, but should only consist of these values: // * Gdk.ModifierType.SHIFT_MASK // * Gdk.ModifierType.CONTROL_MASK @@ -87,16 +87,15 @@ public bool has_only_key_modifier(Gdk.ModifierType field, Gdk.ModifierType mask) } bool is_pointer_over(Gdk.Window window) { - Gdk.DeviceManager? devmgr = window.get_display().get_device_manager(); - if (devmgr == null) { - debug("No device for display"); + var seat = window.get_display().get_default_seat(); + if (seat == null) { + debug("No seat for display"); return false; } int x, y; - devmgr.get_client_pointer().get_position(null, out x, out y); - //gdk_device_get_position(devmgr.get_client_pointer(), null, out x, out y); + seat.get_pointer().get_position(null, out x, out y); return x >= 0 && y >= 0 && x < window.get_width() && y < window.get_height(); } -- cgit v1.2.3