Kristof Vandam 4 years ago
parent
commit
013508c4a3
  1. 11
      bindings/keys.lua
  2. 447
      helpers.lua
  3. 1
      lain
  4. BIN
      modules/.sidepanel.lua.swp
  5. 233
      modules/appdrawer.lua
  6. 22
      modules/dock.lua
  7. 102
      modules/notifications.lua
  8. 182
      modules/panel.lua
  9. 11
      modules/sidepanel.lua
  10. 43
      modules/thumbnail.lua
  11. 7
      preferences/layouts.lua
  12. 82
      preferences/rules.lua
  13. 73
      rc.lua
  14. 1
      revelation
  15. 3273
      themes/pixelos/assets.bck/mockup.svg
  16. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_blue_active.png
  17. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_blue_active_hover.png
  18. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_blue_inactive.png
  19. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_blue_inactive_hover.png
  20. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_red.png
  21. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_red_hover.png
  22. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_yellow.png
  23. BIN
      themes/pixelos/assets.bck/titlebar/buttons/button_yellow_hover.png
  24. BIN
      themes/pixelos/assets.bck/titlebar/titlebar_bottom.png
  25. BIN
      themes/pixelos/assets.bck/titlebar/titlebar_middle.png
  26. BIN
      themes/pixelos/assets.bck/titlebar/titlebar_top.png
  27. BIN
      themes/pixelos/assets.bck/wallpaper/wallpaper1.png
  28. BIN
      themes/pixelos/assets.bck/wallpaper/wallpaper2.jpg
  29. BIN
      themes/pixelos/assets.bck/wallpaper/wallpaper3.jpg
  30. BIN
      themes/pixelos/assets.bck/wallpaper/wallpaper4.jpg
  31. BIN
      themes/pixelos/assets.bck/widget/widget_pill_bottom_left.png
  32. BIN
      themes/pixelos/assets.bck/widget/widget_pill_bottom_right.png
  33. BIN
      themes/pixelos/assets.bck/widget/widget_pill_top_left.png
  34. BIN
      themes/pixelos/assets.bck/widget/widget_pill_top_right.png
  35. 1
      themes/pixelos/assets/titlebar/Readme.md
  36. BIN
      themes/pixelos/assets/titlebar/titlebar_bottom.png
  37. BIN
      themes/pixelos/assets/titlebar/titlebar_middle.png
  38. BIN
      themes/pixelos/assets/titlebar/titlebar_top.png
  39. BIN
      themes/pixelos/assets/wallpaper/wallpaper5.jpg
  40. 15
      themes/pixelos/init.lua
  41. 1
      vicious
  42. 3
      widgets/battery.lua
  43. 59
      widgets/clickable_container.lua
  44. 2
      widgets/date.lua
  45. 11
      widgets/net.lua

11
bindings/keys.lua

