~mil/mepo-devel

Zig 0.14: Here we go again v2 PROPOSED

LN Liberda: 7
 Zig 0.14: Here we go again
 Zig 0.14: Name types more explicitly
 Zig 0.14: Rename Mepo.config to Mepo.config_contents
 Zig 0.14: std.posix.sigaction does not error
 Zig 0.14: QueueHashMap.pop() might pop nothing
 Zig 0.14: std.mem.split -> std.mem.splitSequence
 Zig 0.14: std.mem.tokenize -> std.mem.tokenizeSequence

 44 files changed, 70 insertions(+), 62 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~mil/mepo-devel/patches/57996/mbox | git am -3
Learn more about email & git

[PATCH v2 1/7] Zig 0.14: Here we go again Export this patch

---
 src/main.zig | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main.zig b/src/main.zig
index c6fafbb..39ea01d 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -12,8 +12,8 @@ const utildbg = @import("./util/utildbg.zig");
pub fn main() !void {
    comptime {
        const v = builtin.zig_version;
        if (v.major != 0 or v.minor != 13)
            @panic("Must be built against Zig 0.13.x");
        if (v.major != 0 or v.minor != 14)
            @panic("Must be built against Zig 0.14.x");
    }

    const allocator = std.heap.c_allocator;
-- 
2.48.1

[PATCH v2 2/7] Zig 0.14: Name types more explicitly Export this patch

---
 src/Mepo.zig                  | 6 +++---
 src/api/bind_button.zig       | 2 +-
 src/api/bind_click.zig        | 4 ++--
 src/api/bind_gesture.zig      | 4 ++--
 src/api/bind_key.zig          | 4 ++--
 src/api/bind_quit.zig         | 2 +-
 src/api/bind_signal.zig       | 2 +-
 src/api/bind_timer.zig        | 4 ++--
 src/api/cache_dlbbox.zig      | 2 +-
 src/api/cache_dlradius.zig    | 2 +-
 src/api/cache_queueclear.zig  | 2 +-
 src/api/center_on_mouse.zig   | 2 +-
 src/api/center_on_pin.zig     | 2 +-
 src/api/clipcopy.zig          | 2 +-
 src/api/clippaste.zig         | 2 +-
 src/api/filedump.zig          | 2 +-
 src/api/fileload.zig          | 2 +-
 src/api/move_relative.zig     | 2 +-
 src/api/pin_activate.zig      | 2 +-
 src/api/pin_add.zig           | 2 +-
 src/api/pin_cycle.zig         | 2 +-
 src/api/pin_deactivate.zig    | 2 +-
 src/api/pin_delete.zig        | 2 +-
 src/api/pin_groupactivate.zig | 2 +-
 src/api/pin_meta.zig          | 2 +-
 src/api/pin_purge.zig         | 2 +-
 src/api/pin_transfer.zig      | 2 +-
 src/api/prefinc.zig           | 2 +-
 src/api/prefset_n.zig         | 2 +-
 src/api/prefset_t.zig         | 2 +-
 src/api/preftoggle.zig        | 2 +-
 src/api/quit.zig              | 2 +-
 src/api/shellpipe_async.zig   | 2 +-
 src/api/shellpipe_sync.zig    | 2 +-
 src/api/zoom_relative.zig     | 2 +-
 src/blit/blit.zig             | 6 +++---
 36 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/src/Mepo.zig b/src/Mepo.zig
index d8c28d6..a7ed01f 100644
--- a/src/Mepo.zig
+++ b/src/Mepo.zig
@@ -341,8 +341,8 @@ fn jsonapi_execute_parseargs(
    map: std.json.ArrayHashMap(std.json.Value),
) anyerror![types.MepoFnNargs]types.MepoArg {
    var args: [types.MepoFnNargs]types.MepoArg = .{
      .{.Number = 0}, .{.Number = 0}, .{.Number = 0},
      .{.Number = 0}, .{.Number = 0}, .{.Number = 0},
        .{ .Number = 0 }, .{ .Number = 0 }, .{ .Number = 0 },
        .{ .Number = 0 }, .{ .Number = 0 }, .{ .Number = 0 },
    };
    for (fn_spec_args, 0..) |spec_arg, i| {
        if (map.map.get(spec_arg.name)) |arg| {
@@ -457,7 +457,7 @@ fn dispatch_check_timers(mepo: *Self) !void {
        const timer_jsonapi = kv.value_ptr.*;
        if (sdl.SDL_GetTicks() > timer_input.created_at_ticks + (timer_input.interval_seconds * 1000)) {
            mepo.jsonapi_execute(timer_jsonapi) catch unreachable;
            const new_timer = .{
            const new_timer = types.TimerInput{
                .created_at_ticks = sdl.SDL_GetTicks(),
                .interval_seconds = timer_input.interval_seconds,
            };
diff --git a/src/api/bind_button.zig b/src/api/bind_button.zig
index 97a41df..0006cc5 100644
--- a/src/api/bind_button.zig
+++ b/src/api/bind_button.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_button",
    .desc = "Create a UI button which executes a JSON commands. UI buttons appear aligned in the bottom right of the screen or the top left alongside the pin details overlay (see first argument).",
    .args = &.{
diff --git a/src/api/bind_click.zig b/src/api/bind_click.zig
index 0a01e48..54e66cf 100644
--- a/src/api/bind_click.zig
+++ b/src/api/bind_click.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_click",
    .desc = "Bind a particular number of successive clicks to run a JSON API expressions.",
    .args = &.{
@@ -23,7 +23,7 @@ fn bind_click(mepo: *Mepo, button: u8, clicks: i8, expression: []const u8) !void
    utildbg.log("Binding click: button={d} clicks={d} to expression {s}\n", .{ button, clicks, expression });

    const sdl_button: u8 = if (button == 1) sdl.SDL_BUTTON_LEFT else sdl.SDL_BUTTON_RIGHT;
    const click = .{ .button = sdl_button, .clicks = clicks };
    const click = types.ClickInput{ .button = sdl_button, .clicks = clicks };

    if (mepo.table_clicks.get(click)) |heap_str| {
        mepo.allocator.free(heap_str);
diff --git a/src/api/bind_gesture.zig b/src/api/bind_gesture.zig
index 66fc2a2..e808b69 100644
--- a/src/api/bind_gesture.zig
+++ b/src/api/bind_gesture.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_gesture",
    .desc = "Bind a multitouch gesture event to execute JSON API expressions.",
    .args = &.{
@@ -27,7 +27,7 @@ fn execute(mepo: *Mepo, args: [types.MepoFnNargs]types.MepoArg) !void {
fn bind_gesture(mepo: *Mepo, action: types.GestureInputAction, fingers: u8, direction: types.GestureInputDirection, expression: []const u8) !void {
    utildbg.log("Binding gesture: fingers={} action={} direction={} to expression {s}\n", .{ fingers, action, direction, expression });

    const gest = .{
    const gest = types.GestureInput{
        .n_fingers = fingers,
        .action = action,
        .direction = direction,
diff --git a/src/api/bind_key.zig b/src/api/bind_key.zig
index 2c00aea..2b36816 100644
--- a/src/api/bind_key.zig
+++ b/src/api/bind_key.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_key",
    .desc = "Bind a key combination to execute a JSON API expressions.",
    .args = &.{
@@ -39,7 +39,7 @@ fn bind_key(mepo: *Mepo, mod_str: [:0]const u8, key_str: [:0]const u8, expressio
        break :m modifier;
    };

    const key: types.KeyInput = .{
    const key = types.KeyInput{
        .keymod = @intCast(keymod),
        .key = std.ascii.toLower(key_str[0]),
    };
diff --git a/src/api/bind_quit.zig b/src/api/bind_quit.zig
index 90eacbe..c8eafce 100644
--- a/src/api/bind_quit.zig
+++ b/src/api/bind_quit.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_quit",
    .desc = "Bind JSON API expressions to run on quitting the application.",
    .args = &.{
diff --git a/src/api/bind_signal.zig b/src/api/bind_signal.zig
index 99e5296..c866eab 100644
--- a/src/api/bind_signal.zig
+++ b/src/api/bind_signal.zig
@@ -5,7 +5,7 @@ const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");
const utilsdl = @import("../util/utilsdl.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_signal",
    .desc = "Bind a signal to execute JSON API expressions.",
    .args = &.{
diff --git a/src/api/bind_timer.zig b/src/api/bind_timer.zig
index 00c242f..c6e10c4 100644
--- a/src/api/bind_timer.zig
+++ b/src/api/bind_timer.zig
@@ -5,7 +5,7 @@ const sdl = @import("../sdlshim.zig");
const utildbg = @import("../util/utildbg.zig");
const utilsdl = @import("../util/utilsdl.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "bind_timer",
    .desc = "Bind a timer to execute JSON API expressions at the given interval.",
    .args = &.{
@@ -23,7 +23,7 @@ fn bind_timer(mepo: *Mepo, interval_seconds: u32, expression: []const u8) !void
    utildbg.log("Binding timer: interval seconds={d} to expression {s}\n", .{ interval_seconds, expression });

    const expression_heap_allocated = try mepo.allocator.dupe(u8, expression);
    const timer: types.TimerInput = .{
    const timer = types.TimerInput{
        .interval_seconds = interval_seconds,
        .created_at_ticks = sdl.SDL_GetTicks(),
    };
diff --git a/src/api/cache_dlbbox.zig b/src/api/cache_dlbbox.zig
index 9585c93..f115097 100644
--- a/src/api/cache_dlbbox.zig
+++ b/src/api/cache_dlbbox.zig
@@ -6,7 +6,7 @@ const utilconversion = @import("../util/utilconversion.zig");
const utildbg = @import("../util/utildbg.zig");
const config = @import("../config.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "cache_dlbbox",
    .desc = "Queue tiles for a bounding box to download to the cache in the background for the given zoom levels. Writes directly to filesystem cache (path determined by `tile_cache_dir` preference) as tiles are downloaded.",
    .args = &.{
diff --git a/src/api/cache_dlradius.zig b/src/api/cache_dlradius.zig
index dd98b3e..58ff406 100644
--- a/src/api/cache_dlradius.zig
+++ b/src/api/cache_dlradius.zig
@@ -6,7 +6,7 @@ const utilconversion = @import("../util/utilconversion.zig");
const utildbg = @import("../util/utildbg.zig");
const config = @import("../config.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "cache_dlradius",
    .desc = "Queue tiles for a bounding box to download to the cache in the background for the given zoom levels. Writes directly to filesystem cache (path determined by `tile_cache_dir` preference) as tiles are downloaded.",
    .args = &.{
diff --git a/src/api/cache_queueclear.zig b/src/api/cache_queueclear.zig
index 661406e..582262f 100644
--- a/src/api/cache_queueclear.zig
+++ b/src/api/cache_queueclear.zig
@@ -5,7 +5,7 @@ const utilconversion = @import("../util/utilconversion.zig");
const utildbg = @import("../util/utildbg.zig");
const config = @import("../config.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "cache_queueclear",
    .desc = "Clear any queued background downloading process queued with `cache_dlbbox` or `cache_dlradius`. Note this does not remove filesystem tiles, but simply stops in-progress downloading.",
    .args = &.{},
diff --git a/src/api/center_on_mouse.zig b/src/api/center_on_mouse.zig
index 4df40fe..a0161b2 100644
--- a/src/api/center_on_mouse.zig
+++ b/src/api/center_on_mouse.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const sdl = @import("../sdlshim.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "center_on_mouse",
    .desc = "Center the map on the current position of the mouse.",
    .args = &.{},
diff --git a/src/api/center_on_pin.zig b/src/api/center_on_pin.zig
index e69302e..5752497 100644
--- a/src/api/center_on_pin.zig
+++ b/src/api/center_on_pin.zig
@@ -3,7 +3,7 @@ const types = @import("../types.zig");
const std = @import("std");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "center_on_pin",
    .desc = "Center the map on the currently active pin.",
    .args = &.{},
diff --git a/src/api/clipcopy.zig b/src/api/clipcopy.zig
index 99182f1..91cd089 100644
--- a/src/api/clipcopy.zig
+++ b/src/api/clipcopy.zig
@@ -6,7 +6,7 @@ const utildbg = @import("../util/utildbg.zig");
const utilsdl = @import("../util/utilsdl.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "clipcopy",
    .desc = "Copy the current map coordinates to the clipboard; will be in format: `lat lon`.",
    .args = &.{},
diff --git a/src/api/clippaste.zig b/src/api/clippaste.zig
index 34edac8..d2de888 100644
--- a/src/api/clippaste.zig
+++ b/src/api/clippaste.zig
@@ -6,7 +6,7 @@ const utildbg = @import("../util/utildbg.zig");
const utilsdl = @import("../util/utilsdl.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "clippaste",
    .desc = "Extract clipboard contents and either center on coordinate (if clipboard content matches `lat lon` format); otherwise run clipboard contents as JSON API expressions.",
    .args = &.{},
diff --git a/src/api/filedump.zig b/src/api/filedump.zig
index 245587a..91191c9 100644
--- a/src/api/filedump.zig
+++ b/src/api/filedump.zig
@@ -7,7 +7,7 @@ const utilfile = @import("../util/utilfile.zig");
const utilsdl = @import("../util/utilsdl.zig");
const utilprefs = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "filedump",
    .desc = "Save the current state of pins and/or preferences to a file as JSON API expressions.",
    .args = &.{
diff --git a/src/api/fileload.zig b/src/api/fileload.zig
index 396b1a8..1151d78 100644
--- a/src/api/fileload.zig
+++ b/src/api/fileload.zig
@@ -3,7 +3,7 @@ const types = @import("../types.zig");
const std = @import("std");
const utilfile = @import("../util/utilfile.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "fileload",
    .desc = "Load JSON API expressions from an arbitrary filesystem file.",
    .args = &.{
diff --git a/src/api/move_relative.zig b/src/api/move_relative.zig
index 771d81a..03668a9 100644
--- a/src/api/move_relative.zig
+++ b/src/api/move_relative.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "move_relative",
    .desc = "Move the map by a relative x/y amount.",
    .args = &.{
diff --git a/src/api/pin_activate.zig b/src/api/pin_activate.zig
index 323fa36..6db31a0 100644
--- a/src/api/pin_activate.zig
+++ b/src/api/pin_activate.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_activate",
    .desc = "Activate a pin by its handle.",
    .args = &.{
diff --git a/src/api/pin_add.zig b/src/api/pin_add.zig
index bc5f870..b849984 100644
--- a/src/api/pin_add.zig
+++ b/src/api/pin_add.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_add",
    .desc = "Add a pin to the map.",
    .args = &.{
diff --git a/src/api/pin_cycle.zig b/src/api/pin_cycle.zig
index 24ff857..1404d65 100644
--- a/src/api/pin_cycle.zig
+++ b/src/api/pin_cycle.zig
@@ -3,7 +3,7 @@ const types = @import("../types.zig");
const std = @import("std");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_cycle",
    .desc = "Cycle the currently focused pin group pin.",
    .args = &.{
diff --git a/src/api/pin_deactivate.zig b/src/api/pin_deactivate.zig
index b20567d..538fdd6 100644
--- a/src/api/pin_deactivate.zig
+++ b/src/api/pin_deactivate.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_deactivate",
    .desc = "Deactivate currently active pin.",
    .args = &.{},
diff --git a/src/api/pin_delete.zig b/src/api/pin_delete.zig
index 5bd9902..4fe35f9 100644
--- a/src/api/pin_delete.zig
+++ b/src/api/pin_delete.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_delete",
    .desc = "Delete a pin by its handle.",
    .args = &.{
diff --git a/src/api/pin_groupactivate.zig b/src/api/pin_groupactivate.zig
index 3164860..e5f1e6c 100644
--- a/src/api/pin_groupactivate.zig
+++ b/src/api/pin_groupactivate.zig
@@ -3,7 +3,7 @@ const types = @import("../types.zig");
const std = @import("std");
const pin_cycle = @import("pin_cycle.zig").pin_cycle;

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_groupactivate",
    .desc = "Activate the pin group specified.",
    .args = &.{
diff --git a/src/api/pin_meta.zig b/src/api/pin_meta.zig
index 2748006..ee8e775 100644
--- a/src/api/pin_meta.zig
+++ b/src/api/pin_meta.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_meta",
    .desc = "Update a pin's metadata.",
    .args = &.{
diff --git a/src/api/pin_purge.zig b/src/api/pin_purge.zig
index 4c9464a..7288a62 100644
--- a/src/api/pin_purge.zig
+++ b/src/api/pin_purge.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_purge",
    .desc = "Purge all pins in the currently active pin group.",
    .args = &.{},
diff --git a/src/api/pin_transfer.zig b/src/api/pin_transfer.zig
index 1229aca..5e0bdde 100644
--- a/src/api/pin_transfer.zig
+++ b/src/api/pin_transfer.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "pin_transfer",
    .desc = "Transfer a pin from one group to another.",
    .args = &.{
diff --git a/src/api/prefinc.zig b/src/api/prefinc.zig
index befb120..d21cc40 100644
--- a/src/api/prefinc.zig
+++ b/src/api/prefinc.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const utildbg = @import("../util/utildbg.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "prefinc",
    .desc = "Increase or decrease a preference by the given delta value.",
    .args = &.{
diff --git a/src/api/prefset_n.zig b/src/api/prefset_n.zig
index dfad93a..8de4138 100644
--- a/src/api/prefset_n.zig
+++ b/src/api/prefset_n.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const utildbg = @import("../util/utildbg.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "prefset_n",
    .desc = "Set a preference number value.",
    .args = &.{
diff --git a/src/api/prefset_t.zig b/src/api/prefset_t.zig
index 926f01b..6f6c842 100644
--- a/src/api/prefset_t.zig
+++ b/src/api/prefset_t.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const utildbg = @import("../util/utildbg.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "prefset_t",
    .desc = "Set a preference text value.",
    .args = &.{
diff --git a/src/api/preftoggle.zig b/src/api/preftoggle.zig
index c80575a..ae8b5a7 100644
--- a/src/api/preftoggle.zig
+++ b/src/api/preftoggle.zig
@@ -4,7 +4,7 @@ const std = @import("std");
const utildbg = @import("../util/utildbg.zig");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "preftoggle",
    .desc = "Toggle a boolean number preference between `1` and `0`.",
    .args = &.{
diff --git a/src/api/quit.zig b/src/api/quit.zig
index 2ae97cc..9e53d28 100644
--- a/src/api/quit.zig
+++ b/src/api/quit.zig
@@ -2,7 +2,7 @@ const Mepo = @import("../Mepo.zig");
const types = @import("../types.zig");
const std = @import("std");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "quit",
    .desc = "Quit the application.",
    .args = &.{},
diff --git a/src/api/shellpipe_async.zig b/src/api/shellpipe_async.zig
index 2e64acd..5291c82 100644
--- a/src/api/shellpipe_async.zig
+++ b/src/api/shellpipe_async.zig
@@ -15,7 +15,7 @@ const AsyncShellpipeRequest = struct {
    cmd: []const u8,
};

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "shellpipe_async",
    .desc = "Run a system (shell) command and pipe asynchronously; STDOUT returned from command will be executed back as a jsonapi expression.",
    .args = &.{
diff --git a/src/api/shellpipe_sync.zig b/src/api/shellpipe_sync.zig
index 84a59a1..0c20784 100644
--- a/src/api/shellpipe_sync.zig
+++ b/src/api/shellpipe_sync.zig
@@ -7,7 +7,7 @@ const sdl = @import("../sdlshim.zig");
const filedump = @import("./filedump.zig");
const run_shellpipe = @import("shellpipe_async.zig").run_shellpipe;

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "shellpipe_sync",
    .desc = "Run a system (shell) command synchronously and pipe; STDOUT returned from command will be executed back as a JSON API expressions. Note state of application can be introspected by examining ENV vars (documented in API doc) and also state is saved as JSON API commands to $XDG_CACHE_HOME/mepo/shellpipe_savestate.json",
    .args = &.{
diff --git a/src/api/zoom_relative.zig b/src/api/zoom_relative.zig
index 9319d63..a3d3880 100644
--- a/src/api/zoom_relative.zig
+++ b/src/api/zoom_relative.zig
@@ -3,7 +3,7 @@ const types = @import("../types.zig");
const std = @import("std");
const p = @import("../util/utilprefs.zig");

pub const spec = .{
pub const spec = types.MepoFnSpec{
    .name = "zoom_relative",
    .desc = "Update the map's zoom level by a relative delta.",
    .args = &.{
diff --git a/src/blit/blit.zig b/src/blit/blit.zig
index 9102df8..f65e4ef 100644
--- a/src/blit/blit.zig
+++ b/src/blit/blit.zig
@@ -213,7 +213,7 @@ fn blit_tile_pinlayer(mepo: *Mepo, tile_x: u32, tile_y: u32, zoom: u8, x_off: i3
                        const is_ordered = p.get(p.pingroup_prop(pin_group_i, .Ordered)).b;
                        break :is_active_path (pin_group_i == mepo.pin_group_active and mepo.pin_group_active_item != null and
                            ((is_ordered and is_active_path_track) or
                            (!is_ordered and mepo.pin_group_active_item.? == pin_i)));
                                (!is_ordered and mepo.pin_group_active_item.? == pin_i)));
                    };
                    is_active_path_track = track: {
                        const has_active_pg_item = mepo.pin_group_active_item != null;
@@ -417,9 +417,9 @@ fn blit_pin(mepo: *Mepo, pin: *types.Pin, prev_pin: ?*types.Pin, pin_group: u8,
            break :render_pin_label;

        const pin_label_bg_value: u24 = if (is_active) 0xe8e8e8 else 0xffffff;
        const pin_label_bg: types.Color = .{ .value = pin_label_bg_value };
        const pin_label_bg = types.Color{ .value = pin_label_bg_value };
        const pin_label_border_value: u24 = if (is_active) 0x000000 else 0xe8e8e8;
        const pin_label_border = .{ .value = pin_label_border_value };
        const pin_label_border = types.Color{ .value = pin_label_border_value };

        const label_color: u24 = 0x000000;
        const label = lab: {
-- 
2.48.1

[PATCH v2 3/7] Zig 0.14: Rename Mepo.config to Mepo.config_contents Export this patch

The field name conflicts with the import of config.zig
---
 src/Mepo.zig | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/Mepo.zig b/src/Mepo.zig
index a7ed01f..9c38647 100644
--- a/src/Mepo.zig
+++ b/src/Mepo.zig
@@ -18,7 +18,7 @@ const FnTable = @import("./api/_FnTable.zig");
const Self = @This();
allocator: std.mem.Allocator,
blit_pinlayer_cache: datastructure.EvictionHashMap(types.XYZ, *sdl.SDL_Texture, evict_texture, &config.MaxTextures),
config: []const u8,
config_contents: []const u8,
debug_message: ?[]const u8 = null,
drag: ?struct {
    begin_ticks: u32,
@@ -493,7 +493,7 @@ pub fn init_video_and_sdl_stdin_loop(mepo: *Self, enable_stdin_jsonapi_repl: boo
fn mepo_sdl_loop_thread_boot(userdata: ?*anyopaque) callconv(.C) c_int {
    const mepo: *Self = @alignCast(@ptrCast(userdata.?));
    video_init(mepo) catch unreachable;
    mepo.jsonapi_execute(mepo.config) catch unreachable;
    mepo.jsonapi_execute(mepo.config_contents) catch unreachable;
    mepo.initialized_video.set();
    sdl_event_loop(mepo) catch unreachable;
    return 0;
@@ -790,7 +790,7 @@ pub fn init(allocator: std.mem.Allocator, tile_cache: *TileCache, use_config: []
            &config.MaxTextures,
        ).init(allocator),
        .shellpipe_async_threads = datastructure.QueueHashMap(i8, sdl.SDL_threadID).init(allocator),
        .config = use_config,
        .config_contents = use_config,
        .fonts_normal = try init_create_fonts_array(false),
        .fonts_bold = try init_create_fonts_array(true),
        .fingers = std.ArrayList(sdl.SDL_FingerID).init(allocator),
-- 
2.48.1

[PATCH v2 4/7] Zig 0.14: std.posix.sigaction does not error Export this patch

---
 src/api/bind_signal.zig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/api/bind_signal.zig b/src/api/bind_signal.zig
index c866eab..533f499 100644
--- a/src/api/bind_signal.zig
+++ b/src/api/bind_signal.zig
@@ -45,7 +45,7 @@ fn bind_signal(mepo: *Mepo, signo_str: [:0]const u8, expression: []const u8) !vo
        .flags = 0,
    };

    std.posix.sigaction(signal_name, &signal_action, null) catch return error.FailedToSetupSighandler;
    std.posix.sigaction(signal_name, &signal_action, null);

    if (mepo.table_signals.get(signal_name)) |heap_str| {
        mepo.allocator.free(heap_str);
-- 
2.48.1

[PATCH v2 5/7] Zig 0.14: QueueHashMap.pop() might pop nothing Export this patch

---
 src/TileCache.zig                  | 18 ++++++++++++------
 src/datastructure/QueueHashMap.zig |  8 +++++---
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/TileCache.zig b/src/TileCache.zig
index 4744a48..3bb969e 100644
--- a/src/TileCache.zig
+++ b/src/TileCache.zig
@@ -82,15 +82,21 @@ pub fn download_loop(tile_cache: *Self, graphical_mode: bool) !void {
        }

        // 2. Transfer from UI LIFO into transfers
        while (tile_cache.queue_lifo_ui.count() > 0 and tile_cache.transfer_map.count() < p.get(p.pref.tile_cache_max_n_transfers).u) {
            const coords = tile_cache.queue_lifo_ui.pop();
            try tile_cache.curl_add_to_multi_and_register_transfer(coords.key, true);
        while (tile_cache.transfer_map.count() < p.get(p.pref.tile_cache_max_n_transfers).u) {
            if (tile_cache.queue_lifo_ui.pop()) |coords| {
                try tile_cache.curl_add_to_multi_and_register_transfer(coords.key, true);
            } else {
                break;
            }
        }

        // 3. Transfer from BG LIFO into transfers
        while (tile_cache.queue_lifo_bg.count() > 0 and tile_cache.transfer_map.count() < p.get(p.pref.tile_cache_max_n_transfers).u) {
            const coords = tile_cache.queue_lifo_bg.pop();
            try tile_cache.curl_add_to_multi_and_register_transfer(coords.key, false);
        while (tile_cache.transfer_map.count() < p.get(p.pref.tile_cache_max_n_transfers).u) {
            if (tile_cache.queue_lifo_bg.pop()) |coords| {
                try tile_cache.curl_add_to_multi_and_register_transfer(coords.key, false);
            } else {
                break;
            }
        }

        // 4. Print status message if non graphical
diff --git a/src/datastructure/QueueHashMap.zig b/src/datastructure/QueueHashMap.zig
index 9cb7996..103fa63 100644
--- a/src/datastructure/QueueHashMap.zig
+++ b/src/datastructure/QueueHashMap.zig
@@ -35,12 +35,14 @@ pub fn QueueHashMap(comptime key_type: type, comptime metadata_type: type) type
            return self.array_hash_map.getPtr(key);
        }

        pub fn pop(self: *Self) struct { key: key_type, value: metadata_type } {
        pub fn pop(self: *Self) ?struct { key: key_type, value: metadata_type } {
            self.mutex.lock();
            defer self.mutex.unlock();

            const popped = self.array_hash_map.pop();
            return .{ .key = popped.key, .value = popped.value };
            if (self.array_hash_map.pop()) |popped| {
                return .{ .key = popped.key, .value = popped.value };
            }
            return null;
        }

        pub fn getIndex(self: *Self, key: key_type) ?usize {
-- 
2.48.1

[PATCH v2 6/7] Zig 0.14: std.mem.split -> std.mem.splitSequence Export this patch

---
 src/api/clippaste.zig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/api/clippaste.zig b/src/api/clippaste.zig
index d2de888..8c45daf 100644
--- a/src/api/clippaste.zig
+++ b/src/api/clippaste.zig
@@ -23,7 +23,7 @@ fn execute(mepo: *Mepo, _: [types.MepoFnNargs]types.MepoArg) !void {
    // trim commas, and see if can parse as floats; if so assume lat/lon
    // if not - break out and run whatever is in clipboard as jsonapi
    parse_lat_lon: {
        var it = std.mem.split(u8, text, " ");
        var it = std.mem.splitSequence(u8, text, " ");
        var lat: ?f64 = null;
        var lon: ?f64 = null;

-- 
2.48.1

[PATCH v2 7/7] Zig 0.14: std.mem.tokenize -> std.mem.tokenizeSequence Export this patch

---
 src/Downloader.zig | 2 +-
 src/blit/blit.zig  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/Downloader.zig b/src/Downloader.zig
index 4136bf7..327a294 100644
--- a/src/Downloader.zig
+++ b/src/Downloader.zig
@@ -58,7 +58,7 @@ fn parse_download_request(download_request_str: []const u8) !TileCache.DownloadB
    var zoom_min: i32 = undefined;
    var zoom_max: i32 = undefined;

    var tokens_it = std.mem.tokenize(u8, download_request_str, ",");
    var tokens_it = std.mem.tokenizeSequence(u8, download_request_str, ",");
    var i: usize = 0;
    while (tokens_it.next()) |token| {
        switch (i) {
diff --git a/src/blit/blit.zig b/src/blit/blit.zig
index f65e4ef..63a6961 100644
--- a/src/blit/blit.zig
+++ b/src/blit/blit.zig
@@ -663,7 +663,7 @@ fn blit_multiline_text(
        var textures_array: [50]*sdl.SDL_Texture = undefined;
        var textures_array_size: usize = 0;

        var lines_it = std.mem.tokenize(u8, msg, "\n");
        var lines_it = std.mem.tokenizeSequence(u8, msg, "\n");
        while (lines_it.next()) |line| {
            if (textures_array_size + 1 > textures_array.len - 1) break;

-- 
2.48.1