From 5522b8bacd35cf0c9a045865c321d9f06d0becb4 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Tue, 28 Apr 2026 12:11:43 -0700 Subject: [PATCH] Add logos to AI usage widgets --- .../config/taffybar/icons/claude-symbol.svg | 8 ++++++ .../config/taffybar/icons/openai-symbol.svg | 5 ++++ dotfiles/config/taffybar/taffybar.css | 10 +++++++ dotfiles/config/taffybar/taffybar.hs | 26 ++++++++++++++++--- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 dotfiles/config/taffybar/icons/claude-symbol.svg create mode 100644 dotfiles/config/taffybar/icons/openai-symbol.svg 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