class Rkremap::WinAttr

アプリの name, class, title を取得する

Public Class Methods

new() click to toggle source
# File lib/rkremap/winattr.rb, line 6
def initialize
  @app_win = {}
  @display = X11.XOpenDisplay(nil) or raise "Cannot open display: #{ENV['DISPLAY']}"
  @buf = ' '*8
end

Public Instance Methods

app_title(window) click to toggle source

@return [String]

# File lib/rkremap/winattr.rb, line 47
def app_title(window)
  win = app_win(window)[0]
  prop = X11::XTextProperty.malloc(Fiddle::RUBY_FREE)
  text_list = X11::Pointer.malloc(Fiddle::RUBY_FREE)
  X11.XGetWMName(@display, win, prop)
  X11.Xutf8TextPropertyToTextList(@display, prop, text_list, @buf)
  title = text_list.ptr.ptr.to_s.force_encoding('utf-8')
  X11.XFreeStringList(text_list.ptr)
  title
end
app_win(window) click to toggle source

@return [Array<window, name, class>]

# File lib/rkremap/winattr.rb, line 20
def app_win(window)
  return @app_win[window] if @app_win[window]
  class_hint = X11::XClassHint.malloc(Fiddle::RUBY_FREE)
  parent = X11::Window.malloc(Fiddle::RUBY_FREE)
  children = X11::Pointer.malloc(Fiddle::RUBY_FREE)
  win = window
  while win > 0
    class_hint.name = nil
    class_hint.class_name = nil
    X11.XGetClassHint(@display, win, class_hint)
    X11.XQueryTree(@display, win, @buf, parent, children, @buf)
    X11.XFree(children.ptr)
    break unless class_hint.name.null? && class_hint.class_name.null?
    win = parent.window
  end
  unless class_hint.name.null?
    win_name = class_hint.name.to_s
    X11.XFree(class_hint.name)
  end
  unless class_hint.class_name.null?
    win_class = class_hint.class_name.to_s
    X11.XFree(class_hint.class_name)
  end
  @app_win[window] = [win, win_name, win_class]
end
focus_win() click to toggle source

@return [Integer] Window

# File lib/rkremap/winattr.rb, line 13
def focus_win
  win = X11::Window.malloc(Fiddle::RUBY_FREE)
  X11.XGetInputFocus(@display, win, @buf)
  win.window
end