summaryrefslogtreecommitdiff
path: root/alternative_wmiircs/ruby/wmiirc
diff options
context:
space:
mode:
Diffstat (limited to 'alternative_wmiircs/ruby/wmiirc')
-rwxr-xr-xalternative_wmiircs/ruby/wmiirc88
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