@ -1,6 +1,7 @@
local awful = require('awful')
local hotkeys_popup = require("awful.hotkeys_popup")
local menubar = require("menubar")
local revelation = require("revelation")
require("awful.hotkeys_popup.keys")
@ -30,6 +31,8 @@ awful.keyboard.append_global_keybindings({
{description = "lua execute prompt", group = "awesome"}),
awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end,
{description = "open a terminal", group = "launcher"}),
awful.key({ modkey, "Shift" }, "Return", function () awful.spawn(terminal .. " --class=floating_terminal") end,
{description = "open a terminal floating", group = "launcher"}),
awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end,
{description = "run prompt", group = "launcher"}),
awful.key({ modkey }, "p", function()
@ -45,6 +48,8 @@ awful.keyboard.append_global_keybindings({
{description = "view previous", group = "tag"}),
awful.key({ modkey, }, "Right", awful.tag.viewnext,
{description = "view next", group = "tag"}),
awful.key({ modkey, }, "e", revelation,
{description = "view exposé", group = "tag"}),
awful.key({ modkey, }, "Escape", awful.tag.history.restore,
{description = "go back", group = "tag"}),
})
@ -218,7 +223,7 @@ end)
client.connect_signal("request::default_keybindings", function()
awful.keyboard.append_client_keybindings({
awful.key({ modkey, }, "f",
awful.key({ modkey, "Shift" }, "f",
function (c)
c.fullscreen = not c.fullscreen
c:raise()
@ -226,11 +231,11 @@ client.connect_signal("request::default_keybindings", function()
{description = "toggle fullscreen", group = "client"}),
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
{description = "close", group = "client"}),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ,
awful.key({ modkey, }, "f", awful.client.floating.toggle ,
{description = "toggle floating", group = "client"}),
awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
{description = "move to master", group = "client"}),
awful.key({ modkey, }, "o", function (c) c:move_to_screen() end,
awful.key({ modkey, "Control", "Shift" }, "j", function (c) c:move_to_screen() end,
{description = "move to screen", group = "client"}),
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end,
{description = "toggle keep on top", group = "client"}),

447
helpers.lua

@ -0,0 +1,447 @@
-- Functions that you use more than once and in different files would
-- be nice to define here.
local awful = require("awful")
local gears = require("gears")
local beautiful = require("beautiful")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
local wibox = require("wibox")
local icons = require("icons")
local notifications = require("notifications")
local naughty = require("naughty")
local helpers = {}
-- Create rounded rectangle shape (in one line)
helpers.rrect = function(radius)
return function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, radius)
end
end
helpers.prrect = function(radius, tl, tr, br, bl)
return function(cr, width, height)
gears.shape.partially_rounded_rect(cr, width, height, tl, tr, br, bl, radius)
end
end
helpers.squircle = function(rate, delta)
return function(cr, width, height)
gears.shape.squircle(cr, width, height, rate, delta)
end
end
helpers.psquircle = function(rate, delta, tl, tr, br, bl)
return function(cr, width, height)
gears.shape.partial_squircle(cr, width, height, tl, tr, br, bl, rate, delta)
end
end
helpers.colorize_text = function(text, color)
return "<span foreground='"..color.."'>"..text.."</span>"
end
function helpers.client_menu_toggle()
local instance = nil
return function ()
if instance and instance.wibox.visible then
instance:hide()
instance = nil
else
instance = awful.menu.clients({ theme = { width = dpi(250) } })
end
end
end
-- Escapes a string so that it can be displayed inside pango markup
-- tags. Modified from:
-- https://github.com/kernelsauce/turbo/blob/master/turbo/escape.lua
function helpers.pango_escape(s)
return (string.gsub(s, "[&<>]", {
["&"] = "&amp;",
["<"] = "&lt;",
[">"] = "&gt;"
}))
end
function helpers.vertical_pad(height)
return wibox.widget{
forced_height = height,
layout = wibox.layout.fixed.vertical
}
end
function helpers.horizontal_pad(width)
return wibox.widget{
forced_width = width,
layout = wibox.layout.fixed.horizontal
}
end
local direction_translate = {
['up'] = 'top',
['down'] = 'bottom',
['left'] = 'left',
['right'] = 'right'
}
function helpers.move_to_edge(c, direction)
local old = c:geometry()
local new = awful.placement[direction_translate[direction]](c, {honor_padding = true, honor_workarea = true, margins = beautiful.useless_gap * 2, pretend = true})
if direction == "up" or direction == "down" then
c:geometry({ x = old.x, y = new.y })
else
c:geometry({ x = new.x, y = old.y })
end
end
local double_tap_timer = nil
function helpers.single_double_tap(single_tap_function, double_tap_function)
if double_tap_timer then
double_tap_timer:stop()
double_tap_timer = nil
double_tap_function()
-- naughty.notify({text = "We got a double tap"})
return
end
double_tap_timer =
gears.timer.start_new(0.20, function()
double_tap_timer = nil
-- naughty.notify({text = "We got a single tap"})
if single_tap_function then
single_tap_function()
end
return false
end)
end
-- Used as a custom command in rofi to move a window into the current tag
-- instead of following it.
-- Rofi has access to the X window id of the client.
function helpers.rofi_move_client_here(window)
local win = function (c)
return awful.rules.match(c, {window = window})
end
for c in awful.client.iterate(win) do
c.minimized = false
c:move_to_tag(mouse.screen.selected_tag)
client.focus = c
end
end
-- Add a hover cursor to a widget by changing the cursor on
-- mouse::enter and mouse::leave
-- You can find the names of the available cursors by opening any
-- cursor theme and looking in the "cursors folder"
-- For example: "hand1" is the cursor that appears when hovering over
-- links
function helpers.add_hover_cursor(w, hover_cursor)
local original_cursor = "left_ptr"
w:connect_signal("mouse::enter", function ()
local w = _G.mouse.current_wibox
if w then
w.cursor = hover_cursor
end
end)
w:connect_signal("mouse::leave", function ()
local w = _G.mouse.current_wibox
if w then
w.cursor = original_cursor
end
end)
end
-- Tag back and forth:
-- If you try to focus the tag you are already at, go back to the previous tag.
-- Useful for quick switching after for example checking an incoming chat
-- message at tag 2 and coming back to your work at tag 1 with the same
-- keypress.
function helpers.tag_back_and_forth(tag_index)
local s = mouse.screen
local tag = s.tags[tag_index]
if tag then
if tag == s.selected_tag then
awful.tag.history.restore()
else
tag:view_only()
end
end
end
-- Resize DWIM (Do What I Mean)
-- Resize client or factor
-- Constants --
local floating_resize_amount = dpi(20)
local tiling_resize_factor= 0.05
---------------
function helpers.resize_dwim(c, direction)
if c and c.floating then
if direction == "up" then
c:relative_move( 0, 0, 0, -floating_resize_amount)
elseif direction == "down" then
c:relative_move( 0, 0, 0, floating_resize_amount)
elseif direction == "left" then
c:relative_move( 0, 0, -floating_resize_amount, 0)
elseif direction == "right" then
c:relative_move( 0, 0, floating_resize_amount, 0)
end
elseif awful.layout.get(mouse.screen) ~= awful.layout.suit.floating then
if direction == "up" then
awful.client.incwfact(-tiling_resize_factor)
elseif direction == "down" then
awful.client.incwfact( tiling_resize_factor)
elseif direction == "left" then
awful.tag.incmwfact(-tiling_resize_factor)
elseif direction == "right" then
awful.tag.incmwfact( tiling_resize_factor)
end
end
end
-- Move client DWIM (Do What I Mean)
-- Move to edge if the client / layout is floating
-- Swap by index if maximized
-- Else swap client by direction
function helpers.move_client_dwim(c, direction)
if c.floating or (awful.layout.get(mouse.screen) == awful.layout.suit.floating) then
helpers.move_to_edge(c, direction)
elseif awful.layout.get(mouse.screen) == awful.layout.suit.max then
if direction == "up" or direction == "left" then
awful.client.swap.byidx(-1, c)
elseif direction == "down" or direction == "right" then
awful.client.swap.byidx(1, c)
end
else
awful.client.swap.bydirection(direction, c, nil)
end
end
-- Make client floating and snap to the desired edge
local axis_translate = {
['up'] = 'horizontally',
['down'] = 'horizontally',
['left'] = 'vertically',
['right'] = 'vertically'
}
function helpers.float_and_edge_snap(c, direction)
c.maximized = false
c.maximized_vertical = false
c.maximized_horizontal = false
c.floating = true
local f = awful.placement.scale
+ awful.placement[direction_translate[direction]]
+ awful.placement['maximize_'..axis_translate[direction]]
f(c, {honor_padding = true, honor_workarea=true, to_percent = 0.5, margins = beautiful.useless_gap * 2 })
end
-- Rounds a number to any number of decimals
function helpers.round(number, decimals)
local power = 10 ^ decimals
return math.floor(number * power) / power
end
function helpers.volume_control(step)
local cmd
if step == 0 then
cmd = "pactl set-sink-mute @DEFAULT_SINK@ toggle"
else
sign = step > 0 and "+" or ""
cmd = "pactl set-sink-mute @DEFAULT_SINK@ 0 && pactl set-sink-volume @DEFAULT_SINK@ "..sign..tostring(step).."%"
end
awful.spawn.with_shell(cmd)
end
function helpers.send_key(c, key)
awful.spawn.with_shell("xdotool key --window "..tostring(c.window).." "..key)
end
function helpers.send_key_sequence(c, seq)
awful.spawn.with_shell("xdotool type --delay 5 --window "..tostring(c.window).." "..seq)
end
function helpers.fake_escape()
root.fake_input('key_press', "Escape")
root.fake_input('key_release', "Escape")
end
local prompt_font = beautiful.prompt_font or "sans bold 8"
function helpers.prompt(action, textbox, prompt, callback)
if action == "run" then
awful.prompt.run {
prompt = prompt,
-- prompt = "<b>Run: </b>",
textbox = textbox,
font = prompt_font,
done_callback = callback,
exe_callback = awful.spawn,
completion_callback = awful.completion.shell,
history_path = awful.util.get_cache_dir() .. "/history"
}
elseif action == "web_search" then
awful.prompt.run {
prompt = prompt,
-- prompt = '<b>Web search: </b>',
textbox = textbox,
font = prompt_font,
history_path = awful.util.get_cache_dir() .. "/history_web",
done_callback = callback,
exe_callback = function(input)
if not input or #input == 0 then return end
awful.spawn.with_shell("noglob "..user.web_search_cmd.."'"..input.."'")
naughty.notify { title = "Searching the web for", text = input, icon = icons.image.firefox, urgency = "low" }
end
}
end
end
-- Given a `match` condition, returns an array with clients that match it, or
-- just the first found client if `first_only` is true
function helpers.find_clients(match, first_only)
local matcher = function (c)
return awful.rules.match(c, match)
end
if first_only then
for c in awful.client.iterate(matcher) do
return c
end
else
local clients = {}
for c in awful.client.iterate(matcher) do
table.insert(clients, c)
end
return clients
end
return nil
end
-- Given a `match` condition, calls the specified function `f_do` on all the
-- clients that match it
function helpers.find_clients_and_do(match, f_do)
local matcher = function (c)
return awful.rules.match(c, match)
end
for c in awful.client.iterate(matcher) do
f_do(c)
end
end
function helpers.run_or_raise(match, move, spawn_cmd, spawn_args)
local matcher = function (c)
return awful.rules.match(c, match)
end
-- Find and raise
local found = false
for c in awful.client.iterate(matcher) do
found = true
c.minimized = false
if move then
c:move_to_tag(mouse.screen.selected_tag)
client.focus = c
else
c:jump_to()
end
break
end
-- Spawn if not found
if not found then
awful.spawn(spawn_cmd, spawn_args)
end
end
-- Run raise or minimize a client (scratchpad style)
-- Depends on helpers.run_or_raise
-- If it not running, spawn it
-- If it is running, focus it
-- If it is focused, minimize it
function helpers.scratchpad(match, spawn_cmd, spawn_args)
local cf = client.focus
if cf and awful.rules.match(cf, match) then
cf.minimized = true
else
helpers.run_or_raise(match, true, spawn_cmd, spawn_args)
end
end
function helpers.float_and_resize(c, width, height)
c.maximized = false
c.width = width
c.height = height
awful.placement.centered(c,{honor_workarea=true, honor_padding = true})
awful.client.property.set(c, 'floating_geometry', c:geometry())
c.floating = true
c:raise()
end
-- Adds a maximized mask to a screen
function helpers.screen_mask(s, bg)
local mask = wibox({visible = false, ontop = true, type = "splash", screen = s})
awful.placement.maximize(mask)
mask.bg = bg
return mask
end
-- Useful for periodically checking the output of a command that
-- requires internet access.
-- Ensures that `command` will be run EXACTLY once during the desired
-- `interval`, even if awesome restarts multiple times during this time.
-- Saves output in `output_file` and checks its last modification
-- time to determine whether to run the command again or not.
-- Passes the output of `command` to `callback` function.
function helpers.remote_watch(command, interval, output_file, callback)
local run_the_thing = function()
-- Pass output to callback AND write it to file
awful.spawn.easy_async_with_shell(command.." | tee "..output_file, function(out) callback(out) end)
end
local timer
timer = gears.timer {
timeout = interval,
call_now = true,
autostart = true,
single_shot = false,
callback = function()
awful.spawn.easy_async_with_shell("date -r "..output_file.." +%s", function(last_update, _, __, exitcode)
-- Probably the file does not exist yet (first time
-- running after reboot)
if exitcode == 1 then
run_the_thing()
return
end
local diff = os.time() - tonumber(last_update)
if diff >= interval then
run_the_thing()
else
-- Pass the date saved in the file since it is fresh enough
awful.spawn.easy_async_with_shell("cat "..output_file, function(out) callback(out) end)
-- Schedule an update for when the remaining time to complete the interval passes
timer:stop()
gears.timer.start_new(interval - diff, function()
run_the_thing()
timer:again()
end)
end
end)
end
}
end
-- The directory of the currently executed lua script
-- Requires the `debug` library to be available in the build of Lua that is running
function helpers.this_dir()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
return helpers

1
lain

@ -0,0 +1 @@
Subproject commit 10076e1d69cabd9ac45b3576f06feafe1190d5e0

BIN
modules/.sidepanel.lua.swp

Binary file not shown.

233
modules/appdrawer.lua

@ -1,25 +1,208 @@
local awful = require('awful')
local wibox = require('wibox')
local gears = require('gears')
local timer = require("gears.timer")
local beautiful = require('beautiful')
local dpi = beautiful.xresources.apply_dpi
screen.connect_signal("appdrawer::open", function(s)
local drawer = wibox({
position = "left",
ontop = true,
stretch = false,
width = dpi(64),
height = s.workarea.height,
visible = true,
y = 48
})
drawer:setup {
expand = "none",
layout = wibox.layout.align.vertical,
}
end)
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local apps = require("apps")
-- local naughty = require("naughty")
local helpers = require("helpers")
-- Appearance
local button_size = beautiful.app_drawer_icon_size or dpi(100)
--
local keybinds = {}
-- Helper function that creates buttons given a text symbol, color, hover_color
-- and the command to run on click.
local function create_button(symbol, color, hover_color, cmd, key)
local icon = wibox.widget {
markup = helpers.colorize_text(symbol, color),
align = "center",
valign = "center",
font = "icomoon 50",
forced_width = dpi(180),
forced_height = dpi(200),
widget = wibox.widget.textbox
}
-- Press "animation"
icon:connect_signal("button::press", function(_, _, __, button)
if button == 3 then
icon.markup = helpers.colorize_text(symbol, hover_color.."55")
end
end)
icon:connect_signal("button::release", function ()
icon.markup = helpers.colorize_text(symbol, hover_color)
end)
-- Hover "animation"
icon:connect_signal("mouse::enter", function ()
icon.markup = helpers.colorize_text(symbol, hover_color)
end)
icon:connect_signal("mouse::leave", function ()
icon.markup = helpers.colorize_text(symbol, color)
end)
-- Change cursor on hover
helpers.add_hover_cursor(icon, "hand1")
-- Adds mousebinds if cmd is provided
if cmd then
icon:buttons(gears.table.join(
awful.button({ }, 1, function ()
cmd()
end),
awful.button({ }, 3, function ()
cmd()
end)
))
end
-- Add keybind to dict, if given
if key then
keybinds[key] = cmd
end
return icon
end
-- Create app buttons
local browser = create_button("", x.color3, x.color11, apps.browser, "w")
local discord = create_button("", x.color5, x.color13, apps.discord, "d")
local telegram = create_button("", x.color4, x.color12, apps.telegram, "t")
local mail = create_button("", x.color6, x.color14, apps.mail, "m")
local files = create_button("", x.color3, x.color11, apps.file_manager, "f")
local gimp = create_button("", x.color5, x.color13, apps.gimp, "g")
local youtube = create_button("", x.color1, x.color9, apps.youtube, "y")
local networks = create_button("", x.color3, x.color11, apps.networks, "n")
local passwords = create_button("", x.color1, x.color9, apps.passwords, "p")
local night_mode = create_button("", x.color1, x.color9, apps.night_mode, "x")
local record = create_button("", x.color4, x.color12, apps.record, "r")
local lutris = create_button("", x.color6, x.color14, apps.lutris, "l")
local steam = create_button("", x.color2, x.color10, apps.steam, "s")
local org = create_button("", x.color2, x.color10, apps.org, "o")
local compositor = create_button("", x.color5, x.color13, apps.compositor, "z")
local restart_awesome = create_button("", x.color4, x.color12)
restart_awesome:buttons(gears.table.join(
awful.button({ }, 1, awesome.restart)
))
-- Create the widget
app_drawer = wibox({visible = false, ontop = true, type = "dock"})
awful.placement.maximize(app_drawer)
app_drawer.bg = "#00000000"
-- app_drawer.bg = beautiful.app_drawer_bg or x.background or "#111111"
app_drawer.fg = beautiful.app_drawer_fg or x.foreground or "#FEFEFE"
-- Add app drawer or mask to each screen
for s in screen do
if s == screen.primary then
s.app_drawer = app_drawer
else
s.app_drawer = helpers.screen_mask(s, beautiful.lock_screen_bg or beautiful.exit_screen_bg or x.background)
end
end
local function set_visibility(v)
for s in screen do
s.app_drawer.visible = v
end
end
local app_drawer_grabber
function app_drawer_hide()
awful.keygrabber.stop(app_drawer_grabber)
set_visibility(false)
end
function app_drawer_show()
-- naughty.notify({text = "starting the keygrabber"})
app_drawer_grabber = awful.keygrabber.run(function(_, key, event)
local invalid_key = false
-- Debug
-- naughty.notify({ title = event, text = key })
-- if event == "press" and key == "Alt_L" or key == "Alt_R" then
-- naughty.notify({ title = "you pressed alt" })
-- end
-- if event == "release" and key == "Alt_L" or key == "Alt_R" then
-- naughty.notify({ title = "you released alt" })
-- end
if event == "release" then return end
if keybinds[key] then
keybinds[key]()
else
invalid_key = true
end
if not invalid_key or key == 'Escape' then
app_drawer_hide()
end
end)
set_visibility(true)
end
app_drawer:buttons(gears.table.join(
-- Left click - Hide app_drawer
awful.button({ }, 1, function ()
app_drawer_hide()
end),
-- Right click - Hide app_drawer
awful.button({ }, 2, function ()
app_drawer_hide()
end),
-- Middle click - Hide app_drawer
awful.button({ }, 2, function ()
app_drawer_hide()
end)
))
local function create_stripe(widgets, bg)
local buttons = wibox.widget {
-- spacing = dpi(20),
layout = wibox.layout.fixed.horizontal
}
for _, widget in ipairs(widgets) do
buttons:add(widget)
end
local stripe = wibox.widget {
{
nil,
{
nil,
buttons,
expand = "none",
layout = wibox.layout.align.horizontal
},
expand = "none",
layout = wibox.layout.align.vertical
},
bg = bg,
widget = wibox.container.background
}
return stripe
end
app_drawer:setup {
-- Background
{
-- Stripes
create_stripe({browser, youtube, discord, telegram}, "#00000000"),
create_stripe({mail, org, files, passwords}, x.color8.."20"),
create_stripe({gimp, record, lutris, steam}, x.color8.."40"),
create_stripe({networks, night_mode, compositor, restart_awesome}, x.color8.."60"),
layout = wibox.layout.flex.vertical
},
bg = x.background,
-- bg = x.background.."AA",
-- bg = "#00000000",
widget = wibox.container.background
}

22
modules/dock.lua

@ -16,26 +16,26 @@ local box = require("modules.dock.dockbox")
return wibox.widget {
{
nil,
nil,
{
nil,
nil,
{
browser,
fileexplorer,
terminal,
intellij,
browser,
fileexplorer,
terminal,
intellij,
gimp,
spotify,
spacing = dpi(8),
layout = wibox.layout.fixed.vertical
},
},
nil,
expand = "none",
layout = wibox.layout.align.vertical
},
nil,
expand = "none",
nil,
expand = "none",
layout = wibox.layout.align.horizontal
},
widget = wibox.container.background,
},
widget = wibox.container.background,
}

