packages feed

taffybar 2.1.0 → 2.1.1

raw patch · 22 files changed

+443/−323 lines, 22 filesdep −alsa-mixerPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: alsa-mixer

API changes (from Hackage documentation)

- System.Taffybar.Compat.GtkLibs: pixbufNewFromData :: (Integral p2, Integral p1) => Ptr Word8 -> p2 -> p1 -> IO Pixbuf
- System.Taffybar.EWMHPixbuf: pixBufFromColor :: Int32 -> ColorRGBA -> IO Pixbuf
- System.Taffybar.EWMHPixbuf: pixBufFromEWMHIcon :: EWMHIcon -> IO Pixbuf
- System.Taffybar.EWMHPixbuf: pixBufFromFile :: FilePath -> IO Pixbuf
- System.Taffybar.EWMHPixbuf: pixelsARGBToBytesABGR :: (Storable a, Bits a, Num a, Integral a) => Ptr a -> Int -> IO (Ptr Word8)
- System.Taffybar.EWMHPixbuf: type ColorRGBA = Word32
- System.Taffybar.Information.EWMHDesktopInfo: [height] :: EWMHIcon -> Int
- System.Taffybar.Information.EWMHDesktopInfo: [pixelsARGB] :: EWMHIcon -> Ptr PixelsWordType
- System.Taffybar.Information.EWMHDesktopInfo: [width] :: EWMHIcon -> Int
- System.Taffybar.Information.Volume: getVolume :: String -> String -> IO Integer
- System.Taffybar.Information.Volume: setVolume :: String -> String -> Double -> IO ()
- System.Taffybar.Widget: IIColor :: ColorRGBA -> IconInfo
- System.Taffybar.Widget: IIEWMH :: EWMHIconData -> IconInfo
- System.Taffybar.Widget: IIFilePath :: FilePath -> IconInfo
- System.Taffybar.Widget: IINone :: IconInfo
- System.Taffybar.Widget: Workspace :: WorkspaceIdx -> String -> WorkspaceState -> [WindowData] -> Workspace
- System.Taffybar.Widget: WorkspacesConfig :: ControllerConstructor -> Int -> Int -> Maybe Int -> Int -> Maybe Int -> Int -> (WindowData -> WorkspacesIO IconInfo) -> (Workspace -> WorkspacesIO String) -> (Workspace -> Bool) -> Int -> [String] -> Integer -> ([WindowData] -> WorkspacesIO [WindowData]) -> Bool -> WorkspacesConfig
- System.Taffybar.Widget: [borderWidth] :: WorkspacesConfig -> Int
- System.Taffybar.Widget: [getIconInfo] :: WorkspacesConfig -> WindowData -> WorkspacesIO IconInfo
- System.Taffybar.Widget: [iconSort] :: WorkspacesConfig -> [WindowData] -> WorkspacesIO [WindowData]
- System.Taffybar.Widget: [labelSetter] :: WorkspacesConfig -> Workspace -> WorkspacesIO String
- System.Taffybar.Widget: [maxIcons] :: WorkspacesConfig -> Maybe Int
- System.Taffybar.Widget: [minIcons] :: WorkspacesConfig -> Int
- System.Taffybar.Widget: [minWSWidgetSize] :: WorkspacesConfig -> Maybe Int
- System.Taffybar.Widget: [showWorkspaceFn] :: WorkspacesConfig -> Workspace -> Bool
- System.Taffybar.Widget: [underlineHeight] :: WorkspacesConfig -> Int
- System.Taffybar.Widget: [underlinePadding] :: WorkspacesConfig -> Int
- System.Taffybar.Widget: [updateEvents] :: WorkspacesConfig -> [String]
- System.Taffybar.Widget: [updateRateLimitMicroseconds] :: WorkspacesConfig -> Integer
- System.Taffybar.Widget: [urgentWorkspaceState] :: WorkspacesConfig -> Bool
- System.Taffybar.Widget: [widgetBuilder] :: WorkspacesConfig -> ControllerConstructor
- System.Taffybar.Widget: [widgetGap] :: WorkspacesConfig -> Int
- System.Taffybar.Widget: [windows] :: Workspace -> [WindowData]
- System.Taffybar.Widget: [workspaceIdx] :: Workspace -> WorkspaceIdx
- System.Taffybar.Widget: [workspaceName] :: Workspace -> String
- System.Taffybar.Widget: [workspaceState] :: Workspace -> WorkspaceState
- System.Taffybar.Widget: data IconInfo
- System.Taffybar.Widget: data Workspace
- System.Taffybar.Widget: data WorkspacesConfig
- System.Taffybar.Widget: hideEmpty :: Workspace -> Bool
- System.Taffybar.Widget: type WorkspacesIO a = ReaderT WorkspacesContext IO a
- System.Taffybar.Widget: volumeControlNew :: String -> String -> IO Widget
- System.Taffybar.Widget: volumeTextNew :: MonadIO m => String -> String -> Double -> m Widget
- System.Taffybar.Widget: workspacesNew :: WorkspacesConfig -> TaffyIO Widget
- System.Taffybar.Widget.Volume: volumeControlNew :: String -> String -> IO Widget
- System.Taffybar.Widget.Volume: volumeTextNew :: MonadIO m => String -> String -> Double -> m Widget
- System.Taffybar.Widget.Workspaces: IIColor :: ColorRGBA -> IconInfo
- System.Taffybar.Widget.Workspaces: IIEWMH :: EWMHIconData -> IconInfo
- System.Taffybar.Widget.Workspaces: IIFilePath :: FilePath -> IconInfo
- System.Taffybar.Widget.Workspaces: IINone :: IconInfo
- System.Taffybar.Widget.Workspaces: [getIconInfo] :: WorkspacesConfig -> WindowData -> WorkspacesIO IconInfo
- System.Taffybar.Widget.Workspaces: [hudWidget] :: WorkspacesContext -> HBox
- System.Taffybar.Widget.Workspaces: data IconInfo
- System.Taffybar.Widget.Workspaces: defaultGetIconInfo :: WindowData -> WorkspacesIO IconInfo
- System.Taffybar.Widget.Workspaces: instance GHC.Classes.Eq System.Taffybar.Widget.Workspaces.IconInfo
- System.Taffybar.Widget.Workspaces: instance GHC.Show.Show System.Taffybar.Widget.Workspaces.IconInfo
- System.Taffybar.Widget.Workspaces: windowTitleClassIconGetter :: (Bool -> String -> String -> IconInfo) -> (WindowData -> WorkspacesIO IconInfo)
+ System.Taffybar.Hooks: directoryEntriesByClassName :: Foldable t => t DesktopEntry -> MultiMap String DesktopEntry
+ System.Taffybar.Hooks: getDirectoryEntriesByClassName :: TaffyIO (MultiMap String DesktopEntry)
+ System.Taffybar.Hooks: readDirectoryEntriesDefault :: TaffyIO (MultiMap String DesktopEntry)
+ System.Taffybar.Hooks: updateDirectoryEntriesCache :: TaffyIO ()
+ System.Taffybar.Information.EWMHDesktopInfo: [ewmhHeight] :: EWMHIcon -> Int
+ System.Taffybar.Information.EWMHDesktopInfo: [ewmhPixelsARGB] :: EWMHIcon -> Ptr PixelsWordType
+ System.Taffybar.Information.EWMHDesktopInfo: [ewmhWidth] :: EWMHIcon -> Int
+ System.Taffybar.Information.EWMHDesktopInfo: parseWindowClasses :: String -> [String]
+ System.Taffybar.Information.SafeX11: AnyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> Event
+ System.Taffybar.Information.SafeX11: ButtonEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Window -> !Time -> !CInt -> !CInt -> !CInt -> !CInt -> !KeyMask -> !Button -> !Bool -> Event
+ System.Taffybar.Information.SafeX11: ClassHint :: String -> String -> ClassHint
+ System.Taffybar.Information.SafeX11: ClientMessageEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Atom -> ![CInt] -> Event
+ System.Taffybar.Information.SafeX11: ConfigureEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !CInt -> !CInt -> !CInt -> !CInt -> !CInt -> !Window -> !Bool -> Event
+ System.Taffybar.Information.SafeX11: ConfigureRequestEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !CInt -> !CInt -> !CInt -> !CInt -> !CInt -> !Window -> !NotifyDetail -> !CULong -> Event
+ System.Taffybar.Information.SafeX11: CrossingEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Window -> !Time -> !CInt -> !CInt -> !CInt -> !CInt -> !NotifyMode -> !NotifyDetail -> !Bool -> !Bool -> !Modifier -> Event
+ System.Taffybar.Information.SafeX11: DestroyWindowEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> Event
+ System.Taffybar.Information.SafeX11: ErrorEvent :: !CInt -> Display -> !CULong -> !CUChar -> !CUChar -> !CUChar -> !XID -> ErrorEvent
+ System.Taffybar.Information.SafeX11: ExposeEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !CInt -> !CInt -> !CInt -> !CInt -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: FontSet :: Ptr FontSet -> FontSet
+ System.Taffybar.Information.SafeX11: KeyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Window -> !Time -> !CInt -> !CInt -> !CInt -> !CInt -> !KeyMask -> !KeyCode -> !Bool -> Event
+ System.Taffybar.Information.SafeX11: MapNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Bool -> Event
+ System.Taffybar.Information.SafeX11: MapRequestEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> Event
+ System.Taffybar.Information.SafeX11: MappingNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !MappingRequest -> !KeyCode -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: MotionEvent :: !EventType -> !CULong -> !Bool -> Display -> !CInt -> !CInt -> !Window -> Event
+ System.Taffybar.Information.SafeX11: PropertyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Atom -> !Time -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: RRCrtcChangeNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !CInt -> !RRCrtc -> !RRMode -> !Rotation -> !CInt -> !CInt -> !CUInt -> !CUInt -> Event
+ System.Taffybar.Information.SafeX11: RRNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: RROutputChangeNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !CInt -> !RROutput -> !RRCrtc -> !RRMode -> !Rotation -> !Connection -> !SubpixelOrder -> Event
+ System.Taffybar.Information.SafeX11: RROutputPropertyNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !CInt -> !RROutput -> !Atom -> !Time -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: RRScreenChangeNotifyEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Time -> !Time -> !SizeID -> !SubpixelOrder -> !Rotation -> !CInt -> !CInt -> !CInt -> !CInt -> Event
+ System.Taffybar.Information.SafeX11: SelectionClear :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Atom -> !Time -> Event
+ System.Taffybar.Information.SafeX11: SelectionRequest :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Atom -> !Atom -> !Atom -> !Time -> Event
+ System.Taffybar.Information.SafeX11: SizeHints :: Maybe (Dimension, Dimension) -> Maybe (Dimension, Dimension) -> Maybe (Dimension, Dimension) -> Maybe ((Dimension, Dimension), (Dimension, Dimension)) -> Maybe (Dimension, Dimension) -> Maybe BitGravity -> SizeHints
+ System.Taffybar.Information.SafeX11: TextProperty :: CString -> Atom -> CInt -> Word64 -> TextProperty
+ System.Taffybar.Information.SafeX11: UnmapEvent :: !EventType -> !CULong -> !Bool -> Display -> !Window -> !Window -> !Bool -> Event
+ System.Taffybar.Information.SafeX11: WMHints :: CLong -> Bool -> CInt -> Pixmap -> Window -> CInt -> CInt -> Pixmap -> XID -> WMHints
+ System.Taffybar.Information.SafeX11: WindowAttributes :: CInt -> CInt -> CInt -> CInt -> CInt -> Colormap -> Bool -> CInt -> Bool -> WindowAttributes
+ System.Taffybar.Information.SafeX11: WindowChanges :: CInt -> CInt -> CInt -> CInt -> CInt -> Window -> CInt -> WindowChanges
+ System.Taffybar.Information.SafeX11: [ev_above] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_atom] :: Event -> !Atom
+ System.Taffybar.Information.SafeX11: [ev_border_width] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_button] :: Event -> !Button
+ System.Taffybar.Information.SafeX11: [ev_config_timestamp] :: Event -> !Time
+ System.Taffybar.Information.SafeX11: [ev_connection] :: Event -> !Connection
+ System.Taffybar.Information.SafeX11: [ev_count] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_crtc] :: Event -> !RRCrtc
+ System.Taffybar.Information.SafeX11: [ev_data] :: Event -> ![CInt]
+ System.Taffybar.Information.SafeX11: [ev_detail] :: Event -> !NotifyDetail
+ System.Taffybar.Information.SafeX11: [ev_display] :: ErrorEvent -> Display
+ System.Taffybar.Information.SafeX11: [ev_error_code] :: ErrorEvent -> !CUChar
+ System.Taffybar.Information.SafeX11: [ev_event] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_event_display] :: Event -> Display
+ System.Taffybar.Information.SafeX11: [ev_event_type] :: Event -> !EventType
+ System.Taffybar.Information.SafeX11: [ev_first_keycode] :: Event -> !KeyCode
+ System.Taffybar.Information.SafeX11: [ev_focus] :: Event -> !Bool
+ System.Taffybar.Information.SafeX11: [ev_from_configure] :: Event -> !Bool
+ System.Taffybar.Information.SafeX11: [ev_height] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_keycode] :: Event -> !KeyCode
+ System.Taffybar.Information.SafeX11: [ev_message_type] :: Event -> !Atom
+ System.Taffybar.Information.SafeX11: [ev_mheight] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_minor_code] :: ErrorEvent -> !CUChar
+ System.Taffybar.Information.SafeX11: [ev_mode] :: Event -> !NotifyMode
+ System.Taffybar.Information.SafeX11: [ev_mwidth] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_output] :: Event -> !RROutput
+ System.Taffybar.Information.SafeX11: [ev_override_redirect] :: Event -> !Bool
+ System.Taffybar.Information.SafeX11: [ev_owner] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_parent] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_property] :: Event -> !Atom
+ System.Taffybar.Information.SafeX11: [ev_propstate] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_request] :: Event -> !MappingRequest
+ System.Taffybar.Information.SafeX11: [ev_request_code] :: ErrorEvent -> !CUChar
+ System.Taffybar.Information.SafeX11: [ev_requestor] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_resourceid] :: ErrorEvent -> !XID
+ System.Taffybar.Information.SafeX11: [ev_root] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_rotation] :: Event -> !Rotation
+ System.Taffybar.Information.SafeX11: [ev_rr_height] :: Event -> !CUInt
+ System.Taffybar.Information.SafeX11: [ev_rr_mode] :: Event -> !RRMode
+ System.Taffybar.Information.SafeX11: [ev_rr_state] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_rr_width] :: Event -> !CUInt
+ System.Taffybar.Information.SafeX11: [ev_same_screen] :: Event -> !Bool
+ System.Taffybar.Information.SafeX11: [ev_selection] :: Event -> !Atom
+ System.Taffybar.Information.SafeX11: [ev_send_event] :: Event -> !Bool
+ System.Taffybar.Information.SafeX11: [ev_serial] :: Event -> !CULong
+ System.Taffybar.Information.SafeX11: [ev_serialnum] :: ErrorEvent -> !CULong
+ System.Taffybar.Information.SafeX11: [ev_size_index] :: Event -> !SizeID
+ System.Taffybar.Information.SafeX11: [ev_state] :: Event -> !Modifier
+ System.Taffybar.Information.SafeX11: [ev_subpixel_order] :: Event -> !SubpixelOrder
+ System.Taffybar.Information.SafeX11: [ev_subtype] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_subwindow] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_target] :: Event -> !Atom
+ System.Taffybar.Information.SafeX11: [ev_time] :: Event -> !Time
+ System.Taffybar.Information.SafeX11: [ev_timestamp] :: Event -> !Time
+ System.Taffybar.Information.SafeX11: [ev_type] :: ErrorEvent -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_value_mask] :: Event -> !CULong
+ System.Taffybar.Information.SafeX11: [ev_width] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_window] :: Event -> !Window
+ System.Taffybar.Information.SafeX11: [ev_x] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_x_root] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_y] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [ev_y_root] :: Event -> !CInt
+ System.Taffybar.Information.SafeX11: [resClass] :: ClassHint -> String
+ System.Taffybar.Information.SafeX11: [resName] :: ClassHint -> String
+ System.Taffybar.Information.SafeX11: [sh_aspect] :: SizeHints -> Maybe ((Dimension, Dimension), (Dimension, Dimension))
+ System.Taffybar.Information.SafeX11: [sh_base_size] :: SizeHints -> Maybe (Dimension, Dimension)
+ System.Taffybar.Information.SafeX11: [sh_max_size] :: SizeHints -> Maybe (Dimension, Dimension)
+ System.Taffybar.Information.SafeX11: [sh_min_size] :: SizeHints -> Maybe (Dimension, Dimension)
+ System.Taffybar.Information.SafeX11: [sh_resize_inc] :: SizeHints -> Maybe (Dimension, Dimension)
+ System.Taffybar.Information.SafeX11: [sh_win_gravity] :: SizeHints -> Maybe BitGravity
+ System.Taffybar.Information.SafeX11: [tp_encoding] :: TextProperty -> Atom
+ System.Taffybar.Information.SafeX11: [tp_format] :: TextProperty -> CInt
+ System.Taffybar.Information.SafeX11: [tp_nitems] :: TextProperty -> Word64
+ System.Taffybar.Information.SafeX11: [tp_value] :: TextProperty -> CString
+ System.Taffybar.Information.SafeX11: [wa_border_width] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wa_colormap] :: WindowAttributes -> Colormap
+ System.Taffybar.Information.SafeX11: [wa_height] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wa_map_installed] :: WindowAttributes -> Bool
+ System.Taffybar.Information.SafeX11: [wa_map_state] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wa_override_redirect] :: WindowAttributes -> Bool
+ System.Taffybar.Information.SafeX11: [wa_width] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wa_x] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wa_y] :: WindowAttributes -> CInt
+ System.Taffybar.Information.SafeX11: [wc_border_width] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wc_height] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wc_sibling] :: WindowChanges -> Window
+ System.Taffybar.Information.SafeX11: [wc_stack_mode] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wc_width] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wc_x] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wc_y] :: WindowChanges -> CInt
+ System.Taffybar.Information.SafeX11: [wmh_flags] :: WMHints -> CLong
+ System.Taffybar.Information.SafeX11: [wmh_icon_mask] :: WMHints -> Pixmap
+ System.Taffybar.Information.SafeX11: [wmh_icon_pixmap] :: WMHints -> Pixmap
+ System.Taffybar.Information.SafeX11: [wmh_icon_window] :: WMHints -> Window
+ System.Taffybar.Information.SafeX11: [wmh_icon_x] :: WMHints -> CInt
+ System.Taffybar.Information.SafeX11: [wmh_icon_y] :: WMHints -> CInt
+ System.Taffybar.Information.SafeX11: [wmh_initial_state] :: WMHints -> CInt
+ System.Taffybar.Information.SafeX11: [wmh_input] :: WMHints -> Bool
+ System.Taffybar.Information.SafeX11: [wmh_window_group] :: WMHints -> XID
+ System.Taffybar.Information.SafeX11: _xSetErrorHandler :: FunPtr CXErrorHandler -> IO FunPtr CXErrorHandler
+ System.Taffybar.Information.SafeX11: allHintsBitmask :: CLong
+ System.Taffybar.Information.SafeX11: anyButton :: Button
+ System.Taffybar.Information.SafeX11: anyKey :: KeyCode
+ System.Taffybar.Information.SafeX11: anyPropertyType :: Atom
+ System.Taffybar.Information.SafeX11: changeProperty16 :: Display -> Window -> Atom -> Atom -> CInt -> [CShort] -> IO ()
+ System.Taffybar.Information.SafeX11: changeProperty32 :: Display -> Window -> Atom -> Atom -> CInt -> [CLong] -> IO ()
+ System.Taffybar.Information.SafeX11: changeProperty8 :: Display -> Window -> Atom -> Atom -> CInt -> [CChar] -> IO ()
+ System.Taffybar.Information.SafeX11: changeWindowAttributes :: Display -> Window -> AttributeMask -> Ptr SetWindowAttributes -> IO ()
+ System.Taffybar.Information.SafeX11: configureWindow :: Display -> Window -> CULong -> WindowChanges -> IO ()
+ System.Taffybar.Information.SafeX11: createFontSet :: Display -> String -> IO ([String], String, FontSet)
+ System.Taffybar.Information.SafeX11: currentTime :: Time
+ System.Taffybar.Information.SafeX11: data ClassHint
+ System.Taffybar.Information.SafeX11: data ErrorEvent
+ System.Taffybar.Information.SafeX11: data Event
+ System.Taffybar.Information.SafeX11: data SizeHints
+ System.Taffybar.Information.SafeX11: data TextProperty
+ System.Taffybar.Information.SafeX11: data WMHints
+ System.Taffybar.Information.SafeX11: data WindowAttributes
+ System.Taffybar.Information.SafeX11: data WindowChanges
+ System.Taffybar.Information.SafeX11: deleteProperty :: Display -> Window -> Atom -> IO ()
+ System.Taffybar.Information.SafeX11: eventName :: Event -> String
+ System.Taffybar.Information.SafeX11: eventTable :: [(EventType, String)]
+ System.Taffybar.Information.SafeX11: fetchName :: Display -> Window -> IO Maybe String
+ System.Taffybar.Information.SafeX11: freeFontSet :: Display -> FontSet -> IO ()
+ System.Taffybar.Information.SafeX11: freeStringList :: Ptr CString -> IO ()
+ System.Taffybar.Information.SafeX11: getClassHint :: Display -> Window -> IO ClassHint
+ System.Taffybar.Information.SafeX11: getCommand :: Display -> Window -> IO [String]
+ System.Taffybar.Information.SafeX11: getErrorEvent :: XErrorEventPtr -> IO ErrorEvent
+ System.Taffybar.Information.SafeX11: getEvent :: XEventPtr -> IO Event
+ System.Taffybar.Information.SafeX11: getModifierMapping :: Display -> IO [(Modifier, [KeyCode])]
+ System.Taffybar.Information.SafeX11: getTextProperty :: Display -> Window -> Atom -> IO TextProperty
+ System.Taffybar.Information.SafeX11: getTransientForHint :: Display -> Window -> IO Maybe Window
+ System.Taffybar.Information.SafeX11: getWMNormalHints :: Display -> Window -> IO SizeHints
+ System.Taffybar.Information.SafeX11: getWMProtocols :: Display -> Window -> IO [Atom]
+ System.Taffybar.Information.SafeX11: getWindowAttributes :: Display -> Window -> IO WindowAttributes
+ System.Taffybar.Information.SafeX11: getXErrorHandler :: FunPtr CXErrorHandler -> CXErrorHandler
+ System.Taffybar.Information.SafeX11: iconMaskHintBit :: Int
+ System.Taffybar.Information.SafeX11: iconPixmapHintBit :: Int
+ System.Taffybar.Information.SafeX11: iconPositionHintBit :: Int
+ System.Taffybar.Information.SafeX11: iconWindowHintBit :: Int
+ System.Taffybar.Information.SafeX11: iconicState :: Int
+ System.Taffybar.Information.SafeX11: inputHintBit :: Int
+ System.Taffybar.Information.SafeX11: isCursorKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isFunctionKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isKeypadKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isMiscFunctionKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isModifierKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isPFKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: isPrivateKeypadKey :: KeySym -> Bool
+ System.Taffybar.Information.SafeX11: killClient :: Display -> Window -> IO CInt
+ System.Taffybar.Information.SafeX11: mapRaised :: Display -> Window -> IO CInt
+ System.Taffybar.Information.SafeX11: mkXErrorHandler :: CXErrorHandler -> IO FunPtr CXErrorHandler
+ System.Taffybar.Information.SafeX11: newtype FontSet
+ System.Taffybar.Information.SafeX11: none :: XID
+ System.Taffybar.Information.SafeX11: normalState :: Int
+ System.Taffybar.Information.SafeX11: pAspectBit :: Int
+ System.Taffybar.Information.SafeX11: pBaseSizeBit :: Int
+ System.Taffybar.Information.SafeX11: pMaxSizeBit :: Int
+ System.Taffybar.Information.SafeX11: pMinSizeBit :: Int
+ System.Taffybar.Information.SafeX11: pResizeIncBit :: Int
+ System.Taffybar.Information.SafeX11: pWinGravityBit :: Int
+ System.Taffybar.Information.SafeX11: propModeAppend :: CInt
+ System.Taffybar.Information.SafeX11: propModePrepend :: CInt
+ System.Taffybar.Information.SafeX11: propModeReplace :: CInt
+ System.Taffybar.Information.SafeX11: queryTree :: Display -> Window -> IO (Window, Window, [Window])
+ System.Taffybar.Information.SafeX11: setClientMessageEvent :: XEventPtr -> Window -> Atom -> CInt -> Atom -> Time -> IO ()
+ System.Taffybar.Information.SafeX11: setConfigureEvent :: XEventPtr -> Window -> Window -> CInt -> CInt -> CInt -> CInt -> CInt -> Window -> Bool -> IO ()
+ System.Taffybar.Information.SafeX11: setErrorHandler :: XErrorHandler -> IO ()
+ System.Taffybar.Information.SafeX11: setEventType :: XEventPtr -> EventType -> IO ()
+ System.Taffybar.Information.SafeX11: setKeyEvent :: XEventPtr -> Window -> Window -> Window -> KeyMask -> KeyCode -> Bool -> IO ()
+ System.Taffybar.Information.SafeX11: setSelectionNotify :: XEventPtr -> Window -> Atom -> Atom -> Atom -> Time -> IO ()
+ System.Taffybar.Information.SafeX11: setWMHints :: Display -> Window -> WMHints -> IO Status
+ System.Taffybar.Information.SafeX11: stateHintBit :: Int
+ System.Taffybar.Information.SafeX11: type CXErrorHandler = Display -> XErrorEventPtr -> IO CInt
+ System.Taffybar.Information.SafeX11: type XErrorEventPtr = Ptr ()
+ System.Taffybar.Information.SafeX11: type XErrorHandler = Display -> XErrorEventPtr -> IO ()
+ System.Taffybar.Information.SafeX11: unmapWindow :: Display -> Window -> IO ()
+ System.Taffybar.Information.SafeX11: urgencyHintBit :: Int
+ System.Taffybar.Information.SafeX11: waIsUnmapped :: CInt
+ System.Taffybar.Information.SafeX11: waIsUnviewable :: CInt
+ System.Taffybar.Information.SafeX11: waIsViewable :: CInt
+ System.Taffybar.Information.SafeX11: wcDrawImageString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> String -> IO ()
+ System.Taffybar.Information.SafeX11: wcDrawString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> String -> IO ()
+ System.Taffybar.Information.SafeX11: wcFreeStringList :: Ptr CWString -> IO ()
+ System.Taffybar.Information.SafeX11: wcTextEscapement :: FontSet -> String -> Int32
+ System.Taffybar.Information.SafeX11: wcTextExtents :: FontSet -> String -> (Rectangle, Rectangle)
+ System.Taffybar.Information.SafeX11: wcTextPropertyToTextList :: Display -> TextProperty -> IO [String]
+ System.Taffybar.Information.SafeX11: windowGroupHintBit :: Int
+ System.Taffybar.Information.SafeX11: withServer :: Display -> IO () -> IO ()
+ System.Taffybar.Information.SafeX11: withdrawnState :: Int
+ System.Taffybar.Information.SafeX11: xAllocWMHints :: IO Ptr WMHints
+ System.Taffybar.Information.SafeX11: xChangeProperty :: Display -> Window -> Atom -> Atom -> CInt -> CInt -> Ptr CUChar -> CInt -> IO Status
+ System.Taffybar.Information.SafeX11: xConfigureWindow :: Display -> Window -> CULong -> Ptr WindowChanges -> IO CInt
+ System.Taffybar.Information.SafeX11: xConvertSelection :: Display -> Atom -> Atom -> Atom -> Window -> Time -> IO ()
+ System.Taffybar.Information.SafeX11: xCreateFontSet :: Display -> CString -> Ptr Ptr CString -> Ptr CInt -> Ptr CString -> IO Ptr FontSet
+ System.Taffybar.Information.SafeX11: xDeleteProperty :: Display -> Window -> Atom -> IO Status
+ System.Taffybar.Information.SafeX11: xFetchName :: Display -> Window -> Ptr CString -> IO Status
+ System.Taffybar.Information.SafeX11: xFree :: () => Ptr a -> IO CInt
+ System.Taffybar.Information.SafeX11: xFreeModifiermap :: Ptr () -> IO Ptr CInt
+ System.Taffybar.Information.SafeX11: xGetClassHint :: Display -> Window -> Ptr ClassHint -> IO Status
+ System.Taffybar.Information.SafeX11: xGetCommand :: Display -> Window -> Ptr Ptr CWString -> Ptr CInt -> IO Status
+ System.Taffybar.Information.SafeX11: xGetModifierMapping :: Display -> IO Ptr ()
+ System.Taffybar.Information.SafeX11: xGetSelectionOwner :: Display -> Atom -> IO Window
+ System.Taffybar.Information.SafeX11: xGetTextProperty :: Display -> Window -> Ptr TextProperty -> Atom -> IO Status
+ System.Taffybar.Information.SafeX11: xGetTransientForHint :: Display -> Window -> Ptr Window -> IO Status
+ System.Taffybar.Information.SafeX11: xGetWMNormalHints :: Display -> Window -> Ptr SizeHints -> Ptr CLong -> IO Status
+ System.Taffybar.Information.SafeX11: xGetWMProtocols :: Display -> Window -> Ptr Ptr Atom -> Ptr CInt -> IO Status
+ System.Taffybar.Information.SafeX11: xGetWindowAttributes :: Display -> Window -> Ptr WindowAttributes -> IO Status
+ System.Taffybar.Information.SafeX11: xGetWindowProperty :: Display -> Window -> Atom -> CLong -> CLong -> Bool -> Atom -> Ptr Atom -> Ptr CInt -> Ptr CULong -> Ptr CULong -> Ptr Ptr CUChar -> IO Status
+ System.Taffybar.Information.SafeX11: xQueryTree :: Display -> Window -> Ptr Window -> Ptr Window -> Ptr Ptr Window -> Ptr CInt -> IO Status
+ System.Taffybar.Information.SafeX11: xRefreshKeyboardMapping :: Ptr () -> IO CInt
+ System.Taffybar.Information.SafeX11: xSetErrorHandler :: IO ()
+ System.Taffybar.Information.SafeX11: xSetSelectionOwner :: Display -> Atom -> Window -> Time -> IO ()
+ System.Taffybar.Information.SafeX11: xSetWMHints :: Display -> Window -> Ptr WMHints -> IO Status
+ System.Taffybar.Information.SafeX11: xUnmapWindow :: Display -> Window -> IO CInt
+ System.Taffybar.Information.SafeX11: xwcDrawImageString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> CWString -> CInt -> IO ()
+ System.Taffybar.Information.SafeX11: xwcDrawString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> CWString -> CInt -> IO ()
+ System.Taffybar.Information.SafeX11: xwcTextEscapement :: FontSet -> CWString -> CInt -> IO Int32
+ System.Taffybar.Information.SafeX11: xwcTextExtents :: FontSet -> CWString -> CInt -> Ptr Rectangle -> Ptr Rectangle -> IO CInt
+ System.Taffybar.Information.SafeX11: xwcTextPropertyToTextList :: Display -> Ptr TextProperty -> Ptr Ptr CWString -> Ptr CInt -> IO CInt
+ System.Taffybar.Information.XDG.DesktopEntry: getDirectoryEntriesDefault :: IO [DesktopEntry]
+ System.Taffybar.Util: (<||>) :: Monad m => (t -> m (Maybe a)) -> (t -> m (Maybe a)) -> t -> m (Maybe a)
+ System.Taffybar.Util: (<|||>) :: Monad m => (t -> t1 -> m (Maybe a)) -> (t -> t1 -> m (Maybe a)) -> t -> t1 -> m (Maybe a)
+ System.Taffybar.Util: (??) :: Functor f => f (a -> b) -> a -> f b
+ System.Taffybar.Util: catchGErrorsAsLeft :: IO a -> IO (Either GError a)
+ System.Taffybar.Util: foreverWithDelay :: RealFrac a1 => a1 -> IO a -> IO ThreadId
+ System.Taffybar.Util: forkM :: Monad m => (c -> m a) -> (c -> m b) -> c -> m (a, b)
+ System.Taffybar.Util: getPixbufFromFilePath :: FilePath -> IO (Maybe Pixbuf)
+ System.Taffybar.Util: ifM :: Monad m => m Bool -> m a -> m a -> m a
+ System.Taffybar.Util: infixl 3 <|||>
+ System.Taffybar.Util: infixl 4 ??
+ System.Taffybar.Util: liftActionTaker :: (Monad m) => ((a -> m a) -> m b) -> (a -> ReaderT c m a) -> ReaderT c m b
+ System.Taffybar.Util: liftReader :: Monad m => (m1 a -> m b) -> ReaderT r m1 a -> ReaderT r m b
+ System.Taffybar.Util: logPrintF :: (MonadIO m, Show t) => String -> Priority -> String -> t -> m ()
+ System.Taffybar.Util: logPrintFDebug :: (MonadIO m, Show t) => String -> String -> t -> m ()
+ System.Taffybar.Util: maybeTCombine :: Monad m => m (Maybe a) -> m (Maybe a) -> m (Maybe a)
+ System.Taffybar.Util: maybeToEither :: b -> Maybe a -> Either b a
+ System.Taffybar.Util: runCommand :: MonadIO m => FilePath -> [String] -> m (Either String String)
+ System.Taffybar.Util: runCommandFromPath :: MonadIO m => [String] -> m (Either String String)
+ System.Taffybar.Util: safePixbufNewFromFile :: FilePath -> IO (Either GError Pixbuf)
+ System.Taffybar.Util: truncateString :: Int -> String -> String
+ System.Taffybar.Widget.SNITray: sniTrayNewFromHost :: Host -> TaffyIO Widget
+ System.Taffybar.Widget.SNITray: sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt :: TaffyIO Widget
+ System.Taffybar.Widget.Util: loadPixbufByName :: Int32 -> Text -> IO (Maybe Pixbuf)
+ System.Taffybar.Widget.Workspaces: IconUpdate :: [X11Window] -> WidgetUpdate
+ System.Taffybar.Widget.Workspaces: IconWidget :: EventBox -> Image -> MVar (Maybe WindowData) -> IO () -> IconWidget
+ System.Taffybar.Widget.Workspaces: LabelController :: Label -> LabelController
+ System.Taffybar.Widget.Workspaces: WorkspaceBorderController :: EventBox -> EventBox -> WWC -> WorkspaceBorderController
+ System.Taffybar.Widget.Workspaces: WorkspaceUpdate :: Workspace -> WidgetUpdate
+ System.Taffybar.Widget.Workspaces: [borderContents] :: WorkspaceBorderController -> EventBox
+ System.Taffybar.Widget.Workspaces: [border] :: WorkspaceBorderController -> EventBox
+ System.Taffybar.Widget.Workspaces: [getWindowIconPixbuf] :: WorkspacesConfig -> WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: [iconContainer] :: IconWidget -> EventBox
+ System.Taffybar.Widget.Workspaces: [iconForceUpdate] :: IconWidget -> IO ()
+ System.Taffybar.Widget.Workspaces: [iconImage] :: IconWidget -> Image
+ System.Taffybar.Widget.Workspaces: [iconWindow] :: IconWidget -> MVar (Maybe WindowData)
+ System.Taffybar.Widget.Workspaces: [insideController] :: WorkspaceBorderController -> WWC
+ System.Taffybar.Widget.Workspaces: [label] :: LabelController -> Label
+ System.Taffybar.Widget.Workspaces: [workspacesWidget] :: WorkspacesContext -> HBox
+ System.Taffybar.Widget.Workspaces: addCustomIconsAndFallback :: (WindowData -> Maybe FilePath) -> (Int32 -> TaffyIO (Maybe Pixbuf)) -> WindowIconPixbufGetter -> WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: addCustomIconsToDefaultWithFallbackByPath :: (WindowData -> Maybe FilePath) -> FilePath -> WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: addWidget :: WWC -> WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: addWidgetsToTopLevel :: WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: buildBorderController :: ParentControllerConstructor
+ System.Taffybar.Widget.Workspaces: buildIconWidget :: Bool -> Workspace -> WorkspacesIO IconWidget
+ System.Taffybar.Widget.Workspaces: constantScaleWindowIconPixbufGetter :: Int32 -> WindowIconPixbufGetter -> WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: cssWorkspaceStates :: [String]
+ System.Taffybar.Widget.Workspaces: data IconWidget
+ System.Taffybar.Widget.Workspaces: data WidgetUpdate
+ System.Taffybar.Widget.Workspaces: data WorkspaceBorderController
+ System.Taffybar.Widget.Workspaces: defaultGetWindowIconPixbuf :: WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: doWidgetUpdate :: (WorkspaceIdx -> WWC -> WorkspacesIO WWC) -> WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: getCSSClass :: (Show s) => s -> String
+ System.Taffybar.Widget.Workspaces: getPixbufForIconWidget :: Bool -> MVar (Maybe WindowData) -> Int32 -> WorkspacesIO (Maybe Pixbuf)
+ System.Taffybar.Widget.Workspaces: getWindowData :: [X11Window] -> [X11Window] -> X11Window -> X11Property WindowData
+ System.Taffybar.Widget.Workspaces: getWindowIconPixbufFromClass :: WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: getWindowIconPixbufFromDesktopEntry :: WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: getWindowIconPixbufFromEWMH :: WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: getWindowStatusString :: WindowData -> String
+ System.Taffybar.Widget.Workspaces: liftContext :: TaffyIO a -> WorkspacesIO a
+ System.Taffybar.Widget.Workspaces: newtype LabelController
+ System.Taffybar.Widget.Workspaces: onIconChanged :: (Set X11Window -> IO ()) -> Event -> IO ()
+ System.Taffybar.Widget.Workspaces: onIconsChanged :: WorkspacesContext -> IO (Set X11Window -> IO ())
+ System.Taffybar.Widget.Workspaces: onWorkspaceUpdate :: WorkspacesContext -> IO (Event -> IO ())
+ System.Taffybar.Widget.Workspaces: possibleStatusStrings :: [String]
+ System.Taffybar.Widget.Workspaces: rateLimitFn :: forall req resp. WorkspacesContext -> (req -> IO resp) -> ResultsCombiner req resp -> IO (req -> IO resp)
+ System.Taffybar.Widget.Workspaces: scaledWindowIconPixbufGetter :: WindowIconPixbufGetter -> WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: setControllerWidgetVisibility :: WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: setWorkspaceWidgetStatusClass :: WidgetClass widget => Workspace -> widget -> IO ()
+ System.Taffybar.Widget.Workspaces: sortWindowsByPosition :: [WindowData] -> WorkspacesIO [WindowData]
+ System.Taffybar.Widget.Workspaces: switch :: (MonadIO m) => WorkspacesContext -> WorkspaceIdx -> m Bool
+ System.Taffybar.Widget.Workspaces: type ParentControllerConstructor = ControllerConstructor -> ControllerConstructor
+ System.Taffybar.Widget.Workspaces: type WindowIconPixbufGetter = Int32 -> WindowData -> TaffyIO (Maybe Pixbuf)
+ System.Taffybar.Widget.Workspaces: unscaledDefaultGetWindowIconPixbuf :: WindowIconPixbufGetter
+ System.Taffybar.Widget.Workspaces: updateAllWorkspaceWidgets :: WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: updateBorder :: WorkspaceBorderController -> WidgetUpdate -> WorkspacesIO WorkspaceBorderController
+ System.Taffybar.Widget.Workspaces: updateIconWidget :: IconController -> IconWidget -> Maybe WindowData -> WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: updateImages :: IconController -> Workspace -> WorkspacesIO [IconWidget]
+ System.Taffybar.Widget.Workspaces: updateMinSize :: Widget -> Int -> IO ()
+ System.Taffybar.Widget.Workspaces: updateUnderline :: WorkspaceUnderlineController -> WidgetUpdate -> WorkspacesIO WorkspaceUnderlineController
+ System.Taffybar.Widget.Workspaces: updateVar :: MVar a -> (a -> WorkspacesIO a) -> WorkspacesIO a
+ System.Taffybar.Widget.Workspaces: updateWidgetClasses :: WidgetClass widget => widget -> [String] -> [String] -> IO ()
+ System.Taffybar.Widget.Workspaces: updateWindowIconsById :: IconController -> [X11Window] -> WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: updateWorkspaceControllers :: WorkspacesIO ()
+ System.Taffybar.Widget.Workspaces: updateWorkspacesVar :: WorkspacesIO (Map WorkspaceIdx Workspace)
+ System.Taffybar.Widget.Workspaces: wLog :: MonadIO m => Priority -> String -> m ()
+ System.Taffybar.WindowIcon: getDirectoryEntryByClass :: String -> TaffyIO (Maybe DesktopEntry)
+ System.Taffybar.WindowIcon: getIconPixBufFromEWMH :: Int32 -> X11Window -> X11Property (Maybe Pixbuf)
+ System.Taffybar.WindowIcon: getPixbufFromEWMHIcons :: Int32 -> [EWMHIcon] -> IO (Maybe Pixbuf)
+ System.Taffybar.WindowIcon: getWindowIconForAllClasses :: Monad m => (p -> String -> m (Maybe a)) -> p -> String -> m (Maybe a)
+ System.Taffybar.WindowIcon: getWindowIconFromClasses :: Int32 -> String -> IO (Maybe Pixbuf)
+ System.Taffybar.WindowIcon: getWindowIconFromDesktopEntryByClasses :: Int32 -> String -> TaffyIO (Maybe Pixbuf)
+ System.Taffybar.WindowIcon: pixBufFromColor :: MonadIO m => Int32 -> Word32 -> m Pixbuf
+ System.Taffybar.WindowIcon: pixBufFromEWMHIcon :: EWMHIcon -> IO Pixbuf
+ System.Taffybar.WindowIcon: pixelsARGBToBytesABGR :: (Storable a, Bits a, Num a, Integral a) => Ptr a -> Int -> IO (Ptr Word8)
+ System.Taffybar.WindowIcon: selectEWMHIcon :: Int32 -> [EWMHIcon] -> Maybe EWMHIcon
+ System.Taffybar.WindowIcon: type ColorRGBA = Word32
- System.Taffybar.Widget: LayoutConfig :: (String -> TaffyIO String) -> LayoutConfig
+ System.Taffybar.Widget: LayoutConfig :: String -> TaffyIO String -> LayoutConfig
- System.Taffybar.Widget: NotificationConfig :: Maybe Int32 -> Int -> ([Notification] -> String) -> NotificationConfig
+ System.Taffybar.Widget: NotificationConfig :: Maybe Int32 -> Int -> [Notification] -> String -> NotificationConfig
- System.Taffybar.Widget: WindowsConfig :: (X11Window -> TaffyIO String) -> TaffyIO String -> WindowsConfig
+ System.Taffybar.Widget: WindowsConfig :: X11Window -> TaffyIO String -> TaffyIO String -> WindowsConfig
- System.Taffybar.Widget.FreedesktopNotifications: NotificationConfig :: Maybe Int32 -> Int -> ([Notification] -> String) -> NotificationConfig
+ System.Taffybar.Widget.FreedesktopNotifications: NotificationConfig :: Maybe Int32 -> Int -> [Notification] -> String -> NotificationConfig
- System.Taffybar.Widget.Generic.DynamicMenu: DynamicMenuConfig :: Widget -> (Menu -> IO ()) -> DynamicMenuConfig
+ System.Taffybar.Widget.Generic.DynamicMenu: DynamicMenuConfig :: Widget -> Menu -> IO () -> DynamicMenuConfig
- System.Taffybar.Widget.Generic.PollingBar: BarConfig :: (Double, Double, Double) -> (Double -> (Double, Double, Double)) -> (Double -> (Double, Double, Double)) -> Int -> Int -> BarDirection -> BarConfig
+ System.Taffybar.Widget.Generic.PollingBar: BarConfig :: (Double, Double, Double) -> Double -> (Double, Double, Double) -> Double -> (Double, Double, Double) -> Int -> Int -> BarDirection -> BarConfig
- System.Taffybar.Widget.Generic.PollingBar: BarConfigIO :: IO (Double, Double, Double) -> (Double -> IO (Double, Double, Double)) -> (Double -> IO (Double, Double, Double)) -> Int -> Int -> BarDirection -> BarConfig
+ System.Taffybar.Widget.Generic.PollingBar: BarConfigIO :: IO (Double, Double, Double) -> Double -> IO (Double, Double, Double) -> Double -> IO (Double, Double, Double) -> Int -> Int -> BarDirection -> BarConfig
- System.Taffybar.Widget.Generic.VerticalBar: BarConfig :: (Double, Double, Double) -> (Double -> (Double, Double, Double)) -> (Double -> (Double, Double, Double)) -> Int -> Int -> BarDirection -> BarConfig
+ System.Taffybar.Widget.Generic.VerticalBar: BarConfig :: (Double, Double, Double) -> Double -> (Double, Double, Double) -> Double -> (Double, Double, Double) -> Int -> Int -> BarDirection -> BarConfig
- System.Taffybar.Widget.Generic.VerticalBar: BarConfigIO :: IO (Double, Double, Double) -> (Double -> IO (Double, Double, Double)) -> (Double -> IO (Double, Double, Double)) -> Int -> Int -> BarDirection -> BarConfig
+ System.Taffybar.Widget.Generic.VerticalBar: BarConfigIO :: IO (Double, Double, Double) -> Double -> IO (Double, Double, Double) -> Double -> IO (Double, Double, Double) -> Int -> Int -> BarDirection -> BarConfig
- System.Taffybar.Widget.Layout: LayoutConfig :: (String -> TaffyIO String) -> LayoutConfig
+ System.Taffybar.Widget.Layout: LayoutConfig :: String -> TaffyIO String -> LayoutConfig
- System.Taffybar.Widget.SNITray: getHost :: TaffyIO Host
+ System.Taffybar.Widget.SNITray: getHost :: Bool -> TaffyIO Host
- System.Taffybar.Widget.Windows: WindowsConfig :: (X11Window -> TaffyIO String) -> TaffyIO String -> WindowsConfig
+ System.Taffybar.Widget.Windows: WindowsConfig :: X11Window -> TaffyIO String -> TaffyIO String -> WindowsConfig
- System.Taffybar.Widget.Workspaces: WorkspacesConfig :: ControllerConstructor -> Int -> Int -> Maybe Int -> Int -> Maybe Int -> Int -> (WindowData -> WorkspacesIO IconInfo) -> (Workspace -> WorkspacesIO String) -> (Workspace -> Bool) -> Int -> [String] -> Integer -> ([WindowData] -> WorkspacesIO [WindowData]) -> Bool -> WorkspacesConfig
+ System.Taffybar.Widget.Workspaces: WorkspacesConfig :: ControllerConstructor -> Int -> Int -> Maybe Int -> Int -> Maybe Int -> Int -> WindowIconPixbufGetter -> Workspace -> WorkspacesIO String -> Workspace -> Bool -> Int -> [String] -> Integer -> [WindowData] -> WorkspacesIO [WindowData] -> Bool -> WorkspacesConfig

