MyNixOS website logo
Description

A type-safe wrapper around i3's IPC.

Library for controlling i3 through it's IPC. i3 communicates using a JSON interface over a unix socket. For JSON parsing I'm using Aeson. I've written out all the records and types to allow anyone to easily interact with i3 from a Haskell application.

i3ipc

Build Status

Haskell type-safe bindings for working with i3 using it's unix socket IPC. Sway is supposed to be protocl compatible with i3, I've included a function to bind to sway's socket also.

Subscribing

Subscribe to events:

import qualified I3IPC.Subscribe         as Sub
import           I3IPC                   ( subscribe )
import           Control.Monad.IO.Class

-- will print all events
main :: IO ()
main = liftIO $ subscribe print [Sub.Workspace, Sub.Window]

An example of explicitly matching on some events and printing their fields:

import qualified I3IPC.Subscribe               as Sub
import           I3IPC.Event
import           I3IPC                         ( subscribe )
import           Control.Monad.IO.Class

main :: IO ()
main = liftIO $ subscribe handle [Sub.Workspace, Sub.Window]
 where
  handle :: MonadIO m => Either String Event -> m ()
  handle (Right evt) = case evt of
    Workspace WorkspaceEvent { wrk_current } -> print wrk_current
    Window WindowEvent { win_container } -> print win_container
    _ -> error "No other event types"
  handle (Left err) = error err

Sending Messages

Sending Messages to i3:

import           I3IPC              ( connecti3
                                    , getWorkspaces
                                    )
import           Control.Monad.IO.Class                                    

main :: IO ()
main = do
    soc <- liftIO $ connecti3
    print $ getWorkspaces soc

Alternatively, you can ignore the convenience functions and construct these messages yourself:

import qualified I3IPC.Message     as Msg
import           I3IPC              ( connecti3
                                    , receiveMsg
                                    )
import           Control.Monad.IO.Class                                    

main :: IO ()
main = do
    soc <- liftIO $ connecti3
    print $ Msg.sendMsg soc Msg.Workspaces >> receiveMsg soc

Community

I'm happy to take PRs or suggestions, or simply fix issues for this library.

Metadata

Version

0.2.0.0

Platforms (75)

    Darwin
    FreeBSD 13
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd13
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd13
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows