くそいのつくった

wmctrl生だとWindows7でいうWin+数字的なことができないので作った

% client フォーカス切り替えのタイトル なかったときの起動コマンド

みたいな雰囲気でつかう
Win+矢印的なのもほしいけど、wmctrlでフォーカスあたってるウィンドウを取得できるか怪しいのでできるか謎
ていうかwmctrlのコード直接いじったほうがいいように思います

server

require 'drb'

class Window
  attr_accessor :id
  def initialize(id, g, key)
    @id = id
    @x,@y,@w,@h = g[0],g[1],g[2],g[3]
    @key = key
  end
end


class WindowGroup < Array
  def initialize
    super
    @focus = 0
  end

  def focus_next
    @focus = (@focus + 1) % size
    `wmctrl -i -a #{self[@focus].id}`
  end
end

class WmctrlCtrl
  def initialize
    @groups = {}
  end

  def next_or_run(key, cmd)
    update(key)
    g = @groups[key]
    if g.empty? 
      `sh -c "#{cmd}" &`
    else 
      g.focus_next
    end
  end

  def update(key)
    group = @groups[key] || @groups[key] = WindowGroup.new
    group.clear

    `wmctrl -lG`.split("\n").each do |m|
      mm = m.split(' ')
      next unless mm[6..mm.size].join(' ') =~ /#{key}/

      group << Window.new(mm[0], mm[2..5], key)
    end
  end
end

DRb.start_service("druby://127.0.0.1:5656", WmctrlCtrl.new)
DRb.thread.join

client

#! /usr/bin/ruby
require 'drb'
ctrl = DRbObject.new_with_uri('druby://127.0.0.1:5656').next_or_run(ARGV[0], ARGV[1])