Files

README.md view
@@ -1,11 +1,4 @@-Taffybar-========-[![Hackage](https://img.shields.io/hackage/v/taffybar.svg)](https://hackage.haskell.org/package/taffybar)-[![Commits](https://img.shields.io/github/commits-since/taffybar/taffybar/latest-release.svg?label=unreleased%20commits)](https://github.com/taffybar/taffybar/compare/latest-release...master)-[![Build Status](https://travis-ci.org/taffybar/taffybar.svg?branch=master)](https://travis-ci.org/taffybar/taffybar)-[![Help Wanted](https://img.shields.io/github/issues/taffybar/taffybar/help%20wanted.svg)](https://github.com/taffybar/taffybar/labels/help%20wanted)-[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/taffybar/Lobby)-[![License BSD3](https://img.shields.io/badge/license-BSD3-green.svg?dummy)](https://github.com/taffybar/taffybar/blob/master/LICENSE)+# Taffybar [![Hackage](https://img.shields.io/hackage/v/taffybar.svg)](https://hackage.haskell.org/package/taffybar) [![Commits](https://img.shields.io/github/commits-since/taffybar/taffybar/latest-release.svg?label=unreleased%20commits)](https://github.com/taffybar/taffybar/compare/latest-release...master) [![Build Status](https://travis-ci.org/taffybar/taffybar.svg?branch=master)](https://travis-ci.org/taffybar/taffybar) [![Help Wanted](https://img.shields.io/github/issues/taffybar/taffybar/help%20wanted.svg)](https://github.com/taffybar/taffybar/labels/help%20wanted) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/taffybar/Lobby) [![License BSD3](https://img.shields.io/badge/license-BSD3-green.svg?dummy)](https://github.com/taffybar/taffybar/blob/master/LICENSE)  ![https://github.com/taffybar/taffybar/blob/master/doc/screenshot.png](https://raw.githubusercontent.com/taffybar/taffybar/master/doc/screenshot.png) 
+ dbus-xml/org.freedesktop.UPower.Device.xml view
@@ -0,0 +1,48 @@+<node>+  <interface name="org.freedesktop.UPower.Device">+    <method name="Refresh">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+    </method>+    <method name="GetHistory">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+      <arg type="s" name="typev" direction="in"/>+      <arg type="u" name="timespan" direction="in"/>+      <arg type="u" name="resolution" direction="in"/>+      <arg type="a(udu)" name="data" direction="out"/>+    </method>+    <method name="GetStatistics">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+      <arg type="s" name="typev" direction="in"/>+      <arg type="a(dd)" name="data" direction="out"/>+    </method>+    <property type="s" name="NativePath" access="read"/>+    <property type="s" name="Vendor" access="read"/>+    <property type="s" name="Model" access="read"/>+    <property type="s" name="Serial" access="read"/>+    <property type="t" name="UpdateTime" access="read"/>+    <property type="u" name="Type" access="read"/>+    <property type="b" name="PowerSupply" access="read"/>+    <property type="b" name="HasHistory" access="read"/>+    <property type="b" name="HasStatistics" access="read"/>+    <property type="b" name="Online" access="read"/>+    <property type="d" name="Energy" access="read"/>+    <property type="d" name="EnergyEmpty" access="read"/>+    <property type="d" name="EnergyFull" access="read"/>+    <property type="d" name="EnergyFullDesign" access="read"/>+    <property type="d" name="EnergyRate" access="read"/>+    <property type="d" name="Voltage" access="read"/>+    <property type="d" name="Luminosity" access="read"/>+    <property type="x" name="TimeToEmpty" access="read"/>+    <property type="x" name="TimeToFull" access="read"/>+    <property type="d" name="Percentage" access="read"/>+    <property type="d" name="Temperature" access="read"/>+    <property type="b" name="IsPresent" access="read"/>+    <property type="u" name="State" access="read"/>+    <property type="b" name="IsRechargeable" access="read"/>+    <property type="d" name="Capacity" access="read"/>+    <property type="u" name="Technology" access="read"/>+    <property type="u" name="WarningLevel" access="read"/>+    <property type="u" name="BatteryLevel" access="read"/>+    <property type="s" name="IconName" access="read"/>+  </interface>+</node>
+ dbus-xml/org.freedesktop.UPower.xml view
@@ -0,0 +1,26 @@+<node>+  <interface name="org.freedesktop.UPower">+    <method name="EnumerateDevices">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+      <arg type="ao" name="devices" direction="out"/>+    </method>+    <method name="GetDisplayDevice">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+      <arg type="o" name="device" direction="out"/>+    </method>+    <method name="GetCriticalAction">+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>+      <arg type="s" name="action" direction="out"/>+    </method>+    <signal name="DeviceAdded">+      <arg type="o" name="device"/>+    </signal>+    <signal name="DeviceRemoved">+      <arg type="o" name="device"/>+    </signal>+    <property type="s" name="DaemonVersion" access="read"/>+    <property type="b" name="OnBattery" access="read"/>+    <property type="b" name="LidIsClosed" access="read"/>+    <property type="b" name="LidIsPresent" access="read"/>+  </interface>+</node>
+ dbus-xml/org.mpris.MediaPlayer2.xml view
@@ -0,0 +1,10 @@+<node>+  <interface name="org.mpris.MediaPlayer2">+    <property name="CanQuit" type="b" access="read"/>+    <property name="CanRaise" type="b" access="read"/>+    <property name="DesktopEntry" type="s" access="read"/>+    <property name="Identity" type="s" access="read"/>+    <method name="Quit"/>+    <method name="Raise"/>+  </interface>+</node>
src/System/Taffybar/Compat/GtkLibs.hs view
@@ -12,11 +12,8 @@  import           Control.Monad.IO.Class import           Data.GI.Base.ManagedPtr-import           Data.Word import           Foreign.ForeignPtr-import           Foreign.Marshal.Alloc import           Foreign.Ptr-import           GI.GdkPixbuf.Enums import qualified GI.GdkPixbuf.Objects.Pixbuf as PB import qualified GI.Gtk import qualified Graphics.UI.Gtk as Gtk@@ -57,13 +54,3 @@  toGIImage :: MonadIO m => Gtk.Image -> m GI.Gtk.Image toGIImage = toGIWidget' GI.Gtk.Image Gtk.unImage---- | Call the GI version of 'pixbufNewFromData' with sensible parameters. The--- provided ptr will be freed when the pixbuf is destroyed.-pixbufNewFromData :: (Integral p2, Integral p1) => Ptr Word8 -> p2 -> p1 -> IO PB.Pixbuf-pixbufNewFromData ptr w h = do-  let width = fromIntegral w-      height = fromIntegral h-      rowStride = width * 4-  PB.pixbufNewFromData ptr ColorspaceRgb True 8-    width height rowStride (Just free)
src/System/Taffybar/Context.hs view
@@ -45,7 +45,6 @@ import           System.Taffybar.Information.SafeX11 import           System.Taffybar.Information.X11DesktopInfo import           System.Taffybar.Util-import           System.Taffybar.Widget.Generic.AutoSizeImage import           System.Taffybar.Widget.Util import           Text.Printf import           Unsafe.Coerce@@ -181,15 +180,7 @@   _ <- widgetSetClass window "taffy-window"    let addWidgetWith widgetAdd buildWidget =-        do-          widget <- runReaderT buildWidget context-          -- XXX: This is a pretty bad way to do this-          let height =-                case strutHeight $ strutConfig barConfig of-                  ExactSize size -> fromIntegral size-                  _ -> 40-          Gtk.widgetSetSizeRequest widget (-1) height-          widgetAdd widget+        runReaderT buildWidget thisContext >>= widgetAdd       addToStart widget = Gtk.boxPackStart box widget Gtk.PackNatural 0       addToEnd widget = Gtk.boxPackEnd box widget Gtk.PackNatural 0       addToCenter widget = Gtk.boxPackStart centerBox widget Gtk.PackNatural 0
− src/System/Taffybar/EWMHPixbuf.hs
@@ -1,78 +0,0 @@--------------------------------------------------------------------------------- |--- Module      : System.Taffybar.EWMHPixbuf--- Copyright   : (c) Ivan A. Malison--- License     : BSD3-style (see LICENSE)------ Maintainer  : Ivan A. Malison--- Stability   : unstable--- Portability : unportable--------------------------------------------------------------------------------module System.Taffybar.EWMHPixbuf-  ( ColorRGBA-  , pixBufFromEWMHIcon-  , pixelsARGBToBytesABGR-  , pixBufFromColor-  , pixBufFromFile-  ) where--import           Data.Bits-import           Data.Int-import           Data.Word-import           Foreign.Marshal.Array-import           Foreign.Ptr-import           Foreign.Storable-import qualified GI.GdkPixbuf.Enums as Gdk-import qualified GI.GdkPixbuf.Objects.Pixbuf as Gdk-import           System.Taffybar.Compat.GtkLibs-import           System.Taffybar.Information.EWMHDesktopInfo--type ColorRGBA = Word32--colorspace :: Gdk.Colorspace-colorspace = Gdk.ColorspaceRgb---- | Create a pixbuf from the pixel data in an EWMHIcon.-pixBufFromEWMHIcon :: EWMHIcon -> IO Gdk.Pixbuf-pixBufFromEWMHIcon EWMHIcon {width = w, height = h, pixelsARGB = px} = do-  wPtr <- pixelsARGBToBytesABGR px (w * h)-  pixbufNewFromData wPtr w h---- | Create a pixbuf with the indicated RGBA color.-pixBufFromColor :: Int32 -> ColorRGBA -> IO Gdk.Pixbuf-pixBufFromColor imgSize c = do-  Just pixbuf <- Gdk.pixbufNew colorspace True 8 imgSize imgSize-  Gdk.pixbufFill pixbuf c-  return pixbuf---- | Convert a C array of integer pixels in the ARGB format to the ABGR format.--- Returns an unmanged Ptr that points to a block of memory that must be freed--- manually.-pixelsARGBToBytesABGR-  :: (Storable a, Bits a, Num a, Integral a)-  => Ptr a -> Int -> IO (Ptr Word8)-pixelsARGBToBytesABGR ptr size = do-  target <- mallocArray (size * 4)-  let writeIndex i = do-        bits <- peekElemOff ptr i-        let b = toByte bits-            g = toByte $ bits `shift` (-8)-            r = toByte $ bits `shift` (-16)-            a = toByte $ bits `shift` (-24)-            baseTarget = 4 * i-            doPoke offset = pokeElemOff target (baseTarget + offset)-            toByte = fromIntegral . (.&. 0xFF)-        doPoke 0 r-        doPoke 1 g-        doPoke 2 b-        doPoke 3 a-      writeIndexAndNext i-        | i >= size = return ()-        | otherwise = writeIndex i >> writeIndexAndNext (i + 1)-  writeIndexAndNext 0-  return target---- | Create a pixbuf from a file and scale it to be square.-pixBufFromFile :: FilePath -> IO Gdk.Pixbuf-pixBufFromFile = Gdk.pixbufNewFromFile
src/System/Taffybar/Hooks.hs view
@@ -4,12 +4,20 @@   , refreshBatteriesOnPropChange   ) where -import Control.Concurrent-import Control.Monad.Trans.Class-import System.Taffybar.Context-import System.Taffybar.DBus-import System.Taffybar.Information.Battery-import System.Taffybar.Information.Network+import           Control.Applicative+import           Control.Concurrent+import           Control.Monad+import           Control.Monad.Trans.Class+import           Control.Monad.Trans.Reader+import           Data.Maybe+import qualified Data.MultiMap as MM+import           System.FilePath+import           System.Taffybar.Context+import           System.Taffybar.DBus+import           System.Taffybar.Information.Battery+import           System.Taffybar.Information.Network+import           System.Taffybar.Information.XDG.DesktopEntry+import           System.Taffybar.Util  newtype NetworkInfoChan = NetworkInfoChan (Chan [(String, (Rational, Rational))]) @@ -24,3 +32,32 @@  withBatteryRefresh :: TaffybarConfig -> TaffybarConfig withBatteryRefresh = appendHook refreshBatteriesOnPropChange++getDirectoryEntriesByClassName :: TaffyIO (MM.MultiMap String DesktopEntry)+getDirectoryEntriesByClassName =+  getStateDefault readDirectoryEntriesDefault++updateDirectoryEntriesCache :: TaffyIO ()+updateDirectoryEntriesCache = ask >>= \ctx ->+  void $ lift $ foreverWithDelay (60 :: Double) $ flip runReaderT ctx $+       putState readDirectoryEntriesDefault++readDirectoryEntriesDefault :: TaffyIO (MM.MultiMap String DesktopEntry)+readDirectoryEntriesDefault = lift $+  directoryEntriesByClassName <$> getDirectoryEntriesDefault++directoryEntriesByClassName+  :: Foldable t+  => t DesktopEntry -> MM.MultiMap String DesktopEntry+directoryEntriesByClassName = foldl insertByClassName MM.empty+  where+    insertByClassName entriesMap entry =+      MM.insert (getClassName entry) entry entriesMap+    getFromFilename filepath =+      let (_, filename) = splitFileName filepath+          (_, noExtensions) = splitExtensions filename+      in noExtensions+    getClassName DesktopEntry {deAttributes = attributes, deFilename = filename} =+      fromMaybe (getFromFilename filename) $+                lookup "StartupWMClass" attributes <|>+                lookup "Name" attributes
src/System/Taffybar/Information/EWMHDesktopInfo.hs view
@@ -20,31 +20,33 @@ -----------------------------------------------------------------------------  module System.Taffybar.Information.EWMHDesktopInfo-  ( X11Window      -- re-exported from X11DesktopInfo-  , X11WindowHandle-  , WorkspaceIdx(..)-  , EWMHIcon(..)+  ( EWMHIcon(..)   , EWMHIconData-  , withDefaultCtx -- re-exported from X11DesktopInfo-  , isWindowUrgent -- re-exported from X11DesktopInfo+  , WorkspaceIdx(..)+  , X11Window      -- re-exported from X11DesktopInfo+  , X11WindowHandle+  , focusWindow+  , getActiveWindowTitle   , getCurrentWorkspace   , getVisibleWorkspaces-  , getWorkspaceNames-  , switchToWorkspace-  , switchOneWorkspace-  , withEWMHIcons-  , getWindowTitle   , getWindowClass+  , getWindowHandles   , getWindowIconsData-  , getActiveWindowTitle+  , getWindowTitle   , getWindows-  , getWindowHandles   , getWorkspace-  , focusWindow+  , getWorkspaceNames+  , isWindowUrgent -- re-exported from X11DesktopInfo+  , parseWindowClasses+  , switchOneWorkspace+  , switchToWorkspace+  , withDefaultCtx -- re-exported from X11DesktopInfo+  , withEWMHIcons   ) where  import Control.Applicative import Control.Monad.Trans.Class+import Data.List.Split import Data.Maybe import Data.Tuple import Data.Word@@ -79,9 +81,9 @@ type EWMHIconData = (ForeignPtr PixelsWordType, Int)  data EWMHIcon = EWMHIcon-  { width :: Int-  , height :: Int-  , pixelsARGB :: Ptr PixelsWordType+  { ewmhWidth :: Int+  , ewmhHeight :: Int+  , ewmhPixelsARGB :: Ptr PixelsWordType   } deriving (Show, Eq)  noFocus :: String@@ -145,6 +147,9 @@ getWindowClass :: X11Window -> X11Property String getWindowClass window = readAsString (Just window) "WM_CLASS" +parseWindowClasses :: String -> [String]+parseWindowClasses = filter (not . null) . splitOn "\NUL"+ -- | Get EWMHIconData for the given X11Window getWindowIconsData :: X11Window -> X11Property (Maybe EWMHIconData) getWindowIconsData window = do@@ -179,9 +184,9 @@       newArr = advancePtr pixelsPtr thisSize       thisIcon =         EWMHIcon-        { width = iwidth-        , height = iheight-        , pixelsARGB = pixelsPtr+        { ewmhWidth = iwidth+        , ewmhHeight = iheight+        , ewmhPixelsARGB = pixelsPtr         }       getRes newSize         | newSize < 0 = trace "This should not happen parseIcons" return []
− src/System/Taffybar/Information/Volume.hs
@@ -1,40 +0,0 @@-module System.Taffybar.Information.Volume-  ( getVolume-  , setVolume-  ) where--import Sound.ALSA.Mixer--volumeAct :: String -> String -> (Volume -> Integer -> Integer -> IO a) -> IO a-volumeAct mix channel action = withMixer mix $ \mixer -> do-  Just control <- getControlByName mixer channel-  let Just playbackVolume = playback $ volume control-  (lo, hi) <- getRange playbackVolume-  action playbackVolume lo hi---- | Gets volume of a channel of a mixer-getVolume :: String -> String -> IO Integer-getVolume mix channel = volumeAct mix channel $ \playbackVolume lo hi -> do-  Just vol <- getChannel FrontLeft $ value playbackVolume-  return $ toPercent vol lo hi---- | Sets volume of a channel of a mixer-setVolume :: String -> String -> Double -> IO ()-setVolume mix channel vol = volumeAct mix channel $ \playbackVolume lo hi -> do-  let volumeValue = value playbackVolume-      percentage = fromPercent vol lo hi-      setForChannel c = setChannel c volumeValue percentage-  mapM_ setForChannel allChannels--toPercent :: Integer -> Integer -> Integer -> Integer-toPercent v lo hi = ceiling $ (v' - lo') / (hi' - lo') * 100-  where-    v' :: Double-    v' = fromIntegral v-    lo' = fromIntegral lo-    hi' = fromIntegral hi--fromPercent :: Double -> Integer -> Integer -> Integer-fromPercent v lo hi = ceiling $ lo' + (hi' - lo') * v / 100-  where lo' = fromIntegral lo-        hi' = fromIntegral hi
src/System/Taffybar/Information/XDG/DesktopEntry.hs view
@@ -10,7 +10,7 @@ -- -- Implementation of version 1.1 of the freedesktop "Desktop Entry -- specification", see--- https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html.+-- https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.2.html. -----------------------------------------------------------------------------  module System.Taffybar.Information.XDG.DesktopEntry@@ -25,6 +25,7 @@   , deOnlyShowIn   , existingDirs   , getDefaultDataHome+  , getDirectoryEntriesDefault   , getDirectoryEntry   , getDirectoryEntryDefault   , getXDGDataDirs@@ -184,6 +185,12 @@ getDirectoryEntryDefault entry =   fmap (</> "applications") <$> getXDGDataDirs >>=   flip getDirectoryEntry (printf "%s.desktop" entry)++getDirectoryEntriesDefault :: IO [DesktopEntry]+getDirectoryEntriesDefault =+  fmap (</> "applications") <$> getXDGDataDirs >>= foldM addDirectories []+  where addDirectories soFar directory =+          (soFar ++) <$> listDesktopEntries "desktop" directory  -- | Main section of a desktop entry file. sectionMain :: String
src/System/Taffybar/Information/XDG/Protocol.hs view
@@ -104,7 +104,6 @@ getApplicationEntries langs xm = do   defEntries <- if xmDefaultAppDirs xm     then do dataDirs <- getXDGDataDirs-            putStrLn $ "DataDirs=" ++ show dataDirs             concat <$> mapM (listDesktopEntries ".desktop" .                                                   (</> "applications")) dataDirs     else return []
src/System/Taffybar/Util.hs view
@@ -11,13 +11,19 @@  module System.Taffybar.Util where +import           Control.Applicative import           Control.Arrow ((&&&)) import           Control.Concurrent+import           Control.Exception.Base import           Control.Monad import           Control.Monad.IO.Class import           Control.Monad.Trans.Class+import           Control.Monad.Trans.Maybe import           Control.Monad.Trans.Reader+import           Data.Either.Combinators+import           Data.GI.Base.GError import           Data.Tuple.Sequence+import qualified GI.GdkPixbuf.Objects.Pixbuf as Gdk import           System.Exit (ExitCode (..)) import           System.Log.Logger import qualified System.Process as P@@ -81,3 +87,41 @@ liftActionTaker actionTaker action = do   ctx <- ask   lift $ actionTaker $ flip runReaderT ctx . action++maybeTCombine+  :: Monad m+  => m (Maybe a) -> m (Maybe a) -> m (Maybe a)+maybeTCombine a b = runMaybeT $ MaybeT a <|> MaybeT b++infixl 3 <||>+(<||>) :: Monad m =>+             (t -> m (Maybe a)) -> (t -> m (Maybe a)) -> t -> m (Maybe a)+a <||> b = combineOptions+  where combineOptions v = maybeTCombine (a v) (b v)++infixl 3 <|||>+(<|||>)+  :: Monad m+  => (t -> t1 -> m (Maybe a))+  -> (t -> t1 -> m (Maybe a))+  -> t+  -> t1+  -> m (Maybe a)+a <|||> b = combineOptions+  where combineOptions v v1 = maybeTCombine (a v v1) (b v v1)++catchGErrorsAsLeft :: IO a -> IO (Either GError a)+catchGErrorsAsLeft action = catch (Right <$> action) mkLeft+  where mkLeft err = return $ Left err++safePixbufNewFromFile :: FilePath -> IO (Either GError Gdk.Pixbuf)+safePixbufNewFromFile filepath =+  catchGErrorsAsLeft (Gdk.pixbufNewFromFile filepath)++getPixbufFromFilePath :: FilePath -> IO (Maybe Gdk.Pixbuf)+getPixbufFromFilePath filepath = do+  result <- safePixbufNewFromFile filepath+  when (isLeft result) $+       logM "System.Taffybar.WindowIcon" WARNING $+            printf "Failed to load icon from filepath %s" filepath+  return $ rightToMaybe result
src/System/Taffybar/Widget.hs view
@@ -53,10 +53,6 @@   -- * "System.Taffybar.Widget.Text.NetworkMonitor"   , module System.Taffybar.Widget.Text.NetworkMonitor -  -- * "System.Taffybar.Widget.Volume"-  , volumeTextNew-  , volumeControlNew-   -- * "System.Taffybar.Widget.Weather"   , WeatherConfig(..)   , WeatherInfo(..)@@ -73,12 +69,7 @@   , truncatedGetMenuLabel    -- * "System.Taffybar.Widget.Workspaces"-  , IconInfo(..)-  , Workspace(..)-  , WorkspacesConfig(..)-  , WorkspacesIO-  , hideEmpty-  , workspacesNew+  , module System.Taffybar.Widget.Workspaces    -- * "System.Taffybar.Widget.XDGMenu.MenuWidget"   , module System.Taffybar.Widget.XDGMenu.MenuWidget@@ -100,7 +91,6 @@ import System.Taffybar.Widget.Text.MemoryMonitor import System.Taffybar.Widget.Text.NetworkMonitor import System.Taffybar.Widget.Util-import System.Taffybar.Widget.Volume import System.Taffybar.Widget.Weather import System.Taffybar.Widget.Windows import System.Taffybar.Widget.Workspaces
src/System/Taffybar/Widget/Generic/DynamicMenu.hs view
@@ -2,7 +2,6 @@  import           Control.Monad.IO.Class import qualified GI.Gtk as Gtk-import           System.Log.Logger  data DynamicMenuConfig = DynamicMenuConfig   { dmClickWidget :: Gtk.Widget
src/System/Taffybar/Widget/SNITray.hs view
@@ -24,21 +24,21 @@ import           System.Taffybar.Widget.Util import           Text.Printf -getHost :: TaffyIO H.Host-getHost = getStateDefault $ do+getHost :: Bool -> TaffyIO H.Host+getHost startWatcher = getStateDefault $ do   pid <- lift getProcessID   client <- asks sessionDBusClient   Just host <- lift $ H.build H.defaultParams      { H.dbusClient = Just client      , H.uniqueIdentifier = printf "taffybar-%s" $ show pid+     , H.startWatcher = startWatcher      }   return host  -- | Build a new StatusNotifierItem tray that will share a host with any other -- trays that are constructed automatically-sniTrayNew :: TaffyIO Gtk.Widget-sniTrayNew = do-  host <- getHost+sniTrayNewFromHost :: H.Host -> TaffyIO Gtk.Widget+sniTrayNewFromHost host = do   client <- asks sessionDBusClient   lift $ do     tray <-@@ -54,3 +54,10 @@     _ <- widgetSetClassGI tray "sni-tray"     GI.Gtk.widgetShowAll tray     GI.Gtk.toWidget tray >>= fromGIWidget++sniTrayNew :: TaffyIO Gtk.Widget+sniTrayNew = getHost False >>= sniTrayNewFromHost++sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt :: TaffyIO Gtk.Widget+sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt = getHost True >>= sniTrayNewFromHost+
src/System/Taffybar/Widget/Util.hs view
@@ -142,6 +142,14 @@       then Just <$> GI.pixbufNewFromFile iconName       else return Nothing +loadPixbufByName :: Int32 -> T.Text -> IO (Maybe GI.Pixbuf)+loadPixbufByName size name = do+  iconTheme <- GI.Gtk.iconThemeGetDefault+  hasIcon <- GI.Gtk.iconThemeHasIcon iconTheme name+  if hasIcon+  then GI.Gtk.iconThemeLoadIcon iconTheme name size themeLoadFlags+  else return Nothing+ alignCenter :: (GI.Gtk.IsWidget o, MonadIO m) => o -> m () alignCenter widget =   GI.Gtk.setWidgetValign widget GI.Gtk.AlignCenter >>
− src/System/Taffybar/Widget/Volume.hs
@@ -1,26 +0,0 @@-module System.Taffybar.Widget.Volume-  ( volumeTextNew-  , volumeControlNew-  ) where--import Control.Monad.IO.Class-import Graphics.UI.Gtk-import System.Taffybar.Information.Volume-import System.Taffybar.Widget.Generic.PollingLabel---- | Creates a new text volume meter-volumeTextNew :: MonadIO m => String -> String -> Double -> m Widget-volumeTextNew mixer control pollSeconds = liftIO $ do-  l <- pollingLabelNew "" pollSeconds . fmap show $ getVolume mixer control-  widgetShowAll l-  return l---- | Creates a new volume meter widget-volumeControlNew :: String -> String -> IO Widget-volumeControlNew mixer control = do-  b <- volumeButtonNew-  _ <- on b scaleButtonValueChanged $ \v ->-    setVolume mixer control (v * 100)-  let w = toWidget b-  widgetShowAll w-  return w
src/System/Taffybar/Widget/Workspaces.hs view
@@ -11,38 +11,7 @@ -- Portability : unportable ----------------------------------------------------------------------------- -module System.Taffybar.Widget.Workspaces-  ( ControllerConstructor-  , IconController(..)-  , IconInfo(..)-  , WWC(..)-  , WindowData(..)-  , Workspace(..)-  , WorkspaceButtonController(..)-  , WorkspaceContentsController(..)-  , WorkspaceState(..)-  , WorkspaceUnderlineController(..)-  , WorkspaceWidgetController(..)-  , WorkspacesConfig(..)-  , WorkspacesContext(..)-  , WorkspacesIO-  , buildBorderButtonController-  , buildButtonController-  , buildContentsController-  , buildIconController-  , buildLabelController-  , buildUnderlineButtonController-  , buildUnderlineController-  , buildWorkspaceData-  , defaultBuildContentsController-  , defaultGetIconInfo-  , defaultWorkspacesConfig-  , getWorkspaceToWindows-  , hideEmpty-  , liftX11Def-  , workspacesNew-  , windowTitleClassIconGetter-) where+module System.Taffybar.Widget.Workspaces where  import           Control.Applicative import           Control.Arrow ((&&&))@@ -51,6 +20,7 @@ import           Control.Monad import           Control.Monad.IO.Class import           Control.Monad.Trans.Class+import           Control.Monad.Trans.Maybe import           Control.Monad.Trans.Reader import           Control.RateLimit import qualified Data.Char as Char@@ -76,7 +46,6 @@ import           System.Log.Logger import           System.Taffybar.Compat.GtkLibs import           System.Taffybar.Context-import           System.Taffybar.EWMHPixbuf import           System.Taffybar.Information.EWMHDesktopInfo import           System.Taffybar.Information.SafeX11 import           System.Taffybar.Information.X11DesktopInfo@@ -84,6 +53,7 @@ import           System.Taffybar.Widget.Decorators import           System.Taffybar.Widget.Generic.AutoSizeImage (autoSizeImage) import           System.Taffybar.Widget.Util+import           System.Taffybar.WindowIcon import           Text.Printf  data WorkspaceState@@ -100,16 +70,6 @@ cssWorkspaceStates :: [String] cssWorkspaceStates = map getCSSClass [Active, Visible, Hidden, Empty, Urgent] -data IconInfo-  = IIEWMH EWMHIconData-  | IIFilePath FilePath-  | IIColor ColorRGBA-  | IINone-  deriving (Eq, Show)--transparentInfo :: IconInfo-transparentInfo = IIColor 0- data WindowData = WindowData   { windowId :: X11Window   , windowTitle :: String@@ -131,7 +91,7 @@ data WorkspacesContext = WorkspacesContext   { controllersVar :: MV.MVar (M.Map WorkspaceIdx WWC)   , workspacesVar :: MV.MVar (M.Map WorkspaceIdx Workspace)-  , hudWidget :: Gtk.HBox+  , workspacesWidget :: Gtk.HBox   , workspacesConfig :: WorkspacesConfig   , taffyContext :: Context   }@@ -183,6 +143,9 @@ type ParentControllerConstructor =   ControllerConstructor -> ControllerConstructor +type WindowIconPixbufGetter =+  Int32 -> WindowData -> TaffyIO (Maybe Gdk.Pixbuf)+ data WorkspacesConfig =   WorkspacesConfig   { widgetBuilder :: ControllerConstructor@@ -192,7 +155,7 @@   , underlinePadding :: Int   , maxIcons :: Maybe Int   , minIcons :: Int-  , getIconInfo :: WindowData -> WorkspacesIO IconInfo+  , getWindowIconPixbuf :: WindowIconPixbufGetter   , labelSetter :: Workspace -> WorkspacesIO String   , showWorkspaceFn :: Workspace -> Bool   , borderWidth :: Int@@ -202,18 +165,6 @@   , urgentWorkspaceState :: Bool   } -windowTitleClassIconGetter-  :: (Bool -> String -> String -> IconInfo)-  -> (WindowData -> WorkspacesIO IconInfo)-windowTitleClassIconGetter customIconF = fn-  where-    fn w@WindowData {windowTitle = wTitle, windowClass = wClass} = do-      ewmhIcon <- defaultGetIconInfo w-      let hasEwmhIcon = ewmhIcon /= IINone-          custIcon = customIconF hasEwmhIcon wTitle wClass-          hasCustomIcon = custIcon /= IINone-      return $ if hasCustomIcon then custIcon else ewmhIcon- defaultWorkspacesConfig :: WorkspacesConfig defaultWorkspacesConfig =   WorkspacesConfig@@ -224,7 +175,7 @@   , underlinePadding = 1   , maxIcons = Nothing   , minIcons = 0-  , getIconInfo = defaultGetIconInfo+  , getWindowIconPixbuf = defaultGetWindowIconPixbuf   , labelSetter = return . workspaceName   , showWorkspaceFn = const True   , borderWidth = 2@@ -321,7 +272,7 @@ addWidgetsToTopLevel = do   WorkspacesContext     { controllersVar = controllersRef-    , hudWidget = cont+    , workspacesWidget = cont     } <- ask   controllersMap <- lift $ MV.readMVar controllersRef   -- Elems returns elements in ascending order of their keys so this will always@@ -331,7 +282,7 @@  addWidget :: WWC -> WorkspacesIO () addWidget controller = do-  cont <- asks hudWidget+  cont <- asks workspacesWidget   let workspaceWidget = getWidget controller   lift $ do      -- XXX: This hbox exists to (hopefully) prevent the issue where workspace@@ -353,7 +304,7 @@         WorkspacesContext         { controllersVar = controllersRef         , workspacesVar = workspacesRef-        , hudWidget = cont+        , workspacesWidget = cont         , workspacesConfig = cfg         , taffyContext = tContext         }@@ -431,11 +382,12 @@  updateWorkspaceControllers :: WorkspacesIO () updateWorkspaceControllers = do-  WorkspacesContext { controllersVar = controllersRef-          , workspacesVar = workspacesRef-          , hudWidget = cont-          , workspacesConfig = cfg-          } <- ask+  WorkspacesContext+    { controllersVar = controllersRef+    , workspacesVar = workspacesRef+    , workspacesWidget = cont+    , workspacesConfig = cfg+    } <- ask   workspacesMap <- lift $ MV.readMVar workspacesRef   controllersMap <- lift $ MV.readMVar controllersRef @@ -574,29 +526,20 @@   , iconForceUpdate :: IO ()   } -getPixbufFromInfo :: Bool -> Int32 -> IconInfo -> IO (Maybe Gdk.Pixbuf)-getPixbufFromInfo transparentOnNone imgSize = gpb-  where-    gpb (IIEWMH iconData) =-      withEWMHIcons iconData (traverse pixBufFromEWMHIcon . selectEWMHIcon imgSize)-    gpb (IIFilePath file) = Just <$> pixBufFromFile file-    gpb (IIColor color) = Just <$> pixBufFromColor imgSize color-    gpb IINone =-      if transparentOnNone-      then getPixbufFromInfo transparentOnNone imgSize transparentInfo-      else return Nothing- getPixbufForIconWidget :: Bool                        -> MV.MVar (Maybe WindowData)                        -> Int32                        -> WorkspacesIO (Maybe Gdk.Pixbuf)-getPixbufForIconWidget transparentOnNone dataVar size =-  ask >>= \ctx ->-    let getII = getIconInfo $ workspacesConfig ctx-    in lift $ MV.readMVar dataVar >>=-       flip runReaderT ctx . maybe (return IINone) getII >>=-       getPixbufFromInfo transparentOnNone size >>=-       traverse (scalePixbufToSize size GI.Gtk.OrientationHorizontal)+getPixbufForIconWidget transparentOnNone dataVar size = do+  ctx <- ask+  let tContext = taffyContext ctx+      getPBFromData = getWindowIconPixbuf $ workspacesConfig ctx+      getPB' = runMaybeT $+               MaybeT (lift $ MV.readMVar dataVar) >>= MaybeT . getPBFromData size+      getPB = if transparentOnNone+              then maybeTCombine getPB' (Just <$> pixBufFromColor size 0)+              else getPB'+  lift $ runReaderT getPB tContext  buildIconWidget :: Bool -> Workspace -> WorkspacesIO IconWidget buildIconWidget transparentOnNone ws = do@@ -673,10 +616,63 @@   W.Requisition w _ <- W.widgetSizeRequest widget   when (w < minWidth) $ W.widgetSetSizeRequest widget minWidth  $ -1 -defaultGetIconInfo :: WindowData -> WorkspacesIO IconInfo-defaultGetIconInfo w =-  maybe IINone IIEWMH <$> liftX11Def Nothing (getWindowIconsData $ windowId w)+scaledWindowIconPixbufGetter :: WindowIconPixbufGetter -> WindowIconPixbufGetter+scaledWindowIconPixbufGetter getter size =+  getter size >=>+  lift . traverse (scalePixbufToSize size GI.Gtk.OrientationHorizontal) +constantScaleWindowIconPixbufGetter :: Int32+                                    -> WindowIconPixbufGetter+                                    -> WindowIconPixbufGetter+constantScaleWindowIconPixbufGetter constantSize getter =+  const $ scaledWindowIconPixbufGetter getter constantSize++getWindowIconPixbufFromEWMH :: WindowIconPixbufGetter+getWindowIconPixbufFromEWMH size windowData =+  runX11Def Nothing (getIconPixBufFromEWMH size $ windowId windowData)++getWindowIconPixbufFromClass :: WindowIconPixbufGetter+getWindowIconPixbufFromClass size windowData =+  lift $ getWindowIconFromClasses size (windowClass windowData)++getWindowIconPixbufFromDesktopEntry :: WindowIconPixbufGetter+getWindowIconPixbufFromDesktopEntry size windowData =+  getWindowIconFromDesktopEntryByClasses size (windowClass windowData)++defaultGetWindowIconPixbuf :: WindowIconPixbufGetter+defaultGetWindowIconPixbuf =+  scaledWindowIconPixbufGetter unscaledDefaultGetWindowIconPixbuf++unscaledDefaultGetWindowIconPixbuf :: WindowIconPixbufGetter+unscaledDefaultGetWindowIconPixbuf =+  getWindowIconPixbufFromDesktopEntry <|||>+  getWindowIconPixbufFromClass <|||>+  getWindowIconPixbufFromEWMH++addCustomIconsToDefaultWithFallbackByPath+  :: (WindowData -> Maybe FilePath)+  -> FilePath+  -> WindowIconPixbufGetter+addCustomIconsToDefaultWithFallbackByPath getCustomIconPath fallbackPath =+  addCustomIconsAndFallback+    getCustomIconPath+    (const $ lift $ getPixbufFromFilePath fallbackPath)+    unscaledDefaultGetWindowIconPixbuf++addCustomIconsAndFallback+  :: (WindowData -> Maybe FilePath)+  -> (Int32 -> TaffyIO (Maybe Gdk.Pixbuf))+  -> WindowIconPixbufGetter+  -> WindowIconPixbufGetter+addCustomIconsAndFallback getCustomIconPath fallback defaultGetter =+  scaledWindowIconPixbufGetter $+  getCustomIcon <|||> defaultGetter <|||> (\s _ -> fallback s)+  where+    getCustomIcon :: Int32 -> WindowData -> TaffyIO (Maybe Gdk.Pixbuf)+    getCustomIcon _ wdata =+      lift $+      maybe (return Nothing) getPixbufFromFilePath $ getCustomIconPath wdata+ sortWindowsByPosition :: [WindowData] -> WorkspacesIO [WindowData] sortWindowsByPosition wins = do   let getGeometryWorkspaces w = getDisplay >>= liftIO . (`safeGetGeometry` w)@@ -761,13 +757,6 @@         updateWidgetClasses iconButton [statusString] possibleStatusStrings   void $ updateVar windowRef $ const $ return windowData   lift $ updateIcon >> setIconWidgetProperties--selectEWMHIcon :: Int32 -> [EWMHIcon] -> Maybe EWMHIcon-selectEWMHIcon imgSize icons = listToMaybe prefIcon-  where sortedIcons = sortBy (comparing height) icons-        smallestLargerIcon = take 1 $ dropWhile ((<= fromIntegral imgSize) . height) sortedIcons-        largestIcon = take 1 $ reverse sortedIcons-        prefIcon = smallestLargerIcon ++ largestIcon  data WorkspaceButtonController = WorkspaceButtonController   { button :: Gtk.EventBox
+ src/System/Taffybar/WindowIcon.hs view
@@ -0,0 +1,122 @@+module System.Taffybar.WindowIcon where++import           Control.Monad+import           Control.Monad.IO.Class+import           Control.Monad.Trans.Class+import           Control.Monad.Trans.Maybe+import           Data.Bits+import           Data.Int+import           Data.List+import           Data.Maybe+import qualified Data.MultiMap as MM+import           Data.Ord+import qualified Data.Text as T+import           Data.Word+import           Foreign.Marshal.Alloc+import           Foreign.Marshal.Array+import           Foreign.Ptr+import           Foreign.Storable+import qualified GI.GdkPixbuf.Enums as Gdk+import qualified GI.GdkPixbuf.Objects.Pixbuf as Gdk+import           System.Log.Logger+import           System.Taffybar.Context+import           System.Taffybar.Hooks+import           System.Taffybar.Information.EWMHDesktopInfo+import           System.Taffybar.Information.X11DesktopInfo+import           System.Taffybar.Information.XDG.DesktopEntry+import           System.Taffybar.Util+import           System.Taffybar.Widget.Util++type ColorRGBA = Word32++-- | Convert a C array of integer pixels in the ARGB format to the ABGR format.+-- Returns an unmanged Ptr that points to a block of memory that must be freed+-- manually.+pixelsARGBToBytesABGR+  :: (Storable a, Bits a, Num a, Integral a)+  => Ptr a -> Int -> IO (Ptr Word8)+pixelsARGBToBytesABGR ptr size = do+  target <- mallocArray (size * 4)+  let writeIndex i = do+        bits <- peekElemOff ptr i+        let b = toByte bits+            g = toByte $ bits `shift` (-8)+            r = toByte $ bits `shift` (-16)+            a = toByte $ bits `shift` (-24)+            baseTarget = 4 * i+            doPoke offset = pokeElemOff target (baseTarget + offset)+            toByte = fromIntegral . (.&. 0xFF)+        doPoke 0 r+        doPoke 1 g+        doPoke 2 b+        doPoke 3 a+      writeIndexAndNext i+        | i >= size = return ()+        | otherwise = writeIndex i >> writeIndexAndNext (i + 1)+  writeIndexAndNext 0+  return target++selectEWMHIcon :: Int32 -> [EWMHIcon] -> Maybe EWMHIcon+selectEWMHIcon imgSize icons = listToMaybe prefIcon+  where sortedIcons = sortBy (comparing ewmhHeight) icons+        smallestLargerIcon = take 1 $ dropWhile ((<= fromIntegral imgSize) . ewmhHeight) sortedIcons+        largestIcon = take 1 $ reverse sortedIcons+        prefIcon = smallestLargerIcon ++ largestIcon++getPixbufFromEWMHIcons :: Int32 -> [EWMHIcon] -> IO (Maybe Gdk.Pixbuf)+getPixbufFromEWMHIcons size = traverse pixBufFromEWMHIcon . selectEWMHIcon size++-- | Create a pixbuf from the pixel data in an EWMHIcon.+pixBufFromEWMHIcon :: EWMHIcon -> IO Gdk.Pixbuf+pixBufFromEWMHIcon EWMHIcon {ewmhWidth = w, ewmhHeight = h, ewmhPixelsARGB = px} = do+  let width = fromIntegral w+      height = fromIntegral h+      rowStride = width * 4+  wPtr <- pixelsARGBToBytesABGR px (w * h)+  Gdk.pixbufNewFromData wPtr Gdk.ColorspaceRgb True 8+     width height rowStride (Just free)++getIconPixBufFromEWMH :: Int32 -> X11Window -> X11Property (Maybe Gdk.Pixbuf)+getIconPixBufFromEWMH size x11WindowId = runMaybeT $ do+  ewmhData <- MaybeT $ getWindowIconsData x11WindowId+  MaybeT $ lift $ withEWMHIcons ewmhData (getPixbufFromEWMHIcons size)++-- | Create a pixbuf with the indicated RGBA color.+pixBufFromColor+  :: MonadIO m+  => Int32 -> Word32 -> m Gdk.Pixbuf+pixBufFromColor imgSize c = do+  Just pixbuf <- Gdk.pixbufNew Gdk.ColorspaceRgb True 8 imgSize imgSize+  Gdk.pixbufFill pixbuf c+  return pixbuf++getDirectoryEntryByClass+  :: String+  -> TaffyIO (Maybe DesktopEntry)+getDirectoryEntryByClass klass = do+  entries <- MM.lookup klass <$> getDirectoryEntriesByClassName+  when (length entries > 1) $+       logPrintF "System.Taffybar.WindowIcon" INFO "Multiple entries for: %s" (klass, entries)+  return $ listToMaybe entries++getWindowIconForAllClasses+  :: Monad m+  => (p -> String -> m (Maybe a)) -> p -> String -> m (Maybe a)+getWindowIconForAllClasses doOnClass size klass =+  foldl combine (return Nothing) $ parseWindowClasses klass+  where+    combine soFar theClass =+      maybeTCombine soFar (doOnClass size theClass)++getWindowIconFromDesktopEntryByClasses :: Int32 -> String -> TaffyIO (Maybe Gdk.Pixbuf)+getWindowIconFromDesktopEntryByClasses =+  getWindowIconForAllClasses getWindowIconFromDesktopEntryByClass+  where getWindowIconFromDesktopEntryByClass size klass =+          runMaybeT $ do+            entry <- MaybeT $ getDirectoryEntryByClass klass+            MaybeT $ lift $ getImageForDesktopEntry size entry++getWindowIconFromClasses :: Int32 -> String -> IO (Maybe Gdk.Pixbuf)+getWindowIconFromClasses =+  getWindowIconForAllClasses getWindowIconFromClass+  where getWindowIconFromClass size klass = loadPixbufByName size (T.pack klass)
taffybar.cabal view
@@ -1,5 +1,5 @@ name: taffybar-version: 2.1.0+version: 2.1.1 synopsis: A desktop bar similar to xmobar, but with more GUI license: BSD3 license-file: LICENSE@@ -17,8 +17,10 @@   README.md   CHANGELOG.md   taffybar.hs.example+  dbus-xml/org.freedesktop.UPower.Device.xml+  dbus-xml/org.freedesktop.UPower.xml   dbus-xml/org.mpris.MediaPlayer2.Player.xml-+  dbus-xml/org.mpris.MediaPlayer2.xml  description:   Taffybar is a gtk+3 (through gtk2hs) based desktop information bar, intended@@ -37,7 +39,6 @@    default-language: Haskell2010   build-depends: base > 3 && < 5-               , alsa-mixer >= 0.2.0                , ConfigFile                , HStringTemplate >= 0.8 && < 0.9                , HTTP@@ -104,7 +105,6 @@                  , System.Taffybar.Context                  , System.Taffybar.DBus                  , System.Taffybar.DBus.Toggle-                 , System.Taffybar.EWMHPixbuf                  , System.Taffybar.Hooks                  , System.Taffybar.Information.Battery                  , System.Taffybar.Information.CPU@@ -116,12 +116,12 @@                  , System.Taffybar.Information.Network                  , System.Taffybar.Information.SafeX11                  , System.Taffybar.Information.StreamInfo-                 , System.Taffybar.Information.Volume                  , System.Taffybar.Information.X11DesktopInfo                  , System.Taffybar.Information.XDG.DesktopEntry                  , System.Taffybar.Information.XDG.Protocol                  , System.Taffybar.SimpleConfig                  , System.Taffybar.Support.PagerHints+                 , System.Taffybar.Util                  , System.Taffybar.Widget                  , System.Taffybar.Widget.Battery                  , System.Taffybar.Widget.CPUMonitor@@ -150,12 +150,12 @@                  , System.Taffybar.Widget.Text.MemoryMonitor                  , System.Taffybar.Widget.Text.NetworkMonitor                  , System.Taffybar.Widget.Util-                 , System.Taffybar.Widget.Volume                  , System.Taffybar.Widget.Weather                  , System.Taffybar.Widget.Windows                  , System.Taffybar.Widget.Workspaces                  , System.Taffybar.Widget.XDGMenu.Menu                  , System.Taffybar.Widget.XDGMenu.MenuWidget+                 , System.Taffybar.WindowIcon                       other-modules: Paths_taffybar                , System.Taffybar.DBus.Client.MPRIS2@@ -163,7 +163,6 @@                , System.Taffybar.DBus.Client.UPower                , System.Taffybar.DBus.Client.UPowerDevice                , System.Taffybar.DBus.Client.Util-               , System.Taffybar.Util    cc-options: -fPIC   ghc-options: -Wall -funbox-strict-fields -fno-warn-orphans
taffybar.hs.example view
@@ -64,13 +64,16 @@       clock = textClockNew Nothing "%a %b %_d %r" 1       layout = layoutNew defaultLayoutConfig       windows = windowsNew defaultWindowsConfig+	  -- See https://github.com/taffybar/gtk-sni-tray#statusnotifierwatcher+	  -- for a better way to set up the sni tray+	  tray = sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt       myConfig = defaultSimpleTaffyConfig         { startWidgets =             workspaces : map (>>= buildContentsBox) [ layout, windows ]         , endWidgets = map (>>= buildContentsBox)           [ batteryIconNew           , clock-          , sniTrayNew+          , tray           , cpu           , mem           , net