From de15a46696c0d5ef6cb1caae5aa7673eab0d9ae9 Mon Sep 17 00:00:00 2001 From: Crescent617 Date: Thu, 6 Jul 2023 00:14:00 +0800 Subject: [PATCH] fix simlink --- rc.lua | 872 +++++++++++++++++++++++++++++++++++- themes/multicolor/theme.lua | 234 +++++++++- 2 files changed, 1104 insertions(+), 2 deletions(-) mode change 120000 => 100644 rc.lua mode change 120000 => 100644 themes/multicolor/theme.lua diff --git a/rc.lua b/rc.lua deleted file mode 120000 index 6b1467e..0000000 --- a/rc.lua +++ /dev/null @@ -1 +0,0 @@ -/home/hrli/repos/dotfiles/awesomewm/rc.lua \ No newline at end of file diff --git a/rc.lua b/rc.lua new file mode 100644 index 0000000..59d3882 --- /dev/null +++ b/rc.lua @@ -0,0 +1,871 @@ +--[[ + Awesome WM configuration template + github.com/lcpz + +--]] + +-- {{{ Required libraries + +-- If LuaRocks is installed, make sure that packages installed through it are +-- found (e.g. lgi). If LuaRocks is not installed, do nothing. +pcall(require, "luarocks.loader") + +local gears = require "gears" +local awful = require "awful" +require "awful.autofocus" +local wibox = require "wibox" +local beautiful = require "beautiful" +local naughty = require "naughty" +local lain = require "lain" +local freedesktop = require "freedesktop" +local hotkeys_popup = require "awful.hotkeys_popup" +require "awful.hotkeys_popup.keys" +local mytable = awful.util.table or gears.table -- 4.{0,1} compatibility +local volume_widget = require "awesome-wm-widgets.volume-widget.volume" + +-- }}} + +-- {{{ Error handling + +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify { + preset = naughty.config.presets.critical, + title = "Oops! there were errors during startup!", + text = awesome.startup_errors, + } +end + +-- Handle runtime errors after startup +do + local in_error = false + + awesome.connect_signal("debug::error", function(err) + if in_error then + return + end + + in_error = true + + naughty.notify { + preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = tostring(err), + } + + in_error = false + end) +end + +-- }}} + +-- {{{ Autostart windowless processes + +-- This function will run once every time Awesome is started +awful.spawn.once(string.format("sh -c 'cd %s && ls | xargs -n1 gio launch'", os.getenv "HOME" .. "/.config/autostart")) +-- awful.spawn.once "picom" + +-- This function implements the XDG autostart specification +--[[ +awful.spawn.with_shell( + 'if (xrdb -query | grep -q "^awesome\\.started:\\s*true$"); then exit; fi;' .. + 'xrdb -merge <<< "awesome.started:true";' .. + -- list each of your autostart commands, followed by ; inside single quotes, followed by .. + 'dex --environment Awesome --autostart --search-paths "$XDG_CONFIG_DIRS/autostart:$XDG_CONFIG_HOME/autostart"' -- https://github.com/jceb/dex +) +--]] + +-- }}} + +-- {{{ Variable definitions +local modkey = "Mod4" +local altkey = "Mod1" +-- local terminal = "gnome-terminal" +local terminal = "/home/hrli/.local/kitty.app/bin/kitty" +local vi_focus = false -- vi-like client focus https://github.com/lcpz/awesome-copycats/issues/275 +local cycle_prev = true -- cycle with only the previously focused client or all https://github.com/lcpz/awesome-copycats/issues/274 +local editor = os.getenv "EDITOR" or "nvim" +-- local browser = "librewolf" +local scrlocker = "slock" +local launcher = "rofi -show drun" +-- local launcher = "dmenu_run -i -fn Monospace -p 'Open '" + +awful.util.terminal = terminal +awful.util.tagnames = { "1: ", "2:", "3: ", "4: ", "5:󰊠 " } +awful.layout.layouts = { + awful.layout.suit.spiral, + --awful.layout.suit.spiral.dwindle, + -- awful.layout.suit.floating, + -- awful.layout.suit.tile, + -- awful.layout.suit.tile.left, + -- awful.layout.suit.tile.bottom, + -- awful.layout.suit.tile.top, + -- awful.layout.suit.fair, + --awful.layout.suit.fair.horizontal, + --awful.layout.suit.max, + --awful.layout.suit.max.fullscreen, + --awful.layout.suit.magnifier, + --awful.layout.suit.corner.nw, + --awful.layout.suit.corner.ne, + --awful.layout.suit.corner.sw, + --awful.layout.suit.corner.se, + -- lain.layout.cascade, + --lain.layout.cascade.tile, + --lain.layout.centerwork, + --lain.layout.centerwork.horizontal, + lain.layout.termfair, + --lain.layout.termfair.center +} + +lain.layout.termfair.nmaster = 3 +lain.layout.termfair.ncol = 1 +lain.layout.termfair.center.nmaster = 3 +lain.layout.termfair.center.ncol = 1 +lain.layout.cascade.tile.offset_x = 2 +lain.layout.cascade.tile.offset_y = 32 +lain.layout.cascade.tile.extra_padding = 5 +lain.layout.cascade.tile.nmaster = 5 +lain.layout.cascade.tile.ncol = 2 + +awful.util.taglist_buttons = mytable.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), + awful.button({}, 4, function(t) + awful.tag.viewnext(t.screen) + end), + awful.button({}, 5, function(t) + awful.tag.viewprev(t.screen) + end) +) + +awful.util.tasklist_buttons = mytable.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), + awful.button({}, 3, function() + awful.menu.client_list { theme = { width = 250 } } + end), + awful.button({}, 4, function() + awful.client.focus.byidx(1) + end), + awful.button({}, 5, function() + awful.client.focus.byidx(-1) + end) +) + +beautiful.init(string.format("%s/.config/awesome/themes/multicolor/theme.lua", os.getenv "HOME")) + +-- }}} + +-- {{{ Custom +--- naughty config +naughty.config.spacing = 10 +naughty.config.padding = 30 +function naughty.config.notify_callback(args) + local is_done = string.find(string.lower(args.text), "done") + if is_done then + awful.spawn "paplay /usr/share/sounds/freedesktop/stereo/complete.oga" + else + awful.spawn "paplay /usr/share/sounds/freedesktop/stereo/message.oga" + end + return args +end + +-- }}} + +-- {{{ Menu + +-- Create a launcher widget and a main menu +local myawesomemenu = { + { + "Hotkeys", + function() + hotkeys_popup.show_help(nil, awful.screen.focused()) + end, + }, + { "Manual", string.format("%s -e man awesome", terminal) }, + { "Edit config", string.format("%s -e %s %s", terminal, editor, awesome.conffile) }, + { "Restart", awesome.restart }, + { + "Quit", + function() + awesome.quit() + end, + }, +} + +awful.util.mymainmenu = freedesktop.menu.build { + before = { + { "Awesome", myawesomemenu, beautiful.awesome_icon }, + -- other triads can be put here + }, + after = { + { "Open terminal", terminal }, + -- other triads can be put here + }, +} + +-- Hide the menu when the mouse leaves it +--[[ +awful.util.mymainmenu.wibox:connect_signal("mouse::leave", function() + if not awful.util.mymainmenu.active_child or + (awful.util.mymainmenu.wibox ~= mouse.current_wibox and + awful.util.mymainmenu.active_child.wibox ~= mouse.current_wibox) then + awful.util.mymainmenu:hide() + else + awful.util.mymainmenu.active_child.wibox:connect_signal("mouse::leave", + function() + if awful.util.mymainmenu.wibox ~= mouse.current_wibox then + awful.util.mymainmenu:hide() + end + end) + end +end) +--]] + +-- }}} + +-- {{{ Screen + +-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) +screen.connect_signal("property::geometry", function(s) + -- Wallpaper + if beautiful.wallpaper then + local wallpaper = beautiful.wallpaper + -- If wallpaper is a function, call it with the screen + if type(wallpaper) == "function" then + wallpaper = wallpaper(s) + end + gears.wallpaper.maximized(wallpaper, s, true) + end +end) + +-- No borders when rearranging only 1 non-floating or maximized client +screen.connect_signal("arrange", function(s) + local only_one = #s.tiled_clients == 1 + for _, c in pairs(s.clients) do + if only_one and not c.floating or c.maximized or c.fullscreen then + c.border_width = 0 + else + c.border_width = beautiful.border_width + end + end +end) + +-- Create a wibox for each screen and add it +awful.screen.connect_for_each_screen(function(s) + beautiful.at_screen_connect(s) +end) + +-- }}} + +-- {{{ Mouse bindings + +root.buttons(mytable.join( + awful.button({}, 3, function() + awful.util.mymainmenu:toggle() + end), + awful.button({}, 4, awful.tag.viewnext), + awful.button({}, 5, awful.tag.viewprev) +)) + +-- }}} + +-- {{{ Key bindings + +globalkeys = mytable.join( + -- Destroy all notifications + awful.key({ "Control", altkey }, "space", function() + naughty.destroy_all_notifications() + end, { description = "destroy all notifications", group = "hotkeys" }), + -- Take a screenshot + -- https://github.com/lcpz/dots/blob/master/bin/screenshot + awful.key({}, "Print", function() + awful.spawn "flameshot gui" + end, { description = "take a screenshot", group = "hotkeys" }), + + -- X screen locker + awful.key({ altkey, "Control" }, "l", function() + os.execute(scrlocker) + end, { description = "lock screen", group = "hotkeys" }), + + awful.key({ modkey }, "v", function() + awful.spawn "gpaste-client ui" + end, { description = "clipboard", group = "hotkeys" }), + + -- Show help + awful.key({ modkey }, "s", hotkeys_popup.show_help, { description = "show help", group = "awesome" }), + + -- Tag browsing + awful.key({ modkey }, "Left", awful.tag.viewprev, { description = "view previous", group = "tag" }), + awful.key({ modkey }, "Right", awful.tag.viewnext, { description = "view next", group = "tag" }), + awful.key({ modkey }, "Escape", awful.tag.history.restore, { description = "go back", group = "tag" }), + + -- Non-empty tag browsing + awful.key({ altkey }, "Left", function() + lain.util.tag_view_nonempty(-1) + end, { description = "view previous nonempty", group = "tag" }), + awful.key({ altkey }, "Right", function() + lain.util.tag_view_nonempty(1) + end, { description = "view previous nonempty", group = "tag" }), + + -- Default client focus + -- awful.key({ altkey, }, "j", + -- function () + -- awful.client.focus.byidx( 1) + -- end, + -- {description = "focus next by index", group = "client"} + -- ), + -- awful.key({ altkey, }, "k", + -- function () + -- awful.client.focus.byidx(-1) + -- end, + -- {description = "focus previous by index", group = "client"} + -- ), + + -- By-direction client focus + awful.key({ modkey }, "j", function() + awful.client.focus.global_bydirection "down" + if client.focus then + client.focus:raise() + end + end, { description = "focus down", group = "client" }), + awful.key({ modkey }, "k", function() + awful.client.focus.global_bydirection "up" + if client.focus then + client.focus:raise() + end + end, { description = "focus up", group = "client" }), + awful.key({ modkey }, "h", function() + awful.client.focus.global_bydirection "left" + if client.focus then + client.focus:raise() + end + end, { description = "focus left", group = "client" }), + awful.key({ modkey }, "l", function() + awful.client.focus.global_bydirection "right" + if client.focus then + client.focus:raise() + end + end, { description = "focus right", group = "client" }), + + -- Menu + -- awful.key({ modkey }, "w", function() + -- awful.util.mymainmenu:show() + -- end, { description = "show main menu", group = "awesome" }), + + -- Layout manipulation + awful.key({ modkey, "Shift" }, "j", function() + awful.client.swap.byidx(1) + end, { description = "swap with next client by index", group = "client" }), + awful.key({ modkey, "Shift" }, "k", function() + awful.client.swap.byidx(-1) + end, { description = "swap with previous client by index", group = "client" }), + awful.key({ modkey, "Control" }, "j", function() + awful.screen.focus_relative(1) + end, { description = "focus the next screen", group = "screen" }), + awful.key({ modkey, "Control" }, "k", function() + awful.screen.focus_relative(-1) + end, { description = "focus the previous screen", group = "screen" }), + awful.key({ modkey }, "u", awful.client.urgent.jumpto, { description = "jump to urgent client", group = "client" }), + awful.key({ modkey }, "Tab", function() + if cycle_prev then + awful.client.focus.history.previous() + else + awful.client.focus.byidx(-1) + end + if client.focus then + client.focus:raise() + end + end, { description = "cycle with previous/go back", group = "client" }), + + -- Show/hide wibox + awful.key({ modkey }, "b", function() + for s in screen do + s.mywibox.visible = not s.mywibox.visible + if s.mybottomwibox then + s.mybottomwibox.visible = not s.mybottomwibox.visible + end + end + end, { description = "toggle wibox", group = "awesome" }), + + -- On-the-fly useless gaps change + awful.key({ altkey, "Control" }, "=", function() + lain.util.useless_gaps_resize(1) + end, { description = "increment useless gaps", group = "tag" }), + awful.key({ altkey, "Control" }, "-", function() + lain.util.useless_gaps_resize(-1) + end, { description = "decrement useless gaps", group = "tag" }), + + -- Dynamic tagging + awful.key({ modkey, "Control" }, "n", function() + lain.util.add_tag() + end, { description = "add new tag", group = "tag" }), + awful.key({ modkey, "Control" }, "r", function() + lain.util.rename_tag() + end, { description = "rename tag", group = "tag" }), + awful.key({ modkey, "Control" }, "Left", function() + lain.util.move_tag(-1) + end, { description = "move tag to the left", group = "tag" }), + awful.key({ modkey, "Control" }, "Right", function() + lain.util.move_tag(1) + end, { description = "move tag to the right", group = "tag" }), + awful.key({ modkey, "Control" }, "d", function() + lain.util.delete_tag() + end, { description = "delete tag", group = "tag" }), + + -- Standard program + awful.key({ modkey }, "Return", function() + awful.spawn(terminal) + end, { description = "open a terminal", group = "launcher" }), + awful.key({ modkey, "Shift" }, "r", awesome.restart, { description = "reload awesome", group = "awesome" }), + awful.key({ modkey, "Shift" }, "q", awesome.quit, { description = "quit awesome", group = "awesome" }), + awful.key({ modkey, altkey }, "l", function() + awful.tag.incmwfact(0.05) + end, { description = "increase master width factor", group = "layout" }), + awful.key({ modkey, altkey }, "h", function() + awful.tag.incmwfact(-0.05) + end, { description = "decrease master width factor", group = "layout" }), + awful.key({ modkey, "Shift" }, "h", function() + awful.tag.incnmaster(1, nil, true) + end, { description = "increase the number of master clients", group = "layout" }), + awful.key({ modkey, "Shift" }, "l", function() + awful.tag.incnmaster(-1, nil, true) + end, { description = "decrease the number of master clients", group = "layout" }), + awful.key({ modkey, "Control" }, "h", function() + awful.tag.incncol(1, nil, true) + end, { description = "increase the number of columns", group = "layout" }), + awful.key({ modkey, "Control" }, "l", function() + awful.tag.incncol(-1, nil, true) + end, { description = "decrease the number of columns", group = "layout" }), + -- awful.key({ modkey }, "space", function() + -- awful.layout.inc(1) + -- end, { description = "select next", group = "layout" }), + awful.key({ modkey, "Shift" }, "space", function() + awful.layout.inc(-1) + end, { description = "select previous", group = "layout" }), + + -- Screen brightness + awful.key({}, "XF86MonBrightnessUp", function() + os.execute "xbacklight -inc 10" + end, { description = "+10%", group = "hotkeys" }), + awful.key({}, "XF86MonBrightnessDown", function() + os.execute "xbacklight -dec 10" + end, { description = "-10%", group = "hotkeys" }), + + -- volume control + awful.key({}, "XF86AudioRaiseVolume", function() + volume_widget:inc(5) + end, { description = "+5%", group = "hotkeys" }), + + awful.key({}, "XF86AudioLowerVolume", function() + volume_widget:dec(5) + end, { description = "-5%", group = "hotkeys" }), + + awful.key({}, "XF86AudioMute", function() + volume_widget:toggle() + end, { description = "mute", group = "hotkeys" }), + + -- ALSA volume control + -- awful.key({ altkey }, "Up", function() + -- os.execute(string.format("amixer -q set %s 1%%+", beautiful.volume.channel)) + -- beautiful.volume.update() + -- end, { description = "volume up", group = "hotkeys" }), + -- awful.key({ altkey }, "Down", function() + -- os.execute(string.format("amixer -q set %s 1%%-", beautiful.volume.channel)) + -- beautiful.volume.update() + -- end, { description = "volume down", group = "hotkeys" }), + -- awful.key({ altkey }, "m", function() + -- os.execute(string.format("amixer -q set %s toggle", beautiful.volume.togglechannel or beautiful.volume.channel)) + -- beautiful.volume.update() + -- end, { description = "toggle mute", group = "hotkeys" }), + -- awful.key({ altkey, "Control" }, "m", + -- function () + -- os.execute(string.format("amixer -q set %s 100%%", beautiful.volume.channel)) + -- beautiful.volume.update() + -- end, + -- {description = "volume 100%", group = "hotkeys"}), + -- awful.key({ altkey, "Control" }, "0", + -- function () + -- os.execute(string.format("amixer -q set %s 0%%", beautiful.volume.channel)) + -- beautiful.volume.update() + -- end, + -- {description = "volume 0%", group = "hotkeys"}), + + -- MPD control + awful.key({ altkey, "Control" }, "Up", function() + os.execute "mpc toggle" + beautiful.mpd.update() + end, { description = "mpc toggle", group = "widgets" }), + awful.key({ altkey, "Control" }, "Down", function() + os.execute "mpc stop" + beautiful.mpd.update() + end, { description = "mpc stop", group = "widgets" }), + awful.key({ altkey, "Control" }, "Left", function() + os.execute "mpc prev" + beautiful.mpd.update() + end, { description = "mpc prev", group = "widgets" }), + awful.key({ altkey, "Control" }, "Right", function() + os.execute "mpc next" + beautiful.mpd.update() + end, { description = "mpc next", group = "widgets" }), + awful.key({ altkey }, "0", function() + local common = { text = "MPD widget ", position = "top_middle", timeout = 2 } + if beautiful.mpd.timer.started then + beautiful.mpd.timer:stop() + common.text = common.text .. lain.util.markup.bold "OFF" + else + beautiful.mpd.timer:start() + common.text = common.text .. lain.util.markup.bold "ON" + end + naughty.notify(common) + end, { description = "mpc on/off", group = "widgets" }), + + -- Copy primary to clipboard (terminals to gtk) + -- awful.key({ modkey }, "c", function() + -- awful.spawn.with_shell "xsel | xsel -i -b" + -- end, { description = "copy terminal to gtk", group = "hotkeys" }), + -- -- Copy clipboard to primary (gtk to terminals) + -- awful.key({ modkey }, "v", function() + -- awful.spawn.with_shell "xsel -b | xsel" + -- end, { description = "copy gtk to terminal", group = "hotkeys" }), + + -- User programs + -- awful.key({ modkey }, "q", function () awful.spawn(browser) end, + -- {description = "run browser", group = "launcher"}), + + -- Default + -- dmenu + awful.key({ modkey }, "space", function() + os.execute(launcher) + end, { description = "show launcher", group = "launcher" }), + --]] + -- alternatively use rofi, a dmenu-like application with more features + -- check https://github.com/DaveDavenport/rofi for more details + --[[ rofi + awful.key({ modkey }, "x", function () + os.execute(string.format("rofi -show %s -theme %s", + 'run', 'dmenu')) + end, + {description = "show rofi", group = "launcher"}), + --]] + -- Prompt + awful.key({ modkey }, "r", function() + -- awful.screen.focused().mypromptbox:run() + os.execute "rofi -show run" + end, { description = "run prompt", group = "launcher" }), + + awful.key({ modkey }, "x", function() + awful.prompt.run { + prompt = "Run Lua code: ", + textbox = awful.screen.focused().mypromptbox.widget, + exe_callback = awful.util.eval, + history_path = awful.util.get_cache_dir() .. "/history_eval", + } + end, { description = "lua execute prompt", group = "awesome" }) + --]] +) + +clientkeys = mytable.join( + awful.key({ altkey, "Shift" }, "m", lain.util.magnify_client, { description = "magnify client", group = "client" }), + awful.key({ modkey }, "f", function(c) + c.fullscreen = not c.fullscreen + c:raise() + end, { description = "toggle fullscreen", group = "client" }), + awful.key({ modkey }, "q", function(c) + c:kill() + end, { description = "close", group = "client" }), + awful.key( + { modkey, "Control" }, + "space", + awful.client.floating.toggle, + { description = "toggle floating", group = "client" } + ), + awful.key({ modkey, "Control" }, "Return", function(c) + c:swap(awful.client.getmaster()) + end, { description = "move to master", group = "client" }), + awful.key({ modkey }, "o", function(c) + c:move_to_screen() + end, { description = "move to screen", group = "client" }), + awful.key({ modkey }, "t", function(c) + c.ontop = not c.ontop + end, { description = "toggle keep on top", group = "client" }), + awful.key({ modkey }, "n", function(c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end, { description = "minimize", group = "client" }), + + awful.key({ modkey, "Shift" }, "n", function() + local c = awful.client.restore() + -- Focus restored client + if c then + c:emit_signal("request::activate", "key.unminimize", { raise = true }) + end + end, { description = "restore minimized", group = "client" }), + + awful.key({ modkey }, "m", function(c) + c.maximized = not c.maximized + c:raise() + end, { description = "(un)maximize", group = "client" }), + awful.key({ modkey, "Control" }, "m", function(c) + c.maximized_vertical = not c.maximized_vertical + c:raise() + end, { description = "(un)maximize vertically", group = "client" }), + awful.key({ modkey, "Shift" }, "m", function(c) + c.maximized_horizontal = not c.maximized_horizontal + c:raise() + end, { description = "(un)maximize horizontally", group = "client" }) +) + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it work on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, 9 do + globalkeys = mytable.join( + globalkeys, + -- View tag only. + awful.key({ modkey }, "#" .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + tag:view_only() + end + end, { description = "view tag #" .. i, group = "tag" }), + -- Toggle tag display. + awful.key({ modkey, "Control" }, "#" .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + awful.tag.viewtoggle(tag) + end + end, { description = "toggle tag #" .. i, group = "tag" }), + -- Move client to tag. + awful.key({ modkey, "Shift" }, "#" .. i + 9, function() + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:move_to_tag(tag) + end + end + end, { description = "move focused client to tag #" .. i, group = "tag" }), + -- Toggle tag on focused client. + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, function() + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:toggle_tag(tag) + end + end + end, { description = "toggle focused client on tag #" .. i, group = "tag" }) + ) +end + +clientbuttons = mytable.join( + awful.button({}, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) + end), + awful.button({ modkey }, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) + awful.mouse.client.move(c) + end), + awful.button({ modkey }, 3, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) + awful.mouse.client.resize(c) + end) +) + +-- Set keys +root.keys(globalkeys) + +-- }}} + +-- {{{ Rules + +-- Rules to apply to new clients (through the "manage" signal). +awful.rules.rules = { + -- All clients will match this rule. + { + rule = {}, + properties = { + border_width = beautiful.border_width, + border_color = beautiful.border_normal, + callback = awful.client.setslave, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap + awful.placement.no_offscreen, + size_hints_honor = false, + }, + }, + { rule_any = { class = { "x-terminal-emulator", "kitty" } }, properties = { opacity = 0.95 } }, + -- Floating clients. + { + rule_any = { + instance = { + "DTA", -- Firefox addon DownThemAll. + "copyq", -- Includes session name in class. + "pinentry", + }, + class = { + "Arandr", + "Blueman-manager", + "Gpick", + "Kruler", + "MessageWin", -- kalarm. + "Sxiv", + "Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size. + "Wpa_gui", + "veromix", + "xtightvncviewer", + }, + + -- Note that the name property shown in xprop might be set slightly after creation of the client + -- and the name shown there might not match defined rules here. + name = { + "Event Tester", -- xev. + }, + role = { + "AlarmWindow", -- Thunderbird's calendar. + "ConfigManager", -- Thunderbird's about:config. + "pop-up", -- e.g. Google Chrome's (detached) Developer Tools. + }, + }, + properties = { floating = true }, + }, + + -- Add titlebars to normal clients and dialogs + { + rule_any = { type = { "normal", "dialog" } }, + properties = { titlebars_enabled = true }, + }, + + -- Set Firefox to always map on the tag named "2" on screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { screen = 1, tag = "2" } }, +} + +-- }}} + +-- {{{ Signals + +-- Signal function to execute when a new client appears. +client.connect_signal("manage", function(c) + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + -- if not awesome.startup then awful.client.setslave(c) end + + if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end +end) + +-- Add a titlebar if titlebars_enabled is set to true in the rules. +client.connect_signal("request::titlebars", function(c) + -- Custom + if beautiful.titlebar_fun then + beautiful.titlebar_fun(c) + return + end + + -- Default + -- buttons for the titlebar + local buttons = mytable.join( + awful.button({}, 1, function() + c:emit_signal("request::activate", "titlebar", { raise = true }) + awful.mouse.client.move(c) + end), + awful.button({}, 3, function() + c:emit_signal("request::activate", "titlebar", { raise = true }) + awful.mouse.client.resize(c) + end) + ) + + awful.titlebar(c, { size = 30 }):setup { + { -- Left + awful.titlebar.widget.iconwidget(c), + buttons = buttons, + layout = wibox.layout.fixed.horizontal, + }, + { -- Middle + { -- Title + align = "center", + widget = awful.titlebar.widget.titlewidget(c), + }, + buttons = buttons, + layout = wibox.layout.flex.horizontal, + }, + { -- Right + awful.titlebar.widget.floatingbutton(c), + awful.titlebar.widget.maximizedbutton(c), + awful.titlebar.widget.stickybutton(c), + awful.titlebar.widget.ontopbutton(c), + awful.titlebar.widget.closebutton(c), + layout = wibox.layout.fixed.horizontal(), + }, + layout = wibox.layout.align.horizontal, + } + + if not c.floating then + awful.titlebar.hide(c) + end +end) + +client.connect_signal("property::floating", function(c) + if c.floating then + awful.titlebar.show(c) + else + awful.titlebar.hide(c) + end +end) + +-- Enable sloppy focus, so that focus follows mouse. +client.connect_signal("mouse::enter", function(c) + c:emit_signal("request::activate", "mouse_enter", { raise = vi_focus }) +end) + +client.connect_signal("focus", function(c) + c.border_color = beautiful.border_focus +end) +client.connect_signal("unfocus", function(c) + c.border_color = beautiful.border_normal +end) + +-- switch to parent after closing child window +local function backham() + local s = awful.screen.focused() + local c = awful.client.focus.history.get(s, 0) + if c then + client.focus = c + c:raise() + end +end + +-- attach to minimized state +client.connect_signal("property::minimized", backham) +-- attach to closed state +client.connect_signal("unmanage", backham) +-- ensure there is always a selected client during tag switching or logins +tag.connect_signal("property::selected", backham) + +-- }}} diff --git a/themes/multicolor/theme.lua b/themes/multicolor/theme.lua deleted file mode 120000 index ec5e792..0000000 --- a/themes/multicolor/theme.lua +++ /dev/null @@ -1 +0,0 @@ -/home/hrli/repos/dotfiles/awesomewm/themes/multicolor/theme-personal.lua \ No newline at end of file diff --git a/themes/multicolor/theme.lua b/themes/multicolor/theme.lua new file mode 100644 index 0000000..444b0e5 --- /dev/null +++ b/themes/multicolor/theme.lua @@ -0,0 +1,233 @@ +--[[ + + Multicolor Awesome WM theme 2.0 + github.com/lcpz + +--]] + +local gears = require "gears" +local lain = require "lain" +local awful = require "awful" +local wibox = require "wibox" +local dpi = require("beautiful.xresources").apply_dpi + +local os = os +-- local my_table = awful.util.table or gears.table -- 4.{0,1} compatibility + +local theme = {} +theme.confdir = os.getenv "HOME" .. "/.config/awesome/themes/multicolor" +theme.wallpaper = string.format("%s/Pictures/1308322.jpeg", os.getenv "HOME") +theme.font = "Monospace 11" + +-- Menu +theme.menu_bg_normal = "#000000AA" +theme.menu_bg_focus = "#000000AA" +theme.menu_border_width = 0 +theme.menu_width = dpi(130) +theme.menu_fg_normal = "#aaaaaa" +theme.menu_fg_focus = "#59e269" +theme.menu_bg_normal = "#050505dd" +theme.menu_bg_focus = "#050505dd" + +-- Background +theme.bg_normal = "#1f2430" +theme.bg_dark = "#000000" +theme.bg_focus = "#151821" +theme.bg_urgent = "#ed8274" +theme.bg_minimize = "#444444" + +-- Foreground +theme.fg_normal = "#ffffff" +theme.fg_focus = "#59e269" +theme.fg_urgent = "#ffffff" +theme.fg_minimize = "#ffffff" + +-- Window Gap Distance +theme.useless_gap = dpi(15) + +-- Show Gaps if Only One Client is Visible +theme.gap_single_client = true + +-- Window Borders +theme.border_width = dpi(2) +theme.border_normal = "#1c2022" +theme.border_focus = "#59e269" +theme.border_marked = "#3ca4d8" + +-- Taglist +theme.taglist_bg_empty = theme.bg_normal +theme.taglist_bg_occupied = "#ffffff1a" +theme.taglist_bg_urgent = "#e91e6399" +theme.taglist_bg_focus = theme.bg_focus + +-- Tasklist +theme.tasklist_font = theme.font + +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 + +-- Panel Sizing +theme.left_panel_width = dpi(55) +theme.top_panel_height = dpi(26) + +-- Notification Sizing +-- theme.notification_max_width = dpi(350) + +-- System Tray +theme.bg_systray = theme.bg_normal +theme.systray_icon_spacing = dpi(5) + +-- theme.tasklist_plain_task_name = false +-- theme.tasklist_disable_icon = false + +theme.useless_gap = dpi(17) +theme.layout_tile = theme.confdir .. "/icons/tile.png" +theme.layout_tilegaps = theme.confdir .. "/icons/tilegaps.png" +theme.layout_tileleft = theme.confdir .. "/icons/tileleft.png" +theme.layout_tilebottom = theme.confdir .. "/icons/tilebottom.png" +theme.layout_tiletop = theme.confdir .. "/icons/tiletop.png" +theme.layout_fairv = theme.confdir .. "/icons/fairv.png" +theme.layout_fairh = theme.confdir .. "/icons/fairh.png" +theme.layout_spiral = theme.confdir .. "/icons/spiral.png" +theme.layout_dwindle = theme.confdir .. "/icons/dwindle.png" +theme.layout_max = theme.confdir .. "/icons/max.png" +theme.layout_fullscreen = theme.confdir .. "/icons/fullscreen.png" +theme.layout_magnifier = theme.confdir .. "/icons/magnifier.png" +theme.layout_floating = theme.confdir .. "/icons/floating.png" +theme.titlebar_close_button_normal = theme.confdir .. "/icons/titlebar/close_normal.png" +theme.titlebar_close_button_focus = theme.confdir .. "/icons/titlebar/close_focus.png" +theme.titlebar_minimize_button_normal = theme.confdir .. "/icons/titlebar/minimize_normal.png" +theme.titlebar_minimize_button_focus = theme.confdir .. "/icons/titlebar/minimize_focus.png" +theme.titlebar_ontop_button_normal_inactive = theme.confdir .. "/icons/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = theme.confdir .. "/icons/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = theme.confdir .. "/icons/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = theme.confdir .. "/icons/titlebar/ontop_focus_active.png" +theme.titlebar_sticky_button_normal_inactive = theme.confdir .. "/icons/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = theme.confdir .. "/icons/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = theme.confdir .. "/icons/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = theme.confdir .. "/icons/titlebar/sticky_focus_active.png" +theme.titlebar_floating_button_normal_inactive = theme.confdir .. "/icons/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = theme.confdir .. "/icons/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = theme.confdir .. "/icons/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = theme.confdir .. "/icons/titlebar/floating_focus_active.png" +theme.titlebar_maximized_button_normal_inactive = theme.confdir .. "/icons/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = theme.confdir .. "/icons/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = theme.confdir .. "/icons/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = theme.confdir .. "/icons/titlebar/maximized_focus_active.png" + +local markup = lain.util.markup + +-- Textclock +os.setlocale(os.getenv "LANG") -- to localize the clock +local mytextclock = wibox.widget.textclock(markup("#a7aaff", "%A %d %B ") .. markup("#de6eae", "%H:%M ")) +mytextclock.font = theme.font + +-- Calendar +theme.cal = lain.widget.cal { + attach_to = { mytextclock }, + notification_preset = { + font = theme.font, + fg = theme.fg_normal, + bg = theme.bg_normal, + }, +} + +-- CPU +local cpu = lain.widget.cpu { + settings = function() + widget:set_markup(markup.fontfg(theme.font, "#f36a6e", "CPU " .. cpu_now.usage .. "% ")) + end, +} + +-- MEM +local memory = lain.widget.mem { + settings = function() + widget:set_markup(markup.fontfg(theme.font, "#e0da37", "RAM " .. mem_now.perc .. "% ")) + end, +} + +-- Utils +local function lr_margin_box(widget, margin) + if not margin then + margin = 10 + end + return wibox.widget { + widget, + left = dpi(margin), + right = dpi(margin), + widget = wibox.container.margin, + } +end + +local function margin_box(widget, margin) + if not margin then + margin = 2 + end + return wibox.widget { + widget, + margins = dpi(margin), + widget = wibox.container.margin, + } +end + +function theme.at_screen_connect(s) + -- Quake application + s.quake = lain.util.quake { app = awful.util.terminal } + + -- If wallpaper is a function, call it with the screen + local wallpaper = theme.wallpaper + if type(wallpaper) == "function" then + wallpaper = wallpaper(s) + end + gears.wallpaper.maximized(wallpaper, s, true) + + -- Tags + awful.tag(awful.util.tagnames, s, awful.layout.layouts[1]) + + -- Create a promptbox for each screen + s.mypromptbox = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + s.mylayoutbox = awful.widget.layoutbox(s) + + -- Create a taglist widget + s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, awful.util.taglist_buttons) + + -- Create a tasklist widget + s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, awful.util.tasklist_buttons) + + -- Create the wibox + s.mywibox = awful.wibar { position = "top", screen = s, height = dpi(22), bg = theme.bg_normal, fg = theme.fg_normal } + + -- Add widgets to the wibox + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + s.mylayoutbox, + lr_margin_box(s.mytaglist), + lr_margin_box(s.mypromptbox, 5), + }, + lr_margin_box(s.mytasklist, 5), + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + margin_box(wibox.widget.systray(), 2), + lr_margin_box(require "awesome-wm-widgets.volume-widget.volume"(), 10), + memory.widget, + cpu.widget, + mytextclock, + require "awesome-wm-widgets.logout-menu-widget.logout-menu" { + onlock = function() + awful.spawn.with_shell "slock" + end, + }, + }, + } +end + +return theme