You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 yields — performBatchOperation 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 Checker — check.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:
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.
Switched db:batch IPC from invoke/handle to send/on — ipcRenderer.invoke() uses the Mojo synchronous IPC path which corrupts GLib state during dispatch. ipcRenderer.send() uses the message path which avoids this.
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.