Fix stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream
, '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 stack icon rendering on newer macOS - #131

Open
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos
Open

Fix stack icon rendering on newer macOS#131
kiwidream wants to merge 2 commits into
AdamWagner:mainfrom
kiwidream:stack-icons-macos

Conversation

@kiwidream

Copy link
Copy Markdown

Summary

Fix stack indicators not showing app icons on newer macOS/Hammerspoon setups, and add a small local Lua test harness to cover the new behavior.

Fixes#125.

Problem

On current Apple Silicon and newer macOS/Hammerspoon environments, Stackline could fail to display stack icons for two different reasons:

  1. paths.yabai could point at a Homebrew prefix directory such as /opt/homebrew/opt/yabai instead of the actual binary, which caused the hs.task launch to fail and left stackmanager empty.
  2. Even when yabai was reachable, Stackline relied on hs.window.filter:getWindows() to expose every stacked window. On newer setups that assumption appears less reliable, so Stackline could miss stacked windows before it ever reached the icon drawing path.
  3. The icon lookup path itself used hs.appfinder.appFromName(), which is deprecated and can return nil in cases where the owning application object is already available from the window.

The net effect was that users could create a stack successfully but see no icon indicators, with very little diagnostic information about which layer had actually failed.

Solution

This PR hardens the stack detection and icon lookup paths:

  • resolve the configured yabai path more defensively, including handling directory-style Homebrew paths and falling back to common binary locations
  • surface one-time user notifications when yabai cannot be found or launched, instead of failing silently
  • treat yabai as the source of truth for stack-index values and drop grouped windows that yabai does not report as stacked
  • rebuild stacks from yabai window IDs on active spaces when hs.window.filter does not expose all stacked windows
  • switch icon lookup to use the live window application object first, then fall back to bundle ID, app path, and hs.application.get() as needed
  • cache resolved icon images per window to avoid repeating lookup work
  • update the default paths.yabai config to prefer /opt/homebrew/bin/yabai when present

Additional Changes

This PR also adds a lightweight local Lua test harness so the new behavior can be exercised without requiring a full interactive Hammerspoon session:

  • make test entrypoint
  • focused unit tests for default yabai path selection
  • focused unit tests for query fallback and path resolution
  • focused unit tests for icon lookup fallback and caching

Testing

Manual:

  • validated the fix locally with Hammerspoon running from ~/.hammerspoon
  • confirmed Stackline loads via the hs CLI after enabling hs.ipc
  • confirmed the patched config resolves paths.yabai to /opt/homebrew/bin/yabai

Automated:

make test

Current result:

  • 6 tests, 0 failures

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.

[Bug] Stackline is not showing Icons on Stack mode

1 participant

@kiwidream