102
modules/notifications.lua

@ -0,0 +1,102 @@
local awful = require('awful')
local wibox = require('wibox')
local gears = require('gears')
local beautiful = require('beautiful')
local naughty = require('naughty')
local dpi = beautiful.xresources.apply_dpi
screen.connect_signal("request::desktop_decoration", function(s)
local panel_width = dpi(300)
local notify_center = wibox({
ontop = true,
stretch = false,
width = panel_width,
height = s.workarea.height,
visible = false,
y = beautiful.panel_height,
x = s.workarea.width - panel_width
})
notify_center:setup {
-- Add a button to dismiss all notifications, because why not.
{
{
text = 'Dismiss all',
align = 'center',
valign = 'center',
widget = wibox.widget.textbox
},
buttons = gears.table.join(
awful.button({ }, 1, function() naughty.destroy_all_notifications() end)
),
forced_width = 75,
shape = gears.shape.rounded_bar,
shape_border_width = 1,
shape_border_color = beautiful.bg_highlight,
widget = wibox.container.background
},
{
base_layout = wibox.widget {
spacing_widget = wibox.widget {
orientation = 'vertical',
span_ratio = 0.5,
widget = wibox.widget.separator,
},
forced_height = 30,
spacing = 3,
layout = wibox.layout.fixed.vertical
},
widget_template = {
{
naughty.widget.icon,
{
naughty.widget.title,
naughty.widget.message,
{
layout = wibox.widget {
-- Adding the wibox.widget allows to share a
-- single instance for all spacers.
spacing_widget = wibox.widget {
orientation = 'horizontal',
span_ratio = 0.9,
widget = wibox.widget.separator,
},
spacing = 3,
layout = wibox.layout.flex.horizontal
},
widget = naughty.list.widgets,
},
layout = wibox.layout.align.vertical
},
spacing = 10,
fill_space = true,
layout = wibox.layout.fixed.horizontal
},
margins = 5,
widget = wibox.container.margin
},
widget = naughty.list.notifications,
},
layout = wibox.layout.align.vertical
}
local notify_center_trigger = awful.wibar({
position = "right",
width = 1,
bg = "#00000000",
opacity = 0,
ontop = true,
visible = true
})
local notify_center_hide_timer = gears.timer({ timeout = 1})
notify_center_trigger:geometry({ width = 5, height = s.workarea.height })
notify_center_hide_timer:connect_signal("timeout", function() notify_center.visible = false; notify_center_hide_timer:stop() end )
notify_center_trigger:connect_signal("mouse::enter", function() notify_center.visible = true end)
notify_center:connect_signal("mouse::enter", function() if notify_center_hide_timer.started then notify_center_hide_timer:stop() end end)
notify_center:connect_signal("mouse::leave", function() notify_center_hide_timer:again() end)
end)

