Compare commits

...

10 Commits

Author SHA1 Message Date
0e0acc03d6 Update script names
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
2023-10-03 14:44:07 +01:00
e0d4998f0a Update dotfiles
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
2023-02-01 16:54:47 +02:00
a5b6ceef2a Update dotfiles 2022-09-12 14:16:43 +03:00
215db2fc03 Cleanup home, add wallpapers, add templates 2022-05-14 13:48:10 +01:00
710ecbcfc7 Update Picom opacities 2022-04-17 12:01:39 +03:00
82a80a5997 Colors and misc changes 2022-04-15 19:49:41 +03:00
cee82b5305 Add emoji picker configs 2022-04-14 01:18:53 +03:00
0da0d833dc Update README 2022-04-14 00:47:07 +03:00
9136f7ef3d Big changes 2022-04-14 00:35:06 +03:00
5b218de55a Change window rules 2022-03-27 16:08:12 +01:00
120 changed files with 2246 additions and 855 deletions

View File

@@ -1,15 +1,15 @@
# Configuration for Alacritty, the GPU enhanced terminal emulator. # Configuration for Alacritty, the GPU enhanced terminal emulator.
background_opacity: 0.95
window: window:
opacity: 0.85
padding: padding:
x: 8 x: 8
y: 8 y: 8
font: font:
family: "MesloLGS NF"
size: 12 size: 12
normal:
family: "MesloLGS NF"
key_bindings: key_bindings:
- { key: N, mods: Control|Shift, action: SpawnNewInstance } - { key: N, mods: Control|Shift, action: SpawnNewInstance }
@@ -38,7 +38,7 @@ colors:
green: "#1fe0a7" green: "#1fe0a7"
yellow: "#ffb731" yellow: "#ffb731"
blue: "#33aefe" blue: "#33aefe"
magenta: "#b567f9" magenta: "#b054ff"
cyan: "#2acafc" cyan: "#2acafc"
white: "#b3b6bd" white: "#b3b6bd"
bright: bright:
@@ -46,7 +46,7 @@ colors:
red: "#f765a4" red: "#f765a4"
green: "#29edbf" green: "#29edbf"
yellow: "#fec458" yellow: "#fec458"
blue: "#33aefe" blue: "#34c2f9"
magenta: "#b567f9" magenta: "#b567f9"
cyan: "#2be3fd" cyan: "#2be3fd"
white: "#ecf2f2" white: "#ecf2f2"

View File

@@ -1,18 +1,17 @@
local gears = require("gears") local gears = require("gears")
local awful = require("awful") local awful = require("awful")
local hotkeys_popup = require("awful.hotkeys_popup") -- local hotkeys_popup = require("awful.hotkeys_popup")
require "bindings.mod" require "config"
require "config.apps"
globalkeys = globalkeys =
gears.table.join( gears.table.join(
awful.key( -- awful.key(
{modkey}, -- {modkey},
"s", -- "s",
hotkeys_popup.show_help, -- hotkeys_popup.show_help,
{description = "show help", group = "awesome"} -- {description = "show help", group = "awesome"}
), -- ),
awful.key( awful.key(
{modkey, "Control"}, {modkey, "Control"},
"r", "r",
@@ -76,7 +75,7 @@ globalkeys =
{}, {},
"XF86MonBrightnessUp", "XF86MonBrightnessUp",
function() function()
awful.spawn("brightness_up", false) awful.spawn("brightness-up", false)
end, end,
{description = "brightness +5%", group = "hotkeys"} {description = "brightness +5%", group = "hotkeys"}
), ),
@@ -84,7 +83,7 @@ globalkeys =
{}, {},
"XF86MonBrightnessDown", "XF86MonBrightnessDown",
function() function()
awful.spawn("brightness_down", false) awful.spawn("brightness-down", false)
end, end,
{description = "brightness -5%", group = "hotkeys"} {description = "brightness -5%", group = "hotkeys"}
), ),
@@ -92,7 +91,7 @@ globalkeys =
{}, {},
"XF86AudioRaiseVolume", "XF86AudioRaiseVolume",
function() function()
awful.spawn("amixer set Master 2%+", false) awful.spawn("pactl set-sink-volume @DEFAULT_SINK@ +2%", false)
end, end,
{description = "volume +2%", group = "hotkeys"} {description = "volume +2%", group = "hotkeys"}
), ),
@@ -100,7 +99,7 @@ globalkeys =
{}, {},
"XF86AudioLowerVolume", "XF86AudioLowerVolume",
function() function()
awful.spawn("amixer set Master 2%-", false) awful.spawn("pactl set-sink-volume @DEFAULT_SINK@ -2%", false)
end, end,
{description = "volume -2%", group = "hotkeys"} {description = "volume -2%", group = "hotkeys"}
), ),
@@ -172,7 +171,7 @@ globalkeys =
{modkey, "Control"}, {modkey, "Control"},
"p", "p",
function() function()
awful.spawn.with_shell("power_saving_mode", false) awful.spawn.with_shell("power-saving-mode", false)
end, end,
{description = "toggle power saving mode", group = "hotkeys"} {description = "toggle power saving mode", group = "hotkeys"}
), ),
@@ -180,7 +179,7 @@ globalkeys =
{modkey, "Control"}, {modkey, "Control"},
"t", "t",
function() function()
awful.spawn("/home/nick/.config/awesome/scripts/switch_theme.sh", false) awful.spawn("/home/nick/.config/awesome/scripts/switch-theme.sh", false)
end, end,
{description = "switch theme", group = "hotkeys"} {description = "switch theme", group = "hotkeys"}
), ),
@@ -297,6 +296,22 @@ globalkeys =
"Escape", "Escape",
awful.tag.history.restore, awful.tag.history.restore,
{description = "go back", group = "tag"} {description = "go back", group = "tag"}
),
awful.key(
{modkey, "Shift"},
";",
function()
awful.spawn("/usr/bin/emoji-picker")
end,
{description = "emoji picker", group = "launcher"}
),
awful.key(
{modkey, "Control"},
"w",
function()
toggle_window_buffers(awful.screen.focused())
end,
{description = "set workarea height to 200", group = "screen"}
) )
) )

View File

@@ -1,2 +1,4 @@
modkey = "Mod4"
require "bindings.global" require "bindings.global"
require "bindings.client" require "bindings.client"

View File

@@ -1 +0,0 @@
modkey = "Mod4"

View File

@@ -1,3 +0,0 @@
terminal = "alacritty"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor

View File

@@ -1 +1,3 @@
require "config.apps" terminal = "alacritty"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor

View File

@@ -0,0 +1,63 @@
package = "bling"
version = "dev-1"
source = {
url = "git://github.com/BlingCorp/bling",
branch = "master",
}
description = {
summary = "Utilities for the AwesomeWM",
detailed = [[
This module extends the Awesome window manager with alternative layouts,
flash focus, tabbing, a simple tiling wallpaper generator, a declarative
wallpaper setter, window swallowing and a playerctl signal.
]],
homepage = "https://github.com/BlingCorp/bling",
license = "MIT",
}
dependencies = {
"lua >= 5.1",
}
build = {
type = "builtin",
modules = {
["bling"] = "init.lua",
["bling.helpers"] = "helpers/init.lua",
["bling.helpers.client"] = "helpers/client.lua",
["bling.helpers.color"] = "helpers/color.lua",
["bling.helpers.filesystem"] = "helpers/filesystem.lua",
["bling.helpers.shape"] = "helpers/shape.lua",
["bling.helpers.time"] = "helpers/time.lua",
["bling.layout"] = "layout/init.lua",
["bling.layout.centered"] = "layout/centered.lua",
["bling.layout.deck"] = "layout/deck.lua",
["bling.layout.equalarea"] = "layout/equalarea.lua",
["bling.layout.horizontal"] = "layout/horizontal.lua",
["bling.layout.mstab"] = "layout/mstab.lua",
["bling.layout.vertical"] = "layout/vertical.lua",
["bling.module"] = "module/init.lua",
["bling.module.flash_focus"] = "module/flash_focus.lua",
["bling.module.scratchpad"] = "module/scratchpad.lua",
["bling.module.tabbed"] = "module/tabbed.lua",
["bling.module.tiled_wallpaper"] = "module/tiled_wallpaper.lua",
["bling.module.wallpaper"] = "module/wallpaper.lua",
["bling.module.window_swallowing"] = "module/window_swallowing.lua",
["bling.signal"] = "signal/init.lua",
["bling.signal.playerctl"] = "signal/playerctl/init.lua",
["bling.signal.playerctl.playerctl_cli"] = "signal/playerctl/playerctl_cli.lua",
["bling.signal.playerctl.playerctl_lib"] = "signal/playerctl/playerctl_lib.lua",
["bling.widget"] = "widget/init.lua",
["bling.widget.tabbar.boxes"] = "widget/tabbar/boxes.lua",
["bling.widget.tabbar.default"] = "widget/tabbar/default.lua",
["bling.widget.tabbar.modern"] = "widget/tabbar/modern.lua",
["bling.widget.tabbed_misc"] = "widget/tabbed_misc/init.lua",
["bling.widget.tabbed_misc.custom_tasklist"] = "widget/tabbed_misc/custom_tasklist.lua",
["bling.widget.tabbed_misc.titlebar_indicator"] = "widget/tabbed_misc/titlebar_indicator.lua",
["bling.widget.tag_preview"] = "widget/tag_preview.lua",
["bling.widget.task_preview"] = "widget/task_preview.lua",
["bling.widget.window_switcher"] = "widget/window_switcher.lua",
},
}

View File

@@ -1,4 +1,6 @@
local Gio = require("lgi").Gio local Gio = require("lgi").Gio
local awful = require("awful")
local string = string
local _filesystem = {} local _filesystem = {}
@@ -50,4 +52,11 @@ function _filesystem.list_directory_files(path, exts, recursive)
return files return files
end end
function _filesystem.save_image_async_curl(url, filepath, callback)
awful.spawn.with_line_callback(string.format("curl -L -s %s -o %s", url, filepath),
{
exit=callback
})
end
return _filesystem return _filesystem

View File

@@ -1,7 +1,11 @@
--[[
Bling
Layouts, widgets and utilities for Awesome WM
--]]
return { return {
layout = require(... .. ".layout"), layout = require(... .. ".layout"),
--module = require(... .. ".module"), module = require(... .. ".module"),
--helpers = require(... .. ".helpers"), helpers = require(... .. ".helpers"),
--signal = require(... .. ".signal"), signal = require(... .. ".signal"),
--widget = require(... .. ".widget"), widget = require(... .. ".widget"),
} }

View File

@@ -8,37 +8,27 @@ mylayout.name = "centered"
function mylayout.arrange(p) function mylayout.arrange(p)
local area = p.workarea local area = p.workarea
local t = p.tag or screen[p.screen].selected_tag local t = p.tag or screen[p.screen].selected_tag
local mwfact = t.master_width_factor
local nmaster = math.min(t.master_count, #p.clients) local nmaster = math.min(t.master_count, #p.clients)
local nslaves = #p.clients - nmaster local nslaves = #p.clients - nmaster
local master_area_width = area.width * mwfact local master_area_width = area.width * t.master_width_factor
local slave_area_width = area.width - master_area_width if t.master_count == 0 then master_area_width = 0 end
local master_area_x = area.x + 0.5 * slave_area_width local slave_width = 0.5 * (area.width - master_area_width)
local master_area_x = area.x + slave_width
local number_of_left_sided_slaves = math.floor(nslaves / 2)
local number_of_right_sided_slaves = nslaves - number_of_left_sided_slaves
local left_iterator = 0
local right_iterator = 0
-- Special case: no maters -> rrelapse into awesomes fair layout -- Special case: few slaves -> make masters take more space - unless requested otherwise!
if t.master_count == 0 then if nslaves < 2 and t.master_fill_policy ~= "master_width_factor" then
awful.layout.suit.fair.arrange(p)
return
end
-- Special case: one slave -> relapse into awesomes masterstack tile layout
if nslaves == 1 then
awful.layout.suit.tile.right.arrange(p)
return
end
-- Special case: no slaves -> fullscreen master area
if nslaves < 1 then
master_area_width = area.width
master_area_x = area.x master_area_x = area.x
if nslaves == 1 then
slave_width = area.width - master_area_width
else
master_area_width = area.width
end
end end
-- iterate through masters -- iterate through masters
for idx = 1, nmaster do for idx = 1, nmaster do
local c = p.clients[idx] local c = p.clients[idx]
@@ -52,8 +42,14 @@ function mylayout.arrange(p)
p.geometries[c] = g p.geometries[c] = g
end end
-- iterate through slaves -- iterate through slaves
for idx = 1, nslaves do -- idx=nmaster+1,#p.clients do local number_of_left_sided_slaves = math.floor(nslaves / 2)
local number_of_right_sided_slaves = nslaves - number_of_left_sided_slaves
local left_iterator = 0
local right_iterator = 0
for idx = 1, nslaves do
local c = p.clients[idx + nmaster] local c = p.clients[idx + nmaster]
local g local g
if idx % 2 == 0 then if idx % 2 == 0 then
@@ -62,17 +58,17 @@ function mylayout.arrange(p)
y = area.y y = area.y
+ left_iterator + left_iterator
* (area.height / number_of_left_sided_slaves), * (area.height / number_of_left_sided_slaves),
width = slave_area_width / 2, width = slave_width,
height = area.height / number_of_left_sided_slaves, height = area.height / number_of_left_sided_slaves,
} }
left_iterator = left_iterator + 1 left_iterator = left_iterator + 1
else else
g = { g = {
x = area.x + master_area_width + slave_area_width / 2, x = master_area_x + master_area_width,
y = area.y y = area.y
+ right_iterator + right_iterator
* (area.height / number_of_right_sided_slaves), * (area.height / number_of_right_sided_slaves),
width = slave_area_width / 2, width = slave_width,
height = area.height / number_of_right_sided_slaves, height = area.height / number_of_right_sided_slaves,
} }
right_iterator = right_iterator + 1 right_iterator = right_iterator + 1

View File

@@ -20,7 +20,7 @@ end
local function get_icon(icon_raw) local function get_icon(icon_raw)
if icon_raw ~= nil then if icon_raw ~= nil then
return gears.color.recolor_image(icon_raw, "#e6e6e6") return gears.color.recolor_image(icon_raw, beautiful.fg_focus)
else else
return nil return nil
end end

View File

