i3-ipc

Posted 14.03.2010 um 14:27 von badboy_ - 0 Kommentare

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:

dzen2 workspace list dzen2 workspace list

Nett, oder? ;)

0 Kommentare:

  1. Was ist 10 plus 10?