182
modules/panel.lua

@ -1,99 +1,113 @@
local awful = require('awful')
local wibox = require('wibox')
local gears = require('gears')
local awful = require('awful')
local wibox = require('wibox')
local gears = require('gears')
local beautiful = require('beautiful')
local lain = require('../lain')
local vicious = require("../vicious")
local battery = require('../widgets/battery')
--local volume = require('../widgets/volume')
local date = require('../widgets/date')
local bat = lain.widget.bat {
settings = function()
widget:set_markup("BAT " .. bat_now.perc .. "% ")
end
}
local sysload = lain.widget.sysload {
settings = function()
widget:set_markup("LOAD " .. load_1 .. ", " .. load_5 .. ", " .. load_15 .. " ")
end
}
require("../modules.widget")
local cpu = lain.widget.cpu {
settings = function()
widget:set_markup("CPU " .. cpu_now.usage .. "% ")
end
}
local mem = lain.widget.mem {
settings = function()
widget:set_markup("MEM " .. mem_now.perc .. "% ")
end
}
modkey = "Mod4"
local net = lain.widget.net {
settings = function()
widget:set_markup("NET " .. net_now.sent .. "B/" .. net_now.received .. "B ")
end
}
-- Keyboard map indicator and switcher
mykeyboardlayout = awful.widget.keyboardlayout()
modkey = "Mod4"
screen.connect_signal("request::desktop_decoration", function(s)
-- Each screen has its own tag table.
awful.tag({ "main", "term", "dev", "browse", "social", "misc" }, s, awful.layout.layouts[1])
-- Create a promptbox for each screen
s.mypromptbox = awful.widget.prompt()
-- Create the wibox
s.mywibox = awful.wibar({ position = "top" ,height = beautiful.panel_height, screen = s })
-- Create an imagebox widget which will contain an icon indicating which layout we're using.
-- We need one layoutbox per screen.
s.mylayoutbox = awful.widget.layoutbox {
screen = s,
buttons = {
awful.button({ }, 1, function () awful.layout.inc( 1) end),
awful.button({ }, 3, function () awful.layout.inc(-1) end),
awful.button({ }, 4, function () awful.layout.inc( 1) end),
awful.button({ }, 5, function () awful.layout.inc(-1) end),
}
}
-- Each screen has its own tag table.
awful.tag({ "main", "term", "dev", "browse", "social", "misc" }, s, awful.layout.layouts[1])
-- Create a taglist widget
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
widget_template = {
{
{
{
id = 'text_role',
widget = wibox.widget.textbox,
},
layout = wibox.layout.fixed.horizontal,
},
left = 18,
right = 18,
widget = wibox.container.margin
},
id = 'background_role',
widget = wibox.container.background,
-- Create a taglist widget
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
widget_template = {
{
{
{
id = 'text_role',
widget = wibox.widget.textbox,
},
layout = wibox.layout.fixed.horizontal,
},
buttons = {
awful.button({ }, 1, function(t) t:view_only() end),
awful.button({ modkey }, 1, function(t)
if client.focus then
client.focus:move_to_tag(t)
end
end),
awful.button({ }, 3, awful.tag.viewtoggle),
awful.button({ modkey }, 3, function(t)
if client.focus then
client.focus:toggle_tag(t)
end
end),
awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end),
}
left = 18,
right = 18,
widget = wibox.container.margin
},
id = 'background_role',
widget = wibox.container.background,
},
buttons = {
awful.button({ }, 1, function(t) t:view_only() end),
awful.button({ modkey }, 1, function(t)
if client.focus then
client.focus:move_to_tag(t)
end
end),
awful.button({ }, 3, awful.tag.viewtoggle),
awful.button({ modkey }, 3, function(t)
if client.focus then
client.focus:toggle_tag(t)
end
end),
awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end),
}
}
-- Create the wibox
s.mywibox = awful.wibar({ position = "top", height = 48, screen = s })
-- Add widgets to the wibox
s.mywibox.widget = {
layout = wibox.layout.align.horizontal,
{ -- Left widgets
layout = wibox.layout.fixed.horizontal,
mylauncher,
s.mytaglist,
s.mypromptbox
},
nil,
-- s.mytasklist, -- Middle widget
{ -- Right widgets
layout = wibox.layout.fixed.horizontal,
s.mylayoutbox,
-- mykeyboardlayout,
-- wibox.widget.systray(),
battery,
date,
},
}
-- Add widgets to the wibox
s.mywibox.widget = {
layout = wibox.layout.stack,
{
layout = wibox.layout.align.horizontal,
{ -- Left widgets
layout = wibox.layout.fixed.horizontal,
s.mytaglist,
},
nil,
{
layout = wibox.layout.fixed.horizontal,
cpu,
mem,
-- net,
bat,
-- sysload,
-- wibox.widget.systray(),
}
},
{ -- Right widgets
layout = wibox.container.place,
valign = "center",
halign = "center",
wibox.widget.textclock
},
}
end)