@@ -5,7 +5,7 @@ local op = beautiful.flash_focus_start_opacity or 0.6
local stp = beautiful.flash_focus_step or 0.01 local stp = beautiful.flash_focus_step or 0.01
local flashfocus = function(c) local flashfocus = function(c)
if c then if c and #c.screen.clients > 1 then
c.opacity = op c.opacity = op
local q = op local q = op
local g = gears.timer({ local g = gears.timer({

View File

@@ -293,10 +293,10 @@ function Scratchpad:turn_on()
animate_turn_on(self, anim_y, "y") animate_turn_on(self, anim_y, "y")
end end
self:emit_signal("inital_apply", c1) self:emit_signal("inital_apply", c1)
self.client.disconnect_signal("manage", inital_apply) client.disconnect_signal("manage", inital_apply)
end end
end end
self.client.connect_signal("manage", inital_apply) client.connect_signal("manage", inital_apply)
end end
end end
end end

View File

@@ -53,36 +53,37 @@ function apply(wallpaper_object, args)
args.offset = args.offset or { x = 0, y = 0 } args.offset = args.offset or { x = 0, y = 0 }
args.scale = args.scale or 1 args.scale = args.scale or 1
local positions = { local positions = {
["centered"] = function() ["centered"] = function(s)
gears.wallpaper.centered( gears.wallpaper.centered(
wallpaper_object, wallpaper_object,
args.screen, s,
args.background, args.background,
args.scale args.scale
) )
end, end,
["tiled"] = function() ["tiled"] = function(s)
gears.wallpaper.tiled(wallpaper_object, args.screen, args.offset) gears.wallpaper.tiled(wallpaper_object, s, args.offset)
end, end,
["maximized"] = function() ["maximized"] = function(s)
gears.wallpaper.maximized( gears.wallpaper.maximized(
wallpaper_object, wallpaper_object,
args.screen, s,
args.ignore_aspect, args.ignore_aspect,
args.offset args.offset
) )
end, end,
["fit"] = function() ["fit"] = function(s)
gears.wallpaper.fit(wallpaper_object, args.screen, args.background) gears.wallpaper.fit(wallpaper_object, s, args.background)
end, end,
} }
local call_func = nil
if if
type(wallpaper_object) == "string" type(wallpaper_object) == "string"
and gears.filesystem.file_readable(wallpaper_object) and gears.filesystem.file_readable(wallpaper_object)
then then
-- path of an image file, we use a position function -- path of an image file, we use a position function
local p = args.position or "centered" local p = args.position or "centered"
positions[p]() call_func = positions[p]
elseif type(wallpaper_object) == "function" then elseif type(wallpaper_object) == "function" then
-- function -- function
wallpaper_object(args) wallpaper_object(args)
@@ -91,10 +92,13 @@ function apply(wallpaper_object, args)
and args.position and args.position
then then
-- if the user sets a position function, wallpaper_object should be a cairo surface -- if the user sets a position function, wallpaper_object should be a cairo surface
positions[args.position]() call_func = positions[args.position]
else else
gears.wallpaper.set(wallpaper_object) gears.wallpaper.set(wallpaper_object)
end end
if call_func then
call_func(args.screen)
end
end end
--- Converts `args.wallpaper` to a list of `wallpaper_objects` readable by `apply` function). --- Converts `args.wallpaper` to a list of `wallpaper_objects` readable by `apply` function).
@@ -154,7 +158,15 @@ local simple_index = 0
function setters.simple(args) function setters.simple(args)
local wallpapers = prepare_list(args) local wallpapers = prepare_list(args)
simple_index = (simple_index % #wallpapers) + 1 simple_index = (simple_index % #wallpapers) + 1
apply(wallpapers[simple_index], args) if type(args.screen) == 'table' then
for _,v in ipairs(args.screen) do
args.screen = v
apply(wallpapers[simple_index], args)
args.screen = nil
end
else
apply(wallpapers[simple_index], args)
end
end end
--- Set a random wallpaper from a list. --- Set a random wallpaper from a list.
@@ -164,7 +176,15 @@ end
-- @see prepare_list -- @see prepare_list
function setters.random(args) function setters.random(args)
local wallpapers = prepare_list(args) local wallpapers = prepare_list(args)
apply(wallpapers[math.random(#wallpapers)], args) if type(args.screen) == 'table' then
for _,v in ipairs(args.screen) do
args.screen = v
apply(wallpapers[math.random(#wallpapers)], args)
args.screen = nil
end
else
apply(wallpapers[math.random(#wallpapers)], args)
end
end end
local simple_schedule_object = nil local simple_schedule_object = nil
@@ -310,7 +330,10 @@ function setup(args)
config.set_function = config.set_function config.set_function = config.set_function
or (config.wallpaper and setters.simple or setters.awesome_wallpaper) or (config.wallpaper and setters.simple or setters.awesome_wallpaper)
local function set_wallpaper(s) local function set_wallpaper(s)
config.screen = s or config.screen if type(config.screen) ~= 'table' then
if config.screen and s and config.screen ~= s then return end
config.screen = s or config.screen
end
config.set_function(config) config.set_function(config)
end end
@@ -324,7 +347,7 @@ function setup(args)
end, end,
}) })
end end
if awesome.version == "v4.3" then if awesome.version == "v4.3" or awesome.version == "4.3" then
awful.screen.connect_for_each_screen(set_wallpaper) awful.screen.connect_for_each_screen(set_wallpaper)
else else
screen.connect_signal("request::wallpaper", set_wallpaper) screen.connect_signal("request::wallpaper", set_wallpaper)

View File

@@ -11,53 +11,93 @@ local helpers = require(tostring(...):match(".*bling") .. ".helpers")
local window_swallowing_activated = false local window_swallowing_activated = false
-- you might want to add or remove applications here -- you might want to add or remove applications here
local dont_swallow_classname_list = beautiful.dont_swallow_classname_list local parent_filter_list = beautiful.parent_filter_list
or beautiful.dont_swallow_classname_list
or { "firefox", "Gimp", "Google-chrome" } or { "firefox", "Gimp", "Google-chrome" }
local activate_dont_swallow_filter = beautiful.dont_swallow_filter_activated local child_filter_list = beautiful.child_filter_list
or true or beautiful.dont_swallow_classname_list or { }
-- checks if client classname matches with any entry of the dont-swallow-list -- for boolean values the or chain way to set the values breaks with 2 vars
local function check_if_swallow(c) -- and always defaults to true so i had to do this to se the right value...
if not activate_dont_swallow_filter then local swallowing_filter = true
return true local filter_vars = { beautiful.swallowing_filter, beautiful.dont_swallow_filter_activated }
end for _, var in pairs(filter_vars) do
for _, classname in ipairs(dont_swallow_classname_list) do swallowing_filter = var
if classname == c.class then end
return false
-- check if element exist in table
-- returns true if it is
local function is_in_table(element, table)
local res = false
for _, value in pairs(table) do
if element:match(value) then
res = true
break
end end
end end
return true return res
end end
-- if the swallowing filter is active checks the child and parent classes
-- against their filters
local function check_swallow(parent, child)
local res = true
if swallowing_filter then
local prnt = not is_in_table(parent, parent_filter_list)
local chld = not is_in_table(child, child_filter_list)
res = ( prnt and chld )
end
return res
end
-- async function to get the parent's pid
-- recieves a child process pid and a callback function
-- parent_pid in format "init(1)---ancestorA(pidA)---ancestorB(pidB)...---process(pid)"
function get_parent_pid(child_ppid, callback)
local ppid_cmd = string.format("pstree -A -p -s %s", child_ppid)
awful.spawn.easy_async(ppid_cmd, function(stdout, stderr, reason, exit_code)
-- primitive error checking
if stderr and stderr ~= "" then
callback(stderr)
return
end
local ppid = stdout
callback(nil, ppid)
end)
end
-- the function that will be connected to / disconnected from the spawn client signal -- the function that will be connected to / disconnected from the spawn client signal
local function manage_clientspawn(c) local function manage_clientspawn(c)
-- get the last focused window to check if it is a parent window -- get the last focused window to check if it is a parent window
local parent_client = awful.client.focus.history.get(c.screen, 1) local parent_client = awful.client.focus.history.get(c.screen, 1)
if not parent_client then if not parent_client then
return return
elseif parent_client.type == "dialog" or parent_client.type == "splash" then
return
end end
-- io.popen is normally discouraged. Should probably be changed get_parent_pid(c.pid, function(err, ppid)
local handle = io.popen( if err then
[[pstree -T -p -a -s ]] return
.. tostring(c.pid) end
.. [[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']] parent_pid = ppid
)
local parent_pid = handle:read("*a")
handle:close()
if if
(tostring(parent_pid) == tostring(parent_client.pid)) -- will search for "(parent_client.pid)" inside the parent_pid string
and check_if_swallow(c) ( tostring(parent_pid):find("("..tostring(parent_client.pid)..")") )
and check_swallow(parent_client.class, c.class)
then then
c:connect_signal("unmanage", function() c:connect_signal("unmanage", function()
helpers.client.turn_on(parent_client) if parent_client then
helpers.client.sync(parent_client, c) helpers.client.turn_on(parent_client)
helpers.client.sync(parent_client, c)
end
end) end)
helpers.client.sync(c, parent_client) helpers.client.sync(c, parent_client)
helpers.client.turn_off(parent_client) helpers.client.turn_off(parent_client)
end end
end)
end end
-- without the following functions that module would be autoloaded by require("bling") -- without the following functions that module would be autoloaded by require("bling")

View File

@@ -1 +1,3 @@
return { playerctl = require(... .. ".playerctl") } return {
playerctl = require(... .. ".playerctl"),
}

View File

@@ -1,4 +1,7 @@
local awful = require("awful")
local gtimer = require("gears.timer")
local beautiful = require("beautiful") local beautiful = require("beautiful")
local naughty = require("naughty")
-- Use CLI backend as default as it is supported on most if not all systems -- Use CLI backend as default as it is supported on most if not all systems
local backend_config = beautiful.playerctl_backend or "playerctl_cli" local backend_config = beautiful.playerctl_backend or "playerctl_cli"
@@ -7,13 +10,37 @@ local backends = {
playerctl_lib = require(... .. ".playerctl_lib"), playerctl_lib = require(... .. ".playerctl_lib"),
} }
local backend = nil
local function enable_wrapper(args) local function enable_wrapper(args)
local open = naughty.action { name = "Open" }
open:connect_signal("invoked", function()
awful.spawn("xdg-open https://blingcorp.github.io/bling/#/signals/pctl")
end)
gtimer.delayed_call(function()
naughty.notify({
title = "Bling Error",
text = "Global signals are deprecated! Please take a look at the playerctl documentation.",
app_name = "Bling Error",
app_icon = "system-error",
actions = { open }
})
end)
backend_config = (args and args.backend) or backend_config backend_config = (args and args.backend) or backend_config
backends[backend_config].enable(args) backend = backends[backend_config](args)
return backend
end end
local function disable_wrapper() local function disable_wrapper()
backends[backend_config].disable() backend:disable()
end end
return { enable = enable_wrapper, disable = disable_wrapper } return {
lib = backends.playerctl_lib,
cli = backends.playerctl_cli,
enable = enable_wrapper,
disable = disable_wrapper
}

View File

@@ -1,151 +1,348 @@
-- Playerctl signals
-- --
-- Provides: -- Provides:
-- bling::playerctl::status -- metadata
-- playing (boolean)
-- bling::playerctl::title_artist_album
-- title (string) -- title (string)
-- artist (string) -- artist (string)
-- album_path (string) -- album_path (string)
-- bling::playerctl::position -- album (string)
-- player_name (string)
-- position
-- interval_sec (number) -- interval_sec (number)
-- length_sec (number) -- length_sec (number)
-- bling::playerctl::no_players -- playback_status
-- -- playing (boolean)
-- volume
-- volume (number)
-- loop_status
-- loop_status (string)
-- shuffle
-- shuffle (bool)
-- no_players
-- (No parameters)
local awful = require("awful") local awful = require("awful")
local gobject = require("gears.object")
local gtable = require("gears.table")
local gtimer = require("gears.timer")
local gstring = require("gears.string")
local beautiful = require("beautiful") local beautiful = require("beautiful")
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
local setmetatable = setmetatable
local tonumber = tonumber
local ipairs = ipairs
local type = type
local capi = { awesome = awesome }
local interval = beautiful.playerctl_position_update_interval or 1 local playerctl = { mt = {} }
local function emit_player_status() function playerctl:disable()
local status_cmd = "playerctl status -F" self._private.metadata_timer:stop()
self._private.metadata_timer = nil
-- Follow status awful.spawn.with_shell("killall playerctl")
awful.spawn.easy_async({
"pkill",
"--full",
"--uid",
os.getenv("USER"),
"^playerctl status",
}, function()
awful.spawn.with_line_callback(status_cmd, {
stdout = function(line)
local playing = false
if line:find("Playing") then
playing = true
else
playing = false
end
awesome.emit_signal("bling::playerctl::status", playing)
end,
})
collectgarbage("collect")
end)
end end
local function emit_player_info() function playerctl:pause(player)
local art_script = [[ if player ~= nil then
sh -c ' awful.spawn.with_shell("playerctl --player=" .. player .. " pause")
else
awful.spawn.with_shell(self._private.cmd .. "pause")
end
end
tmp_dir="$XDG_CACHE_HOME/awesome/" function playerctl:play(player)
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " play")
else
awful.spawn.with_shell(self._private.cmd .. "play")
end
end
if [ -z ${XDG_CACHE_HOME} ]; then function playerctl:stop(player)
tmp_dir="$HOME/.cache/awesome/" if player ~= nil then
fi awful.spawn.with_shell("playerctl --player=" .. player .. " stop")
else
awful.spawn.with_shell(self._private.cmd .. "stop")
end
end
tmp_cover_path=${tmp_dir}"cover.png" function playerctl:play_pause(player)
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " play-pause")
else
awful.spawn.with_shell(self._private.cmd .. "play-pause")
end
end
if [ ! -d $tmp_dir ]; then function playerctl:previous(player)
mkdir -p $tmp_dir if player ~= nil then
fi awful.spawn.with_shell("playerctl --player=" .. player .. " previous")
else
awful.spawn.with_shell(self._private.cmd .. "previous")
end
end
link="$(playerctl metadata mpris:artUrl)" function playerctl:next(player)
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " next")
else
awful.spawn.with_shell(self._private.cmd .. "next")
end
end
curl -s "$link" --output $tmp_cover_path function playerctl:set_loop_status(loop_status, player)
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " loop " .. loop_status)
else
awful.spawn.with_shell(self._private.cmd .. "loop " .. loop_status)
end
end
echo "$tmp_cover_path" function playerctl:cycle_loop_status(player)
']] local function set_loop_status(loop_status)
if loop_status == "None" then
self:set_loop_status("Track")
elseif loop_status == "Track" then
self:set_loop_status("Playlist")
elseif loop_status == "Playlist" then
self:set_loop_status("None")
end
end
-- Command that lists artist and title in a format to find and follow if player ~= nil then
local song_follow_cmd = awful.spawn.easy_async_with_shell("playerctl --player=" .. player .. " loop", function(stdout)
"playerctl metadata --format 'artist_{{artist}}title_{{title}}' -F" set_loop_status(stdout)
end)
else
set_loop_status(self._private.loop_status)
end
end
-- Progress Cmds function playerctl:set_position(position, player)
local prog_cmd = "playerctl position" if player ~= nil then
local length_cmd = "playerctl metadata mpris:length" awful.spawn.with_shell("playerctl --player=" .. player .. " position " .. position)
else
awful.spawn.with_shell(self._private.cmd .. "position " .. position)
end
end
awful.widget.watch(prog_cmd, interval, function(_, interval) function playerctl:set_shuffle(shuffle, player)
shuffle = shuffle and "on" or "off"
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " shuffle " .. shuffle)
else
awful.spawn.with_shell(self._private.cmd .. "shuffle " .. shuffle)
end
end
function playerctl:cycle_shuffle(player)
if player ~= nil then
awful.spawn.easy_async_with_shell("playerctl --player=" .. player .. " shuffle", function(stdout)
local shuffle = stdout == "on" and true or false
self:set_shuffle(not self._private.shuffle)
end)
else
self:set_shuffle(not self._private.shuffle)
end
end
function playerctl:set_volume(volume, player)
if player ~= nil then
awful.spawn.with_shell("playerctl --player=" .. player .. " volume " .. volume)
else
awful.spawn.with_shell(self._private.cmd .. "volume " .. volume)
end
end
local function emit_player_metadata(self)
local metadata_cmd = self._private.cmd .. "metadata --format 'title_{{title}}artist_{{artist}}art_url_{{mpris:artUrl}}player_name_{{playerName}}album_{{album}}' -F"
awful.spawn.with_line_callback(metadata_cmd, {
stdout = function(line)
local title = gstring.xml_escape(line:match('title_(.*)artist_')) or ""
local artist = gstring.xml_escape(line:match('artist_(.*)art_url_')) or ""
local art_url = line:match('art_url_(.*)player_name_') or ""
local player_name = line:match('player_name_(.*)album_') or ""
local album = gstring.xml_escape(line:match('album_(.*)')) or ""
art_url = art_url:gsub('%\n', '')
if player_name == "spotify" then
art_url = art_url:gsub("open.spotify.com", "i.scdn.co")
end
if self._private.metadata_timer
and self._private.metadata_timer.started
then
self._private.metadata_timer:stop()
end
self._private.metadata_timer = gtimer {
timeout = self.debounce_delay,
autostart = true,
single_shot = true,
callback = function()
if title and title ~= "" then
if art_url ~= "" then
local art_path = os.tmpname()
helpers.filesystem.save_image_async_curl(art_url, art_path, function()
self:emit_signal("metadata", title, artist, art_path, album, player_name)
capi.awesome.emit_signal("bling::playerctl::title_artist_album", title, artist, art_path)
end)
else
self:emit_signal("metadata", title, artist, "", album, player_name)
capi.awesome.emit_signal("bling::playerctl::title_artist_album", title, artist, "")
end
else
self:emit_signal("no_players")
capi.awesome.emit_signal("bling::playerctl::no_players")
end
end
}
collectgarbage("collect")
end,
})
end
local function emit_player_position(self)
local position_cmd = self._private.cmd .. "position"
local length_cmd = self._private.cmd .. "metadata mpris:length"
awful.widget.watch(position_cmd, self.interval, function(_, interval)
awful.spawn.easy_async_with_shell(length_cmd, function(length) awful.spawn.easy_async_with_shell(length_cmd, function(length)
local length_sec = tonumber(length) -- in microseconds local length_sec = tonumber(length) -- in microseconds
local interval_sec = tonumber(interval) -- in seconds local interval_sec = tonumber(interval) -- in seconds
if length_sec and interval_sec then if length_sec and interval_sec then
if interval_sec >= 0 and length_sec > 0 then if interval_sec >= 0 and length_sec > 0 then
awesome.emit_signal( self:emit_signal("position", interval_sec, length_sec / 1000000)
"bling::playerctl::position", capi.awesome.emit_signal("bling::playerctl::position", interval_sec, length_sec / 1000000)
interval_sec,
length_sec / 1000000
)
end end
end end
end) end)
collectgarbage("collect") collectgarbage("collect")
end) end)
-- Follow title
awful.spawn.easy_async({
"pkill",
"--full",
"--uid",
os.getenv("USER"),
"^playerctl metadata",
}, function()
awful.spawn.with_line_callback(song_follow_cmd, {
stdout = function(line)
local album_path = ""
awful.spawn.easy_async_with_shell(art_script, function(out)
-- Get album path
album_path = out:gsub("%\n", "")
-- Get title and artist
local artist = line:match("artist_(.*)title_")
local title = line:match("title_(.*)")
-- If the title is nil or empty then the players stopped
if title and title ~= "" then
awesome.emit_signal(
"bling::playerctl::title_artist_album",
title,
artist,
album_path
)
else
awesome.emit_signal("bling::playerctl::no_players")
end
end)
collectgarbage("collect")
end,
})
collectgarbage("collect")
end)
end end
-- Emit info local function emit_player_playback_status(self)
-- emit_player_status() local status_cmd = self._private.cmd .. "status -F"
-- emit_player_info()
local enable = function(args) awful.spawn.with_line_callback(status_cmd, {
interval = (args and args.interval) or interval stdout = function(line)
emit_player_status() if line:find("Playing") then
emit_player_info() self:emit_signal("playback_status", true)
capi.awesome.emit_signal("bling::playerctl::status", true)
else
self:emit_signal("playback_status", false)
capi.awesome.emit_signal("bling::playerctl::status", false)
end
end,
})
end end
local disable = function() local function emit_player_volume(self)
awful.spawn.with_shell( local volume_cmd = self._private.cmd .. "volume -F"
"pkill --full --uid " .. os.getenv("USER") .. " '^playerctl status -F'"
)
awful.spawn.with_shell( awful.spawn.with_line_callback(volume_cmd, {
"pkill --full --uid " stdout = function(line)
.. os.getenv("USER") self:emit_signal("volume", tonumber(line))
.. " '^playerctl metadata --format'" end,
) })
end end
return { enable = enable, disable = disable } local function emit_player_loop_status(self)
local loop_status_cmd = self._private.cmd .. "loop -F"
awful.spawn.with_line_callback(loop_status_cmd, {
stdout = function(line)
self._private.loop_status = line
self:emit_signal("loop_status", line:lower())
end,
})
end
local function emit_player_shuffle(self)
local shuffle_cmd = self._private.cmd .. "shuffle -F"
awful.spawn.with_line_callback(shuffle_cmd, {
stdout = function(line)
if line:find("On") then
self._private.shuffle = true
self:emit_signal("shuffle", true)
else
self._private.shuffle = false
self:emit_signal("shuffle", false)
end
end,
})
end
local function parse_args(self, args)
if args.player then
self._private.cmd = self._private.cmd .. "--player="
if type(args.player) == "string" then
self._private.cmd = self._private.cmd .. args.player .. " "
elseif type(args.player) == "table" then
for index, player in ipairs(args.player) do
self._private.cmd = self._private.cmd .. player
if index < #args.player then
self._private.cmd = self._private.cmd .. ","
else
self._private.cmd = self._private.cmd .. " "
end
end
end
end
if args.ignore then
self._private.cmd = self._private.cmd .. "--ignore-player="
if type(args.ignore) == "string" then
self._private.cmd = self._private.cmd .. args.ignore .. " "
elseif type(args.ignore) == "table" then
for index, player in ipairs(args.ignore) do
self._private.cmd = self._private.cmd .. player
if index < #args.ignore then
self._private.cmd = self._private.cmd .. ","
else
self._private.cmd = self._private.cmd .. " "
end
end
end
end
end
local function new(args)
args = args or {}
local ret = gobject{}
gtable.crush(ret, playerctl, true)
ret.interval = args.interval or beautiful.playerctl_position_update_interval or 1
ret.debounce_delay = args.debounce_delay or beautiful.playerctl_debounce_delay or 0.35
ret._private = {}
ret._private.metadata_timer = nil
ret._private.cmd = "playerctl "
parse_args(ret, args)
emit_player_metadata(ret)
emit_player_position(ret)
emit_player_playback_status(ret)
emit_player_volume(ret)
emit_player_loop_status(ret)
emit_player_shuffle(ret)
return ret
end
function playerctl.mt:__call(...)
return new(...)
end
-- On startup instead of on playerctl object init to make it
-- possible to have more than one of these running
awful.spawn.with_shell("killall playerctl")
return setmetatable(playerctl, playerctl.mt)

View File

@@ -1,88 +1,209 @@
-- Playerctl signals -- Playerctl signals
-- --
-- Provides: -- Provides:
-- bling::playerctl::status -- metadata
-- playing (boolean)
-- player_name (string)
-- bling::playerctl::title_artist_album
-- title (string) -- title (string)
-- artist (string) -- artist (string)
-- album_path (string) -- album_path (string)
-- album (string)
-- new (bool)
-- player_name (string) -- player_name (string)
-- bling::playerctl::position -- position
-- interval_sec (number) -- interval_sec (number)
-- length_sec (number) -- length_sec (number)
-- player_name (string) -- player_name (string)
-- bling::playerctl::no_players -- playback_status
-- playing (boolean)
-- player_name (string)
-- seeked
-- position (number)
-- player_name (string)
-- volume
-- volume (number)
-- player_name (string)
-- loop_status
-- loop_status (string)
-- player_name (string)
-- shuffle
-- shuffle (boolean)
-- player_name (string)
-- exit
-- player_name (string)
-- no_players
-- (No parameters) -- (No parameters)
local gears = require("gears")
local awful = require("awful") local awful = require("awful")
local gobject = require("gears.object")
local gtable = require("gears.table")
local gtimer = require("gears.timer")
local gstring = require("gears.string")
local beautiful = require("beautiful") local beautiful = require("beautiful")
local Playerctl = nil local helpers = require(tostring(...):match(".*bling") .. ".helpers")
local setmetatable = setmetatable
local ipairs = ipairs
local pairs = pairs
local type = type
local capi = { awesome = awesome }
local manager = nil local playerctl = { mt = {} }
local metadata_timer = nil
local position_timer = nil
local ignore = {} function playerctl:disable()
local priority = {} -- Restore default settings
local update_on_activity = true self.ignore = {}
local interval = 1 self.priority = {}
self.update_on_activity = true
self.interval = 1
self.debounce_delay = 0.35
-- Track position callback -- Reset timers
local last_position = -1 self._private.manager = nil
local last_length = -1 self._private.metadata_timer:stop()
local function position_cb() self._private.metadata_timer = nil
local player = manager.players[1] self._private.position_timer:stop()
self._private.position_timer = nil
-- Reset default values
self._private.last_position = -1
self._private.last_length = -1
self._private.last_player = nil
self._private.last_title = ""
self._private.last_artist = ""
self._private.last_artUrl = ""
end
function playerctl:pause(player)
player = player or self._private.manager.players[1]
if player then if player then
local position = player:get_position() / 1000000 player:pause()
local length = (player.metadata.value["mpris:length"] or 0) / 1000000 end
if position ~= last_position or length ~= last_length then end
awesome.emit_signal(
"bling::playerctl::position", function playerctl:play(player)
position, player = player or self._private.manager.players[1]
length, if player then
player.player_name player:play()
) end
last_position = position end
last_length = length
function playerctl:stop(player)
player = player or self._private.manager.players[1]
if player then
player:stop()
end
end
function playerctl:play_pause(player)
player = player or self._private.manager.players[1]
if player then
player:play_pause()
end
end
function playerctl:previous(player)
player = player or self._private.manager.players[1]
if player then
player:previous()
end
end
function playerctl:next(player)
player = player or self._private.manager.players[1]
if player then
player:next()
end
end
function playerctl:set_loop_status(loop_status, player)
player = player or self._private.manager.players[1]
if player then
player:set_loop_status(loop_status)
end
end
function playerctl:cycle_loop_status(player)
player = player or self._private.manager.players[1]
if player then
if player.loop_status == "NONE" then
player:set_loop_status("TRACK")
elseif player.loop_status == "TRACK" then
player:set_loop_status("PLAYLIST")
elseif player.loop_status == "PLAYLIST" then
player:set_loop_status("NONE")
end end
end end
end end
local function get_album_art(url) function playerctl:set_position(position, player)
return awful.util.shell player = player or self._private.manager.players[1]
.. [[ -c ' if player then
player:set_position(position * 1000000)
tmp_dir="$XDG_CACHE_HOME/awesome/" end
if [ -z "$XDG_CACHE_HOME" ]; then
tmp_dir="$HOME/.cache/awesome/"
fi
tmp_cover_path="${tmp_dir}cover.png"
if [ ! -d "$tmp_dir" ]; then
mkdir -p $tmp_dir
fi
curl -s ']]
.. url
.. [[' --output $tmp_cover_path
echo "$tmp_cover_path"
']]
end end
-- Metadata callback for title, artist, and album art function playerctl:set_shuffle(shuffle, player)
local last_player = nil player = player or self._private.manager.players[1]
local last_title = "" if player then
local last_artist = "" player:set_shuffle(shuffle)
local last_artUrl = "" end
local function metadata_cb(player, metadata) end
if update_on_activity then
manager:move_player_to_top(player) function playerctl:cycle_shuffle(player)
player = player or self._private.manager.players[1]
if player then
player:set_shuffle(not player.shuffle)
end
end
function playerctl:set_volume(volume, player)
player = player or self._private.manager.players[1]
if player then
player:set_volume(volume)
end
end
function playerctl:get_manager()
return self._private.manager
end
function playerctl:get_active_player()
return self._private.manager.players[1]
end
function playerctl:get_player_of_name(name)
for _, player in ipairs(self._private.manager.players[1]) do
if player.name == name then
return player
end
end
return nil
end
local function emit_metadata_signal(self, title, artist, artUrl, album, new, player_name)
title = gstring.xml_escape(title)
artist = gstring.xml_escape(artist)
album = gstring.xml_escape(album)
-- Spotify client doesn't report its art URL's correctly...
if player_name == "spotify" then
artUrl = artUrl:gsub("open.spotify.com", "i.scdn.co")
end
if artUrl ~= "" then
local art_path = os.tmpname()
helpers.filesystem.save_image_async_curl(artUrl, art_path, function()
self:emit_signal("metadata", title, artist, art_path, album, new, player_name)
capi.awesome.emit_signal("bling::playerctl::title_artist_album", title, artist, art_path, player_name)
end)
else
capi.awesome.emit_signal("bling::playerctl::title_artist_album", title, artist, "", player_name)
self:emit_signal("metadata", title, artist, "", album, new, player_name)
end
end
local function metadata_cb(self, player, metadata)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end end
local data = metadata.value local data = metadata.value
@@ -93,101 +214,136 @@ local function metadata_cb(player, metadata)
artist = artist .. ", " .. data["xesam:artist"][i] artist = artist .. ", " .. data["xesam:artist"][i]
end end
local artUrl = data["mpris:artUrl"] or "" local artUrl = data["mpris:artUrl"] or ""
-- Spotify client doesn't report its art URL's correctly... local album = data["xesam:album"] or ""
if player.player_name == "spotify" then
artUrl = artUrl:gsub("open.spotify.com", "i.scdn.co") if player == self._private.manager.players[1] then
end self._private.active_player = player
if player == manager.players[1] then
-- Callback can be called even though values we care about haven't -- Callback can be called even though values we care about haven't
-- changed, so check to see if they have -- changed, so check to see if they have
if if
player ~= last_player player ~= self._private.last_player
or title ~= last_title or title ~= self._private.last_title
or artist ~= last_artist or artist ~= self._private.last_artist
or artUrl ~= last_artUrl or artUrl ~= self._private.last_artUrl
then then
if title == "" and artist == "" and artUrl == "" then if (title == "" and artist == "" and artUrl == "") then return end
return
if self._private.metadata_timer ~= nil and self._private.metadata_timer.started then
self._private.metadata_timer:stop()
end end
if metadata_timer ~= nil then self._private.metadata_timer = gtimer {
if metadata_timer.started then timeout = self.debounce_delay,
metadata_timer:stop()
end
end
metadata_timer = gears.timer({
timeout = 0.3,
autostart = true, autostart = true,
single_shot = true, single_shot = true,
callback = function() callback = function()
if artUrl ~= "" then emit_metadata_signal(self, title, artist, artUrl, album, true, player.player_name)
awful.spawn.with_line_callback(get_album_art(artUrl), { end
stdout = function(line) }
awesome.emit_signal(
"bling::playerctl::title_artist_album",
title,
artist,
line,
player.player_name
)
end,
})
else
awesome.emit_signal(
"bling::playerctl::title_artist_album",
title,
artist,
"",
player.player_name
)
end
end,
})
-- Re-sync with position timer when track changes -- Re-sync with position timer when track changes
position_timer:again() self._private.position_timer:again()
last_player = player self._private.last_player = player
last_title = title self._private.last_title = title
last_artist = artist self._private.last_artist = artist
last_artUrl = artUrl self._private.last_artUrl = artUrl
end end
end end
end end
-- Playback status callback local function position_cb(self)
-- Reported as PLAYING, PAUSED, or STOPPED local player = self._private.manager.players[1]
local function playback_status_cb(player, status) if player then
if update_on_activity then
manager:move_player_to_top(player) local position = player:get_position() / 1000000
local length = (player.metadata.value["mpris:length"] or 0) / 1000000
if position ~= self._private.last_position or length ~= self._private.last_length then
capi.awesome.emit_signal("bling::playerctl::position", position, length, player.player_name)
self:emit_signal("position", position, length, player.player_name)
self._private.last_position = position
self._private.last_length = length
end
end
end
local function playback_status_cb(self, player, status)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end end
if player == manager.players[1] then if player == self._private.manager.players[1] then
self._private.active_player = player
-- Reported as PLAYING, PAUSED, or STOPPED
if status == "PLAYING" then if status == "PLAYING" then
awesome.emit_signal( self:emit_signal("playback_status", true, player.player_name)
"bling::playerctl::status", capi.awesome.emit_signal("bling::playerctl::status", true, player.player_name)
true,
player.player_name
)
else else
awesome.emit_signal( self:emit_signal("playback_status", false, player.player_name)
"bling::playerctl::status", capi.awesome.emit_signal("bling::playerctl::status", false, player.player_name)
false,
player.player_name
)
end end
end end
end end
local function seeked_cb(self, player, position)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end
if player == self._private.manager.players[1] then
self._private.active_player = player
self:emit_signal("seeked", position / 1000000, player.player_name)
end
end
local function volume_cb(self, player, volume)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end
if player == self._private.manager.players[1] then
self._private.active_player = player
self:emit_signal("volume", volume, player.player_name)
end
end
local function loop_status_cb(self, player, loop_status)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end
if player == self._private.manager.players[1] then
self._private.active_player = player
self:emit_signal("loop_status", loop_status:lower(), player.player_name)
end
end
local function shuffle_cb(self, player, shuffle)
if self.update_on_activity then
self._private.manager:move_player_to_top(player)
end
if player == self._private.manager.players[1] then
self._private.active_player = player
self:emit_signal("shuffle", shuffle, player.player_name)
end
end
local function exit_cb(self, player)
if player == self._private.manager.players[1] then
self:emit_signal("exit", player.player_name)
end
end
-- Determine if player should be managed -- Determine if player should be managed
local function name_is_selected(name) local function name_is_selected(self, name)
if ignore[name.name] then if self.ignore[name.name] then
return false return false
end end
if #priority > 0 then if #self.priority > 0 then
for _, arg in pairs(priority) do for _, arg in pairs(self.priority) do
if arg == name.name or arg == "%any" then if arg == name.name or arg == "%any" then
return true return true
end end
@@ -199,23 +355,42 @@ local function name_is_selected(name)
end end
-- Create new player and connect it to callbacks -- Create new player and connect it to callbacks
local function init_player(name) local function init_player(self, name)
if name_is_selected(name) then if name_is_selected(self, name) then
local player = Playerctl.Player.new_from_name(name) local player = self._private.lgi_Playerctl.Player.new_from_name(name)
manager:manage_player(player) self._private.manager:manage_player(player)
player.on_playback_status = playback_status_cb player.on_metadata = function(player, metadata)
player.on_metadata = metadata_cb metadata_cb(self, player, metadata)
end
player.on_playback_status = function(player, playback_status)
playback_status_cb(self, player, playback_status)
end
player.on_seeked = function(player, position)
seeked_cb(self, player, position)
end
player.on_volume = function(player, volume)
volume_cb(self, player, volume)
end
player.on_loop_status = function(player, loop_status)
loop_status_cb(self, player, loop_status)
end
player.on_shuffle = function(player, shuffle_status)
shuffle_cb(self, player, shuffle_status)
end
player.on_exit = function(player, shuffle_status)
exit_cb(self, player)
end
-- Start position timer if its not already running -- Start position timer if its not already running
if not position_timer.started then if not self._private.position_timer.started then
position_timer:again() self._private.position_timer:again()
end end
end end
end end
-- Determine if a player name comes before or after another according to the -- Determine if a player name comes before or after another according to the
-- priority order -- priority order
local function player_compare_name(name_a, name_b) local function player_compare_name(self, name_a, name_b)
local any_index = math.huge local any_index = math.huge
local a_match_index = nil local a_match_index = nil
local b_match_index = nil local b_match_index = nil
@@ -224,7 +399,7 @@ local function player_compare_name(name_a, name_b)
return 0 return 0
end end
for index, name in ipairs(priority) do for index, name in ipairs(self.priority) do
if name == "%any" then if name == "%any" then
any_index = (any_index == math.huge) and index or any_index any_index = (any_index == math.huge) and index or any_index
elseif name == name_a then elseif name == name_a then
@@ -248,103 +423,138 @@ local function player_compare_name(name_a, name_b)
end end
-- Sorting function used by manager if a priority order is specified -- Sorting function used by manager if a priority order is specified
local function player_compare(a, b) local function player_compare(self, a, b)
local player_a = Playerctl.Player(a) local player_a = self._private.lgi_Playerctl.Player(a)
local player_b = Playerctl.Player(b) local player_b = self._private.lgi_Playerctl.Player(b)
return player_compare_name(player_a.player_name, player_b.player_name) return player_compare_name(self, player_a.player_name, player_b.player_name)
end end
local function start_manager() local function get_current_player_info(self, player)
manager = Playerctl.PlayerManager() local title = player:get_title() or ""
if #priority > 0 then local artist = player:get_artist() or ""
manager:set_sort_func(player_compare) local artUrl = player:print_metadata_prop("mpris:artUrl") or ""
local album = player:get_album() or ""
emit_metadata_signal(self, title, artist, artUrl, album, false, player.player_name)
playback_status_cb(self, player, player.playback_status)
volume_cb(self, player, player.volume)
loop_status_cb(self, player, player.loop_status)
shuffle_cb(self, player, player.shuffle)
end
local function start_manager(self)
self._private.manager = self._private.lgi_Playerctl.PlayerManager()
if #self.priority > 0 then
self._private.manager:set_sort_func(function(a, b)
return player_compare(self, a, b)
end)
end end
-- Timer to update track position at specified interval -- Timer to update track position at specified interval
position_timer = gears.timer({ self._private.position_timer = gtimer {
timeout = interval, timeout = self.interval,
callback = position_cb, callback = function()
}) position_cb(self)
end,
}
-- Manage existing players on startup -- Manage existing players on startup
for _, name in ipairs(manager.player_names) do for _, name in ipairs(self._private.manager.player_names) do
init_player(name) init_player(self, name)
end end
if self._private.manager.players[1] then
get_current_player_info(self, self._private.manager.players[1])
end
local _self = self
-- Callback to manage new players -- Callback to manage new players
function manager:on_name_appeared(name) function self._private.manager:on_name_appeared(name)
init_player(name) init_player(_self, name)
end end
-- Callback to check if all players have exited function self._private.manager:on_player_appeared(player)
function manager:on_name_vanished(name) if player == self.players[1] then
if #manager.players == 0 then _self._private.active_player = player
metadata_timer:stop() end
position_timer:stop() end
awesome.emit_signal("bling::playerctl::no_players")
function self._private.manager:on_player_vanished(player)
if #self.players == 0 then
_self._private.metadata_timer:stop()
_self._private.position_timer:stop()
_self:emit_signal("no_players")
capi.awesome.emit_signal("bling::playerctl::no_players")
elseif player == _self._private.active_player then
_self._private.active_player = self.players[1]
get_current_player_info(_self, self.players[1])
end end
end end
end end
-- Parse arguments local function parse_args(self, args)
local function parse_args(args) self.ignore = {}
if args then if type(args.ignore) == "string" then
update_on_activity = args.update_on_activity or update_on_activity self.ignore[args.ignore] = true
interval = args.interval or interval elseif type(args.ignore) == "table" then
for _, name in pairs(args.ignore) do
if type(args.ignore) == "string" then self.ignore[name] = true
ignore[args.ignore] = true
elseif type(args.ignore) == "table" then
for _, name in pairs(args.ignore) do
ignore[name] = true
end
end end
end
if type(args.player) == "string" then self.priority = {}
priority[1] = args.player if type(args.player) == "string" then
elseif type(args.player) == "table" then self.priority[1] = args.player
priority = args.player elseif type(args.player) == "table" then
end self.priority = args.player
end end
end end
local function playerctl_enable(args) local function new(args)
args = args or {} args = args or {}
local ret = gobject{}
gtable.crush(ret, playerctl, true)
-- Grab settings from beautiful variables if not set explicitly -- Grab settings from beautiful variables if not set explicitly
args.ignore = args.ignore or beautiful.playerctl_ignore args.ignore = args.ignore or beautiful.playerctl_ignore
args.player = args.player or beautiful.playerctl_player args.player = args.player or beautiful.playerctl_player
args.update_on_activity = args.update_on_activity ret.update_on_activity = args.update_on_activity or
or beautiful.playerctl_update_on_activity beautiful.playerctl_update_on_activity or true
args.interval = args.interval ret.interval = args.interval or beautiful.playerctl_position_update_interval or 1
or beautiful.playerctl_position_update_interval ret.debounce_delay = args.debounce_delay or beautiful.playerctl_debounce_delay or 0.35
parse_args(args) parse_args(ret, args)
ret._private = {}
-- Metadata callback for title, artist, and album art
ret._private.last_player = nil
ret._private.last_title = ""
ret._private.last_artist = ""
ret._private.last_artUrl = ""
-- Track position callback
ret._private.last_position = -1
ret._private.last_length = -1
-- Grab playerctl library -- Grab playerctl library
Playerctl = require("lgi").Playerctl ret._private.lgi_Playerctl = require("lgi").Playerctl
ret._private.manager = nil
ret._private.metadata_timer = nil
ret._private.position_timer = nil
-- Ensure main event loop has started before starting player manager -- Ensure main event loop has started before starting player manager
gears.timer.delayed_call(start_manager) gtimer.delayed_call(function()
start_manager(ret)
end)
return ret
end end
local function playerctl_disable() function playerctl.mt:__call(...)
-- Remove manager and timer return new(...)
manager = nil
metadata_timer:stop()
metadata_timer = nil
position_timer:stop()
position_timer = nil
-- Restore default settings
ignore = {}
priority = {}
update_on_activity = true
interval = 1
-- Reset default values
last_position = -1
last_length = -1
last_player = nil
last_title = ""
last_artist = ""
last_artUrl = ""
end end
return { enable = playerctl_enable, disable = playerctl_disable } return setmetatable(playerctl, playerctl.mt)

View File

@@ -0,0 +1,105 @@
--[[ Bling theme variables template
This file has all theme variables of the bling module.
Every variable has a small comment on what it does.
You might just want to copy that whole part into your theme.lua and start adjusting from there.
--]]
-- LuaFormatter off
-- window swallowing
theme.dont_swallow_classname_list = { "firefox", "Gimp" } -- list of class names that should not be swallowed
theme.dont_swallow_filter_activated = true -- whether the filter above should be active
-- flash focus
theme.flash_focus_start_opacity = 0.6 -- the starting opacity
theme.flash_focus_step = 0.01 -- the step of animation
-- playerctl signal
theme.playerctl_backend = "playerctl_cli" -- backend to use
theme.playerctl_ignore = {} -- list of players to be ignored
theme.playerctl_player = {} -- list of players to be used in priority order
theme.playerctl_update_on_activity = true -- whether to prioritize the most recently active players or not
theme.playerctl_position_update_interval = 1 -- the update interval for fetching the position from playerctl
-- tabbed
theme.tabbed_spawn_in_tab = false -- whether a new client should spawn into the focused tabbing container
-- tabbar general
theme.tabbar_disable = false -- disable the tab bar entirely
theme.tabbar_ontop = false
theme.tabbar_radius = 0 -- border radius of the tabbar
theme.tabbar_style = "default" -- style of the tabbar ("default", "boxes" or "modern")
theme.tabbar_font = "Sans 11" -- font of the tabbar
theme.tabbar_size = 40 -- size of the tabbar
theme.tabbar_position = "top" -- position of the tabbar
theme.tabbar_bg_normal = "#000000" -- background color of the focused client on the tabbar
theme.tabbar_fg_normal = "#ffffff" -- foreground color of the focused client on the tabbar
theme.tabbar_bg_focus = "#1A2026" -- background color of unfocused clients on the tabbar
theme.tabbar_fg_focus = "#ff0000" -- foreground color of unfocused clients on the tabbar
theme.tabbar_bg_focus_inactive = nil -- background color of the focused client on the tabbar when inactive
theme.tabbar_fg_focus_inactive = nil -- foreground color of the focused client on the tabbar when inactive
theme.tabbar_bg_normal_inactive = nil -- background color of unfocused clients on the tabbar when inactive
theme.tabbar_fg_normal_inactive = nil -- foreground color of unfocused clients on the tabbar when inactive
-- mstab
theme.mstab_bar_disable = false -- disable the tabbar
theme.mstab_bar_ontop = false -- whether you want to allow the bar to be ontop of clients
theme.mstab_dont_resize_slaves = false -- whether the tabbed stack windows should be smaller than the
-- currently focused stack window (set it to true if you use
-- transparent terminals. False if you use shadows on solid ones
theme.mstab_bar_padding = "default" -- how much padding there should be between clients and your tabbar
-- by default it will adjust based on your useless gaps.
-- If you want a custom value. Set it to the number of pixels (int)
theme.mstab_border_radius = 0 -- border radius of the tabbar
theme.mstab_bar_height = 40 -- height of the tabbar
theme.mstab_tabbar_position = "top" -- position of the tabbar (mstab currently does not support left,right)
theme.mstab_tabbar_style = "default" -- style of the tabbar ("default", "boxes" or "modern")
-- defaults to the tabbar_style so only change if you want a
-- different style for mstab and tabbed
-- the following variables are currently only for the "modern" tabbar style
theme.tabbar_color_close = "#f9929b" -- changes the color of the close button
theme.tabbar_color_min = "#fbdf90" -- changes the color of the minimize button
theme.tabbar_color_float = "#ccaced" -- changes the color of the float button
-- tag preview widget
theme.tag_preview_widget_border_radius = 0 -- Border radius of the widget (With AA)
theme.tag_preview_client_border_radius = 0 -- Border radius of each client in the widget (With AA)
theme.tag_preview_client_opacity = 0.5 -- Opacity of each client
theme.tag_preview_client_bg = "#000000" -- The bg color of each client
theme.tag_preview_client_border_color = "#ffffff" -- The border color of each client
theme.tag_preview_client_border_width = 3 -- The border width of each client
theme.tag_preview_widget_bg = "#000000" -- The bg color of the widget
theme.tag_preview_widget_border_color = "#ffffff" -- The border color of the widget
theme.tag_preview_widget_border_width = 3 -- The border width of the widget
theme.tag_preview_widget_margin = 0 -- The margin of the widget
-- task preview widget
theme.task_preview_widget_border_radius = 0 -- Border radius of the widget (With AA)
theme.task_preview_widget_bg = "#000000" -- The bg color of the widget
theme.task_preview_widget_border_color = "#ffffff" -- The border color of the widget
theme.task_preview_widget_border_width = 3 -- The border width of the widget
theme.task_preview_widget_margin = 0 -- The margin of the widget
-- window switcher
theme.window_switcher_widget_bg = "#000000" -- The bg color of the widget
theme.window_switcher_widget_border_width = 3 -- The border width of the widget
theme.window_switcher_widget_border_radius = 0 -- The border radius of the widget
theme.window_switcher_widget_border_color = "#ffffff" -- The border color of the widget
theme.window_switcher_clients_spacing = 20 -- The space between each client item
theme.window_switcher_client_icon_horizontal_spacing = 5 -- The space between client icon and text
theme.window_switcher_client_width = 150 -- The width of one client widget
theme.window_switcher_client_height = 250 -- The height of one client widget
theme.window_switcher_client_margins = 10 -- The margin between the content and the border of the widget
theme.window_switcher_thumbnail_margins = 10 -- The margin between one client thumbnail and the rest of the widget
theme.thumbnail_scale = false -- If set to true, the thumbnails fit policy will be set to "fit" instead of "auto"
theme.window_switcher_name_margins = 10 -- The margin of one clients title to the rest of the widget
theme.window_switcher_name_valign = "center" -- How to vertically align one clients title
theme.window_switcher_name_forced_width = 200 -- The width of one title
theme.window_switcher_name_font = "Sans 11" -- The font of all titles
theme.window_switcher_name_normal_color = "#ffffff" -- The color of one title if the client is unfocused
theme.window_switcher_name_focus_color = "#ff0000" -- The color of one title if the client is focused
theme.window_switcher_icon_valign = "center" -- How to vertically align the one icon
theme.window_switcher_icon_width = 40 -- The width of one icon
-- LuaFormatter on

View File

@@ -281,8 +281,8 @@ local function search(self, text)
text = text:gsub( "%W", "" ) text = text:gsub( "%W", "" )
-- Check if there's a match by the app name or app command -- Check if there's a match by the app name or app command
if string.find(entry.name, case_insensitive_pattern(text)) ~= nil or if string.find(entry.name:lower(), text:lower(), 1, true) ~= nil or
self.search_commands and string.find(entry.commandline, case_insensitive_pattern(text)) ~= nil self.search_commands and string.find(entry.commandline, text:lower(), 1, true) ~= nil
then then
table.insert(self._private.matched_entries, { table.insert(self._private.matched_entries, {
name = entry.name, name = entry.name,
@@ -498,7 +498,6 @@ local function scroll_right(self)
local rows, columns = self._private.grid:get_dimension() local rows, columns = self._private.grid:get_dimension()
local pos = self._private.grid:get_widget_position(self._private.active_widget) local pos = self._private.grid:get_widget_position(self._private.active_widget)
local is_less_than_max_column = pos.col < columns local is_less_than_max_column = pos.col < columns
local is_less_than_max_page = self._private.current_page < self._private.pages_count
-- Check if we can scroll down the app list -- Check if we can scroll down the app list
if is_less_than_max_column then if is_less_than_max_column then
@@ -773,6 +772,7 @@ local function new(args)
args.icon_theme = args.icon_theme or nil args.icon_theme = args.icon_theme or nil
args.icons_size = args.icons_size or nil args.icons_size = args.icons_size or nil
args.type = args.type or "dock"
args.show_on_focused_screen = args.show_on_focused_screen == nil and true or args.show_on_focused_screen args.show_on_focused_screen = args.show_on_focused_screen == nil and true or args.show_on_focused_screen
args.screen = args.screen or capi.screen.primary args.screen = args.screen or capi.screen.primary
args.placement = args.placement or awful.placement.centered args.placement = args.placement or awful.placement.centered
@@ -919,7 +919,7 @@ local function new(args)
} }
ret._private.widget = awful.popup ret._private.widget = awful.popup
{ {
type = "dock", type = args.type,
visible = false, visible = false,
ontop = true, ontop = true,
placement = ret.placement, placement = ret.placement,

View File

@@ -1,4 +1,5 @@
local beautiful = require("beautiful")
local awful = require("awful") local awful = require("awful")
local shapes = require("extras.nice.shapes") local shapes = require("extras.nice.shapes")
@@ -8,12 +9,77 @@ function update_titlebars(c, init)
-- Rounded Corners -- Rounded Corners
if not c.fullscreen and not c.maximized then if not c.fullscreen and not c.maximized then
c.shape = shapes.rounded_rect { c.shape = shapes.rounded_rect {
tl = 9, tl = beautiful.corner_radius,
tr = 9, tr = beautiful.corner_radius,
bl = 9, bl = beautiful.corner_radius,
br = 9 br = beautiful.corner_radius
} }
else else
c.shape = nil c.shape = nil
end end
end end
function toggle_window_buffers(s)
if not s.top then
s.left = awful.wibar({
screen = s,
position = "left",
opacity = 0.0,
input_passthrough = true,
})
s.right = awful.wibar({
screen = s,
position = "right",
opacity = 0.0,
input_passthrough = true,
})
s.top = awful.wibar({
screen = s,
position = "top",
opacity = 0.0,
input_passthrough = true,
})
s.bottom = awful.wibar({
screen = s,
position = "bottom",
opacity = 0.0,
input_passthrough = true,
})
end
-- Three states: off, small borders, large borders
s.buffer_state = s.buffer_state or "off"
if s.buffer_state == "off" then
s.buffer_state = "small"
s.left.visible = true
s.right.visible = true
s.top.visible = true
s.bottom.visible = true
s.left.width = 50
s.right.width = 50
s.top.height = 50
s.bottom.height = 50
elseif s.buffer_state == "small" then
s.buffer_state = "large"
s.left.visible = true
s.right.visible = true
s.top.visible = true
s.bottom.visible = true
s.left.width = 200
s.right.width = 200
s.top.height = 50
s.bottom.height = 350
elseif s.buffer_state == "large" then
s.buffer_state = "off"
s.left.visible = false
s.right.visible = false
s.top.visible = false
s.bottom.visible = false
end
end

View File

@@ -2,7 +2,7 @@ local awful = require("awful")
local beautiful = require("beautiful") local beautiful = require("beautiful")
awful.rules.rules = { awful.rules.rules = {
-- All clients will match this rule. -- All clients
{ {
rule = {}, rule = {},
properties = { properties = {
@@ -15,13 +15,12 @@ awful.rules.rules = {
placement = awful.placement.no_overlap + awful.placement.no_offscreen + awful.placement.centered placement = awful.placement.no_overlap + awful.placement.no_offscreen + awful.placement.centered
} }
}, },
-- Floating clients. -- Floating clients
{ {
rule_any = { rule_any = {
instance = { instance = {
}, },
class = { class = {
"anbox",
"Arandr", "Arandr",
"Blueman-manager", "Blueman-manager",
"Tor Browser", "Tor Browser",
@@ -37,11 +36,53 @@ awful.rules.rules = {
"GLava", "GLava",
"Conky", "Conky",
"eww-wrapper", "eww-wrapper",
"Emulator",
"File Operation Progress",
}, },
role = {
}
}, },
properties = {floating = true}, properties = {
floating = true,
},
},
-- Fullscreen clients
{
rule_any = {
name = {
"Looking Glass (client)"
},
},
properties = {
fullscreen = true
}
},
-- Ontop clients
{
rule_any = {
class = {
"qalculate-gtk",
"Qalculate-gtk",
"Emulator",
},
name = {
"File Operation Progress",
},
},
properties = {
ontop = true
}
},
-- Always Visible
{
rule_any = {
name = {
"Picture-in-Picture",
},
},
properties = {
ontop = true,
sticky = true,
floating = true,
}
}, },
-- Music Visualizer -- Music Visualizer
{ {
@@ -56,8 +97,8 @@ awful.rules.rules = {
skip_taskbar = true, skip_taskbar = true,
titlebars_enabled = false, titlebars_enabled = false,
requests_no_titlebar = true, requests_no_titlebar = true,
focusable = false, focusable = true,
placement = awful.placement.maximize placement = awful.placement.maximize,
} }
}, },
-- Conky Position -- Conky Position
@@ -75,16 +116,5 @@ awful.rules.rules = {
requests_no_titlebar = true, requests_no_titlebar = true,
focusable = false focusable = false
} }
},
-- Looking Glass always fullscreen
{
rule_any = {
name = {
"Looking Glass (client)"
},
},
properties = {
fullscreen = true
}
} }
} }

View File

@@ -1 +1,13 @@
require "screen.wibar" local awful = require("awful")
require "screen.wibar"
require "functions"
awful.screen.connect_for_each_screen(
function(s)
set_wallpaper(s)
awful.tag({"1", "2", "3", "4", "5", "6", "7", "8", "9"}, s, awful.layout.layouts[1])
wibar = wibar_builder(s)
end
)

View File

@@ -3,166 +3,36 @@ local awful = require("awful")
local wibox = require("wibox") local wibox = require("wibox")
local beautiful = require("beautiful") local beautiful = require("beautiful")
beautiful.bg_systray = "#2e3440" require "screen.wibar.widgets"
beautiful.tasklist_bg_normal = "#2e3440"
beautiful.tasklist_bg_focus = "#4c566a"
beautiful.tasklist_bg_urgent = "#bf616a"
beautiful.tasklist_bg_minimize = "#5e81ac"
mykeyboardlayout = awful.widget.keyboardlayout() function wibar_builder(s)
mytextclock = wibox.widget.textclock() local w = awful.wibar({
mysystray = wibox.widget.systray() screen = s,
position = "top",
bg = beautiful.bg_systray,
height = 26,
})
local taglist_buttons = local taglist = taglist(s)
gears.table.join( local tasklist = tasklist(s)
awful.button( local layoutbox = layoutbox(s)
{},
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
)
)
local tasklist_buttons = w:setup{
gears.table.join( expand = "none",
awful.button( layout = wibox.layout.align.horizontal,
{}, {
1, layout = wibox.layout.fixed.horizontal,
function(c) taglist,
if c == client.focus then },
c.minimized = true tasklist,
else {
c:emit_signal("request::activate", "tasklist", {raise = true}) layout = wibox.layout.fixed.horizontal,
end systray,
end keyboardlayout,
), clock,
awful.button( layoutbox,
{},
4,
function()
awful.client.focus.byidx(1)
end
),
awful.button(
{},
5,
function()
awful.client.focus.byidx(-1)
end
)
)
awful.screen.connect_for_each_screen(
function(s)
-- Wallpaper
set_wallpaper(s)
-- Tags
awful.tag({"1", "2", "3", "4", "5", "6", "7", "8", "9"}, s, awful.layout.layouts[1])
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
buttons = taglist_buttons
} }
}
-- Layout Box return w
s.mylayoutbox = awful.widget.layoutbox(s) end
s.mylayoutbox:buttons(
gears.table.join(
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
)
)
)
-- Create a tasklist widget
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons,
}
-- Wibar initialization
s.mywibox = awful.wibar({
position = "top",
screen = s,
bg = "#2e3440"
})
s.mywibox:setup {
layout = wibox.layout.align.horizontal,
{
layout = wibox.layout.fixed.horizontal,
s.mytaglist,
},
s.mytasklist,
{
layout = wibox.layout.fixed.horizontal,
mysystray,
mykeyboardlayout,
mytextclock,
s.mylayoutbox,
}
}
end
)

View File

@@ -0,0 +1,28 @@
local gears = require("gears")
local awful = require("awful")
local wibox = require("wibox")
function layoutbox(s)
lb = awful.widget.layoutbox(s)
lb:buttons(
gears.table.join(
awful.button(
{},
1,
function()
awful.layout.inc(1)
end
),
awful.button(
{},
3,
function()
awful.layout.inc(-1)
end
)
)
)
return lb
end

View File

@@ -0,0 +1,69 @@
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local taglist_buttons =
gears.table.join(
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
)
)
function taglist(s)
return awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all, --.noempty,
buttons = taglist_buttons,
widget_template = {
{
{
id = 'index_role',
widget = wibox.widget.textbox,
},
margins = 2,
widget = wibox.container.margin,
},
id = 'background_role',
widget = wibox.container.background,
create_callback = function(self, c3, index, objects)
self:get_children_by_id('index_role')[1].markup = '<span> '..index..' </span>'
self:connect_signal('mouse::enter', function()
if self.bg ~= beautiful.taglist_bg_focus then
self.backup = self.bg
self.has_backup = true
end
self.bg = beautiful.taglist_bg_focus
end)
self:connect_signal('mouse::leave', function()
if self.has_backup then self.bg = self.backup end
end)
end,
},
}
end

View File

@@ -0,0 +1,85 @@
local gears = require("gears")
local awful = require("awful")
local wibox = require("wibox")
local beautiful = require("beautiful")
local tasklist_buttons =
gears.table.join(
awful.button(
{},
1,
function(c)
if c == client.focus then
c.minimized = true
else
c:emit_signal("request::activate", "tasklist", {raise = true})
end
end
)
)
function tasklist(s)
return awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons,
style = {
--disable_task_name = true
},
layout = {
spacing = 5,
spacing_widget = {
valign = 'center',
halign = 'center',
widget = wibox.container.place,
},
layout = wibox.layout.fixed.horizontal
},
widget_template = {
{
{
{
{
id = 'icon_role',
widget = wibox.widget.imagebox,
},
top = 2,
bottom = 2,
right = 3,
widget = wibox.container.margin,
},
{
id = 'text_role',
widget = wibox.widget.textbox,
},
layout = wibox.layout.fixed.horizontal,
},
left = 8,
right = 10,
widget = wibox.container.margin
},
id = 'background_role',
widget = wibox.container.background,
create_callback = function(self, c3, index, objects)
self:connect_signal('mouse::enter', function()
if self.bg ~= beautiful.tasklist_bg_focus then
self.backup = self.bg
self.has_backup = true
end
self.bg = beautiful.tasklist_bg_focus
-- Raise client
c3:emit_signal(
"request::activate",
"tasklist", {
raise = true
}
)
end)
self:connect_signal('mouse::leave', function()
if self.has_backup then self.bg = self.backup end
end)
end,
},
}
end

View File

@@ -0,0 +1,16 @@
local gears = require("gears")
local awful = require("awful")
local wibox = require("wibox")
local beautiful = require("beautiful")
keyboardlayout = awful.widget.keyboardlayout()
clock = wibox.widget.textclock()
clock.format = "<span foreground='"..beautiful.fg_normal.."'>".." %A %B %d, %H:%M ".."</span>"
systray = wibox.widget.systray()
systray:set_base_size(26)
require "screen.wibar.taglist"
require "screen.wibar.layoutbox"
require "screen.wibar.tasklist"

View File

@@ -0,0 +1,19 @@
#!/bin/bash
theme=$(grep -o -P '(?<=local theme = ").*(?=")' /home/nick/.config/awesome/theme/init.lua)
case $theme in
"nordic_legion")
new_theme="abstract_office"
;;
"abstract_office")
new_theme="nordic_legion"
;;
*)
esac
# Replace the theme in the init.lua file
sed -i "s/local theme = .*$/local theme = \"$new_theme\"/" /home/nick/.config/awesome/theme/init.lua
# Restart awesome
echo 'awesome.restart()' | awesome-client

View File

@@ -1,58 +0,0 @@
#!/bin/bash
theme=$(grep -o -P '(?<=local theme = ").*(?=")' /home/nick/.config/awesome/theme/init.lua)
case $theme in
"nordic_firewatch")
new_theme="nordic_moon"
;;
"nordic_moon")
new_theme="nordic_legion"
;;
"nordic_legion")
new_theme="nordic_firewatch"
;;
*)
esac
# Replace the theme in the init.lua file
sed -i "s/local theme = .*$/local theme = \"$new_theme\"/" /home/nick/.config/awesome/theme/init.lua
# Configure glava
case $new_theme in
"nordic_firewatch")
sed -i 's/#request mod .*/#request mod bars/g' /home/nick/.config/glava/rc.glsl
sed -i 's/#request setgeometry .*/#request setgeometry 0 0 2560 750/g' /home/nick/.config/glava/rc.glsl
;;
"nordic_moon")
sed -i 's/#request mod .*/#request mod radial/g' /home/nick/.config/glava/rc.glsl
sed -i 's/#request setgeometry .*/#request setgeometry 0 0 2560 1600/g' /home/nick/.config/glava/rc.glsl
;;
"nordic_legion")
sed -i 's/#request mod .*/#request mod bars/g' /home/nick/.config/glava/rc.glsl
sed -i 's/#request setgeometry .*/#request setgeometry 0 0 2560 1600/g' /home/nick/.config/glava/rc.glsl
;;
*)
esac
# Restart glava if it's running
if pgrep glava > /dev/null; then
killall glava
glava --desktop &>/dev/null & disown
fi
# Restart awesome
echo 'awesome.restart()' | awesome-client
# Configure conky
case $new_theme in
"nordic_firewatch")
pkill conky
;;
"nordic_moon")
pkill conky
;;
"nordic_legion")
;;
*)
esac

