diff options
Diffstat (limited to 'alternative_wmiircs/ruby/wmiirc')
-rwxr-xr-x | alternative_wmiircs/ruby/wmiirc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/alternative_wmiircs/ruby/wmiirc b/alternative_wmiircs/ruby/wmiirc new file mode 100755 index 0000000..2545137 --- /dev/null +++ b/alternative_wmiircs/ruby/wmiirc @@ -0,0 +1,88 @@ +#!/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 |