X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/8d37b9a1e4521a220f20ce2e1414f656aa3a5015..a20aed82096be8e33461d078b615f788c35704f7:/widgets/yawn/init.lua?ds=inline

diff --git a/widgets/yawn/init.lua b/widgets/yawn/init.lua
index 9bed983..3f08cd5 100644
--- a/widgets/yawn/init.lua
+++ b/widgets/yawn/init.lua
@@ -27,52 +27,58 @@ local setmetatable = setmetatable
 -- 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*$*)[.]")
+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 f = io.popen("curl --connect-timeout 1 -fsm 3 '" .. url .. "'" )
     local text = f:read("*all")
     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", "")
@@ -107,6 +113,11 @@ local function fetch_weather()
 
     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
@@ -122,17 +133,12 @@ local function fetch_weather()
 
     -- Finally setting infos
     yawn.icon:set_image(sky)
-    widget = wibox.widget.textbox()
+    widget = yawn.widget
 
-    forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n")
+    forecast = weather_data:match(": %S.-,"):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()
@@ -143,7 +149,7 @@ 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
@@ -151,7 +157,7 @@ function yawn.show(t_out)
     yawn.hide()
 
     notification = naughty.notify({
-        preset = yawn.notification_preset,
+        preset = yawn_notification_preset,
         text = weather_data,
         icon = sky,
         timeout = t_out
@@ -176,7 +182,7 @@ function yawn.register(id, args)
         yawn.hide()
     end)
 
-    return { icon = yawn.icon, widget = yawn.widget }
+    return yawn
 end
 
 function yawn.attach(widget, id, args)