Title: [Bug]: macOS backend doesn't always pair key_press_event and key_release_event · Issue #31886 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: macOS backend doesn't always pair key_press_event and key_release_event · Issue #31886 · matplotlib/matplotlib
X Title: [Bug]: macOS backend doesn't always pair key_press_event and key_release_event · Issue #31886 · matplotlib/matplotlib
Description: Bug summary I'm trying to better understand the macOS key_press_event/key_release_event logic. Should each key_press_event be paired with a key_release_event? While basic usage works, there are several scenarios where this is not the cas...
Open Graph Description: Bug summary I'm trying to better understand the macOS key_press_event/key_release_event logic. Should each key_press_event be paired with a key_release_event? While basic usage works, there are sev...
X Description: Bug summary I'm trying to better understand the macOS key_press_event/key_release_event logic. Should each key_press_event be paired with a key_release_event? While basic usage works, there are...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/31886
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: macOS backend doesn't always pair key_press_event and key_release_event","articleBody":"### Bug summary\n\nI'm trying to better understand the macOS `key_press_event`/`key_release_event` logic. Should each `key_press_event` be paired with a `key_release_event`?\n\nWhile basic usage works, there are several scenarios where this is not the case.\n\n#### Key Repeats\n\nWhile the figure is the active window, press and hold A:\n```\nyou pressed a None None\nyou pressed a None None\nyou pressed a None None\n```\n\nThis occurs due to `keyDown:` being called on a repeating timer to handle macOS keyboard repeats. Is this the correct behavior, or should only the first press be reported?\n\n\n#### Window loses active focus\n\nWhile the figure is the active window, press Control, Shift, A:\n\n```\nyou pressed control None None\nyou pressed ctrl+shift None None\nyou pressed ctrl+A None None\n```\n\nWhile still holding the keys, use the mouse to select another window. When the keys are released, no event will fire. If a window in a different app was selected, there will be no way to tell when the keys were released. Should the macOS backend send release events if it will no longer receive `keyUp:` messages?\n\n\n#### Window gains active focus\n\nThe inverse of the above. Press control and shift in a different window, then select a Figure and release only shift:\n\n```\nyou pressed control None None\n```\n\nThe is never a \"you released shift\" message posted. Still bugged, but not the exact inverse of the \"loses active\" state.\n\n#### Save Figure Fun\n\nSelect a Figure. Press A. While still holding down A, press S:\n\n```\nyou pressed a None None\n…\nyou pressed a None None\nyou pressed a None None\n```\n\nThe save dialog appears. If you release A, no message will be printed (same case as above).\n\nNow press Escape to cancel the dialog:\n```\nyou pressed s None None\nyou released escape None None\n```\n\nYou now get a single pressed s message (even though you stopped pressing it a long time ago) and an unbalanced \"you released escape\" message.\n\n\n\n\n### Code for reproduction\n\nI'm using the following from PR #21512:\n\n```Python\nimport matplotlib.pyplot as plt\nfig = plt.figure()\n\ndef on_key(event):\n print('you pressed', event.key, event.xdata, event.ydata)\ndef on_key_release(event):\n print('you released', event.key, event.xdata, event.ydata)\n\nfig.canvas.mpl_connect('key_press_event', on_key)\nfig.canvas.mpl_connect('key_release_event', on_key_release)\nplt.show()\n```\n\n### Actual outcome\n\nSee cases above.\n\n### Expected outcome\n\n(I'm not sure what the desired outcome is.)\n\n### Additional information\n\n_No response_\n\n### Operating system\n\n_No response_\n\n### Matplotlib Version\n\ndev\n\n### Matplotlib Backend\n\n_No response_\n\n### Python version\n\n_No response_\n\n### Jupyter version\n\n_No response_\n\n### Installation\n\nNone","author":{"url":"https://github.com/iccir","@type":"Person","name":"iccir"},"datePublished":"2026-06-13T02:31:36.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/31886/matplotlib/issues/31886"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:9b936a1a-3873-c8d6-07a3-ea29ddc8d54e |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8022:21879F:D25DA:120767:6A532C3D |
| html-safe-nonce | adfc1307ed242d36dee86bbe6835fa747dca2fac303d6c25e23b8c78adc6807b |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4MDIyOjIxODc5RjpEMjVEQToxMjA3Njc6NkE1MzJDM0QiLCJ2aXNpdG9yX2lkIjoiNjQ1MzQ5MDIxODYyMDM2NTg4NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1728f089d3e2d9ad83c42e3e57b90cf471692f52235cac341ad96b95f950ad64 |
| hovercard-subject-tag | issue:4653990907 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/31886/issue_layout |
| twitter:image | https://opengraph.githubassets.com/449b2d8cc7fe34cfdd2df01b7f8bcd27e051acf4eb61ba5d8013f92e30761f87/matplotlib/matplotlib/issues/31886 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/449b2d8cc7fe34cfdd2df01b7f8bcd27e051acf4eb61ba5d8013f92e30761f87/matplotlib/matplotlib/issues/31886 |
| og:image:alt | Bug summary I'm trying to better understand the macOS key_press_event/key_release_event logic. Should each key_press_event be paired with a key_release_event? While basic usage works, there are sev... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | iccir |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width