add run shell

This commit is contained in:
streetturtle 2019-03-09 14:50:47 -05:00
parent 3bf894ad3b
commit f65a12034b
5 changed files with 170 additions and 0 deletions

34
run-shell-3/README.md Normal file
View File

@ -0,0 +1,34 @@
# Run Shell
Blurs / pixelates background and shows widget with run prompt:
![screenshot](./blur.png)
![screenshot](./pixelate.png)
## Installation
1. To blur / pixelate the background this widget used [ffmpeg](https://www.ffmpeg.org/) and [frei0r](https://frei0r.dyne.org/) plugins (if you want to pixelate the background), which you need to install. Installation of those depends on your distribution, for ffmpeg just follow the installation section of the site, for frei0r I was able to install it by simply running
```
sudo apt-get install frei0r-plugins
```
1. Clone this repo under **~/.config/awesome/**:
```bash
git clone https://github.com/streetturtle/awesome-wm-widgets.git ~/.config/awesome/
```
1. Require weather widget at the beginning of **rc.lua**:
```lua
local run_shell = require("awesome-wm-widgets.run_shell.run_shell")
```
1. Use it (don't forget to comment out the default prompt):
```lua
awful.key({modkey}, "r", function () run_shell.launch() end),
```
:warning: I am not 100% sure but it may (memory) leak. If awesome uses lots of RAM just reload config (Ctrl + Mod4 + r).

BIN
run-shell-3/blur.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

BIN
run-shell-3/pixelate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

134
run-shell-3/run-shell.lua Normal file
View File

@ -0,0 +1,134 @@
-------------------------------------------------
-- Run Shell for Awesome Window Manager
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/run-shell
-- @author Pavel Makhov
-- @copyright 2018 Pavel Makhov
-- @copyright 2019 Pavel Makhov
-------------------------------------------------
local capi = {
screen = screen,
client = client,
}
local awful = require("awful")
local gfs = require("gears.filesystem")
local wibox = require("wibox")
local gears = require("gears")
local naughty = require("naughty")
local completion = require("awful.completion")
local run_shell = awful.widget.prompt()
local widget = {}
function widget.new()
local widget_instance = {
_cached_wiboxes = {},
_cmd_pixelate = [[bash -c 'ffmpeg -loglevel panic -f x11grab -video_size 1920x1060 -y -i :0.0+%s,20 -vf frei0r=pixeliz0r -vframes 1 /tmp/i3lock-%s.png ; echo done']],
_cmd_blur = [[bash -c 'ffmpeg -loglevel panic -f x11grab -video_size 1920x1060 -y -i :0.0+%s,20 -filter_complex "boxblur=9" -vframes 1 /tmp/i3lock-%s.png ; echo done']]
}
function widget_instance:_create_wibox()
local w = wibox {
visible = false,
ontop = true,
height = 1060,
width = 1920
}
w:setup {
{
{
{
{
markup = '<span font="awesomewm-font 14" color="#ffffff">a</span>',
widget = wibox.widget.textbox,
},
id = 'icon',
left = 10,
layout = wibox.container.margin
},
{
run_shell,
left = 10,
layout = wibox.container.margin,
},
id = 'left',
layout = wibox.layout.fixed.horizontal
},
widget = wibox.container.background,
bg = '#333333',
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 3)
end,
shape_border_color = '#74aeab',
shape_border_width = 1,
forced_width = 200,
forced_height = 50
},
layout = wibox.container.place
}
return w
end
function widget_instance:launch(s, c)
c = c or capi.client.focus
s = mouse.screen
-- naughty.notify { text = 'screen ' .. s.index }
if not self._cached_wiboxes[s] then
self._cached_wiboxes[s] = {}
-- naughty.notify { text = 'nope' }
end
if not self._cached_wiboxes[s][1] then
self._cached_wiboxes[s][1] = self:_create_wibox()
-- naughty.notify { text = 'nope' }
end
local w = self._cached_wiboxes[s][1]
local rnd = math.random()
awful.spawn.with_line_callback(string.format(self._cmd_blur, tostring(awful.screen.focused().geometry.x), rnd), {
stdout = function(line)
w.visible = true
w.bgimage = '/tmp/i3lock-' .. rnd ..'.png'
awful.placement.top(w, { margins = { top = 20 }, parent = awful.screen.focused() })
awful.prompt.run {
prompt = 'Run: ',
bg_cursor = '#74aeab',
textbox = run_shell.widget,
completion_callback = completion.shell,
exe_callback = function(...)
run_shell:spawn_and_handle_error(...)
end,
history_path = gfs.get_cache_dir() .. "/history",
done_callback = function()
w.visible = false
w.bgimage = ''
awful.spawn([[bash -c 'rm -f /tmp/i3lock*']])
end
}
end,
stderr = function(line)
naughty.notify { text = "ERR:" .. line }
end,
})
end
return widget_instance
end
local function get_default_widget()
if not widget.default_widget then
widget.default_widget = widget.new()
end
return widget.default_widget
end
function widget.launch(...)
return get_default_widget():launch(...)
end
return widget

View File

@ -32,6 +32,8 @@ function widget.new()
ontop = true,
height = 1060,
width = 1920,
opacity = 0.6,
bg = '#000002'
}
w:setup {