X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/3754466c5a0f36d056dde3c27bc5bf666739da3e..c6a94b49c00ea320c67909cbe0d2df2f95d4fbb9:/awesome/widgets/mpd_widget.lua diff --git a/awesome/widgets/mpd_widget.lua b/awesome/widgets/mpd_widget.lua index e68fd8c..b6cfec8 100644 --- a/awesome/widgets/mpd_widget.lua +++ b/awesome/widgets/mpd_widget.lua @@ -1,48 +1,39 @@ -local mpc = require("widgets/mpc") -local textbox = require("wibox.widget.textbox") -local gears = require("gears") -local awful = require("awful") +local awful = require("awful") +local gears = require("gears") +local mpc = require("widgets/mpc") local naughty = require("naughty") -local timer = require("gears.timer") - ---TODO remove -local dbg = require("gears.debug") - -mpd_widget = textbox() - -local function update_widget() +local textbox = require("wibox.widget.textbox") +local timer = require("gears.timer") +local wibox = require("wibox") + +local widget = {} +widget._textbox = textbox() +widget._currentsong = {} + +widget.scroll = wibox.widget { + layout = wibox.container.scroll.horizontal, + max_size = 200, + extra_space = 10, + step_function = wibox.container.scroll.step_functions.linear_increase, + speed = 20, + { + widget = widget._textbox, + } +} + +function widget:update_widget() local text = "" - if state == "pause" then - text = "|| " + local artist = self._currentsong.artist + local title = self._currentsong.title + local file = self._currentsong.file + if not artist then + text = string.format("%s", title or file ) + else + text = string.format("%s - %s", artist, title) end - text = text .. tostring(artist or "") .. " - " .. tostring(title or "") - mpd_widget.text = text + self._textbox.text = text end -local connection -local function error_handler(err) - mpd_widget:set_text("Error: " .. tostring(err)) - timer.start_new(10, function() - connection:send("ping") - end) -end - -connection = mpc.new(nil, nil, nil, error_handler, - "status", function(_, result) - state = result.state - end, - "currentsong", function(_, result) - title, artist, file = result.title, result.artist, result.file - pcall(update_widget) - end -) - -mpd_widget:buttons(gears.table.join( - awful.button({}, 1, function() connection:toggle_play() end) -, awful.button({}, 4, function() connection:change_volume(5) end) -, awful.button({}, 5, function() connection:change_volume(-5) end)) -) - local function sec_to_min(sec) m, s = math.modf((sec or 0.0) / 60) return string.format('%d:%02d', m, math.floor(s * 60)) @@ -52,71 +43,134 @@ local function song_duration(elapsed, duration) return sec_to_min(elapsed) .. "/" .. sec_to_min(duration) end -local function get_info(callback) +function widget:get_info(callback) local status = nil - connection:send("status", function(_, s) status = s end) + self._connection:send("status", function(_, s) status = s end) local song = nil - connection:send("currentsong", function(_, s) song = s end) + self._connection:send("currentsong", function(_, s) song = s end) - connection:send("ping", function() - dbg.dump(status) - dbg.dump(song) + self._connection:send("ping", function() local info = {} info.title = status.state .. " " .. status.song .. "/" .. status.playlistlength .. " " .. song_duration(status.elapsed, status.duration) - info.text = tostring(song.artist or "") .. " - " .. tostring(song.title or "") .. "\n" - .. tostring(song.album or "") + if not song.artist then + info.text = string.format("%s", song.title or song.file) + else + info.text = string.format("%s - %s", song.artist, song.title) + end + if song.album then + info.text = info.text .. "\n" .. tostring(song.album or "") + end callback(info) - return false end) end -local popup = {} -function popup:show() - get_info(function(table) - if self._notification ~= nil then return end +function widget:popup_show() + self:get_info(function(table) + if self._notification then return end self._notification = naughty.notify( { title = table.title -- , icon = img , text = table.text , timeout = 0 + , destroy = function() self._timer:stop(); self._notification = nil end }) + self._timer:start() end) end -function popup:hide() - if self._notification ~= nil then - naughty.destroy(self._notification) - self._notification = nil +function widget:popup_hide(delay) + if self._hide_timer and self._hide_timer.started then + self._hide_timer:again() + else + self._hide_timer = timer( + { timeout = delay + , autostart = true + , single_shot = true + , callback = function() + if self._hover then return end + if not self._notification then return end + naughty.destroy(self._notification) + self._notification = nil + end + }) end end -function popup:update() - get_info(function(table) - if self._notification == nil then return end +function widget:popup_update() + self:get_info(function(table) + if not self._notification then return end naughty.replace_text(self._notification, table.title, table.text) end) end -function popup:run() +function widget:popup_oneshot(timeout) + if self._notification then + self:popup_update() + self:popup_hide(5) + else + self:popup_show() + self:popup_hide(5) + end +end + +function widget:error_handler(err) + self._textbox:set_text("Error: " .. tostring(err)) + timer.start_new(10, function() + self._connection:send("ping") + end) +end + +function widget:run() + self._connection = mpc.new(nil, nil, nil, function(err) self:error_handler(err) end, + "status", function(_, result) + if not self._status or result.state ~= self._status.state then + self._status = result + self:update_widget() + self:popup_oneshot(5) + end + end, + "currentsong", function(_, result) + if not self._currentsong or result.id ~= self._currentsong.id then + self._currentsong = result + self:update_widget() + self:popup_oneshot(5) + end + end + ) + self._timer = timer({ timeout = 1 }) - self._timer:connect_signal("start", function() self:show() end) - self._timer:connect_signal("timeout", function() self:update() end) - self._timer:connect_signal("stop", function() self:hide() end) --TODO delay + self._timer:connect_signal("timeout", function() self:popup_update() end) - mpd_widget:connect_signal("mouse::enter", function() self._timer:again() end) - mpd_widget:connect_signal("mouse::leave", function() self._timer:stop() end) + self._hover = false; + self.scroll:connect_signal("mouse::enter", function() self._hover = true; self:popup_show() end) + self.scroll:connect_signal("mouse::leave", function() self._hover = false; self:popup_hide(2) end) end -popup:run() +widget:run() + +widget.scroll:buttons(gears.table.join( + awful.button({}, 1, function() widget._connection:toggle_play() end) +, awful.button({}, 4, function() widget._connection:change_volume(5) end) +, awful.button({}, 5, function() widget._connection:change_volume(-5) end)) +) globalkeys = gears.table.join(globalkeys, - awful.key({ modkey }, "p", function() connection:toggle_play() end, + awful.key({ modkey }, "p", function() widget._connection:toggle_play() end, { description = "toogle play", group = "mpd" }), - awful.key({ modkey }, ",", function() connection:send("previous") end, + awful.key({ modkey }, "'", function() widget:popup_oneshot(5) end, + { description = "show more info", group = "mpd" }), + awful.key({ modkey }, ",", function() widget._connection:send("previous") end, { description = "previous track", group = "mpd" }), - awful.key({ modkey }, ".", function() connection:send("next") end, + awful.key({ modkey }, ".", function() widget._connection:send("next") end, { description = "next track", group = "mpd" }) ) -return mpd_widget +return { + layout = wibox.layout.align.horizontal, + forced_width = 200, + expand = "outside", + nil, + widget.scroll, + nil, +}