View File

@@ -22,6 +22,24 @@ client.connect_signal(
end end
) )
client.connect_signal(
"unmanage",
function(_)
local focus_timer = timer({ timeout = 0.05 })
focus_timer:connect_signal(
"timeout",
function()
local c = awful.mouse.client_under_pointer()
if c ~= nil and not c.below then
client.focus = c
c:raise()
end
focus_timer:stop()
end)
focus_timer:start()
end
)
-- Enable sloppy focus, so that focus follows mouse. -- Enable sloppy focus, so that focus follows mouse.
client.connect_signal( client.connect_signal(
"mouse::enter", "mouse::enter",
@@ -75,7 +93,6 @@ client.connect_signal(
update_titlebars update_titlebars
) )
-- Automatically unminimize windows
client.connect_signal( client.connect_signal(
"property::minimized", "property::minimized",
function(c) function(c)
@@ -85,14 +102,15 @@ client.connect_signal(
end end
) )
-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) screen.connect_signal(
screen.connect_signal("property::geometry", set_wallpaper) "property::geometry",
set_wallpaper
)
tag.connect_signal( tag.connect_signal(
"property::selected", "property::selected",
function (t) function(t)
local selected = tostring(t.selected) == "false" if not t.selected then
if selected then
local focus_timer = timer({ timeout = 0.05 }) local focus_timer = timer({ timeout = 0.05 })
focus_timer:connect_signal( focus_timer:connect_signal(
"timeout", "timeout",

View File

@@ -0,0 +1,133 @@
---------------------------
-- Default awesome theme --
---------------------------
local gears = require("gears")
local theme_assets = require("beautiful.theme_assets")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
local gfs = require("gears.filesystem")
local themes_path = gfs.get_themes_dir()
local theme = {}
theme.font = "Sans Serif 11"
theme.icon_font = "Font Awesome 6 Free"
theme.icon_size = 11
theme.bg_normal = "#151821"
theme.bg_dark = "#000000"
theme.bg_focus = "#1f2430"
theme.bg_urgent = "#ed8274"
theme.fg_normal = "#ffffff"
theme.fg_focus = "#e4e4e4"
theme.fg_urgent = "#ffffff"
theme.fg_minimize = "#ffffff"
theme.taglist_bg_empty = theme.bg_normal
theme.taglist_bg_occupied = theme.bg_focus
theme.taglist_bg_urgent = "#e91e6399"
theme.taglist_bg_focus = "#ffffff1a"
theme.tasklist_bg_normal = theme.bg_normal
theme.tasklist_bg_focus = theme.bg_focus
theme.tasklist_bg_urgent = theme.bg_urgent
theme.tasklist_fg_focus = theme.fg_focus
theme.tasklist_fg_urgent = theme.fg_urgent
theme.tasklist_fg_normal = theme.fg_normal
theme.useless_gap = dpi(7)
theme.gap_single_client = true
theme.border_width = dpi(0)
theme.corner_radius = dpi(10)
theme.transparency = 85
-- taglist_[bg|fg]_[focus|urgent|occupied|empty|volatile]
-- tasklist_[bg|fg]_[focus|urgent]
-- titlebar_[bg|fg]_[normal|focus]
-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color]
-- mouse_finder_[color|timeout|animate_timeout|radius|factor]
-- prompt_[fg|bg|fg_cursor|bg_cursor|font]
-- hotkeys_[bg|fg|border_width|border_color|shape|opacity|modifiers_fg|label_bg|label_fg|group_margin|font|description_font]
-- notification_font
-- notification_[bg|fg]
-- notification_[width|height|margin]
-- notification_[border_color|border_width|shape|opacity]
theme.menu_height = dpi(15)
theme.menu_width = dpi(100)
-- menu_[bg|fg]_[normal|focus]
-- menu_[border_color|border_width]
-- Image recoloring
local function get_icon(icon_raw)
if icon_raw ~= nil then
return gears.color.recolor_image(icon_raw, theme.fg_focus)
else
return nil
end
end
-- Define the image to load
theme.titlebar_close_button_normal = get_icon(themes_path.."default/titlebar/close_normal.png")
theme.titlebar_close_button_focus = get_icon(themes_path.."default/titlebar/close_focus.png")
theme.titlebar_minimize_button_normal = get_icon(themes_path.."default/titlebar/minimize_normal.png")
theme.titlebar_minimize_button_focus = get_icon(themes_path.."default/titlebar/minimize_focus.png")
theme.titlebar_ontop_button_normal_inactive = get_icon(themes_path.."default/titlebar/ontop_normal_inactive.png")
theme.titlebar_ontop_button_focus_inactive = get_icon(themes_path.."default/titlebar/ontop_focus_inactive.png")
theme.titlebar_ontop_button_normal_active = get_icon(themes_path.."default/titlebar/ontop_normal_active.png")
theme.titlebar_ontop_button_focus_active = get_icon(themes_path.."default/titlebar/ontop_focus_active.png")
theme.titlebar_sticky_button_normal_inactive = get_icon(themes_path.."default/titlebar/sticky_normal_inactive.png")
theme.titlebar_sticky_button_focus_inactive = get_icon(themes_path.."default/titlebar/sticky_focus_inactive.png")
theme.titlebar_sticky_button_normal_active = get_icon(themes_path.."default/titlebar/sticky_normal_active.png")
theme.titlebar_sticky_button_focus_active = get_icon(themes_path.."default/titlebar/sticky_focus_active.png")
theme.titlebar_floating_button_normal_inactive = get_icon(themes_path.."default/titlebar/floating_normal_inactive.png")
theme.titlebar_floating_button_focus_inactive = get_icon(themes_path.."default/titlebar/floating_focus_inactive.png")
theme.titlebar_floating_button_normal_active = get_icon(themes_path.."default/titlebar/floating_normal_active.png")
theme.titlebar_floating_button_focus_active = get_icon(themes_path.."default/titlebar/floating_focus_active.png")
theme.titlebar_maximized_button_normal_inactive = get_icon(themes_path.."default/titlebar/maximized_normal_inactive.png")
theme.titlebar_maximized_button_focus_inactive = get_icon(themes_path.."default/titlebar/maximized_focus_inactive.png")
theme.titlebar_maximized_button_normal_active = get_icon(themes_path.."default/titlebar/maximized_normal_active.png")
theme.titlebar_maximized_button_focus_active = get_icon(themes_path.."default/titlebar/maximized_focus_active.png")
theme.wallpaper = get_icon(themes_path.."default/background.png")
-- You can use your own layout icons like this:
theme.layout_fairh = get_icon(themes_path.."default/layouts/fairhw.png")
theme.layout_fairv = get_icon(themes_path.."default/layouts/fairvw.png")
theme.layout_floating = get_icon(themes_path.."default/layouts/floatingw.png")
theme.layout_magnifier = get_icon(themes_path.."default/layouts/magnifierw.png")
theme.layout_max = get_icon(themes_path.."default/layouts/maxw.png")
theme.layout_fullscreen = get_icon(themes_path.."default/layouts/fullscreenw.png")
theme.layout_tilebottom = get_icon(themes_path.."default/layouts/tilebottomw.png")
theme.layout_tileleft = get_icon(themes_path.."default/layouts/tileleftw.png")
theme.layout_tile = get_icon(themes_path.."default/layouts/tilew.png")
theme.layout_tiletop = get_icon(themes_path.."default/layouts/tiletopw.png")
theme.layout_spiral = get_icon(themes_path.."default/layouts/spiralw.png")
theme.layout_dwindle = get_icon(themes_path.."default/layouts/dwindlew.png")
theme.layout_cornernw = get_icon(themes_path.."default/layouts/cornernww.png")
theme.layout_cornerne = get_icon(themes_path.."default/layouts/cornernew.png")
theme.layout_cornersw = get_icon(themes_path.."default/layouts/cornersww.png")
theme.layout_cornerse = get_icon(themes_path.."default/layouts/cornersew.png")
-- Generate Awesome icon:
theme.awesome_icon = theme_assets.awesome_icon(
theme.menu_height, theme.bg_focus, theme.fg_focus
)
-- Define the icon theme for application icons. If not set then the icons
-- from /usr/share/icons and /usr/share/icons/hicolor will be used.
theme.icon_theme = "Tela-blue-dark"
return theme

View File

@@ -1,22 +1,10 @@
local gears = require("gears") local gears = require("gears")
local beautiful = require("beautiful") local beautiful = require("beautiful")
local awful = require("awful") local awful = require("awful")
local wibox = require("wibox")
beautiful.init(gears.filesystem.get_configuration_dir() .. "theme/default/theme.lua")
beautiful.font = "Ubuntu Sans 11"
beautiful.useless_gap = 7
beautiful.gap_single_client = true
local theme = "nordic_legion"
beautiful.wallpaper = "/home/nick/Pictures/wallpapers/" .. theme .. "/wallpaper.png"
local cutout = "/home/nick/Pictures/wallpapers/" .. theme .. "/cutout.png"
function set_wallpaper(s) function set_wallpaper(s)
-- Wallpaper
if beautiful.wallpaper then if beautiful.wallpaper then
local wallpaper = beautiful.wallpaper local wallpaper = beautiful.wallpaper
-- If wallpaper is a function, call it with the screen
if type(wallpaper) == "function" then if type(wallpaper) == "function" then
wallpaper = wallpaper(s) wallpaper = wallpaper(s)
end end
@@ -24,6 +12,53 @@ function set_wallpaper(s)
end end
end end
local function set_transparency(t)
-- Percentage xx/100
awful.spawn("sed -i 's/[0-9]*:class_g/" .. t .. ":class_g/g' /home/nick/.config/picom/picom.conf", false)
-- Integer 0.xx/1.00
awful.spawn("sed -i 's/opacity: [0-9]*.[0-9]*/opacity: " .. t/100 .. "/g' /home/nick/.config/alacritty/alacritty.yml", false)
-- Binary xx/255
-- awful.spawn("sed -i 's/\"glassit.alpha\": [0-9]*/\"glassit.alpha\": " .. math.floor((t/100)*255 + 0.5) .. "/g' /home/nick/.config/Code/User/settings.json", false)
end
local theme = "abstract_office"
-- Cleanup running theme applications
awful.spawn("pkill conky", false)
-- Per-theme settings
if theme == "nordic_legion" then
beautiful.init(gears.filesystem.get_configuration_dir() .. "theme/nordic_legion/theme.lua")
beautiful.font = "Ubuntu Sans 11"
beautiful.useless_gap = 7
beautiful.gap_single_client = true
beautiful.wallpaper = "/home/nick/Pictures/wallpapers/nordic_legion/wallpaper.png"
-- Launch Conky
awful.spawn.with_shell("killall conky; conky -c /home/nick/.config/conky/conky_left.conf &>/dev/null & disown; conky -c /home/nick/.config/conky/conky_right.conf &>/dev/null & disown", false)
-- Configure Glava
awful.spawn("sed -i 's/#request mod .*/#request mod bars/g' /home/nick/.config/glava/rc.glsl", false)
awful.spawn("sed -i 's/#request setgeometry .*/#request setgeometry 0 0 2560 1600/g' /home/nick/.config/glava/rc.glsl", false)
elseif theme == "abstract_office" then
beautiful.init(gears.filesystem.get_configuration_dir() .. "theme/abstract_office/theme.lua")
beautiful.wallpaper = "/home/nick/Pictures/wallpapers/abstract_office/Square.jpg"
-- Configure Glava
awful.spawn("sed -i 's/#request mod .*/#request mod bars/g' /home/nick/.config/glava/rc.glsl", false)
awful.spawn("sed -i 's/#request setgeometry .*/#request setgeometry 0 0 2560 1600/g' /home/nick/.config/glava/rc.glsl", false)
end
-- Update external configs
awful.spawn("sed -i 's/corner-radius = [0-9]*/corner-radius = " .. beautiful.corner_radius .. "/g' /home/nick/.config/picom/picom.conf", false)
set_transparency(beautiful.transparency)
-- Restart Glava if it's running
awful.spawn.with_shell("if pgrep glava; then killall glava; glava --desktop &>/dev/null & disown; fi", false)
local bling = require("extras.bling") local bling = require("extras.bling")
awful.layout.layouts = { awful.layout.layouts = {
@@ -36,28 +71,3 @@ awful.layout.layouts = {
awful.layout.suit.corner.nw, awful.layout.suit.corner.nw,
awful.layout.suit.floating awful.layout.suit.floating
} }
-- Wallpaper cutout
local imgbox = wibox({
type = "desktop",
width = 2560,
height = 1600,
x = 0,
y = 0,
visible = true,
focusable = false,
opacity = 1,
bg = "#00000000",
})
imgbox:setup{
layout = wibox.layout.fixed.vertical,
{
widget = wibox.widget.imagebox,
image = cutout,
}
}
-- Launch conky if theme is nordic_legion
if theme == "nordic_legion" then
awful.spawn.with_shell("killall conky; conky -c /home/nick/.config/conky/conky_left.conf; conky -c /home/nick/.config/conky/conky_right.conf")
end

View File

@@ -0,0 +1,134 @@
---------------------------
-- Default awesome theme --
---------------------------
local gears = require("gears")
local theme_assets = require("beautiful.theme_assets")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
local gfs = require("gears.filesystem")
local themes_path = gfs.get_themes_dir()
local theme = {}
theme.font = "Sans Serif 11"
theme.icon_font = "Font Awesome 6 Free"
theme.icon_size = 11
theme.bg_normal = "#2e3440"
theme.bg_focus = "#535d6c"
theme.bg_urgent = "#ff0000"
theme.bg_minimize = "#444444"
theme.fg_normal = "#ffffff"
theme.fg_focus = "#ffffff"
theme.fg_urgent = "#ffffff"
theme.fg_minimize = "#ffffff"
theme.tasklist_bg_normal = theme.bg_normal
theme.tasklist_bg_focus = "#4c566a"
theme.tasklist_bg_urgent = "#bf616a"
theme.tasklist_bg_minimize = "#5e81ac"
theme.useless_gap = dpi(7)
theme.gap_single_client = true
theme.border_width = dpi(0)
theme.corner_radius = dpi(10)
theme.transparency = 95
-- taglist_[bg|fg]_[focus|urgent|occupied|empty|volatile]
-- tasklist_[bg|fg]_[focus|urgent]
-- titlebar_[bg|fg]_[normal|focus]
-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color]
-- mouse_finder_[color|timeout|animate_timeout|radius|factor]
-- prompt_[fg|bg|fg_cursor|bg_cursor|font]
-- hotkeys_[bg|fg|border_width|border_color|shape|opacity|modifiers_fg|label_bg|label_fg|group_margin|font|description_font]
-- Generate taglist squares:
local taglist_square_size = dpi(4)
theme.taglist_squares_sel = theme_assets.taglist_squares_sel(
taglist_square_size, theme.fg_normal
)
theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel(
taglist_square_size, theme.fg_normal
)
-- notification_font
-- notification_[bg|fg]
-- notification_[width|height|margin]
-- notification_[border_color|border_width|shape|opacity]
theme.menu_height = dpi(15)
theme.menu_width = dpi(100)
-- menu_[bg|fg]_[normal|focus]
-- menu_[border_color|border_width]
-- Image recoloring
local function get_icon(icon_raw)
if icon_raw ~= nil then
return gears.color.recolor_image(icon_raw, theme.fg_focus)
else
return nil
end
end
-- Define the image to load
theme.titlebar_close_button_normal = get_icon(themes_path.."default/titlebar/close_normal.png")
theme.titlebar_close_button_focus = get_icon(themes_path.."default/titlebar/close_focus.png")
theme.titlebar_minimize_button_normal = get_icon(themes_path.."default/titlebar/minimize_normal.png")
theme.titlebar_minimize_button_focus = get_icon(themes_path.."default/titlebar/minimize_focus.png")
theme.titlebar_ontop_button_normal_inactive = get_icon(themes_path.."default/titlebar/ontop_normal_inactive.png")
theme.titlebar_ontop_button_focus_inactive = get_icon(themes_path.."default/titlebar/ontop_focus_inactive.png")
theme.titlebar_ontop_button_normal_active = get_icon(themes_path.."default/titlebar/ontop_normal_active.png")
theme.titlebar_ontop_button_focus_active = get_icon(themes_path.."default/titlebar/ontop_focus_active.png")
theme.titlebar_sticky_button_normal_inactive = get_icon(themes_path.."default/titlebar/sticky_normal_inactive.png")
theme.titlebar_sticky_button_focus_inactive = get_icon(themes_path.."default/titlebar/sticky_focus_inactive.png")
theme.titlebar_sticky_button_normal_active = get_icon(themes_path.."default/titlebar/sticky_normal_active.png")
theme.titlebar_sticky_button_focus_active = get_icon(themes_path.."default/titlebar/sticky_focus_active.png")
theme.titlebar_floating_button_normal_inactive = get_icon(themes_path.."default/titlebar/floating_normal_inactive.png")
theme.titlebar_floating_button_focus_inactive = get_icon(themes_path.."default/titlebar/floating_focus_inactive.png")
theme.titlebar_floating_button_normal_active = get_icon(themes_path.."default/titlebar/floating_normal_active.png")
theme.titlebar_floating_button_focus_active = get_icon(themes_path.."default/titlebar/floating_focus_active.png")
theme.titlebar_maximized_button_normal_inactive = get_icon(themes_path.."default/titlebar/maximized_normal_inactive.png")
theme.titlebar_maximized_button_focus_inactive = get_icon(themes_path.."default/titlebar/maximized_focus_inactive.png")
theme.titlebar_maximized_button_normal_active = get_icon(themes_path.."default/titlebar/maximized_normal_active.png")
theme.titlebar_maximized_button_focus_active = get_icon(themes_path.."default/titlebar/maximized_focus_active.png")
theme.wallpaper = get_icon(themes_path.."default/background.png")
-- You can use your own layout icons like this:
theme.layout_fairh = get_icon(themes_path.."default/layouts/fairhw.png")
theme.layout_fairv = get_icon(themes_path.."default/layouts/fairvw.png")
theme.layout_floating = get_icon(themes_path.."default/layouts/floatingw.png")
theme.layout_magnifier = get_icon(themes_path.."default/layouts/magnifierw.png")
theme.layout_max = get_icon(themes_path.."default/layouts/maxw.png")
theme.layout_fullscreen = get_icon(themes_path.."default/layouts/fullscreenw.png")
theme.layout_tilebottom = get_icon(themes_path.."default/layouts/tilebottomw.png")
theme.layout_tileleft = get_icon(themes_path.."default/layouts/tileleftw.png")
theme.layout_tile = get_icon(themes_path.."default/layouts/tilew.png")
theme.layout_tiletop = get_icon(themes_path.."default/layouts/tiletopw.png")
theme.layout_spiral = get_icon(themes_path.."default/layouts/spiralw.png")
theme.layout_dwindle = get_icon(themes_path.."default/layouts/dwindlew.png")
theme.layout_cornernw = get_icon(themes_path.."default/layouts/cornernww.png")
theme.layout_cornerne = get_icon(themes_path.."default/layouts/cornernew.png")
theme.layout_cornersw = get_icon(themes_path.."default/layouts/cornersww.png")
theme.layout_cornerse = get_icon(themes_path.."default/layouts/cornersew.png")
-- Generate Awesome icon:
theme.awesome_icon = theme_assets.awesome_icon(
theme.menu_height, theme.bg_focus, theme.fg_focus
)
-- Define the icon theme for application icons. If not set then the icons
-- from /usr/share/icons and /usr/share/icons/hicolor will be used.
theme.icon_theme = "Tela-blue-dark"
return theme

View File

@@ -68,7 +68,7 @@ show_uptime=True
check_temp=True check_temp=True
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. #* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor=Auto cpu_sensor=k10temp:Tctl
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found #* Show temperatures for cpu cores also if check_temp is True and sensors has been found
show_coretemp=True show_coretemp=True

View File

@@ -0,0 +1,38 @@
[General]
activateWindowBeforeWritingByDefault=false
aliasExactMatching=false
customQssFilePath=/home/nick/.config/gazatu.xyz/style.qss
enableEmojiIncludesSearch=true
gendersDisabled=false
hideInputMethod=false
localeKey=
maxEmojiVersion=-1
openAtMouseLocation=false
skinTonesDisabled=false
startInKaomojiMode=false
surroundAliasesWithColons=true
swapEnterAndShiftEnter=false
useClipboardHackByDefault=false
useSystemEmojiFont=false
useSystemEmojiFontWidthHeuristics=true
useSystemQtTheme=false
windowOpacity=0.95
[activateWindowBeforeWritingExceptions]
1\processName=code
2\processName=code-oss
3\processName=chrome
4\processName=chromium
5\processName=kate
6\processName=
size=6
[emojiAliasesIniFilePaths]
1\path=:/aliases/github-emojis.ini
2\path=:/aliases/gitmoji-emojis.ini
size=2
[useClipboardHackExceptions]
1\processName=chatterino
2\processName=kate
size=2

View File

@@ -0,0 +1,215 @@
/* QDarkStyleSheet -----------------------------------------------------------
This is the main style sheet, the palette has nine colors.
It is based on three selecting colors, three greyish (background) colors
plus three whitish (foreground) colors. Each set of widgets of the same
type have a header like this:
------------------
GroupName --------
------------------
And each widget is separated with a header like this:
QWidgetName ------
This makes more easy to find and change some css field. The basic
configuration is described bellow.
BACKGROUND -----------
Light (unpressed)
Normal (border, disabled, pressed, checked, toolbars, menus)
Dark (background)
FOREGROUND -----------
Light (texts/labels)
Normal (not used yet)
Dark (disabled texts)
SELECTION ------------
Light (selection/hover/active)
Normal (selected)
Dark (selected disabled)
If a stranger configuration is required because of a bugfix or anything
else, keep the comment on the line above so nobody changes it, including the
issue number.
*/
/*
See Qt documentation:
- https://doc.qt.io/qt-5/stylesheet.html
- https://doc.qt.io/qt-5/stylesheet-reference.html
- https://doc.qt.io/qt-5/stylesheet-examples.html
--------------------------------------------------------------------------- */
/* QWidget ----------------------------------------------------------------
--------------------------------------------------------------------------- */
QWidget {
background-color: transparent;
border: 0px;
padding: 0px;
color: #F0F0F0;
selection-background-color: #15191f;
selection-color: #F0F0F0;
}
QWidget:disabled {
background-color: #15191f;
color: #15191f;
selection-background-color: #15191f;
selection-color: #15191f;
}
QWidget::item:selected {
background-color: #15191f;
}
QWidget::item:hover {
background-color: #15191f;
color: #15191f;
}
/* QMainWindow ------------------------------------------------------------
This adjusts the splitter in the dock widget, not qsplitter
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow
--------------------------------------------------------------------------- */
QMainWindow {
background-color: #15191f;
}
QMainWindow::separator {
background-color: #15191f;
border: 0px;
spacing: 0px;
padding: 2px;
}
QMainWindow::separator:hover {
background-color: #15191f;
border: 0px;
}
/* QToolTip ---------------------------------------------------------------
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip
--------------------------------------------------------------------------- */
QToolTip {
border: 1px solid #15191f;
color: #15191f;
padding: 0px;
background-color: #15191f;
color: #F0F0F0;
}
/* ... */
/* QLabel -----------------------------------------------------------------
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe
--------------------------------------------------------------------------- */
QLabel {
border: 0px solid #15191f;
padding: 2px;
margin: 0px;
color: #F0F0F0;
}
QLabel:disabled {
background-color: #15191f;
border: 0px solid #15191f;
color: #15191f;
}
/* ... */
/* QLineEdit --------------------------------------------------------------
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit
--------------------------------------------------------------------------- */
QLineEdit {
background-color: #15191f;
padding-top: 2px;
padding-bottom: 2px;
padding-left: 5px;
padding-right: 5px;
border-style: solid;
border: 1px solid #15191f;
border-radius: 5px;
color: #f0f0f0;
height: 28px;
font-size: 14px;
}
QLineEdit:disabled {
background-color: #15191f;
color: #15191f;
}
QLineEdit:hover {
border: 1px solid #15191f;
color: #F0F0F0;
}
QLineEdit:focus {
border: 1px solid #15191f;
}
QLineEdit:selected {
background-color: #15191f;
color: #15191f;
}
/* APPLICATION SPECIFIC CSS */
.EmojiLineEdit {
padding: 2px 5px 2px 5px;
height: 28px;
font-size: 14px;
}
.EmojiLineEdit_previewLabel {
padding-left: 5px;
font-size: 14px;
color: rgba(240, 240, 240, 0.60);
}
.EmojiLineEdit_favsLabel,
.EmojiLineEdit_helpLabel {
padding: 1px 2px 1px 2px;
border-radius: 5px;
font-size: 14px;
}
.EmojiLineEdit_favsLabel:hover,
.EmojiLineEdit_helpLabel:hover {
background-color: rgba(240, 240, 240, 0.33);
}
.EmojiPicker_emojiLabel {
padding: 2px;
border-radius: 5px;
}
.EmojiPicker_emojiLabel.useFont {
padding: 0px;
border-radius: 5px;
/* font-size: 28px; */
}
.EmojiPicker_emojiLabel:hover {
background-color: rgba(240, 240, 240, 0.33);
}

View File

@@ -0,0 +1,11 @@
[Filechooser Settings]
LocationMode=path-bar
ShowHidden=false
ShowSizeColumn=true
GeometryX=0
GeometryY=0
GeometryWidth=840
GeometryHeight=630
SortColumn=name
SortOrder=ascending
StartupMode=recent

View File

@@ -4,7 +4,7 @@ glx-no-stencil = true;
glx-no-rebind-pixmap = true; glx-no-rebind-pixmap = true;
unredir-if-possible = true; unredir-if-possible = true;
corner-radius = 9; corner-radius = 10;
rounded-corners-exclude = [ rounded-corners-exclude = [
"window_type = 'dock'", "window_type = 'dock'",
"window_type = 'desktop'" "window_type = 'desktop'"
@@ -22,6 +22,10 @@ shadow-exclude = [
"name = 'GLava'", "name = 'GLava'",
"class_g = 'Conky'", "class_g = 'Conky'",
"window_type = 'dock'", "window_type = 'dock'",
"window_type = 'menu'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'",
"window_type = 'tooltip'",
]; ];
shadow-ignore-shaped = false; shadow-ignore-shaped = false;
@@ -33,16 +37,28 @@ blur-background = true;
blur-background-exclude = [ blur-background-exclude = [
"name = 'GLava'", "name = 'GLava'",
"class_g = 'Conky'", "class_g = 'Conky'",
"window_type = 'desktop'" "class_g = 'kdeconnect.daemon'",
"window_type = 'desktop'",
"window_type = 'menu'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'",
"window_type = 'tooltip'",
]; ];
blur-kern = "3x3box"; blur-kern = "3x3box";
blur-method = "dual_kawase"; blur-method = "dual_kawase";
blur-strength = 5; blur-strength = 10;
opacity-rule = [ opacity-rule = [
"95:class_g = 'thunar'", "85:class_g = 'thunar'",
"95:class_g = 'Thunar'", "85:class_g = 'Thunar'",
"85:class_g = 'rofi'",
"85:class_g = 'Rofi'",
"85:class_g = 'spotify'",
"85:class_g = 'Spotify'",
"85:class_g = 'qalculate-gtk'",
"85:class_g = 'Qalculate-gtk'",
"70:name = 'GLava'",
]; ];
fading = true; fading = true;
fade-in-step = 0.08; fade-in-step = 0.08;
fade-out-step = 0.08; fade-out-step = 0.08;

View File

@@ -13,14 +13,13 @@ set -e
set -u set -u
# All supported choices # All supported choices
all=(shutdown reboot suspend hibernate logout lockscreen reboot-windows reboot-uefi) all=(shutdown reboot suspend hibernate lockscreen logout reboot-windows reboot-uefi)
# By default, show all (i.e., just copy the array) # By default, show all (i.e., just copy the array)
show=("${all[@]}") show=("${all[@]}")
declare -A texts declare -A texts
texts[lockscreen]="lock screen" texts[lockscreen]="lock screen"
texts[switchuser]="switch user"
texts[logout]="log out" texts[logout]="log out"
texts[suspend]="suspend" texts[suspend]="suspend"
texts[hibernate]="hibernate" texts[hibernate]="hibernate"
@@ -31,7 +30,6 @@ texts[shutdown]="shut down"
declare -A icons declare -A icons
icons[lockscreen]="\uf023" icons[lockscreen]="\uf023"
icons[switchuser]="\uf518"
icons[logout]="\uf842" icons[logout]="\uf842"
icons[suspend]="\uf9b1" icons[suspend]="\uf9b1"
icons[hibernate]="\uf7c9" icons[hibernate]="\uf7c9"
@@ -42,7 +40,7 @@ icons[shutdown]="\uf011"
icons[cancel]="\u00d7" icons[cancel]="\u00d7"
declare -A actions declare -A actions
actions[lockscreen]="dm-tool lock" actions[lockscreen]="dm-tool switch-to-greeter"
actions[logout]="pkill awesome" actions[logout]="pkill awesome"
actions[suspend]="systemctl suspend" actions[suspend]="systemctl suspend"
actions[hibernate]="systemctl hibernate" actions[hibernate]="systemctl hibernate"
@@ -51,8 +49,8 @@ actions[reboot-windows]="sudo grub-reboot 2; systemctl reboot"
actions[reboot-uefi]="sudo grub-reboot 3; systemctl reboot" actions[reboot-uefi]="sudo grub-reboot 3; systemctl reboot"
actions[shutdown]="systemctl poweroff" actions[shutdown]="systemctl poweroff"
# By default, ask for confirmation for actions that are irreversible # Ask for confirmation for every action by default
confirmations=(reboot reboot-windows shutdown logout) confirmations=("${all[@]}")
# By default, no dry run # By default, no dry run
dryrun=false dryrun=false

View File

@@ -55,17 +55,17 @@
anaconda # conda environment (https://conda.io/) anaconda # conda environment (https://conda.io/)
pyenv # python environment (https://github.com/pyenv/pyenv) pyenv # python environment (https://github.com/pyenv/pyenv)
goenv # go environment (https://github.com/syndbg/goenv) goenv # go environment (https://github.com/syndbg/goenv)
nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) # nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv)
nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) nvm # node.js version from nvm (https://github.com/nvm-sh/nvm)
nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) # nodeenv # node.js environment (https://github.com/ekalinin/nodeenv)
# node_version # node.js version # node_version # node.js version
# go_version # go version (https://golang.org) go_version # go version (https://golang.org)
# rust_version # rustc version (https://www.rust-lang.org) rust_version # rustc version (https://www.rust-lang.org)
# dotnet_version # .NET version (https://dotnet.microsoft.com) dotnet_version # .NET version (https://dotnet.microsoft.com)
# php_version # php version (https://www.php.net/) php_version # php version (https://www.php.net/)
# laravel_version # laravel php framework version (https://laravel.com/) laravel_version # laravel php framework version (https://laravel.com/)
# java_version # java version (https://www.java.com/) java_version # java version (https://www.java.com/)
# package # name@version from package.json (https://docs.npmjs.com/files/package.json) package # name@version from package.json (https://docs.npmjs.com/files/package.json)
rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv)
rvm # ruby version from rvm (https://rvm.io) rvm # ruby version from rvm (https://rvm.io)
fvm # flutter version management (https://github.com/leoafarias/fvm) fvm # flutter version management (https://github.com/leoafarias/fvm)
@@ -77,7 +77,7 @@
haskell_stack # haskell version from stack (https://haskellstack.org/) haskell_stack # haskell version from stack (https://haskellstack.org/)
kubecontext # current kubernetes context (https://kubernetes.io/) kubecontext # current kubernetes context (https://kubernetes.io/)
terraform # terraform workspace (https://www.terraform.io) terraform # terraform workspace (https://www.terraform.io)
# terraform_version # terraform version (https://www.terraform.io) terraform_version # terraform version (https://www.terraform.io)
aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)
aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/)
azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) azure # azure account name (https://docs.microsoft.com/en-us/cli/azure)
@@ -92,14 +92,14 @@
vim_shell # vim shell indicator (:sh) vim_shell # vim shell indicator (:sh)
midnight_commander # midnight commander shell (https://midnight-commander.org/) midnight_commander # midnight commander shell (https://midnight-commander.org/)
nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html)
# vpn_ip # virtual private network indicator vpn_ip # virtual private network indicator
# load # CPU load # load # CPU load
# disk_usage # disk usage # disk_usage # disk usage
# ram # free RAM # ram # free RAM
# swap # used swap # swap # used swap
todo # todo items (https://github.com/todotxt/todo.txt-cli) # todo # todo items (https://github.com/todotxt/todo.txt-cli)
timewarrior # timewarrior tracking status (https://timewarrior.net/) # timewarrior # timewarrior tracking status (https://timewarrior.net/)
taskwarrior # taskwarrior task count (https://taskwarrior.org/) # taskwarrior # taskwarrior task count (https://taskwarrior.org/)
battery battery
time # current time time # current time
# =========================[ Line #2 ]========================= # =========================[ Line #2 ]=========================
@@ -517,7 +517,7 @@
# Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as
# it will signify error by turning red. # it will signify error by turning red.
typeset -g POWERLEVEL9K_STATUS_ERROR=false typeset -g POWERLEVEL9K_STATUS_ERROR=true
typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160
typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘'

