{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":423952376,"defaultBranch":"main","name":"walk","ownerLogin":"tailscale","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2021-11-02T18:16:23.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/48932923?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1721755580.0","currentOid":""},"activityList":{"items":[{"before":"31a911e83b8ba341e3c4f4100a08c848c53a8866","after":null,"ref":"refs/heads/aaron/font_semibold","pushedAt":"2024-07-23T17:26:20.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}},{"before":"4327221bd339f8bc794b17affe3dea3e84736125","after":"52804fd3056a202671a58394274825e29ea04104","ref":"refs/heads/main","pushedAt":"2024-07-23T17:26:18.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"font.go: add semi-bold style\n\nMany of the Modern UI text styles use semi-bold weight. In this PR I add\na new style flag for that.\n\nFixes #76\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"font.go: add semi-bold style"}},{"before":null,"after":"31a911e83b8ba341e3c4f4100a08c848c53a8866","ref":"refs/heads/aaron/font_semibold","pushedAt":"2024-07-23T16:06:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"font.go: add semi-bold style\n\nMany of the Modern UI text styles use semi-bold weight. In this PR I add\na new style flag for that.\n\nFixes #76\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"font.go: add semi-bold style"}},{"before":"94bcb645e24c67152957c470f05f5807d0d28330","after":null,"ref":"refs/heads/aaron/theme_color","pushedAt":"2024-07-15T18:04:50.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}},{"before":"9b6fa0bec67992a91b06d6b0d9dcb2737311495f","after":"4327221bd339f8bc794b17affe3dea3e84736125","ref":"refs/heads/main","pushedAt":"2024-07-15T18:04:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"theme.go: add accessor for theme color\n\nThe syscalls were already implemented in win, but I didn't previously bother\nto write a nice accessor. Now we have one.\n\nFixes #74\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"theme.go: add accessor for theme color"}},{"before":null,"after":"94bcb645e24c67152957c470f05f5807d0d28330","ref":"refs/heads/aaron/theme_color","pushedAt":"2024-07-15T18:02:44.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"theme.go: add accessor for theme color\n\nThe syscalls were already implemented in win, but I didn't previously bother\nto write a nice accessor. Now we have one.\n\nFixes #74\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"theme.go: add accessor for theme color"}},{"before":"b9367c68948333f840a07cec5440ddf476a80c73","after":null,"ref":"refs/heads/aaron/fixes","pushedAt":"2024-07-15T17:58:26.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}},{"before":"02104f73bea64c4fa5dda00a4b0cea23c63f50e1","after":"9b6fa0bec67992a91b06d6b0d9dcb2737311495f","ref":"refs/heads/main","pushedAt":"2024-07-15T17:58:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"fix up some post-refactoring issues\n\nI fixed a couple of things that were bothering me in action.go and\nwindow.go, but the main thing that is actually a more significant bug is\nthat FormBase's OnPostDispatch was not being invoked as frequently as it\nwas pre-refactor.\n\nThere are two reasons for this. The first is that we should call the\nhandler when IsDialogMessage returns true, as that should be treated as\nas dispatch. Secondly, we also need to handle messages that were dispatched\nto child windows of the form. In the case of issue 70, the toolbar was\nreceiving a WM_COMMAND whose handler affected layout of the entire form.\nIn that case, we implement OnPostDispatch on WidgetBase and forward it\nto the Form at the top of the hierarchy.\n\nFixes #70\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"fix up some post-refactoring issues"}},{"before":"ad7b9cfbcf5919233fa3741e5649486313ab67cc","after":null,"ref":"refs/heads/nickkhyl/tray-menu-fix","pushedAt":"2024-07-15T17:04:53.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"}},{"before":"7601212d8e23748cf6790c69ec7a32c635307f0e","after":"02104f73bea64c4fa5dda00a4b0cea23c63f50e1","ref":"refs/heads/main","pushedAt":"2024-07-15T17:04:51.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"notifyicon.go: prevent attempts to reinitialize and show a context menu while it's already being displayed\n\nWe should not publish the\n(*NotifyIcon).ShowingContextMenu event if the menu\nis already being displayed. Otherwise, event\nhandlers might reinitialize the menu and update\nthe items, invalidating internal structures like\nownerDrawnMenuItemInfo, which are already in use.\nThis can cause various issues, including a nil\npointer dereference in (*menuItemLayout).layout().\n\nUnder normal circumstances, clicking on the tray\nicon while a context menu is displayed should\nclose the context menu and make TrackPopupMenuEx\nreturn zero before we receive WM_CONTEXTMENU or\nWM_LBUTTONUP again. However, this doesn't happen in\ncertain scenarios, such as when clicking on the\ntray icon immediately after opening and closing\nthe Start Menu. In these cases, SetForegroundWindow\nfails, the context menu never receives focus, and\nit appears in the background. Clicking outside of\nthe context menu (e.g. on the tray icon or on the\ntask bar) does not cancel the context menu. This\nbehavior is not unique to the Tailscale tray icon\nand appears to be a Windows bug. While we cannot\nfix the underlying issue that prevents tray menus\nfrom becoming foreground and active, we can\nprevent the ShowingContextMenu event from being\npublished and the walk structures from being\ninvalidated while the context menu is displayed,\nfixing the nil dereference and similar issues.\n\nIn this PR, we add a field to track if we're in\n(*NotifyIcon).doContextMenu and check it to\nprevent doContextMenu from being called\nrecursively. We also update (*NotifyIcon) wndProc\nto forcibly cancel and hide the context menu if a user\nclicks on the tray icon while the context menu is\ndisplayed.\n\nFixes #72\n\nSigned-off-by: Nick Khyl ","shortMessageHtmlLink":"notifyicon.go: prevent attempts to reinitialize and show a context me…"}},{"before":null,"after":"ad7b9cfbcf5919233fa3741e5649486313ab67cc","ref":"refs/heads/nickkhyl/tray-menu-fix","pushedAt":"2024-07-12T00:46:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"notifyicon.go: prevent attempts to reinitialize and show a context menu while it's already being displayed\n\nWe should not publish the\n(*NotifyIcon).ShowingContextMenu event if the menu\nis already being displayed. Otherwise, event\nhandlers might reinitialize the menu and update\nthe items, invalidating internal structures like\nownerDrawnMenuItemInfo, which are already in use.\nThis can cause various issues, including a nil\npointer dereference in (*menuItemLayout).layout().\n\nUnder normal circumstances, clicking on the tray\nicon while a context menu is displayed should\nclose the context menu and make TrackPopupMenuEx\nreturn zero before we receive WM_CONTEXTMENU or\nWM_LBUTTONUP again. However, this doesn't happen in\ncertain scenarios, such as when clicking on the\ntray icon immediately after opening and closing\nthe Start Menu. In these cases, SetForegroundWindow\nfails, the context menu never receives focus, and\nit appears in the background. Clicking outside of\nthe context menu (e.g. on the tray icon or on the\ntask bar) does not cancel the context menu. This\nbehavior is not unique to the Tailscale tray icon\nand appears to be a Windows bug. While we cannot\nfix the underlying issue that prevents tray menus\nfrom becoming foreground and active, we can\nprevent the ShowingContextMenu event from being\npublished and the walk structures from being\ninvalidated while the context menu is displayed,\nfixing the nil dereference and similar issues.\n\nIn this PR, we add a field to track if we're in\n(*NotifyIcon).doContextMenu and check it to\nprevent doContextMenu from being called\nrecursively. We also update (*NotifyIcon) wndProc\nto forcibly cancel and hide the context menu if a user\nclicks on the tray icon while the context menu is\ndisplayed.\n\nFixes #72\n\nSigned-off-by: Nick Khyl ","shortMessageHtmlLink":"notifyicon.go: prevent attempts to reinitialize and show a context me…"}},{"before":null,"after":"b9367c68948333f840a07cec5440ddf476a80c73","ref":"refs/heads/aaron/fixes","pushedAt":"2024-07-10T15:01:31.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"fix up some post-refactoring issues\n\nI fixed a couple of things that were bothering me in action.go and\nwindow.go, but the main thing that is actually a more significant bug is\nthat FormBase's OnPostDispatch was not being invoked as frequently as it\nwas pre-refactor.\n\nThere are two reasons for this. The first is that we should call the\nhandler when IsDialogMessage returns true, as that should be treated as\nas dispatch. Secondly, we also need to handle messages that were dispatched\nto child windows of the form. In the case of issue 70, the toolbar was\nreceiving a WM_COMMAND whose handler affected layout of the entire form.\nIn that case, we implement OnPostDispatch on WidgetBase and forward it\nto the Form at the top of the hierarchy.\n\nFixes #70\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"fix up some post-refactoring issues"}},{"before":"e81781dd40aec6742f49d19088dc880d78f03fa9","after":null,"ref":"refs/heads/nickkhyl/fix-mainform-init","pushedAt":"2024-06-25T17:16:37.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"}},{"before":"eb5ab583a224a4c0ee5a3d64d36a939e38ec6187","after":"7601212d8e23748cf6790c69ec7a32c635307f0e","ref":"refs/heads/main","pushedAt":"2024-06-25T17:16:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"form.go: move final initialization to run later in the form's lifecycle\n\nIn 325926d94be67a5b2169e12c178bcc8de2914849 we moved the code from (*FormBase).Run() to (*FormBase).init and removed the former method altogether. This change affected the initialization order of a Window, causing nil pointer dereference errors during MainWindow creation.\n\nThis moves the original (*FormBase).Run() code back into its own method and calls it when the form is about to be displayed, ensuring that the window is fully initialized.\n\nFixes #cleanup","shortMessageHtmlLink":"form.go: move final initialization to run later in the form's lifecycle"}},{"before":"5386f90ca29964c1ff201a408cd872b34a2ab32d","after":"e81781dd40aec6742f49d19088dc880d78f03fa9","ref":"refs/heads/nickkhyl/fix-mainform-init","pushedAt":"2024-06-25T17:14:39.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"form.go: move final initialization to run later in the form's lifecycle\n\nIn 325926d94be67a5b2169e12c178bcc8de2914849 we moved the code from (*FormBase).Run() to (*FormBase).init and removed the former method altogether. This change affected the initialization order of a Window, causing nil pointer dereference errors during MainWindow creation.\n\nThis moves the original (*FormBase).Run() code back into its own method and calls it when the form is about to be displayed, ensuring that the window is fully initialized.\n\nFixes #cleanup","shortMessageHtmlLink":"form.go: move final initialization to run later in the form's lifecycle"}},{"before":null,"after":"5386f90ca29964c1ff201a408cd872b34a2ab32d","ref":"refs/heads/nickkhyl/fix-mainform-init","pushedAt":"2024-06-25T17:05:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"form.go: move final initialization to run later in the form's lifecycle\n\nIn 325926d94be67a5b2169e12c178bcc8de2914849 we moved the code from (*FormBase).Run() to (*FormBase).init and removed the former method altogether. This change affected the initialization order of a Window, causing nil pointer dereference errors during MainWindow creation.\n\nThis moves the original (*FormBase).Run() code back into its own method and calls it when the form is about to be displayed, ensuring that the window is fully initialized.\n\nFixes #cleanup","shortMessageHtmlLink":"form.go: move final initialization to run later in the form's lifecycle"}},{"before":"3ba391e2c80529440c60fb4d0575807907569f0f","after":null,"ref":"refs/heads/aaron/notifyicon_diag_info","pushedAt":"2024-06-19T21:47:12.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}},{"before":"325edb597026738acc5a927837fe8e2919f99dab","after":"eb5ab583a224a4c0ee5a3d64d36a939e38ec6187","ref":"refs/heads/main","pushedAt":"2024-06-19T21:47:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_NotifyIcon error messages\n\nShell_NotifyIcon doesn't support any error codes beyond a boolean,\nbut adding the input that was passed into the failing call could\nbe very helpful here.\n\nUpdates https://github.com/tailscale/tailscale/issues/12472\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_N…"}},{"before":"26f76f1c5bbc2789dbe7d60fac2726d3947f67a5","after":"3ba391e2c80529440c60fb4d0575807907569f0f","ref":"refs/heads/aaron/notifyicon_diag_info","pushedAt":"2024-06-19T21:46:50.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_NotifyIcon error messages\n\nShell_NotifyIcon doesn't support any error codes beyond a boolean,\nbut adding the input that was passed into the failing call could\nbe very helpful here.\n\nUpdates https://github.com/tailscale/tailscale/issues/12472\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_N…"}},{"before":"bd965da4cd15e26aa32833ab8a6b0bff02f098ae","after":"26f76f1c5bbc2789dbe7d60fac2726d3947f67a5","ref":"refs/heads/aaron/notifyicon_diag_info","pushedAt":"2024-06-19T21:21:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_NotifyIcon error messages\n\nShell_NotifyIcon doesn't support any error codes beyond a boolean,\nbut adding the input that was passed into the failing call could\nbe very helpful here.\n\nUpdates https://github.com/tailscale/tailscale/issues/12472\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_N…"}},{"before":null,"after":"bd965da4cd15e26aa32833ab8a6b0bff02f098ae","ref":"refs/heads/aaron/notifyicon_diag_info","pushedAt":"2024-06-19T21:20:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_NotifyIcon error messages\n\nShell_NotifyIcon doesn't support any error codes beyond a boolean,\nbut adding the input that was passed into the failing call could\nbe very helpful here.\n\nUpdates https://github.com/tailscale/tailscale/issues/12472\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"notifyicon.go: include contents of NOTIFYICONDATA argument in Shell_N…"}},{"before":"d376dd23844551470b20a21cbe1dece524978e36","after":null,"ref":"refs/heads/aaron/menu_refcount","pushedAt":"2024-06-14T17:03:59.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}},{"before":"d45e42f306e09cfcd8dc8029142d54331afdeaf5","after":"325edb597026738acc5a927837fe8e2919f99dab","ref":"refs/heads/main","pushedAt":"2024-06-14T17:03:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"action.go, menu.go: reduce scope of Action refcounting, improve Action lifecycle and change management\n\nThe refcounting scheme used by Action was not working very well; Actions\nwould essentially Dispose themselves as soon as they were no longer\nreferenced by any ActionLists. This makes Action management very tricky\nfor the API consumer: removing an Action from an ActionList and then\nsubsequently adding it to a different ActionList would trigger a disposal.\n\nOTOH, the Action architecture as-is also needs to map action IDs to\nAction pointers. As package-scoped maps, these entries hinder GC and would\nrequire every single Action to be explicitly Disposed. For complex menus,\nthis would be pretty ugly to manage.\n\nIn this PR we keep the refcounting, but we only use it for the\npackage-scoped maps: when the refcount becomes positive, we add the\naction to those maps. When the refcount reaches zero, we remove the\naction from those maps. While we do offer an explicit Dispose method,\nwe also add a finalizer that will handle the complex menu case.\n\nFurthermore, Dispose does not release the Action ID; only the finalizer\ndoes this. This ensures that there is no possibility of ID reuse as long\nas the application holds references to an Action with that ID.\n\nI also made a fix to menu.go: submenu items may also be owner-drawn or\nhave images, so recursing into updateItemsForWindow should not be\nmutually-exclusive to the former two conditions.\n\nFixes #55\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"action.go, menu.go: reduce scope of Action refcounting, improve Actio…"}},{"before":"ebf61a065a2a258741b61ac091ec0d3d9694d6c5","after":"d376dd23844551470b20a21cbe1dece524978e36","ref":"refs/heads/aaron/menu_refcount","pushedAt":"2024-06-14T16:27:57.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"action.go, menu.go: reduce scope of Action refcounting, improve Action lifecycle and change management\n\nThe refcounting scheme used by Action was not working very well; Actions\nwould essentially Dispose themselves as soon as they were no longer\nreferenced by any ActionLists. This makes Action management very tricky\nfor the API consumer: removing an Action from an ActionList and then\nsubsequently adding it to a different ActionList would trigger a disposal.\n\nOTOH, the Action architecture as-is also needs to map action IDs to\nAction pointers. As package-scoped maps, these entries hinder GC and would\nrequire every single Action to be explicitly Disposed. For complex menus,\nthis would be pretty ugly to manage.\n\nIn this PR we keep the refcounting, but we only use it for the\npackage-scoped maps: when the refcount becomes positive, we add the\naction to those maps. When the refcount reaches zero, we remove the\naction from those maps. While we do offer an explicit Dispose method,\nwe also add a finalizer that will handle the complex menu case.\n\nFurthermore, Dispose does not release the Action ID; only the finalizer\ndoes this. This ensures that there is no possibility of ID reuse as long\nas the application holds references to an Action with that ID.\n\nI also made a fix to menu.go: submenu items may also be owner-drawn or\nhave images, so recursing into updateItemsForWindow should not be\nmutually-exclusive to the former two conditions.\n\nFixes #55\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"action.go, menu.go: reduce scope of Action refcounting, improve Actio…"}},{"before":null,"after":"ebf61a065a2a258741b61ac091ec0d3d9694d6c5","ref":"refs/heads/aaron/menu_refcount","pushedAt":"2024-06-14T16:24:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"},"commit":{"message":"action.go, menu.go: reduce scope of Action refcounting, improve Action lifecycle and change manaegement\n\nThe refcounting scheme used by Action was not working very well; Actions\nwould essentially Dispose themselves as soon as they were no longer\nreferenced by any ActionLists. This makes Action management very tricky\nfor the API consumer: removing an Action from an ActionList and then\nsubsequently adding it to a different ActionList would trigger a disposal.\n\nOTOH, the Action architecture as-is also needs to map action IDs to\nAction pointers. As package-scoped maps, these entries hinder GC and would\nrequire every single Action to be explicitly Disposed. For complex menus,\nthis would be pretty ugly to manage.\n\nIn this PR we keep the refcounting, but we only use it for the\npackage-scoped maps: when the refcount becomes positive, we add the\naction to those maps. When the refcount reaches zero, we remove the\naction from those maps. While we do offer an explicit Dispose method,\nwe also add a finalizer that will handle the complex menu case.\n\nFurthermore, Dispose does not release the Action ID; only the finalizer\ndoes this. This ensures that there is no possibility of ID reuse as long\nas the application holds references to an Action with that ID.\n\nI also made a fix to menu.go: submenu items may also be owner-drawn or\nhave images, so recursing into updateItemsForWindow should not be\nmutually-exclusive to the former two conditions.\n\nFixes #55\n\nSigned-off-by: Aaron Klotz ","shortMessageHtmlLink":"action.go, menu.go: reduce scope of Action refcounting, improve Actio…"}},{"before":"8ee2d5916161e22e9cf3edd1fc7336f925527f00","after":null,"ref":"refs/heads/nickkhyl/radio-button-mi","pushedAt":"2024-06-13T21:07:12.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"}},{"before":"f8f532ad21abbd540ba14da2afbf10a10d2527d0","after":"d45e42f306e09cfcd8dc8029142d54331afdeaf5","ref":"refs/heads/main","pushedAt":"2024-06-13T21:07:11.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"action.go, menu.go, declarative/action.go, examples/actions: fix radio button menu items\n\nThis prevents radio button menu items from being unchecked when a user selects an already checked item. It also updates other item states in an exclusivity group when a radio button menu item is checked programmatically or by a user.\n\nFinally, it allows to create radio button menu items using the declarative syntax and updates examples/actions to demonstrate the new behavior.\n\nFixes #65","shortMessageHtmlLink":"action.go, menu.go, declarative/action.go, examples/actions: fix radi…"}},{"before":"80aa84d8cc57b8aba6ed0d46eb68294c0be5b332","after":"8ee2d5916161e22e9cf3edd1fc7336f925527f00","ref":"refs/heads/nickkhyl/radio-button-mi","pushedAt":"2024-06-13T14:53:02.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"action.go, menu.go, declarative/action.go, examples/actions: fix radio button menu items\n\nThis prevents radio button menu items from being unchecked when a user selects an already checked item. It also updates other item states in an exclusivity group when a radio button menu item is checked programmatically or by a user.\n\nFinally, it allows to create radio button menu items using the declarative syntax and updates examples/actions to demonstrate the new behavior.\n\nFixes #65","shortMessageHtmlLink":"action.go, menu.go, declarative/action.go, examples/actions: fix radi…"}},{"before":null,"after":"80aa84d8cc57b8aba6ed0d46eb68294c0be5b332","ref":"refs/heads/nickkhyl/radio-button-mi","pushedAt":"2024-06-12T22:55:56.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"nickkhyl","name":"Nick Khyl","path":"/nickkhyl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1761190?s=80&v=4"},"commit":{"message":"action.go, menu.go, declarative/action.go, examples/actions: fix radio button menu items\n\nThis prevents radio button menu items from being unchecked when a user selects an already checked item. It also updates other item states in an exclusivity group when a radio button menu item is checked programmatically or by a user.\n\nFinally, it allows to create radio button menu items using the declarative syntax and updates examples/actions to demonstrate the new behavior.\n\nFixes #65","shortMessageHtmlLink":"action.go, menu.go, declarative/action.go, examples/actions: fix radi…"}},{"before":"38cdc23ccdf00e612be0bb977929220da4488268","after":null,"ref":"refs/heads/aaron/comment_fixes_041224","pushedAt":"2024-04-12T18:05:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"dblohm7","name":"Aaron Klotz","path":"/dblohm7","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2090933?s=80&v=4"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEhx_pRgA","startCursor":null,"endCursor":null}},"title":"Activity · tailscale/walk"}