class Fusuma::Plugin::Appmatcher::X11::Matcher

Look up application name using xprop

Public Instance Methods

active_application(id = active_window_id) click to toggle source

@return [String] @return [NilClass]

# File lib/fusuma/plugin/appmatcher/x11.rb, line 60
def active_application(id = active_window_id)
  @cache ||= {}
  @cache[id] ||= begin
    return if id.nil?

    `xprop -id #{id} WM_CLASS | cut -d "=" -f 2 | tr -d '"'`.strip.split(', ').last
  end
end
on_active_application_changed() { |active_application(id) || 'NOT FOUND'| ... } click to toggle source
# File lib/fusuma/plugin/appmatcher/x11.rb, line 69
def on_active_application_changed
  active_window_id(watch: true) do |id|
    yield(active_application(id) || 'NOT FOUND')
  end
end
running_applications() click to toggle source

@return [Array<String>]

# File lib/fusuma/plugin/appmatcher/x11.rb, line 52
def running_applications
  `xprop -root _NET_CLIENT_LIST_STACKING`.split(', ')
                                         .map { |id_str| id_str.match(/0x[\da-z]{2,}/).to_s }
                                         .map { |id| active_application(id) }
end

Private Instance Methods

active_window_id(watch: false) { |id| ... } click to toggle source
# File lib/fusuma/plugin/appmatcher/x11.rb, line 77
def active_window_id(watch: false, &block)
  i, o, e, _w = Open3.popen3(xprop_active_window_id(watch))
  i.close
  o.each do |line|
    id = line.match(/0x[\da-z]{2,}/)&.to_s

    return id unless block_given?

    yield(id)
  end
  MultiLogger.error e.read if o.eof?
  e.close
  o.close

  return nil unless block_given?

  sleep 0.5
  active_window_id(watch: watch, &block)
rescue StandardError => e
  MultiLogger.error e.message
end
xprop_active_window_id(spy) click to toggle source

@param spy [TrueClass, FalseClass] @return [String]

# File lib/fusuma/plugin/appmatcher/x11.rb, line 101
def xprop_active_window_id(spy)
  spy_option = '-spy' if spy
  "xprop #{spy_option} -root _NET_ACTIVE_WINDOW"
end