11
modules/sidepanel.lua

@ -5,8 +5,6 @@ local timer = require("gears.timer")
local beautiful = require('beautiful')
local dpi = beautiful.xresources.apply_dpi
local thumbnail = require('modules.thumbnail')
screen.connect_signal("request::desktop_decoration", function(s)
local entries = {
@ -35,7 +33,7 @@ screen.connect_signal("request::desktop_decoration", function(s)
width = dpi(64),
height = s.workarea.height,
visible = false,
y = 48
y = beautiful.panel_height
})
@ -173,7 +171,7 @@ dock:setup {
}
}
local dock_trigger = awful.wibox({
local dock_trigger = awful.wibar({
position = "left",
width = 1,
bg = "#00000000",
@ -182,11 +180,12 @@ local dock_trigger = awful.wibox({
visible = true
})
local dock_hide_timer = timer({ timeout = 1})
local dock_hide_timer = gears.timer({ timeout = 1})
dock_trigger:geometry({ width = 5, height = s.workarea.height })
dock_hide_timer:connect_signal("timeout", function() dock.visible = false; dock_hide_timer:stop() end )
dock_trigger:connect_signal("mouse::enter", function() dock.visible = true end)
dock:connect_signal("mouse::enter", function() if dock_hide_timer.started then dock_hide_timer:stop() end end)
dock:connect_signal("mouse::leave", function() dock_hide_timer:again() end)
end)
end)

43
modules/thumbnail.lua

@ -1,43 +0,0 @@
local wibox = require("wibox")
local surface = require("gears.surface")
local shape = require("gears.shape")
local module = {}
local function fit(self, context, width, height)
local size = math.min(width, height)
return size, size
end
local function set_client(self, c)
ret._private.client[1] = c
self:emit_signal("widget::redraw_needed")
end
local function draw(self, content, cr, width, height)
local c = self._private.client[1]
local s, geo = surface(c.content), c:geometry()
local scale = math.min(width/geo.width, height/geo.height)
local w, h = geo.width*scale, geo.height*scale
local dx, dy = (width-w)/2, (height-h)/2
cr:translate(dx, dy)
shape.rounded_rect(cr, w, h)
cr:clip()
cr:scale(scale, scale)
cr:set_source_surface(s)
cr:paint()
end
local function new(c)
local ret = wibox.widget.base.make_widget(nil, nil, {
enable_properties = true,
})
rawset(ret, "fit" , fit )
rawset(ret, "draw" , draw )
rawset(ret, "set_client", set_client)
ret._private.client = setmetatable({c}, {__mode="v"})
return ret
end
return setmetatable(module, {__call=function(_,...) return new(...) end})

7
preferences/layouts.lua

@ -1,9 +1,12 @@
local awful = require('awful')
local lain = require('../lain')
tag.connect_signal("request::default_layouts", function()
awful.layout.append_default_layouts({
awful.layout.suit.tile,
-- awful.layout.suit.floating,
awful.layout.suit.floating,
lain.layout.termfair,
lain.layout.centerwork,
-- awful.layout.suit.tile.left,
-- awful.layout.suit.tile.bottom,
-- awful.layout.suit.tile.top,
@ -16,4 +19,4 @@ tag.connect_signal("request::default_layouts", function()
awful.layout.suit.magnifier,
awful.layout.suit.corner.nw,
})
end)
end)

82
preferences/rules.lua

@ -0,0 +1,82 @@
local awful = require("awful")
local ruled = require("ruled")
ruled.client.connect_signal("request::rules", function()
-- All clients will match this rule.
ruled.client.append_rule {
id = "global",
rule = { },
properties = {
focus = awful.client.focus.filter,
raise = true,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap+awful.placement.no_offscreen
}
}
-- Floating terminal.
ruled.client.append_rule {
id = "floating_terminal",
rule_any = {
instance = { "floating_terminal" },
},
properties = {
floating = true,
height = 960,
width = 1280,
placement = awful.placement.centered
}
}
-- Floating clients.
ruled.client.append_rule {
id = "floating",
rule_any = {
instance = { "copyq", "pinentry" },
class = {
"Arandr", "Blueman-manager", "Gpick", "Kruler", "Sxiv",
"Tor Browser", "Wpa_gui", "veromix", "xtightvncviewer"
},
-- Note that the name property shown in xprop might be set slightly after creation of the client
-- and the name shown there might not match defined rules here.
name = {
"Event Tester", "Qalculate!" -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"ConfigManager", -- Thunderbird's about:config.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
}
},
properties = {
floating = true,
placement = awful.placement.centered
}
}
-- Add titlebars to normal clients and dialogs
ruled.client.append_rule {
id = "titlebars",
rule_any = { type = { "normal", "dialog" } },
properties = { titlebars_enabled = true }
}
ruled.client.append_rule {
rule = { class = "Plank" },
properties = {
border_width = 0,
floating = true,
sticky = true,
ontop = true,
focusable = false,
below = true
}
}
-- Set Firefox to always map on the tag named "2" on screen 1.
-- ruled.client.append_rule {
-- rule = { class = "Firefox" },
-- properties = { screen = 1, tag = "2" }
-- }
end)
-- }}}

