1 # Copyright (C) 2008 Dag Odenhall <dag.odenhall@gmail.com>
2 # Licensed under the Academic Free License version 3.0
5 require 'amazing/options'
6 require 'amazing/x11/display_name'
8 require 'amazing/widget'
9 require 'amazing/proc_file'
10 require 'amazing/widgets'
11 require 'amazing/awesome'
17 # Command line interface runner
23 @log = Logger.new(STDOUT)
24 @options = Options.new(@args)
26 @display = X11::DisplayName.new
27 rescue X11::EmptyDisplayName => e
28 @log.warn("#{e.message}, falling back on :0")
29 @display = X11::DisplayName.new(":0")
30 rescue X11::InvalidDisplayName => e
31 @log.fatal("#{e.message}, exiting")
38 @log.fatal("Received SIGINT, exiting")
42 show_help if @options[:help]
46 list_widgets if @options[:listwidgets]
49 explicit_updates unless @options[:update].empty?
53 @config["widgets"].each do |widget_name, settings|
54 if settings["every"] && count % settings["every"] == 0
55 update_widget(widget_name)
72 @log.level = Logger.const_get(@options[:loglevel].upcase)
74 @log.error("Unsupported log level #{@options[:loglevel].inspect}")
75 @log.level = Logger::INFO
80 scripts = @options[:include]
81 @config["include"].each do |script|
82 script = "#{File.dirname(@options[:config])}/#{script}" if script[0] != ?/
85 scripts.each do |script|
86 if File.exist?(script)
87 Widgets.module_eval(File.read(script))
89 @log.error("No such widget script #{script.inspect}")
95 Widgets.constants.each do |widget|
96 if description = Widgets.const_get(widget).description
97 puts "#{widget}: #{description}"
106 @log.debug("Parsing configuration file")
108 @config = YAML.load_file(@options[:config])
110 @log.fatal("Unable to parse configuration file, exiting")
113 @config["include"] ||= []
114 @config["screens"] ||= []
119 @options[:screens].each do |screen|
120 @screens[screen.to_i] = Awesome.new(screen, @display.display)
123 @config["screens"].each do |screen|
124 @screens[screen] = Awesome.new(screen, @display.display)
127 @screens[0] = Awesome.new if @screens.empty?
131 @log.debug("Waiting for awesome control socket for display #{@display.display}")
133 Timeout.timeout(30) do
134 sleep 1 until File.exist?("#{ENV["HOME"]}/.awesome_ctl.#{@display.display}")
135 @log.debug("Got socket for display #{@display.display}")
137 rescue Timeout::Error
138 @log.fatal("Socket for display #{@display.display} not created within 30 seconds, exiting")
143 def update_non_interval
144 @config["widgets"].each do |widget_name, settings|
145 next if settings["every"]
146 update_widget(widget_name)
151 @config["widgets"].each_key do |widget_name|
152 next unless @options[:update].include? widget_name
153 update_widget(widget_name, false)
158 def update_widget(widget_name, threaded=true)
159 settings = @config["widgets"][widget_name]
161 @screens.each do |screen, awesome|
162 @log.debug("Updating widget #{widget_name} of type #{settings["type"]} on screen #{screen}")
163 opts = settings["options"] || {}
164 field = settings["field"] || "default"
166 widget = Widgets.const_get(settings["type"]).new(widget_name, settings["format"], opts)
167 awesome.widget_tell(widget_name, widget.formatize)
175 rescue WidgetError => e
176 @log.error(settings["type"]) { e.message }