diff --git a/docker-widget/docker.lua b/docker-widget/docker.lua
index 3bf92b4..918e3b5 100644
--- a/docker-widget/docker.lua
+++ b/docker-widget/docker.lua
@@ -10,17 +10,17 @@
local awful = require("awful")
local wibox = require("wibox")
-local watch = require("awful.widget.watch")
local spawn = require("awful.spawn")
local naughty = require("naughty")
local gears = require("gears")
local beautiful = require("beautiful")
-local gfs = require("gears.filesystem")
local HOME_DIR = os.getenv("HOME")
local WIDGET_DIR = HOME_DIR .. '/.config/awesome/awesome-wm-widgets/docker-widget'
local ICONS_DIR = WIDGET_DIR .. '/icons/'
+local LIST_CONTAINERS_CMD = [[bash -c "docker container ls -a --format '{{.Names}}::{{.ID}}::{{.Image}}::{{.Status}}'"]]
+
--- Utility function to show warning messages
local function show_warning(message)
naughty.notify{
@@ -46,20 +46,12 @@ local docker_widget = wibox.widget {
id = 'icon',
widget = wibox.widget.imagebox
},
- id = "m",
margins = 4,
layout = wibox.container.margin
},
- {
- id = "txt",
- widget = wibox.widget.textbox
- },
layout = wibox.layout.fixed.horizontal,
set_icon = function(self, new_icon)
- self.m.icon.image = new_icon
- end,
- set_text = function(self, new_value)
- self.txt.text = new_value
+ self:get_children_by_id("icon")[1].image = new_icon
end
}
@@ -77,7 +69,8 @@ local parse_container = function(line)
status = actual_status,
how_long = how_long:gsub('%s?%(.*%)%s?', ''),
is_up = function() return status == 'Up' end,
- is_paused = function() return how_long:find('Paused') end
+ is_paused = function() return how_long:find('Paused') end,
+ is_exited = function() return status == 'Exited' end
}
return container
end
@@ -112,31 +105,7 @@ local function worker(args)
for line in stdout:gmatch("[^\r\n]+") do
local container = parse_container(line)
- print(container:is_up())
- local name, container_id, image, status, how_long = line:match('(.*)::(.*)::(.*)::(%w*) (.*)')
- local is_visible
- if status == 'Up' or 'Exited' then is_visible = true else is_visible = false end
-
- local start_stop_button = wibox.widget {
- image = ICONS_DIR .. (container:is_up() and 'stop-btn.svg' or 'play-btn.svg'),
- visible = is_visible,
- opacity = 0.4,
- resize = false,
- widget = wibox.widget.imagebox
- }
- start_stop_button:connect_signal("mouse::enter", function(c) c:set_opacity(1) c:emit_signal('widget::redraw_needed') end)
- start_stop_button:connect_signal("mouse::leave", function(c) c:set_opacity(0.4) c:emit_signal('widget::redraw_needed') end)
-
- local pause_unpause_button = wibox.widget {
- image = ICONS_DIR .. (container:is_paused() and 'unpause-btn.svg' or 'pause-btn.svg'),
- visible = container.is_up(),
- opacity = 0.4,
- resize = false,
- widget = wibox.widget.imagebox
- }
- pause_unpause_button:connect_signal("mouse::enter", function(c) c:set_opacity(1) c:emit_signal('widget::redraw_needed') end)
- pause_unpause_button:connect_signal("mouse::leave", function(c) c:set_opacity(0.4) c:emit_signal('widget::redraw_needed') end)
local status_icon = wibox.widget {
image = status_to_icon_name[container['status']],
@@ -144,6 +113,90 @@ local function worker(args)
widget = wibox.widget.imagebox
}
+
+ local start_stop_button
+ if container.is_up() or container.is_exited() then
+ start_stop_button = wibox.widget {
+ {
+ id = 'icon',
+ image = ICONS_DIR .. (container:is_up() and 'stop-btn.svg' or 'play-btn.svg'),
+ opacity = 0.4,
+ resize = false,
+ widget = wibox.widget.imagebox
+ },
+ left = 2,
+ right = 2,
+ layout = wibox.container.margin
+ }
+ start_stop_button:connect_signal("mouse::enter", function(c)
+ c:get_children_by_id("icon")[1]:set_opacity(1)
+ c:get_children_by_id("icon")[1]:emit_signal('widget::redraw_needed') end)
+ start_stop_button:connect_signal("mouse::leave", function(c)
+ c:get_children_by_id("icon")[1]:set_opacity(0.4)
+ c:get_children_by_id("icon")[1]:emit_signal('widget::redraw_needed')
+ end)
+
+ start_stop_button:buttons(
+ awful.util.table.join( awful.button({}, 1, function()
+ local command
+ if container:is_up() then command = 'stop' else command = 'start' end
+
+ status_icon:set_opacity(0.2)
+ status_icon:emit_signal('widget::redraw_needed')
+
+ awful.spawn.easy_async('docker ' .. command .. ' ' .. container['name'], function(stdout, stderr)
+ if stderr ~= '' then show_warning(stderr) end
+ spawn.easy_async(LIST_CONTAINERS_CMD, function(stdout, stderr)
+ rebuild_widget(stdout, stderr) end)
+ end)
+ end) ) )
+ else
+ start_stop_button = nil
+ end
+
+
+ local pause_unpause_button
+ if container.is_up() then
+ pause_unpause_button = wibox.widget {
+ {
+ id = 'icon',
+ image = ICONS_DIR .. (container:is_paused() and 'unpause-btn.svg' or 'pause-btn.svg'),
+ opacity = 0.4,
+ resize = false,
+ widget = wibox.widget.imagebox
+ },
+ left = 2,
+ right = 2,
+ layout = wibox.container.margin
+ }
+ pause_unpause_button:connect_signal("mouse::enter", function(c)
+ c:get_children_by_id("icon")[1]:set_opacity(1)
+ c:get_children_by_id("icon")[1]:emit_signal('widget::redraw_needed')
+ end)
+ pause_unpause_button:connect_signal("mouse::leave", function(c)
+ c:get_children_by_id("icon")[1]:set_opacity(0.4)
+ c:get_children_by_id("icon")[1]:emit_signal('widget::redraw_needed')
+ end)
+
+ pause_unpause_button:buttons(
+ awful.util.table.join( awful.button({}, 1, function()
+ local command
+ if container:is_paused() then command = 'unpause' else command = 'pause' end
+
+ status_icon:set_opacity(0.2)
+ status_icon:emit_signal('widget::redraw_needed')
+
+ awful.spawn.easy_async('docker ' .. command .. ' ' .. container['name'], function(stdout, stderr)
+ if stderr ~= '' then show_warning(stderr) end
+ spawn.easy_async(LIST_CONTAINERS_CMD, function(stdout, stderr)
+ rebuild_widget(stdout, stderr) end)
+ end)
+ end) ) )
+ else
+ pause_unpause_button = nil
+ end
+
+
local row = wibox.widget {
{
{
@@ -154,15 +207,19 @@ local function worker(args)
},
{
{
- markup = '' .. container['name'] .. '',
- widget = wibox.widget.textbox
+ {
+ markup = '' .. container['name'] .. '',
+ widget = wibox.widget.textbox
+ },
+ {
+ text = container['how_long'],
+ widget = wibox.widget.textbox
+ },
+ forced_width = 180,
+ layout = wibox.layout.fixed.vertical
},
- {
- text = container['how_long'],
- widget = wibox.widget.textbox
- },
- forced_width = 180,
- layout = wibox.layout.fixed.vertical
+ valigh = 'center',
+ layout = wibox.container.place
},
{
{
@@ -170,7 +227,7 @@ local function worker(args)
pause_unpause_button,
layout = wibox.layout.align.horizontal
},
- forced_width = 40,
+ forced_width = 60,
valign = 'center',
haligh = 'center',
layout = wibox.container.place,
@@ -186,36 +243,6 @@ local function worker(args)
}
- start_stop_button:buttons(
- awful.util.table.join( awful.button({}, 1, function()
- local command
- if container:is_up() then command = 'stop' else command = 'start' end
-
- status_icon:set_opacity(0.2)
- status_icon:emit_signal('widget::redraw_needed')
-
- awful.spawn.easy_async('docker ' .. command .. ' ' .. container['name'], function(stdout, stderr)
- if stderr ~= '' then show_warning(stderr) return end
- spawn.easy_async([[bash -c "docker container ls -a --format '{{.Names}}::{{.ID}}::{{.Image}}::{{.Status}}'"]], function(stdout, stderr)
- rebuild_widget(stdout, stderr) end)
- end)
- end) ) )
-
- pause_unpause_button:buttons(
- awful.util.table.join( awful.button({}, 1, function()
- local command
- if container:is_paused() then command = 'unpause' else command = 'pause' end
-
- status_icon:set_opacity(0.2)
- status_icon:emit_signal('widget::redraw_needed')
-
- awful.spawn.easy_async('docker ' .. command .. ' ' .. container['name'], function(stdout, stderr)
- if stderr ~= '' then show_warning(stderr) return end
- spawn.easy_async([[bash -c "docker container ls -a --format '{{.Names}}::{{.ID}}::{{.Image}}::{{.Status}}'"]], function(stdout, stderr)
- rebuild_widget(stdout, stderr) end)
- end)
- end) ) )
-
row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end)
row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end)
@@ -231,8 +258,10 @@ local function worker(args)
if popup.visible then
popup.visible = not popup.visible
else
- spawn.easy_async([[bash -c "docker container ls -a --format '{{.Names}}::{{.ID}}::{{.Image}}::{{.Status}}'"]], function(stdout, stderr) rebuild_widget(stdout, stderr) end)
- popup:move_next_to(mouse.current_widget_geometry)
+ spawn.easy_async(LIST_CONTAINERS_CMD, function(stdout, stderr)
+ rebuild_widget(stdout, stderr)
+ popup:move_next_to(mouse.current_widget_geometry)
+ end)
end
end)
)
diff --git a/docker-widget/icons/play-btn.svg b/docker-widget/icons/play-btn.svg
index 455a61d..573ae7e 100644
--- a/docker-widget/icons/play-btn.svg
+++ b/docker-widget/icons/play-btn.svg
@@ -5,5 +5,5 @@
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
-
+
\ No newline at end of file
diff --git a/docker-widget/icons/play-btn.svg- b/docker-widget/icons/play-btn.svg-
new file mode 100644
index 0000000..455a61d
--- /dev/null
+++ b/docker-widget/icons/play-btn.svg-
@@ -0,0 +1,9 @@
+
\ No newline at end of file