73
rc.lua

@ -3,19 +3,24 @@ pcall(require, "luarocks.loader")
local gears = require('gears')
local awful = require('awful')
local beautiful = require('beautiful')
local revelation = require('revelation')
awful.screen.set_auto_dpi_enabled(true)
beautiful.init(require('theme'))
revelation.init()
require('awful.autofocus')
require('preferences.apps')
require('preferences.layouts')
require('preferences.rules')
require('modules.client')
require('modules.titlebar')
require('modules.panel')
require('modules.sidepanel')
--require('modules.dock')
-- require('modules.sidepanel')
-- require('modules.notifications')
-- require('modules.dock')
-- require('modules.appdrawer')
require('bindings.keys')
@ -111,70 +116,6 @@ awful.mouse.append_global_mousebindings({
-- {{{ Rules
-- Rules to apply to new clients.
ruled.client.connect_signal("request::rules", function()
-- All clients will match this rule.
ruled.client.append_rule {
id = "global",
rule = { },
properties = {
focus = awful.client.focus.filter,
raise = true,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap+awful.placement.no_offscreen
}
}
-- Floating clients.
ruled.client.append_rule {
id = "floating",
rule_any = {
instance = { "copyq", "pinentry" },
class = {
"Arandr", "Blueman-manager", "Gpick", "Kruler", "Sxiv",
"Tor Browser", "Wpa_gui", "veromix", "xtightvncviewer"
},
-- Note that the name property shown in xprop might be set slightly after creation of the client
-- and the name shown there might not match defined rules here.
name = {
"Event Tester", -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"ConfigManager", -- Thunderbird's about:config.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
}
},
properties = { floating = true }
}
-- Add titlebars to normal clients and dialogs
ruled.client.append_rule {
id = "titlebars",
rule_any = { type = { "normal", "dialog" } },
properties = { titlebars_enabled = true }
}
ruled.client.append_rule {
rule = { class = "Plank" },
properties = {
border_width = 0,
floating = true,
sticky = true,
ontop = true,
focusable = false,
below = true
}
}
-- Set Firefox to always map on the tag named "2" on screen 1.
-- ruled.client.append_rule {
-- rule = { class = "Firefox" },
-- properties = { screen = 1, tag = "2" }
-- }
end)
-- }}}
-- {{{ Notifications

1
revelation

@ -0,0 +1 @@
Subproject commit d8b58e3776ec0ace45b5bc1160e322b69fa16d6f

3273
themes/pixelos/assets.bck/mockup.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 235 KiB

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_blue_active.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_blue_active_hover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_blue_inactive.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_blue_inactive_hover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_red.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_red_hover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_yellow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

BIN
themes/pixelos/assets.bck/titlebar/buttons/button_yellow_hover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

BIN
themes/pixelos/assets.bck/titlebar/titlebar_bottom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

BIN
themes/pixelos/assets.bck/titlebar/titlebar_middle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

BIN
themes/pixelos/assets.bck/titlebar/titlebar_top.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

BIN
themes/pixelos/assets.bck/wallpaper/wallpaper1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
themes/pixelos/assets.bck/wallpaper/wallpaper2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

BIN
themes/pixelos/assets.bck/wallpaper/wallpaper3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

BIN
themes/pixelos/assets.bck/wallpaper/wallpaper4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
themes/pixelos/assets.bck/widget/widget_pill_bottom_left.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

BIN
themes/pixelos/assets.bck/widget/widget_pill_bottom_right.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

BIN
themes/pixelos/assets.bck/widget/widget_pill_top_left.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

BIN
themes/pixelos/assets.bck/widget/widget_pill_top_right.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

1
themes/pixelos/assets/titlebar/Readme.md

@ -0,0 +1 @@
convert *.png -scale 75% -set filename:f '%t' '%[filename:f].png'

BIN
themes/pixelos/assets/titlebar/titlebar_bottom.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 407 B

BIN
themes/pixelos/assets/titlebar/titlebar_middle.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 369 B

BIN
themes/pixelos/assets/titlebar/titlebar_top.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

After

Width:  |  Height:  |  Size: 402 B

BIN
themes/pixelos/assets/wallpaper/wallpaper5.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

15
themes/pixelos/init.lua

@ -12,12 +12,12 @@ theme.icon_theme = 'Papirus-Dark'
-- Font
-- theme.font = 'ProggyCleanTTCE Nerd Font Mono 12'
theme.font = 'VictorMono Nerd Font Mono 10'
-- theme.font = 'Iosevka Nerd Font Mono 10'
-- theme.font = 'VictorMono Nerd Font Mono 10'
theme.font = 'Iosevka Nerd Font Mono 10'
-- Misc
-- -- Wallpaper Image
theme.wallpaper = assets .. 'wallpaper/wallpaper4.jpg'
theme.wallpaper = assets .. 'wallpaper/wallpaper5.jpg'
-- -- Solid Color
gears.wallpaper.set("#20BEC6")
@ -46,6 +46,9 @@ theme.notification_border_width = 0
theme.notification_border_color = "#FFFFFFFF"
theme.notification_shape = gears.shape.rounded_rect
-- Panel
theme.panel_height = 38
-- Menu
theme.menu_height = 40
theme.menu_bg_focus = theme.background
@ -53,9 +56,9 @@ theme.menu_bg_normal = theme.background
-- Taglist
theme.taglist_bg_empty = theme.background .. '00'
theme.taglist_bg_occupied = '#2a2a2a' .. 'ff'
theme.taglist_bg_occupied = '#ffffff' .. '11'
theme.taglist_bg_urgent = '#E91E63' .. '99'
theme.taglist_bg_focus = '#3a3a3a'
theme.taglist_bg_focus = '#ffffff' .. '22'
theme.taglist_spacing = dpi(0)
theme.apps_slack = assets .. 'titlebar/buttons/button_red.png'
@ -91,11 +94,11 @@ theme.titlebar_image_bottom = assets .. 'titlebar/titlebar_bottom.png'
theme.titlebar_bgimage_normal = theme.titlebar_middle
-- Titlebar Buttons
theme.titlebar_button_spacing = dpi(2.5)
theme.titlebar_button_margin_left = dpi(2.5)
theme.titlebar_button_margin_right = dpi(3)
theme.titlebar_button_margin_top = dpi(3)
theme.titlebar_button_margin_bottom = dpi(3)
theme.titlebar_button_spacing = dpi(2.5)
theme.titlebar_button_close = assets .. 'titlebar/buttons/button_red.png'
theme.titlebar_button_close_hover = assets .. 'titlebar/buttons/button_red_hover.png'

1
vicious

@ -1 +0,0 @@
Subproject commit eada06667d78f58209f50cc5aa3bdd4dde32f0d9

3
widgets/battery.lua

@ -1,4 +1,3 @@
local vicious = require("../vicious")
local wibox = require("wibox")
local gears = require("gears")
require("../modules.widget")
@ -31,4 +30,4 @@ vicious.register(textbox, vicious.widgets.bat, "$2%", 61, "BAT0")
return battery
return battery

59
widgets/clickable_container.lua

@ -0,0 +1,59 @@
local wibox = require('wibox')
local beautiful = require('beautiful')
local create_click_events = function(widget)
local container = wibox.widget {
widget,
widget = wibox.container.background
}
-- Old and new widget
local old_cursor, old_wibox
-- Mouse hovers on the widget
container:connect_signal(
'mouse::enter',
function()
container.bg = beautiful.groups_bg
-- Hm, no idea how to get the wibox from this signal's arguments...
local w = mouse.current_wibox
if w then
old_cursor, old_wibox = w.cursor, w
w.cursor = 'hand1'
end
end
)
-- Mouse leaves the widget
container:connect_signal(
'mouse::leave',
function()
container.bg = beautiful.leave_event
if old_wibox then
old_wibox.cursor = old_cursor
old_wibox = nil
end
end
)
-- Mouse pressed the widget
container:connect_signal(
'button::press',
function()
container.bg = beautiful.press_event
end
)
-- Mouse releases the widget
container:connect_signal(
'button::release',
function()
container.bg = beautiful.release_event
end
)
return container
end
return create_click_events

2
widgets/date.lua

@ -8,4 +8,4 @@ date = pill(textbox, "#2D2D2D")
vicious.register(textbox, vicious.widgets.date, "%b %d, %R")
return date
return date

11
widgets/net.lua

@ -0,0 +1,11 @@
local wibox = require('wibox')
local vicious = require('../vicious')
require("../modules.widget")
textbox = wibox.widget.textbox()
date = pill(textbox, "#2D2D2D")
vicious.register(textbox, vicious.widgets.date, "%b %d, %R")
return date
Loading…
Cancel
Save