Skip to content

fix: clean up close_click IPC listener after each notification (#39)#153

Merged
parth0025 merged 1 commit into
stagingfrom
fix/issue-39-ipc-listener-leak
May 15, 2026
Merged

fix: clean up close_click IPC listener after each notification (#39)#153
parth0025 merged 1 commit into
stagingfrom
fix/issue-39-ipc-listener-leak

Conversation

@parth0025
Copy link
Copy Markdown
Collaborator

sendNotification() registered a new ipcMain.on('close_click', ...) handler on every screenshot capture and never removed it, so the process accumulated one global IPC listener per screenshot and a single close click eventually fired N stale handlers, each trying to close an already-destroyed BrowserWindow reference.

Switched the registration to ipcMain.once so the happy path (user clicks close) auto-removes the listener. For the auto-timeout path (window closes after 10s without a click) the handler stays registered and would later steal a future notification's close event, so also remove it explicitly when the window emits 'closed'. The timeout id is now tracked and cleared on the same hook so the timer can't fire against a destroyed window. The window reference is captured in a local so each listener targets its own window even if a subsequent sendNotification() reassigns the module-level screenshotNotificationWindow before this listener fires.

Closes #39

Pull Request Template Chooser

Please click the link that matches your contribution type to load the correct format.

Note: Clicking a link will reload this page and clear any text you've already typed here.

  • Bug Fix
    Use this for fixing broken logic or UI glitches.

  • New Feature
    Use this for adding new functionality or components.

  • Refactor
    Use this for code cleanup, performance tweaks, or technical debt.


General Summary

If you don't want to use a specific template, please provide a brief summary of your changes below.

sendNotification() registered a new ipcMain.on('close_click', ...)
handler on every screenshot capture and never removed it, so the
process accumulated one global IPC listener per screenshot and a
single close click eventually fired N stale handlers, each trying to
close an already-destroyed BrowserWindow reference.

Switched the registration to ipcMain.once so the happy path
(user clicks close) auto-removes the listener. For the auto-timeout
path (window closes after 10s without a click) the handler stays
registered and would later steal a future notification's close
event, so also remove it explicitly when the window emits 'closed'.
The timeout id is now tracked and cleared on the same hook so the
timer can't fire against a destroyed window. The window reference
is captured in a local so each listener targets its own window even
if a subsequent sendNotification() reassigns the module-level
screenshotNotificationWindow before this listener fires.

Closes #39

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@parth0025 parth0025 self-assigned this May 15, 2026
@parth0025 parth0025 merged commit 9c7fa18 into staging May 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant