class Uh::WM::Runner

Attributes

actions[R]
env[R]
events[R]
rules[R]

Public Class Methods

new(env, manager: nil, stopped: false) click to toggle source
# File lib/uh/wm/runner.rb, line 22
def initialize env, manager: nil, stopped: false
  @env      = env
  @events   = Dispatcher.new
  @manager  = manager
  @actions  = ActionsHandler.new(@env, @events)
  @stopped  = stopped
  @rules    = @env.rules
end
run(env, **options) click to toggle source
# File lib/uh/wm/runner.rb, line 7
def run env, **options
  runner = new env, **options
  runner.evaluate_run_control
  runner.register_event_hooks
  runner.connect_manager
  runner.run_until { runner.stopped? }
  runner.terminate
end

Public Instance Methods

connect_manager() click to toggle source
# File lib/uh/wm/runner.rb, line 53
def connect_manager
  manager.connect
  @env.keybinds.each { |keysym, _| manager.grab_key *keysym }
end
evaluate_run_control() click to toggle source
# File lib/uh/wm/runner.rb, line 43
def evaluate_run_control
  RunControl.evaluate(env)
end
manager() click to toggle source
# File lib/uh/wm/runner.rb, line 39
def manager
  @manager ||= Manager.new(@events, @env.modifier, @env.modifier_ignore)
end
register_event_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 47
def register_event_hooks
  %w[runner manager layout keybinds rules launcher]
    .map  { |e| "register_#{e}_hooks".to_sym }
    .each { |e| send e }
end
run_until(&block) click to toggle source
# File lib/uh/wm/runner.rb, line 72
def run_until &block
  worker.watch @manager
  log "Working events with `#{worker.class}'"
  worker.work_events until block.call
end
stop!() click to toggle source
# File lib/uh/wm/runner.rb, line 35
def stop!
  @stopped = true
end
stopped?() click to toggle source
# File lib/uh/wm/runner.rb, line 31
def stopped?
  !!@stopped
end
terminate() click to toggle source
# File lib/uh/wm/runner.rb, line 78
def terminate
  log 'Terminating...'
  manager.disconnect
end
worker() click to toggle source
# File lib/uh/wm/runner.rb, line 58
def worker
  @worker ||= Workers.build(*(@env.worker)).tap do |w|
    w.before_watch  { @manager.flush }
    w.on_read       { @manager.handle_pending_events }
    w.on_read_next  { @manager.handle_next_event }
    w.on_timeout do
      log_debug 'Worker timeout, ticking...'
      @events.emit :tick
      log_debug 'Flushing X output buffer'
      @manager.flush
    end
  end
end

Private Instance Methods

register_keybinds_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 135
def register_keybinds_hooks
  @env.keybinds.each do |keysym, code|
    @events.on(:key, *keysym) { @actions.evaluate code }
  end
end
register_launcher_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 149
def register_launcher_hooks
  @events.on :connected do
    Launcher.launch(self, @env.launch) if @env.launch
  end
end
register_layout_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 107
def register_layout_hooks
  @events.on :connected do |display|
    log "Registering layout `#{layout.class}'"
    layout.register display
  end
  @events.on :configure do |window|
    log "Configuring window: #{window}"
    layout.suggest_geo
  end
  @events.on :manage do |client|
    log "Managing client #{client}"
    layout << client
  end
  @events.on :unmanage do |client|
    log "Unmanaging client #{client}"
    layout.remove client
  end
  @events.on :change do |client|
    log "Updating client #{client}"
    layout.update client
  end
  @events.on :expose do |window|
    log "Exposing window: #{window}"
    layout.expose window
  end
  @events.on(:tick) { layout.update }
end
register_manager_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 89
def register_manager_hooks
  @events.on :connecting do |display|
    log_debug "Connecting to X server on `#{display}'"
  end
  @events.on :connected do |display|
    log "Connected to X server on `#{display}'"
  end
  @events.on(:disconnected) { log 'Disconnected from X server' }
  @events.on(:xevent) { |event| XEventLogger.new(env).log_event event }
  @events.on(:xerror) do |*error|
    if error.none?
      log_fatal 'Fatal X IO Error received'
    else
      XEventLogger.new(env).log_xerror *error
    end
  end
end
register_rules_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 141
def register_rules_hooks
  @events.on :manage do |client|
    @rules.each do |selector, code|
      @actions.evaluate code if client.wclass =~ selector
    end
  end
end
register_runner_hooks() click to toggle source
# File lib/uh/wm/runner.rb, line 85
def register_runner_hooks
  @events.on(:quit) { stop! }
end