-- lain.widgets.yawn
local yawn =
{
- icon = wibox.widget.imagebox(),
- widget = wibox.widget.textbox(''),
- notification_preset = {}
+ icon = wibox.widget.imagebox(),
+ widget = wibox.widget.textbox('')
}
-local project_path = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]]
-local localizations_path = project_path .. 'localizations/'
-local icon_path = project_path .. 'icons/'
-local api_url = 'http://weather.yahooapis.com/forecastrss'
-local units_set = '?u=c&w=' -- Default is Celsius
-local language = string.match(os.getenv("LANG"), "(%S*$*)[.]")
-local weather_data = nil
-local notification = nil
-local city_id = nil
-local sky = nil
-local settings = function() end
+local project_path = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]]
+local localizations_path = project_path .. 'localizations/'
+local icon_path = project_path .. 'icons/'
+local api_url = 'http://weather.yahooapis.com/forecastrss'
+local units_set = '?u=c&w=' -- Default is Celsius
+local language = string.match(os.getenv("LANG"), "(%S*$*)[.]") or "en_US" -- if LANG is not set
+local weather_data = nil
+local notification = nil
+local city_id = nil
+local sky = nil
+local settings = function() end
+
+yawn_notification_preset = {}
local function fetch_weather()
local url = api_url .. units_set .. city_id
- local f = io.popen("curl --connect-timeout 1 -fsm 2 '"
- .. url .. "'" )
- local text = f:read("*all")
+ local f = io.popen("curl --connect-timeout 1 -fsm 3 '" .. url .. "'" )
+ local text = f:read("*a")
f:close()
- -- handle no suitable icon found
- yawn.icon:set_image(icon_path .. "na.png")
-
-- In case of no connection or invalid city ID
-- widgets won't display
if text == "" or text:match("City not found")
then
+ yawn.icon:set_image(icon_path .. "na.png")
if text == "" then
weather_data = "Service not available at the moment."
- yawn.widget:set_text("N/A")
+ yawn.widget:set_text(" N/A ")
else
weather_data = "City not found!\n" ..
"Are you sure " .. city_id ..
" is your Yahoo city ID?"
- yawn.widget:set_text("?")
+ yawn.widget:set_text(" ? ")
end
return
end
-- Processing raw data
weather_data = text:gsub("<.->", "")
- weather_data = weather_data:match("Current Conditions:.-Full")
+ weather_data = weather_data:match("Current Conditions:.-Full") or ""
+
+ -- may still happens in case of bad connectivity
+ if weather_data == "" then
+ yawn.icon:set_image(icon_path .. "na.png")
+ yawn.widget:set_text(" ? ")
+ return
+ end
+
weather_data = weather_data:gsub("Current Conditions:.-\n", "Now: ")
weather_data = weather_data:gsub("Forecast:.-\n", "")
weather_data = weather_data:gsub("\nFull", "")
sky = sky .. forecast:gsub(" ", ""):gsub("/", "") .. ".png"
+ -- In case there's no defined icon for current forecast
+ if io.open(sky) == nil then
+ sky = icon_path .. "na.png"
+ end
+
-- Localization
local f = io.open(localizations_path .. language, "r")
if language:find("en_") == nil and f ~= nil
-- Finally setting infos
yawn.icon:set_image(sky)
- widget = wibox.widget.textbox()
+ widget = yawn.widget
- forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n")
+ _data = weather_data:match(": %S.-,") or weather_data
+ forecast = _data:gsub(": ", ""):gsub(",", "")
units = units:gsub(" ", "")
- notification_preset = {}
- -- anche notification preset, con fg, bg e position
settings()
-
- yawn.widget = widget
- yawn.notification_preset = notification_preset
end
function yawn.hide()
end
function yawn.show(t_out)
- if yawn.widget._layout.text == "?"
+ if yawn.widget._layout.text:match("?")
then
fetch_weather(settings)
end
yawn.hide()
notification = naughty.notify({
- preset = yawn.notification_preset,
+ preset = yawn_notification_preset,
text = weather_data,
icon = sky,
- timeout = t_out
+ timeout = t_out,
+ screen = client.focus and client.focus.screen or 1
})
end
yawn.hide()
end)
- return { icon = yawn.icon, widget = yawn.widget }
+ return yawn
end
function yawn.attach(widget, id, args)