i3-ipc
Endlich komm ich mal dazu über mein neuestes Projekt zu bloggen.
Seit längerem gibt es das IPC-Interface bei i3, mit dem Commit 3db4890 unterstützt das i3 IPC-Interface nun auch Events.
Seit dem das IPC-Interface eingebaut ist, gibt es auch i3-msg, ein kleines Clientprogramm, was Kommandos an den Fenstermanager sendet.
Da die Interprozesskommunikation aber über ein einfaches UNIX Domain Socket funktioniert, ist es ein leichtes Clients dafür zu schreiben.
Und genau das habe ich nun mit i3-ipc gemacht.
Zum einen ist da das simple CLI-Skript. Das funktioniert ähnlich wie i3-msg und sendet ein Kommando oder fragt nach den Workspaces.
$ i3-ipc "exec xterm"
{"success"=>true}
# xterm opens
$ i3-ipc -t1 -p
[{"num"=>1,
"name"=>"1",
"visible"=>false,
"focused"=>false,
"rect"=>{"x"=>0, "y"=>0, "width"=>1280, "height"=>800},
"output"=>"LVDS1"},
...
Das zu installieren ist ebenfalls einfach:
curl -s http://github.com/badboy/i3-ipc/raw/master/i3-ipc > i3-ipc &&
chmod 755 i3-ipc &&
mv i3-ipc /usr/local/bin/i3-ipc
Wenn Arch Linux nutzt (so wie ich), ist es sinnvoll, dass Skript mit Pacman zu installieren. Dafür gibt es das AUR-Paket:
curl -s http://aur.archlinux.org/packages/i3-ipc/i3-ipc/PKGBUILD > PKGBUILD &&
makepkg -i
Aber damit nicht genug, man will ja auch die Events nutzen. Mittels der Events wird die direkt in i3 implementierte Workspace-Bar am unteren Rand des Bildschirms wohl bald optional.
Um i3-ipc zu diesem Zwecke zu nutzen, braucht man das Gem:
gem install i3-ipc
oder man klont halt das Repository:
git clone git://github.com/badboy/i3-ipc.git
Dann kann man damit arbeiten. Das Grundgerüst sieht dabei dann so aus:
I3::IPC.subscribe [:workspace] do |em, type, data|
# ...
end
Um nun zum Beispiel auf einen Wechsel der Workspaces zu reagieren, nutzt man folgenden Code
I3::IPC.subscribe [:workspace] do |em, type, data|
case type
when I3::IPC::MESSAGE_REPLY_GET_WORKSPACES
data.each do |e|
if e["focused"]
puts "focused: %s" % e["name"]
else
puts "unfocused: %s" % e["name"]
end
end
when I3::IPC::EVENT_WORKSPACE
em.send_data I3::IPC.format(I3::IPC::MESSAGE_TYPE_GET_WORKSPACES)
end
end
Das vollständige Beispiel findet sich im examples-Ordner und wird folgendermaßen ausgeführt:
ruby dzen2-workspace.rb | dzen2 -ta l -dock
TADA! schon habt ihr eine Liste am unteren Rand:
Nett, oder? ;)