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 +1/−8
- dbus-xml/org.freedesktop.UPower.Device.xml +48/−0
- dbus-xml/org.freedesktop.UPower.xml +26/−0
- dbus-xml/org.mpris.MediaPlayer2.xml +10/−0
- src/System/Taffybar/Compat/GtkLibs.hs +0/−13
- src/System/Taffybar/Context.hs +1/−10
- src/System/Taffybar/EWMHPixbuf.hs +0/−78
- src/System/Taffybar/Hooks.hs +43/−6
- src/System/Taffybar/Information/EWMHDesktopInfo.hs +25/−20
- src/System/Taffybar/Information/Volume.hs +0/−40
- src/System/Taffybar/Information/XDG/DesktopEntry.hs +8/−1
- src/System/Taffybar/Information/XDG/Protocol.hs +0/−1
- src/System/Taffybar/Util.hs +44/−0
- src/System/Taffybar/Widget.hs +1/−11
- src/System/Taffybar/Widget/Generic/DynamicMenu.hs +0/−1
- src/System/Taffybar/Widget/SNITray.hs +12/−5
- src/System/Taffybar/Widget/Util.hs +8/−0
- src/System/Taffybar/Widget/Volume.hs +0/−26
- src/System/Taffybar/Widget/Workspaces.hs +84/−95
- src/System/Taffybar/WindowIcon.hs +122/−0
- taffybar.cabal +6/−7
- taffybar.hs.example +4/−1
README.md view
@@ -1,11 +1,4 @@-Taffybar-========-[](https://hackage.haskell.org/package/taffybar)-[](https://github.com/taffybar/taffybar/compare/latest-release...master)-[](https://travis-ci.org/taffybar/taffybar)-[](https://github.com/taffybar/taffybar/labels/help%20wanted)-[](https://gitter.im/taffybar/Lobby)-[](https://github.com/taffybar/taffybar/blob/master/LICENSE)+# Taffybar [](https://hackage.haskell.org/package/taffybar) [](https://github.com/taffybar/taffybar/compare/latest-release...master) [](https://travis-ci.org/taffybar/taffybar) [](https://github.com/taffybar/taffybar/labels/help%20wanted) [](https://gitter.im/taffybar/Lobby) [](https://github.com/taffybar/taffybar/blob/master/LICENSE) 
+ 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