fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(markdown,menu): make link clicks and context menus reliable - #285

Merged
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction
Aug 26, 2026
Merged

fix(markdown,menu): make link clicks and context menus reliable#285
Tryanks merged 2 commits into
mainfrom
fix/markdown-link-interaction

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Summary

Fixes three defects in ChatView Markdown link interaction:

  1. Context menu opened at the wrong place — the Popover-based ContextMenu could only anchor to the trigger element's bounds, and for Markdown the trigger is the whole block, so the menu appeared at the block's edge instead of the cursor. ContextMenu is rewritten (modeled on the upstream gpui-component implementation at the same pinned revision) to anchor at the right-click mouse position via deferred + anchored().position(...), snapped to the window with an 8px margin. Sidebar and terminal context menus pick up mouse-position anchoring too.

  2. Menu items did nothing — the menu rendered as a sibling of the trigger, while the OpenLink/CopyLinkAddress/OpenPath/… handlers are registered on_action on the trigger div itself. Actions dispatch along the focused (menu) node's ancestor chain, which never included the trigger, so every action was silently dropped. The menu is now a child of the trigger, putting those handlers on the dispatch path. The new link_context_menu_action_opens_the_url test fails on the old structure.

  3. Left clicks unreliable — mouse-up was guarded by the window-wide TextSelection::has_selection, and the selection snapshot compares anchor/cursor as pixels, so the ~1px jitter of a real press-and-release registered as a selection and swallowed the click. Replaced with press-origin tracking: a release within 3px of a press that started on the link is a click; farther is a drag-selection. click_count == 1 keeps a double-click (which selects the word) from opening the link twice.

Changes

  • crates/ui/src/widgets/menu.rsContextMenu rewritten off gpui_base::Popover: mouse-position anchoring, menu as trigger child, focus restore on dismiss, deferred-popover registration preserved (keeps the collapsed-sidebar hover overlay alive while a menu is open).
  • crates/ui/src/markdown/inline.rs — link press-origin tracking replaces the has_selection guard.
  • crates/ui/src/markdown/state.rs — new link_press_origin field.
  • crates/ui/src/markdown/view.rs — two regression tests.

Testing

  • cargo test -p tcode-ui: 268 passed, 0 failed (includes new link_click_survives_pixel_jitter_but_not_a_drag and link_context_menu_action_opens_the_url).
  • cargo clippy -p tcode-ui: clean.

Three independent defects in Markdown link interaction:
- Context menus opened at the trigger element's corner because the
Popover-based ContextMenu could only anchor to trigger bounds. Rewrite
ContextMenu to anchor at the right-click mouse position (deferred +
anchored, snapped to the window with an 8px margin).
- Menu actions were silently dropped: the menu rendered as a sibling of
the trigger, so actions dispatched along the focus path never reached
the on_action handlers registered on the trigger div. The menu is now
a child of the trigger, putting those handlers on the dispatch path.
- Left clicks on links were swallowed whenever the press-to-release
jitter produced a pixel-level selection snapshot. Replace the
window-wide has_selection guard with press-origin tracking: a release
within 3px of a press that started on the link is a click; farther is
a drag-selection. click_count == 1 keeps double-clicks from opening
the link twice.
@Tryanks
Tryanks merged commit d51a294 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/markdown-link-interaction branch August 26, 2026 06:18
Sign up for freeto 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

@Tryanks