class Sapristi::Linux::MonitorManager

Constants

MONITOR_LINE_REGEX
OFFSET
RESOLUTION

Public Class Methods

dimensions(work_area, monitor_info) click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 53
def self.dimensions(work_area, monitor_info)
  offset_x = monitor_info['offset_x']
  offset_y = monitor_info['offset_y']
  x_start = work_area.x
  y_start = work_area.y
  [
    x_start - offset_x,
    y_start - offset_y,
    x_start + work_area.width - offset_x,
    y_start + work_area.height - offset_y
  ]
end
new() click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 10
def initialize
  # https://ruby-gnome2.osdn.jp/hiki.cgi?Gdk%3A%3ADisplay
  @screen = Gdk::Screen.default
end
parse_line(line) click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 36
def self.parse_line(line)
  matcher = line.match(MONITOR_LINE_REGEX)
  matcher.names.each_with_object({}) do |name, memo|
    value = matcher[name]
    memo[name] = value&.match(/^[0-9]+$/) ? value.to_i : value
  end
end

Public Instance Methods

monitors() click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 15
def monitors
  list_monitors.split("\n")[1..nil]
               .map { |line| extract_monitor_info(line) }
               .each_with_object({}) { |monitor, memo| memo[monitor['name']] = monitor }
rescue StandardError => e
  raise Error, "Error fetching monitor information: #{e}"
end
monitors_work_area() click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 66
def monitors_work_area
  @screen.n_monitors.times.each_with_object({}) do |monitor_id, memo|
    memo[monitor_id] = @screen.get_monitor_workarea(monitor_id)
  end
end
work_area(monitor_info) click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 44
def work_area(monitor_info)
  area = monitors_work_area[monitor_info['id']]
  {
    'work_area' => MonitorManager.dimensions(area, monitor_info),
    'work_area_width' => area.width,
    'work_area_height' => area.height
  }
end

Private Instance Methods

extract_monitor_info(line) click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 29
def extract_monitor_info(line)
  monitor_info = MonitorManager.parse_line line
  Monitor.new monitor_info.merge work_area(monitor_info)
end
list_monitors() click to toggle source
# File lib/sapristi/adapters/linux/monitor_manager.rb, line 25
def list_monitors
  `xrandr --listmonitors`
end