wmii/alternative_wmiircs/ruby/wmiirc

89 lines
1.7 KiB
Ruby
Executable File

#!/usr/bin/env ruby
#
# Bootloader for wmii configuration.
#
#--
# Copyright protects this work.
# See LICENSE file for details.
#++
# create a logger to aid debugging
require 'logger'
LOG = Logger.new(__FILE__ + '.log', 5)
class << LOG
# emulate IO.write
alias write <<
def flush
# ignore
end
end
# capture standard output in logger
$stdout = $stderr = LOG
begin
LOG.info 'birth'
# load configuration library
def find_config file
base_dirs = ENV['WMII_CONFPATH'].to_s.split(/:+/)
ruby_dirs = base_dirs.map {|dir| File.join(dir, 'ruby') }
Dir["{#{base_dirs.zip(ruby_dirs).join(',')}}/#{file}"].first
end
require find_config('config.rb')
# terminate any existing wmiirc
fs.event.write 'Start wmiirc'
event 'Start' do |arg|
exit if arg == 'wmiirc'
end
# apply user configuration
load_config find_config('config.yaml')
# setup tag bar (buttons that correspond to views)
fs.lbar.clear
tags.each {|t| event 'CreateTag', t }
event 'FocusTag', curr_tag
# register key bindings
fs.keys.write keys.join("\n")
event('Key') {|*a| key(*a) }
# the main event loop
fs.event.each_line do |line|
line.split("\n").each do |call|
name, args = call.split(' ', 2)
argv = args.to_s.split(' ')
event name, *argv
end
end
rescue SystemExit
# ignore it; the program wants to terminate
rescue Exception => e
LOG.error e
# allow the user to rescue themselves
system '@TERMINAL@ &'
IO.popen('xmessage -nearmouse -file - -buttons Recover,Ignore -print', 'w+') do |f|
f.puts e.inspect, e.backtrace
f.close_write
if f.read.chomp == 'Recover'
reload_config
end
end
ensure
LOG.info 'death'
end