diff --git a/dotfiles/config/taffybar/icons/claude-symbol.svg b/dotfiles/config/taffybar/icons/claude-symbol.svg
new file mode 100644
index 00000000..27259c08
--- /dev/null
+++ b/dotfiles/config/taffybar/icons/claude-symbol.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/dotfiles/config/taffybar/icons/openai-symbol.svg b/dotfiles/config/taffybar/icons/openai-symbol.svg
new file mode 100644
index 00000000..a99dd84a
--- /dev/null
+++ b/dotfiles/config/taffybar/icons/openai-symbol.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/dotfiles/config/taffybar/taffybar.css b/dotfiles/config/taffybar/taffybar.css
index f2244284..6369826e 100644
--- a/dotfiles/config/taffybar/taffybar.css
+++ b/dotfiles/config/taffybar/taffybar.css
@@ -40,6 +40,16 @@
-GtkLabel-justify: left;
}
+/* Compact logo column for stacked AI usage sections. */
+.usage-section.icon-label > .icon {
+ min-width: 22px;
+ padding-right: 8px;
+}
+
+.usage-section.icon-label > .label {
+ padding-right: 0px;
+}
+
/* Compact two-line RAM/SWAP widget: reduce icon padding a bit. */
.ram-swap .icon-label > .icon {
/* Different glyphs have different visual widths; fix the icon column width
diff --git a/dotfiles/config/taffybar/taffybar.hs b/dotfiles/config/taffybar/taffybar.hs
index 32bf5c41..1365d30d 100644
--- a/dotfiles/config/taffybar/taffybar.hs
+++ b/dotfiles/config/taffybar/taffybar.hs
@@ -65,7 +65,7 @@ import System.Taffybar.Widget.SNITray.PrioritizedCollapsible
sniTrayPrioritizedCollapsibleNewFromParams,
)
import qualified System.Taffybar.Widget.ScreenLock as ScreenLock
-import System.Taffybar.Widget.Util (backgroundLoop, buildContentsBox, buildIconLabelBox, loadPixbufByName, widgetSetClassGI)
+import System.Taffybar.Widget.Util (backgroundLoop, buildContentsBox, buildIconLabelBox, loadPixbufByName, pixbufNewFromFileAtScaleByHeight, widgetSetClassGI)
import qualified System.Taffybar.Widget.Wlsunset as Wlsunset
import qualified System.Taffybar.Widget.Workspaces as Workspaces
import System.Taffybar.WindowIcon (pixBufFromColor)
@@ -551,13 +551,33 @@ wakeupDebugWidget :: TaffyIO Gtk.Widget
wakeupDebugWidget =
decorateWithClassAndBoxM "wakeup-debug" wakeupDebugWidgetNew
+usageLogoWidget :: FilePath -> Text -> IO Gtk.Widget
+usageLogoWidget iconFile tooltip = do
+ iconPath <- getUserConfigFile "taffybar" ("icons/" <> iconFile)
+ iconWidget <-
+ pixbufNewFromFileAtScaleByHeight 18 iconPath >>= \loaded ->
+ case loaded of
+ Right pixbuf -> Gtk.toWidget =<< Gtk.imageNewFromPixbuf (Just pixbuf)
+ Left _ -> Gtk.toWidget =<< Gtk.labelNew (Just "?")
+ Gtk.widgetSetTooltipText iconWidget (Just tooltip)
+ widgetSetClassGI iconWidget "usage-logo"
+
+usageSectionWidget :: Text -> FilePath -> Text -> TaffyIO Gtk.Widget -> TaffyIO Gtk.Widget
+usageSectionWidget klass iconFile tooltip stackBuilder =
+ decorateWithClassAndBoxM klass $ do
+ stack <- stackBuilder
+ liftIO $ do
+ iconWidget <- usageLogoWidget iconFile tooltip
+ section <- buildIconLabelBox iconWidget stack
+ widgetSetClassGI section "usage-section"
+
openAIUsageWidget :: TaffyIO Gtk.Widget
openAIUsageWidget =
- decorateWithClassAndBoxM "openai-usage" openAIUsageStackNew
+ usageSectionWidget "openai-usage" "openai-symbol.svg" "OpenAI usage" openAIUsageStackNew
anthropicUsageWidget :: TaffyIO Gtk.Widget
anthropicUsageWidget =
- decorateWithClassAndBoxM "anthropic-usage" anthropicUsageStackNew
+ usageSectionWidget "anthropic-usage" "claude-symbol.svg" "Anthropic usage" anthropicUsageStackNew
sniPriorityVisibilityThresholdDefault :: Int
sniPriorityVisibilityThresholdDefault = 0