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