Skip to content

v1.7.0

Choose a tag to compare

@motaz-hefny motaz-hefny released this 10 May 19:11

[1.7.0] - 2026-05-10

Changed

  • Keyboard reset uses GDK setEnabled + X11 setFocusable toggle with yield instead of blur/focus — replaced the old setFocusable(false)+blur()+setFocusable(true)+focus() sequence (which changed window Z‑order) with setEnabled(false)+setFocusable(false)setImmediate yield → setFocusable(true)+setEnabled(true)+webContents.focus(). Disables both GTK sensitivity (GDK) and WM_HINTS.input (X11), lets GLib process both disconnections, then re-enables and forces Chromium to register fresh keyboard signal handlers. Z‑order impact: none — the window stays in place.
  • Batch SQLite operations broken into 100-item chunks with setImmediate yieldsperformBatchOperation for delete, updateStatus, updateProtocol, and check now processes proxies in batches of 100, yielding to the event loop between each batch via setImmediate.
  • Proxy checker yields to full event loop between batches — replaced await this.delay(20) with await new Promise(resolve => setImmediate(resolve)) in processQueue().

Added

  • Concurrency slider for Proxy Checkercheck.concurrent setting is now rendered as a <input type="range"> slider (range 5–200, step 5). Concurrency is read from settings when a batch check starts.
  • Automatic keyboard reset restored — since setEnabled+setFocusable toggle has no Z‑order impact, keyboard reset is called automatically after proxy check completion and batch database operations.

Fixed

  • Permanent keyboard freeze triggered by "Cleanup Dead" (batch delete) on Linux — root cause identified as GLib-GObject IME signal handler disconnect (gsignal.c:2685: instance has no handler with id). Three-pronged fix:
    1. Removed confirm() dialogs from handleCleanDead and handleCleanByLatency — the Chromium modal dialog generated focus events that triggered internal IME teardown IPC, which disconnected the GLib keyboard signal handlers.
    2. Switched db:batch IPC from invoke/handle to send/onipcRenderer.invoke() uses the Mojo synchronous IPC path which corrupts GLib state during dispatch. ipcRenderer.send() uses the message path which avoids this.
    3. Added setImmediate yield at start of batch IPC handler — gives GLib time to settle any pending IME/focus events before our handler runs.
  • confirm() dialogs removed from batch delete operations — deleting dead/slow/filtered proxies no longer shows a confirmation dialog, preventing the focus-change→IME-teardown→GLib-corruption sequence. The notification toast on completion provides sufficient feedback.