55
.config/zsh/.zshrc Normal file
View File

@@ -0,0 +1,55 @@
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
export ZSH="$HOME/.config/zsh/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
HYPHEN_INSENSITIVE="true"
setopt correct
zstyle ':omz:update' mode reminder
zstyle ':omz:update' frequency 14
plugins=(
colored-man-pages
colorize
command-not-found
cp
history
history-substring-search
rsync
safe-paste
screen
tmux
urltools
z
docker
git
npm
nvm
python
archlinux
battery
)
source $ZSH/oh-my-zsh.sh
source /usr/share/nvm/init-nvm.sh
HISTFILE=$HOME/.config/zsh/.histfile
HISTSIZE=10000
# export MANPATH="/usr/local/man:$MANPATH"
# export LANG=en_US.UTF-8
# export ARCHFLAGS="-arch x86_64"
alias la='ls -la --human-readable'
alias neo='neofetch'
alias fetch='neofetch'
alias tor='sudo /usr/bin/tor'
alias ssh='TERM=xterm-256color ssh'
alias proton-call-ge='proton-call -c /usr/share/steam/compatibilitytools.d/proton-ge-custom -r'
alias sync-timezone='timedatectl set-timezone "$(curl --fail https://ipapi.co/timezone)" && timedatectl'
[[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh

View File

@@ -2,3 +2,5 @@
setxkbmap -layout "us,gr" -option "grp:alt_shift_toggle" setxkbmap -layout "us,gr" -option "grp:alt_shift_toggle"
export WINIT_X11_SCALE_FACTOR=1 export WINIT_X11_SCALE_FACTOR=1
[[ -f /etc/zsh/zshenv ]] && source /etc/zsh/zshenv

118
.zshrc
View File

@@ -1,118 +0,0 @@
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# If you come from bash you might have to change your $PATH.
export PATH=/opt/cuda/bin:$HOME/.local/bin:/usr/local/bin:$PATH
# Path to your oh-my-zsh installation.
export ZSH="/home/nick/.oh-my-zsh"
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"
# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
HYPHEN_INSENSITIVE="true"
# Enable Autocorrect
setopt correct
# Uncomment one of the following lines to change the auto-update behavior
# zstyle ':omz:update' mode disabled # disable automatic updates
# zstyle ':omz:update' mode auto # update automatically without asking
zstyle ':omz:update' mode reminder # just remind me to update when it's time
# Uncomment the following line to change how often to auto-update (in days).
zstyle ':omz:update' frequency 13
# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS="true"
# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"
# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"
# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"
# Uncomment the following line to display red dots whilst waiting for completion.
# You can also set it to another string to have that shown instead of the default red dots.
# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
# COMPLETION_WAITING_DOTS="true"
# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"
# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
colored-man-pages
colorize
command-not-found
cp
history
history-substring-search
rsync
safe-paste
screen
tmux
urltools
z
docker
git
python
archlinux
battery
)
source $ZSH/oh-my-zsh.sh
# User configuration
HISTFILE="$HOME/.histfile"
HISTSIZE=10000
# export MANPATH="/usr/local/man:$MANPATH"
# export LANG=en_US.UTF-8
export EDITOR=nano
# export ARCHFLAGS="-arch x86_64"
# For a full list of active aliases, run `alias`.
alias la='ls -la --human-readable'
alias neo='neofetch'
alias fetch='neofetch'
alias tor='sudo /usr/bin/tor'
alias ssh='TERM=xterm-256color ssh'
alias proton-call-ge='proton-call -c /usr/share/steam/compatibilitytools.d/proton-ge-custom -r'
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

View File

@@ -1,5 +1,7 @@
# dotfiles # dotfiles
![Wallpaper](./wallpapers/abstract_office/Cage.jpg)
Config files for my Legion 7 2021. Config files for my Legion 7 2021.
## Programs Used ## Programs Used
@@ -40,6 +42,16 @@ Config files for my Legion 7 2021.
## Screenshots ## Screenshots
### Abstract Office
![Abstract Office](./screenshots/abstract-office.png)
![Programs](./screenshots/abstract-office-programs.png)
### Nordic Firewatch
![Nordic Firewatch](./screenshots/nordic-firewatch.png) ![Nordic Firewatch](./screenshots/nordic-firewatch.png)
![Programs](./screenshots/programs.png) ![Programs](./screenshots/nordic-firewatch-programs.png)
![Nordic Legion](./screenshots/nordic-legion.png)
### Nordic Legion
![Nordic Legion](./screenshots/nordic-legion.png)

24
etc/zsh/zshenv Normal file
View File

@@ -0,0 +1,24 @@
export EDITOR=nano
export PATH=$HOME/.local/bin:/usr/local/bin:$PATH:/home/nick/.spicetify:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools
export XDG_DATA_HOME=$HOME/.local/share
export XDG_CONFIG_HOME=$HOME/.config
export XDG_STATE_HOME=$HOME/.local/state
export XDG_CACHE_HOME=$HOME/.cache
export ANDROID_HOME="/home/nick/.android/sdk"
export ZDOTDIR=$HOME/.config/zsh
export CARGO_HOME="$XDG_DATA_HOME"/cargo
export CUDA_CACHE_PATH="$XDG_CACHE_HOME"/nv
export DOCKER_CONFIG="$XDG_CONFIG_HOME"/docker
export GNUPGHOME="$XDG_DATA_HOME"/gnupg
export GTK2_RC_FILES="$XDG_CONFIG_HOME"/gtk-2.0/gtkrc
export IPYTHONDIR="$XDG_CONFIG_HOME"/ipython
export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java
export _Z_DATA="$XDG_DATA_HOME/z"
export NVM_DIR="$XDG_DATA_HOME/nvm"
alias nvidia-settings='nvidia-settings --config="$XDG_CONFIG_HOME"/nvidia/settings'
alias wget='wget --hsts-file="$XDG_DATA_HOME/wget-hsts"'
alias yarn='yarn --use-yarnrc $XDG_CONFIG_HOME/yarn/config'

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

Before

Width:  |  Height:  |  Size: 582 KiB

After

Width:  |  Height:  |  Size: 582 KiB

0
templates/Dots/.gitignore vendored Normal file
View File

0
templates/Dots/.nomedia Normal file
View File

View File

@@ -0,0 +1 @@
#!/bin/bash

View File

@@ -0,0 +1,14 @@
\documentclass{report}
\usepackage[a4paper, margin=1in]{geometry}
\usepackage{hyperref}
\usepackage{float}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{amsmath}
\usepackage{listings}
%\setlength{\parskip}{0.5em}
\setlength{\parindent}{0pt}
\begin{document}
\end{document}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Some files were not shown because too many files have changed in this diff Show More