From e0722684751cdc4e7ba7b44fc565cc024510b7e1 Mon Sep 17 00:00:00 2001 From: David Bernet <david.bernet@student.uni-halle.de> Date: Sat, 3 Aug 2024 07:35:01 +0200 Subject: [PATCH] =?UTF-8?q?AwesomeWM=20config=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- awesome/rc.lua | 511 ++++++++++++++++++++++++++++++++++++++ awesome/themes/custom.lua | 153 ++++++++++++ 2 files changed, 664 insertions(+) create mode 100644 awesome/rc.lua create mode 100644 awesome/themes/custom.lua diff --git a/awesome/rc.lua b/awesome/rc.lua new file mode 100644 index 0000000..501dcc2 --- /dev/null +++ b/awesome/rc.lua @@ -0,0 +1,511 @@ +-- 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") + +-- Standard awesome library +local gears = require("gears") +local gmath = require("gears.math") +local awful = require("awful") +require("awful.autofocus") +-- Widget and layout library +local wibox = require("wibox") +-- Theme handling library +local beautiful = require("beautiful") +-- Notification library +local naughty = require("naughty") +local menubar = require("menubar") +local hotkeys_popup = require("awful.hotkeys_popup") +-- Enable hotkeys help widget for VIM and other apps +-- when client with a matching name is opened: +require("awful.hotkeys_popup.keys") + +-- {{{ 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) + -- Make sure we don't go into an endless error loop + 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 +-- }}} + +-- {{{ Variable definitions +-- Themes define colours, icons, font and wallpapers. +-- beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua") +beautiful.init(gears.filesystem.get_configuration_dir() .. 'themes/custom.lua') + +-- This is used later as the default terminal and editor to run. +terminal = "kitty" +editor = os.getenv("EDITOR") or "code" +editor_cmd = terminal .. " -e " .. editor + +-- Default modkey. +-- Usually, Mod4 is the key with a logo between Control and Alt. +-- If you do not like this or do not have such a key, +-- I suggest you to remap Mod4 to another key using xmodmap or other tools. +-- However, you can use another modifier like Mod1, but it may interact with others. +modkey = "Mod4" + +-- Table of layouts to cover with awful.layout.inc, order matters. +awful.layout.layouts = { + -- 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.spiral, + awful.layout.suit.spiral.dwindle, + -- 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, +} +-- }}} + +-- {{{ Menu +-- Create a launcher widget and a main menu +myawesomemenu = { + { "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) end }, + { "manual", terminal .. " -e man awesome" }, + { "edit config", editor_cmd .. " " .. awesome.conffile }, + { "restart", awesome.restart }, + { "quit", function() awesome.quit() end }, +} + +mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "open terminal", terminal } + } + }) + +mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, + menu = mymainmenu }) + +-- Menubar configuration +menubar.utils.terminal = terminal -- Set the terminal for applications that require it +-- }}} + +-- Keyboard map indicator and switcher +mykeyboardlayout = awful.widget.keyboardlayout() + +-- {{{ Wibar + + +-- Create a wibox for each screen and add it +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), + 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 = 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), + 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)) + +local function set_wallpaper(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 + +-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) +screen.connect_signal("property::geometry", set_wallpaper) + +awful.screen.connect_for_each_screen(function(s) + -- Wallpaper + set_wallpaper(s) + + -- Each screen has its own tag table. + awful.tag({ " Ⅰ ", " Ⅱ ", " Ⅲ ", " Ⅳ ", " Ⅴ " }, s, awful.layout.layouts[1]) + + -- Create a promptbox for each screen + s.mypromptbox = awful.widget.prompt() + -- Create an imagebox widget which will contain an icon indicating which layout we're using. + -- We need one layoutbox per screen. + s.mylayoutbox = awful.widget.layoutbox(s) + 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 taglist widget + s.mytaglist = awful.widget.taglist { + screen = s, + filter = awful.widget.taglist.filter.all, + buttons = taglist_buttons + } + + -- Create a tasklist widget + s.mytasklist = awful.widget.tasklist { + screen = s, + filter = awful.widget.tasklist.filter.currenttags, + buttons = tasklist_buttons + } + + -- Create the wibox + s.mywibox = awful.wibar({ position = "top", screen = s }) + + s.my_clock = wibox.widget { + format = ' %d.%m.%Y ◆ %H:%M:%S ', + refresh = 1, + widget = wibox.widget.textclock + } + + + s.my_clock:buttons(gears.table.join( + s.my_clock:buttons(), + awful.button({}, 1, nil, function() + awful.spawn("kitty") + end) + )) + + -- Add widgets to the wibox + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + -- mylauncher, + s.mytaglist, + s.mypromptbox, + }, + s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + -- mykeyboardlayout, + + wibox.widget.systray(), + spacer, + -- awful.widget.watch("date", 1), + -- Create a textclock widget + s.my_clock, + -- s.mylayoutbox, + }, + } +end) +-- }}} + +-- {{{ Mouse bindings +root.buttons(gears.table.join( + awful.button({ }, 3, function () mymainmenu:toggle() end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} + +local function move_to_previous_tag() + local c = client.focus + if not c then return end + local t = c.screen.selected_tag + local tags = c.screen.tags + local idx = t.index + local newtag = tags[gmath.cycle(#tags, idx-1)] + c:move_to_tag(newtag) + awful.tag.viewprev() +end + +local function move_to_next_tag() + local c = client.focus + if not c then return end + local t = c.screen.selected_tag + local tags = c.screen.tags + local idx = t.index + local newtag = tags[gmath.cycle(#tags, idx+1)] + c:move_to_tag(newtag) + awful.tag.viewnext() +end + +-- {{{ Key bindings +globalkeys = gears.table.join( + + awful.key({ modkey, }, "Left", awful.tag.viewprev, + {description = "Arbeitsfläche links", group = "Workspace"}), + awful.key({ modkey, }, "Right", awful.tag.viewnext, + {description = "Arbeitsfläche rechts", group = "Workspace"}), + + awful.key({ modkey, "Ctrl" }, "Left", function(c) move_to_previous_tag() end, + {description = "Fenster nach links", group = "Workspace"}), + awful.key({ modkey, "Ctrl" }, "Right", function(c) move_to_next_tag() end, + {description = "Fenster nach rechts", group = "Workspace"}), + + awful.key({ modkey, }, "Down", + function () + awful.client.focus.byidx( 1) + end, + {description = "Fokus vorheriges Fenster", group = "Fenster"} + ), + awful.key({ modkey, }, "Up", + function () + awful.client.focus.byidx(-1) + end, + {description = "Fokus nächstes Fenster", group = "Fenster"} + ), + + -- Layout manipulation + awful.key({ modkey, "Ctrl" }, "Down", function () awful.client.swap.byidx( 1) end, + {description = "Fenster nach unten schieben", group = "Fenster"}), + awful.key({ modkey, "Ctrl" }, "Up", function () awful.client.swap.byidx( -1) end, + {description = "Fenster nach oben schieben", group = "Fenster"}), + awful.key({ modkey }, "o", function () awful.screen.focus_relative( 1) end, + {description = "Fokus auf nächsten Monitor", group = "Monitor"}), + + -- Standard program + awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end, + {description = "Terminal", group = "Launcher"}), + awful.key({ modkey, "Control" }, "r", awesome.restart, + {description = "reload awesome", group = "awesome"}), + + -- Prompt + awful.key({ modkey }, "r", function () awful.spawn("rofi -show drun") end, + {description = "run prompt", group = "Launcher"}), + + awful.key({ modkey }, "e", function () awful.spawn("firefox") end, + {description = "Explorer", group = "Launcher"}), + + awful.key({ modkey }, "w", function () awful.spawn("firefox") end, + {description = "Web browser", group = "Launcher"}), + + awful.key({ modkey }, "t", function () awful.spawn("thunderbird") end, + {description = "Email client", group = "Launcher"}), + + awful.key({ modkey }, "d", function () awful.spawn("discord") end, + {description = "Discord", group = "Launcher"}), + + awful.key({ modkey }, "s", function () awful.spawn("steam") end, + {description = "Steam", group = "Launcher"}) +) + +clientkeys = gears.table.join( + awful.key({ modkey, }, "space", + function (c) + c.fullscreen = not c.fullscreen + c:raise() + end, + {description = "toggle fullscreen", group = "Fenster"}), + + awful.key({ modkey }, "q", function (c) c:kill() end, + {description = "close", group = "Fenster"}), + + awful.key({ modkey, "Ctrl" }, "o", function (c) c:move_to_screen() end, + {description = "move to screen", group = "client"}), + + awful.key({ modkey, }, "m", + function (c) + c.maximized = not c.maximized + c:raise() + end , + {description = "(un)maximize", 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 = gears.table.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 = "Workspaces"}), + -- 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 = "Workspaces"}), + -- 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 = "Workspaces"}), + -- 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 = "Workspaces"}) + ) +end + +clientbuttons = gears.table.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, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap+awful.placement.no_offscreen + } + }, + + -- 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 }}, +} +-- }}} + +-- {{{ 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) + + +-- Enable sloppy focus, so that focus follows mouse. +client.connect_signal("mouse::enter", function(c) + c:emit_signal("request::activate", "mouse_enter", {raise = false}) +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) +-- }}} + +beautiful.fullscreen_hide_border = true +beautiful.maximized_hide_border = true + +local function set_border(c) + local s = awful.screen.focused() + if (#s.tiled_clients == 1 and not c.floating) + or (s.selected_tag and s.selected_tag.name == "max") + then + c.border_width = 0 + else + c.border_width = beautiful.border_width + end +end + +client.connect_signal("focus", set_border) +client.connect_signal("request::border", set_border) +client.connect_signal("property::maximized", set_border) \ No newline at end of file diff --git a/awesome/themes/custom.lua b/awesome/themes/custom.lua new file mode 100644 index 0000000..42e1792 --- /dev/null +++ b/awesome/themes/custom.lua @@ -0,0 +1,153 @@ +--------------------------- +-- Default awesome theme -- +--------------------------- + +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 14" + +local bg0 = "#32302f" +local bg1 = "#3c3836" +local bg2 = "#504945" +local bg3 = "#665c54" + +local fg0 = "#d4be98" +local fg1 = "#ddc7a1" +local fg2 = "#7c6f64" + +local gray0 = "#928374" +local gray1 = "#a89984" + +local red = "#ea6962" +local green = "#a9b665" +local yellow = "#d8a657" +local blue = "#7daea3" +local purple = "#d3869b" +local orange = "#e78a4e" + +theme.bg_normal = bg0 +theme.bg_focus = bg2 +theme.bg_urgent = red +theme.bg_minimize = orange +theme.bg_systray = theme.bg_normal + +theme.fg_normal = fg0 +theme.fg_focus = fg1 +theme.fg_urgent = fg1 +theme.fg_minimize = fg1 + +theme.useless_gap = dpi(0) +theme.border_width = dpi(1) +theme.border_normal = bg0 +theme.border_focus = blue +theme.border_marked = green + + +-- beautiful.taglist_bg_occupied = red + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- 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] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Generate taglist squares: +local taglist_square_size = dpi(5) +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 +) + +-- Variables set for theming notifications: +-- notification_font +-- notification_[bg|fg] +-- notification_[width|height|margin] +-- notification_[border_color|border_width|shape|opacity] + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = themes_path.."default/submenu.png" +theme.menu_height = dpi(15) +theme.menu_width = dpi(100) + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +-- theme.titlebar_close_button_normal = themes_path.."default/titlebar/close_normal.png" +-- theme.titlebar_close_button_focus = themes_path.."default/titlebar/close_focus.png" + +-- theme.titlebar_minimize_button_normal = themes_path.."default/titlebar/minimize_normal.png" +-- theme.titlebar_minimize_button_focus = themes_path.."default/titlebar/minimize_focus.png" + +-- theme.titlebar_ontop_button_normal_inactive = themes_path.."default/titlebar/ontop_normal_inactive.png" +-- theme.titlebar_ontop_button_focus_inactive = themes_path.."default/titlebar/ontop_focus_inactive.png" +-- theme.titlebar_ontop_button_normal_active = themes_path.."default/titlebar/ontop_normal_active.png" +-- theme.titlebar_ontop_button_focus_active = themes_path.."default/titlebar/ontop_focus_active.png" + +-- theme.titlebar_sticky_button_normal_inactive = themes_path.."default/titlebar/sticky_normal_inactive.png" +-- theme.titlebar_sticky_button_focus_inactive = themes_path.."default/titlebar/sticky_focus_inactive.png" +-- theme.titlebar_sticky_button_normal_active = themes_path.."default/titlebar/sticky_normal_active.png" +-- theme.titlebar_sticky_button_focus_active = themes_path.."default/titlebar/sticky_focus_active.png" + +-- theme.titlebar_floating_button_normal_inactive = themes_path.."default/titlebar/floating_normal_inactive.png" +-- theme.titlebar_floating_button_focus_inactive = themes_path.."default/titlebar/floating_focus_inactive.png" +-- theme.titlebar_floating_button_normal_active = themes_path.."default/titlebar/floating_normal_active.png" +-- theme.titlebar_floating_button_focus_active = themes_path.."default/titlebar/floating_focus_active.png" + +-- theme.titlebar_maximized_button_normal_inactive = themes_path.."default/titlebar/maximized_normal_inactive.png" +-- theme.titlebar_maximized_button_focus_inactive = themes_path.."default/titlebar/maximized_focus_inactive.png" +-- theme.titlebar_maximized_button_normal_active = themes_path.."default/titlebar/maximized_normal_active.png" +-- theme.titlebar_maximized_button_focus_active = themes_path.."default/titlebar/maximized_focus_active.png" + +theme.wallpaper = themes_path.."default/background.png" + +-- You can use your own layout icons like this: +theme.layout_fairh = themes_path.."default/layouts/fairhw.png" +theme.layout_fairv = themes_path.."default/layouts/fairvw.png" +theme.layout_floating = themes_path.."default/layouts/floatingw.png" +theme.layout_magnifier = themes_path.."default/layouts/magnifierw.png" +theme.layout_max = themes_path.."default/layouts/maxw.png" +theme.layout_fullscreen = themes_path.."default/layouts/fullscreenw.png" +theme.layout_tilebottom = themes_path.."default/layouts/tilebottomw.png" +theme.layout_tileleft = themes_path.."default/layouts/tileleftw.png" +theme.layout_tile = themes_path.."default/layouts/tilew.png" +theme.layout_tiletop = themes_path.."default/layouts/tiletopw.png" +theme.layout_spiral = themes_path.."default/layouts/spiralw.png" +theme.layout_dwindle = themes_path.."default/layouts/dwindlew.png" +theme.layout_cornernw = themes_path.."default/layouts/cornernww.png" +theme.layout_cornerne = themes_path.."default/layouts/cornernew.png" +theme.layout_cornersw = themes_path.."default/layouts/cornersww.png" +theme.layout_cornerse = 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 = nil + +return theme + +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 -- GitLab