From 3aa412a73f0eab470d69ae99ebc82f840475910b Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Tue, 13 Aug 2019 23:03:08 +0200 Subject: [PATCH] Big refactor to make simple awesome a lua module --- README.md | 4 + {art => assets/art}/default_wallpaper.png | Bin {art => assets/art}/default_wallpaper.xcf | Bin {icons => assets/icons}/lock.svg | 0 {icons => assets/icons}/log-out.svg | 0 {icons => assets/icons}/power.svg | 0 {icons => assets/icons}/refresh-cw.svg | 0 {icons => assets/icons}/volume-1.svg | 0 {icons => assets/icons}/volume-2.svg | 0 {icons => assets/icons}/volume-x.svg | 0 {icons => assets/icons}/volume.svg | 0 {rofi => assets/rofi}/themes/paper-float.rasi | 0 default_config.lua | 72 +- default_theme.lua | 10 +- rc.lua | 725 +----------------- simple/core/hotkey.lua | 25 + {debug => simple/debug}/inspect.lua | 0 simple/init.lua | 716 +++++++++++++++++ media_control.lua => simple/media_control.lua | 2 +- tiling.lua => simple/tiling.lua | 0 .../widgets}/system_resources.lua | 4 +- theme.lua | 3 + 22 files changed, 799 insertions(+), 762 deletions(-) rename {art => assets/art}/default_wallpaper.png (100%) rename {art => assets/art}/default_wallpaper.xcf (100%) rename {icons => assets/icons}/lock.svg (100%) rename {icons => assets/icons}/log-out.svg (100%) rename {icons => assets/icons}/power.svg (100%) rename {icons => assets/icons}/refresh-cw.svg (100%) rename {icons => assets/icons}/volume-1.svg (100%) rename {icons => assets/icons}/volume-2.svg (100%) rename {icons => assets/icons}/volume-x.svg (100%) rename {icons => assets/icons}/volume.svg (100%) rename {rofi => assets/rofi}/themes/paper-float.rasi (100%) create mode 100644 simple/core/hotkey.lua rename {debug => simple/debug}/inspect.lua (100%) create mode 100644 simple/init.lua rename media_control.lua => simple/media_control.lua (99%) rename tiling.lua => simple/tiling.lua (100%) rename {widgets/system_resources => simple/widgets}/system_resources.lua (97%) create mode 100644 theme.lua diff --git a/README.md b/README.md index 716008c..efe4ad8 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,7 @@ By default, Simple Awesome uses - Improve "leave menu"'s design - Modify "start menu", make everything work - Make "start menu" and "leave menu" not sticky (they currently stay open and focus even when clicking outside) + +## Arisu personal todo + +- Add aliases to rofi https://github.com/davatorium/rofi/issues/97 diff --git a/art/default_wallpaper.png b/assets/art/default_wallpaper.png similarity index 100% rename from art/default_wallpaper.png rename to assets/art/default_wallpaper.png diff --git a/art/default_wallpaper.xcf b/assets/art/default_wallpaper.xcf similarity index 100% rename from art/default_wallpaper.xcf rename to assets/art/default_wallpaper.xcf diff --git a/icons/lock.svg b/assets/icons/lock.svg similarity index 100% rename from icons/lock.svg rename to assets/icons/lock.svg diff --git a/icons/log-out.svg b/assets/icons/log-out.svg similarity index 100% rename from icons/log-out.svg rename to assets/icons/log-out.svg diff --git a/icons/power.svg b/assets/icons/power.svg similarity index 100% rename from icons/power.svg rename to assets/icons/power.svg diff --git a/icons/refresh-cw.svg b/assets/icons/refresh-cw.svg similarity index 100% rename from icons/refresh-cw.svg rename to assets/icons/refresh-cw.svg diff --git a/icons/volume-1.svg b/assets/icons/volume-1.svg similarity index 100% rename from icons/volume-1.svg rename to assets/icons/volume-1.svg diff --git a/icons/volume-2.svg b/assets/icons/volume-2.svg similarity index 100% rename from icons/volume-2.svg rename to assets/icons/volume-2.svg diff --git a/icons/volume-x.svg b/assets/icons/volume-x.svg similarity index 100% rename from icons/volume-x.svg rename to assets/icons/volume-x.svg diff --git a/icons/volume.svg b/assets/icons/volume.svg similarity index 100% rename from icons/volume.svg rename to assets/icons/volume.svg diff --git a/rofi/themes/paper-float.rasi b/assets/rofi/themes/paper-float.rasi similarity index 100% rename from rofi/themes/paper-float.rasi rename to assets/rofi/themes/paper-float.rasi diff --git a/default_config.lua b/default_config.lua index dc9acd5..f655401 100644 --- a/default_config.lua +++ b/default_config.lua @@ -1,5 +1,6 @@ -- Default configuration file --- Copy to TBD to override values. This file will be overridden on update. +-- This file will be overridden on update. +-- Copy to `~/.config/awesome/config.lua` to avoid losing your changes. local awful = require("awful") local naughty = require("naughty") @@ -18,16 +19,13 @@ config.awesome = { -- when client with a matching name is opened: hotkeys_popup = true, + -- Application launcher + application_launcher_check = "rofi -version", + application_launcher = "rofi -show run -config " .. awful.util.getdir("config") .. "/assets/rofi/themes/paper-float.rasi", + -- Terminal terminal = "terminator", - -- Default terminal editor - editor = os.getenv("EDITOR") or "nano", - -- editor = "vi", - - -- Default terminal editor command - editor_cmd = config.awesome.terminal .. " -e " .. config.awesome.editor, - -- Window tiling tiling = { -- Available window layouts - order matters @@ -52,6 +50,14 @@ config.awesome = { }, } +-- Default text editor +config.awesome.editor = os.getenv("EDITOR") or "nano" +-- config.awesome.editor = "vi" +-- config.awesome.editor = "code" + +-- Default text editor command +config.awesome.editor_cmd = config.awesome.terminal .. " -e " .. config.awesome.editor + -- -- Keys / Hotkeys / Shortcuts @@ -62,33 +68,38 @@ config.keys = { -- Main modifier key for meta hotkeys like moving windows or locking the session -- Usually, Mod4 is the key with a logo between Control and Alt. modkey = "Mod4", +} - -- Hotkeys globally available (through the entire OS, regardless of what's focused) - globalkeys = { - media_control = { - -- - -- Media and volume controls - -- See media_control.lua - -- +-- Hotkeys globally available (through the entire OS, regardless of what's focused) +config.keys.global_keys = { + -- Application launcher + launcher = { + { config.keys.modkey }, + "space", + }, - -- Raise volume - raiseVolume = "XF86AudioRaiseVolume", + -- + -- Media and volume controls + -- See media_control.lua + -- + media_control = { + -- Raise volume + raiseVolume = "XF86AudioRaiseVolume", - -- Lower volume - lowerVolume = "XF86AudioLowerVolume", + -- Lower volume + lowerVolume = "XF86AudioLowerVolume", - -- Toggle mute - toggleMute = "XF86AudioMute", + -- Toggle mute + toggleMute = "XF86AudioMute", - -- Toggle Play / Pause - playPause = "XF86AudioPlay", + -- Toggle Play / Pause + playPause = "XF86AudioPlay", - -- Next track - nextTrack = "XF86AudioNext", + -- Next track + nextTrack = "XF86AudioNext", - -- Previous track - previousTrack = "XF86AudioPrev", - }, + -- Previous track + previousTrack = "XF86AudioPrev", }, } @@ -119,7 +130,7 @@ config.autostart = { -- Theme -- Change to gears.filesystem.get_themes_dir() .. "default/theme.lua" to use default awesome theme -config.theme = awful.util.getdir("config") .. "/default_theme.lua" +config.theme = awful.util.getdir("config") .. "/theme.lua" -- Screenshot utility config.screenshot_utility_command = "flameshot gui" @@ -129,8 +140,7 @@ config.kbSwitchCmd = "setxkbmap" config.kbLayouts = { "fr", "us" } -- Run menu -config.runMenu = "rofi -show run -config " .. awful.util.getdir("config") .. "/rofi/themes/paper-float.rasi" -config.windowSwitcher = "rofi -show window -config " .. awful.util.getdir("config") .. "/rofi/themes/paper-float.rasi" +config.windowSwitcher = "rofi -show window -config " .. awful.util.getdir("config") .. "/assets/rofi/themes/paper-float.rasi" -- Media control config.volume_osd_timeout = 2 diff --git a/default_theme.lua b/default_theme.lua index c402843..d402af7 100644 --- a/default_theme.lua +++ b/default_theme.lua @@ -72,10 +72,10 @@ end theme.volume_osd_width = dpi(128) theme.volume_osd_height = dpi(128) theme.volume_osd_image_color = "#ffffff" -theme.volume_osd_icon_0 = simple_awesome_path .. "/icons/volume-x.svg" -theme.volume_osd_icon_1 = simple_awesome_path .. "/icons/volume.svg" -theme.volume_osd_icon_2 = simple_awesome_path .. "/icons/volume-1.svg" -theme.volume_osd_icon_3 = simple_awesome_path .. "/icons/volume-2.svg" +theme.volume_osd_icon_0 = simple_awesome_path .. "/assets/icons/volume-x.svg" +theme.volume_osd_icon_1 = simple_awesome_path .. "/assets/icons/volume.svg" +theme.volume_osd_icon_2 = simple_awesome_path .. "/assets/icons/volume-1.svg" +theme.volume_osd_icon_3 = simple_awesome_path .. "/assets/icons/volume-2.svg" -- System resources widget theme.system_resources_widget_bar_bg = theme.bg_focus @@ -155,7 +155,7 @@ theme.titlebar_maximized_button_focus_inactive = themes_path.."default/titlebar 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 = simple_awesome_path.."/art/default_wallpaper.png" +theme.wallpaper = simple_awesome_path.."/assets/art/default_wallpaper.png" -- You can use your own layout icons like this: theme.layout_fairh = themes_path.."default/layouts/fairhw.png" diff --git a/rc.lua b/rc.lua index a4aa8cb..a6efe2c 100644 --- a/rc.lua +++ b/rc.lua @@ -1,726 +1,5 @@ -- --- Simple Awesome main file - By Arisu & Arkhist +-- Simple Awesome - By Arisu & Arkhist -- To configure Simple Awesome without losing your changes when updating, see the `config.lua` file. -- - - --- --- DEBUG --- -local inspect = require("debug/inspect") - --- --- Simple Awesome configuration --- -local config = require("config") - - --- --- Awesome WM --- -local awful = require("awful") -local beautiful = require("beautiful") -local gears = require("gears") -local naughty = require("naughty") -local wibox = require("wibox") - --- Widgets and layout components -local hotkeys_popup = require("awful.hotkeys_popup") -local menubar = require("menubar") - --- Window autofocus -if config.awesome.autofocus then - require("awful.autofocus") -end - --- Hotkeys popup -if hotkeys_popup then - require("awful.hotkeys_popup.keys") -end - - --- --- Error handling --- - --- Startup errors -if awesome.startup_errors then - naughty.notify({ - preset = naughty.config.presets.critical, - title = "Something went wrong while booting Awesome", - text = awesome.startup_errors - }) -end - --- Runtime errors handling routine -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 = "An error happened during Awesome runtime", - text = tostring(err) - }) - in_error = false - end) -end - - --- --- Variables that need to be populated during the whole setup --- - --- Hotkeys -local globalkeys = {} -function registerKeys(...) - globalkeys = gears.table.join(globalkeys, ...) -end - - --- --- Theme --- -beautiful.init(config.theme) - - --- --- Window tiling --- -local tiling = require("tiling") - --- Tiling layouts -awful.layout.layouts = config.awesome.tiling.layouts - - --- --- Media control keys and widget --- -local media_control = require("media_control") -registerKeys(media_control.getKeys(config.keys.globalkeys.media_control)) - - --- --- Widgets --- - --- System resources -local system_resources_widget -if config.widgets.system_resources then - system_resources_widget = require("widgets/system_resources/system_resources") -end - - --- --- Auto start --- -for _, app in ipairs(config.autostart) do - local type = type(app) - if type == "table" then -- Has a verification command that checks if it exists on the system - if os.execute(app[1]) == true then - awful.spawn(app[2]) - end - elseif type == "string" then -- Simple command - awful.spawn(app) - end -end - - --- {{{ Menu --- Create a launcher widget and a main menu -myawesomemenu = { - { "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) end }, - { "manual", config.awesome.terminal .. " -e man awesome" }, - { "edit config", config.awesome.editor_cmd .. " " .. awesome.conffile }, - { "restart", awesome.restart }, - { "quit", function() awesome.quit() end }, -} - -mymainmenu = awful.menu({ - items = { - { "awesome", myawesomemenu, beautiful.awesome_icon }, - { "open terminal", config.awesome.terminal } - } -}) - -mylauncher = awful.widget.launcher({ - image = beautiful.awesome_icon, - menu = mymainmenu -}) - --- Menubar configuration -menubar.utils.terminal = config.awesome.terminal -- Set the terminal for applications that require it --- }}} - --- Keyboard map indicator and switcher -mykeyboardlayout = awful.widget.keyboardlayout() - -kbdlayout = {} -kbdlayout.cur = 1 -kbdlayout.switch = function() - kbdlayout.cur = (kbdlayout.cur % #(config.kbLayouts)) + 1 - local t = config.kbLayouts[kbdlayout.cur] - os.execute(config.kbSwitchCmd .. " " .. t) -end - -shutdown_icon = awesome.load_image(awful.util.getdir("config") .. "/icons/power.svg") -restart_icon = awesome.load_image(awful.util.getdir("config") .. "/icons/refresh-cw.svg") -logout_icon = awesome.load_image(awful.util.getdir("config") .. "/icons/log-out.svg") -lock_icon = awesome.load_image(awful.util.getdir("config") .. "/icons/lock.svg") - -shutdownMenu_items = { - { - "Shutdown", - function() - os.execute('shutdown now') - end, - shutdown_icon - }, - { - "Restart", - function() - os.execute('shutdown -r now') - end, - restart_icon - }, - { - "Logout", - function() - awesome.quit() - end, - logout_icon - }, - { - "Lock", - function() - awful.spawn("xscreensaver-command -lock") - end, - lock_icon - } -} -shutdownMenu_launcher = awful.widget.launcher({ - image = beautiful.awesome_icon, - menu = awful.menu({ items = shutdownMenu_items }) -}) - - --- {{{ Wibar --- Create a textclock widget -mytextclock = wibox.widget.textclock() - --- 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({ config.keys.modkey }, 1, function(t) - if client.focus then - client.focus:move_to_tag(t) - end - end), - awful.button({}, 3, awful.tag.viewtoggle), - awful.button({ config.keys.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({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, 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, - widget_template = { - { - { - { - { - id = 'icon_role', - widget = wibox.widget.imagebox, - }, - margins = 8, - widget = wibox.container.margin, - }, - { - id = 'text_role', - widget = wibox.widget.textbox, - }, - layout = wibox.layout.fixed.horizontal, - }, - left = 0, - right = 8, - widget = wibox.container.margin - }, - id = 'background_role', - widget = wibox.container.background, - }, - layout = { - max_widget_size = 256, - layout = wibox.layout.flex.horizontal - } - } - - -- Create the wibox - s.mywibox = awful.wibar({ - position = "top", - screen = s, - height = 32 - }) - - function matchesScreen(screens) - for _, allowedScreen in ipairs(screens) do - if allowedScreen == s.index then - return true - end - end - return false - 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 - matchesScreen(config.system_resources_widget_screens) and system_resources_widget.widget or nil, - layout = wibox.layout.fixed.horizontal, - mykeyboardlayout, - wibox.widget.systray(), - mytextclock, - s.mylayoutbox, - shutdownMenu_launcher, - }, - } -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))) --- }}} - --- {{{ Key bindings -globalkeys = gears.table.join(globalkeys, awful.key({ config.keys.modkey, }, "s", hotkeys_popup.show_help, - { description = "show help", group = "awesome" }), - - awful.key({ config.keys.modkey, }, "Escape", awful.tag.history.restore, - { description = "go back", group = "tag" }), - - awful.key({ config.keys.modkey, }, "j", - function() - awful.client.focus.byidx(1) - end, - { description = "focus next by index", group = "client" }), - awful.key({ config.keys.modkey, }, "k", - function() - awful.client.focus.byidx(-1) - end, - { description = "focus previous by index", group = "client" }), - awful.key({ config.keys.modkey, }, "w", function() mymainmenu:show() end, - { description = "show main menu", group = "awesome" }), - - -- Layout manipulation - awful.key({ config.keys.modkey, "Shift" }, "j", function() awful.client.swap.byidx(1) end, - { description = "swap with next client by index", group = "client" }), - awful.key({ config.keys.modkey, "Shift" }, "k", function() awful.client.swap.byidx(-1) end, - { description = "swap with previous client by index", group = "client" }), - awful.key({ config.keys.modkey, "Control" }, "j", function() awful.screen.focus_relative(1) end, - { description = "focus the next screen", group = "screen" }), - awful.key({ config.keys.modkey, "Control" }, "k", function() awful.screen.focus_relative(-1) end, - { description = "focus the previous screen", group = "screen" }), - awful.key({ config.keys.modkey, }, "u", awful.client.urgent.jumpto, - { description = "jump to urgent client", group = "client" }), - awful.key({ config.keys.modkey, }, "Tab", - function() - if config.windowSwitcher == "" then - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - else - os.execute(config.windowSwitcher) - end - end, - { description = "switch window", group = "client" }), - - -- Standard program - awful.key({ config.keys.modkey, }, "Return", function() awful.spawn(config.awesome.terminal) end, - { description = "open a terminal", group = "launcher" }), - awful.key({ config.keys.modkey, "Control" }, "r", awesome.restart, - { description = "reload awesome", group = "awesome" }), - awful.key({ config.keys.modkey, "Shift" }, "q", awesome.quit, - { description = "quit awesome", group = "awesome" }), - - awful.key({ config.keys.modkey, }, "l", function() awful.tag.incmwfact(0.05) end, - { description = "increase master width factor", group = "layout" }), - awful.key({ config.keys.modkey, }, "h", function() awful.tag.incmwfact(-0.05) end, - { description = "decrease master width factor", group = "layout" }), - awful.key({ config.keys.modkey, "Shift" }, "h", function() awful.tag.incnmaster(1, nil, true) end, - { description = "increase the number of master clients", group = "layout" }), - awful.key({ config.keys.modkey, "Shift" }, "l", function() awful.tag.incnmaster(-1, nil, true) end, - { description = "decrease the number of master clients", group = "layout" }), - awful.key({ config.keys.modkey, "Control" }, "h", function() awful.tag.incncol(1, nil, true) end, - { description = "increase the number of columns", group = "layout" }), - awful.key({ config.keys.modkey, "Control" }, "l", function() awful.tag.incncol(-1, nil, true) end, - { description = "decrease the number of columns", group = "layout" }), - awful.key({ config.keys.modkey, }, "space", function() awful.layout.inc(1) end, - { description = "select next", group = "layout" }), - awful.key({ config.keys.modkey, "Shift" }, "space", function() awful.layout.inc(-1) end, - { description = "select previous", group = "layout" }), - - awful.key({ config.keys.modkey, "Control" }, "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" }), - - -- Prompt - awful.key({ config.keys.modkey }, "r", function() os.execute(config.runMenu) end, - { description = "show the run menu", group = "launcher" }), - - awful.key({ config.keys.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" }), - -- Menubar - awful.key({ config.keys.modkey }, "space", function() os.execute(config.runMenu) end, - { description = "show the run menu", group = "launcher" }), - -- Keyboard layout switch - awful.key({ "Mod1" }, "Shift_L", function() kbdlayout.switch() end, - { description = "switch keyboard layout" }), - awful.key({ "Shift" }, "Alt_L", function() kbdlayout.switch() end, - { description = "switch keyboard layout" }), - -- Flameshot - awful.key({}, "Print", function() os.execute(config.screenshot_utility_command) end, - { description = "Take a screenshot using the screenshot utility", group = "utilities" })) - -clientkeys = gears.table.join(-- tiling - awful.key({ config.keys.modkey, }, "Right", - tiling.key.tileRight, - { description = "Tile right", group = "tiling" }), - awful.key({ config.keys.modkey, }, "Left", - tiling.key.tileLeft, - { description = "Tile left", group = "tiling" }), - awful.key({ config.keys.modkey, }, "Up", - tiling.key.toggleMaximized, - { description = "Toggle maximized", group = "tiling" }), - awful.key({ config.keys.modkey, }, "Down", - tiling.key.minimize, - { description = "Lower", group = "tiling" }), - - awful.key({ config.keys.modkey, }, "f", - function(c) - c.fullscreen = not c.fullscreen - c:raise() - end, - { description = "toggle fullscreen", group = "client" }), - awful.key({ config.keys.modkey, "Shift" }, "c", function(c) c:kill() end, - { description = "close", group = "client" }), - awful.key({ config.keys.modkey, "Control" }, "space", awful.client.floating.toggle, - { description = "toggle floating", group = "client" }), - awful.key({ config.keys.modkey, "Control" }, "Return", function(c) c:swap(awful.client.getmaster()) end, - { description = "move to master", group = "client" }), - awful.key({ config.keys.modkey, }, "o", function(c) c:move_to_screen() end, - { description = "move to screen", group = "client" }), - awful.key({ config.keys.modkey, }, "t", function(c) c.ontop = not c.ontop end, - { description = "toggle keep on top", group = "client" }), - awful.key({ config.keys.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({ config.keys.modkey, }, "m", - function(c) - c.maximized = not c.maximized - c:raise() - end, - { description = "(un)maximize", group = "client" }), - awful.key({ config.keys.modkey, "Control" }, "m", - function(c) - c.maximized_vertical = not c.maximized_vertical - c:raise() - end, - { description = "(un)maximize vertically", group = "client" }), - awful.key({ config.keys.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 = gears.table.join(globalkeys, - -- View tag only. - awful.key({ config.keys.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({ config.keys.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({ config.keys.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({ config.keys.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 = gears.table.join(awful.button({}, 1, function(c) - c:emit_signal("request::activate", "mouse_click", { raise = true }) -end), - awful.button({ config.keys.modkey }, 1, function(c) - c:emit_signal("request::activate", "mouse_click", { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({ config.keys.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 } - }, - - -- 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) - -- buttons for the titlebar - local buttons = gears.table.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):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 - } -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) --- }}} +require("simple") diff --git a/simple/core/hotkey.lua b/simple/core/hotkey.lua new file mode 100644 index 0000000..693dd59 --- /dev/null +++ b/simple/core/hotkey.lua @@ -0,0 +1,25 @@ +local awful = require("awful") +local gears = require("gears") + +local global_keys = {} + +function make(hotkey, action, identity) + local modifiers = hotkey[1] + local key = hotkey[2] + return awful.key(modifiers, key, action, identity) +end + + +function registerKeys(...) + global_keys = gears.table.join(global_keys, ...) +end + +function getKeys() + return global_keys +end + +return { + make = make, + registerKeys = registerKeys, + getKeys = getKeys, +} \ No newline at end of file diff --git a/debug/inspect.lua b/simple/debug/inspect.lua similarity index 100% rename from debug/inspect.lua rename to simple/debug/inspect.lua diff --git a/simple/init.lua b/simple/init.lua new file mode 100644 index 0000000..f4f5eb8 --- /dev/null +++ b/simple/init.lua @@ -0,0 +1,716 @@ +-- +-- DEBUG +-- +local inspect = require("simple/debug/inspect") + +-- +-- Simple Awesome configuration +-- +local config = require("config") + + +-- +-- Hotkeys +-- +local hotkey = require("simple/core/hotkey") + + +-- +-- Awesome WM +-- +local awful = require("awful") +local beautiful = require("beautiful") +local gears = require("gears") +local naughty = require("naughty") +local wibox = require("wibox") + +-- Widgets and layout components +local hotkeys_popup = require("awful.hotkeys_popup") + +-- Window autofocus +if config.awesome.autofocus then + require("awful.autofocus") +end + +-- Hotkeys popup +if hotkeys_popup then + require("awful.hotkeys_popup.keys") +end + +-- Application launcher +local menubar = require("menubar") +menubar.utils.terminal = config.awesome.terminal +function showAppLauncher() + if os.execute(config.awesome.application_launcher_check) then + awful.spawn(config.awesome.application_launcher) + else + menubar.show() + end +end + +hotkey.registerKeys(hotkey.make(config.keys.global_keys.launcher, showAppLauncher, + { description = "show the application launcher", group = "launcher" })) + + +-- +-- Error handling +-- + +-- Startup errors +if awesome.startup_errors then + naughty.notify({ + preset = naughty.config.presets.critical, + title = "Something went wrong while booting Awesome", + text = awesome.startup_errors + }) +end + +-- Runtime errors handling routine +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 = "An error happened during Awesome runtime", + text = tostring(err) + }) + in_error = false + end) +end + + +-- +-- Theme +-- +beautiful.init(config.theme) + + +-- +-- Window tiling +-- +local tiling = require("simple/tiling") + +-- Tiling layouts +awful.layout.layouts = config.awesome.tiling.layouts + + +-- +-- Media control keys and widget +-- +local media_control = require("simple/media_control") +hotkey.registerKeys(media_control.getKeys(config.keys.global_keys.media_control)) + + +-- +-- Widgets +-- + +-- System resources +local system_resources_widget +if config.widgets.system_resources then + system_resources_widget = require("simple/widgets/system_resources") +end + + +-- +-- Auto start +-- +for _, app in ipairs(config.autostart) do + local type = type(app) + if type == "table" then -- Has a verification command that checks if it exists on the system + if os.execute(app[1]) == true then + awful.spawn(app[2]) + end + elseif type == "string" then -- Simple command + awful.spawn(app) + end +end + +-- +-- Launcher (start menu) +-- +local launcher = awful.widget.launcher({ + image = beautiful.awesome_icon, + menu = awful.menu({ + items = { + { "Hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) end }, + { "Manual", config.awesome.terminal .. " -e man awesome" }, + { "Edit config", config.awesome.editor_cmd .. " " .. awesome.conffile }, + { "Open terminal", config.awesome.terminal } + } + }), +}) + + +-- Keyboard map indicator and switcher +mykeyboardlayout = awful.widget.keyboardlayout() + +kbdlayout = {} +kbdlayout.cur = 1 +kbdlayout.switch = function() + kbdlayout.cur = (kbdlayout.cur % #(config.kbLayouts)) + 1 + local t = config.kbLayouts[kbdlayout.cur] + os.execute(config.kbSwitchCmd .. " " .. t) +end + +shutdown_icon = awesome.load_image(awful.util.getdir("config") .. "/assets/icons/power.svg") +restart_icon = awesome.load_image(awful.util.getdir("config") .. "/assets/icons/refresh-cw.svg") +logout_icon = awesome.load_image(awful.util.getdir("config") .. "/assets/icons/log-out.svg") +lock_icon = awesome.load_image(awful.util.getdir("config") .. "/assets/icons/lock.svg") + +shutdownMenu_items = { + { + "Shutdown", + function() + os.execute('shutdown now') + end, + shutdown_icon + }, + { + "Restart", + function() + os.execute('shutdown -r now') + end, + restart_icon + }, + { + "Logout", + function() + awesome.quit() + end, + logout_icon + }, + { + "Lock", + function() + awful.spawn("xscreensaver-command -lock") + end, + lock_icon + } +} +shutdownMenu_launcher = awful.widget.launcher({ + image = beautiful.awesome_icon, + menu = awful.menu({ items = shutdownMenu_items }) +}) + + +-- {{{ Wibar +-- Create a textclock widget +mytextclock = wibox.widget.textclock() + +-- 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({ config.keys.modkey }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end + end), + awful.button({}, 3, awful.tag.viewtoggle), + awful.button({ config.keys.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({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, 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, + widget_template = { + { + { + { + { + id = 'icon_role', + widget = wibox.widget.imagebox, + }, + margins = 8, + widget = wibox.container.margin, + }, + { + id = 'text_role', + widget = wibox.widget.textbox, + }, + layout = wibox.layout.fixed.horizontal, + }, + left = 0, + right = 8, + widget = wibox.container.margin + }, + id = 'background_role', + widget = wibox.container.background, + }, + layout = { + max_widget_size = 256, + layout = wibox.layout.flex.horizontal + } + } + + -- Create the wibox + s.mywibox = awful.wibar({ + position = "top", + screen = s, + height = 32 + }) + + function matchesScreen(screens) + for _, allowedScreen in ipairs(screens) do + if allowedScreen == s.index then + return true + end + end + return false + 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 + matchesScreen(config.system_resources_widget_screens) and system_resources_widget.widget or nil, + layout = wibox.layout.fixed.horizontal, + mykeyboardlayout, + wibox.widget.systray(), + mytextclock, + s.mylayoutbox, + shutdownMenu_launcher, + }, + } +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))) +-- }}} + +-- {{{ Key bindings +hotkey.registerKeys(awful.key({ config.keys.modkey, }, "s", hotkeys_popup.show_help, + { description = "show help", group = "awesome" }), + + awful.key({ config.keys.modkey, }, "Escape", awful.tag.history.restore, + { description = "go back", group = "tag" }), + + awful.key({ config.keys.modkey, }, "j", + function() + awful.client.focus.byidx(1) + end, + { description = "focus next by index", group = "client" }), + awful.key({ config.keys.modkey, }, "k", + function() + awful.client.focus.byidx(-1) + end, + { description = "focus previous by index", group = "client" }), + awful.key({ config.keys.modkey, }, "w", function() mymainmenu:show() end, + { description = "show main menu", group = "awesome" }), + + -- Layout manipulation + awful.key({ config.keys.modkey, "Shift" }, "j", function() awful.client.swap.byidx(1) end, + { description = "swap with next client by index", group = "client" }), + awful.key({ config.keys.modkey, "Shift" }, "k", function() awful.client.swap.byidx(-1) end, + { description = "swap with previous client by index", group = "client" }), + awful.key({ config.keys.modkey, "Control" }, "j", function() awful.screen.focus_relative(1) end, + { description = "focus the next screen", group = "screen" }), + awful.key({ config.keys.modkey, "Control" }, "k", function() awful.screen.focus_relative(-1) end, + { description = "focus the previous screen", group = "screen" }), + awful.key({ config.keys.modkey, }, "u", awful.client.urgent.jumpto, + { description = "jump to urgent client", group = "client" }), + awful.key({ config.keys.modkey, }, "Tab", + function() + if config.windowSwitcher == "" then + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + else + os.execute(config.windowSwitcher) + end + end, + { description = "switch window", group = "client" }), + + -- Standard program + awful.key({ config.keys.modkey, }, "Return", function() awful.spawn(config.awesome.terminal) end, + { description = "open a terminal", group = "launcher" }), + awful.key({ config.keys.modkey, "Control" }, "r", awesome.restart, + { description = "reload awesome", group = "awesome" }), + awful.key({ config.keys.modkey, "Shift" }, "q", awesome.quit, + { description = "quit awesome", group = "awesome" }), + + awful.key({ config.keys.modkey, }, "l", function() awful.tag.incmwfact(0.05) end, + { description = "increase master width factor", group = "layout" }), + awful.key({ config.keys.modkey, }, "h", function() awful.tag.incmwfact(-0.05) end, + { description = "decrease master width factor", group = "layout" }), + awful.key({ config.keys.modkey, "Shift" }, "h", function() awful.tag.incnmaster(1, nil, true) end, + { description = "increase the number of master clients", group = "layout" }), + awful.key({ config.keys.modkey, "Shift" }, "l", function() awful.tag.incnmaster(-1, nil, true) end, + { description = "decrease the number of master clients", group = "layout" }), + awful.key({ config.keys.modkey, "Control" }, "h", function() awful.tag.incncol(1, nil, true) end, + { description = "increase the number of columns", group = "layout" }), + awful.key({ config.keys.modkey, "Control" }, "l", function() awful.tag.incncol(-1, nil, true) end, + { description = "decrease the number of columns", group = "layout" }), + awful.key({ config.keys.modkey, }, "space", function() awful.layout.inc(1) end, + { description = "select next", group = "layout" }), + awful.key({ config.keys.modkey, "Shift" }, "space", function() awful.layout.inc(-1) end, + { description = "select previous", group = "layout" }), + + awful.key({ config.keys.modkey, "Control" }, "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" }), + + -- Prompt + awful.key({ config.keys.modkey }, "r", function() os.execute(config.runMenu) end, + { description = "show the run menu", group = "launcher" }), + + awful.key({ config.keys.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" }), + -- Menubar + awful.key({ config.keys.modkey }, "space", function() os.execute(config.runMenu) end, + { description = "show the run menu", group = "launcher" }), + -- Keyboard layout switch + awful.key({ "Mod1" }, "Shift_L", function() kbdlayout.switch() end, + { description = "switch keyboard layout" }), + awful.key({ "Shift" }, "Alt_L", function() kbdlayout.switch() end, + { description = "switch keyboard layout" }), + -- Flameshot + awful.key({}, "Print", function() os.execute(config.screenshot_utility_command) end, + { description = "Take a screenshot using the screenshot utility", group = "utilities" })) + +clientkeys = gears.table.join(-- tiling + awful.key({ config.keys.modkey, }, "Right", + tiling.key.tileRight, + { description = "Tile right", group = "tiling" }), + awful.key({ config.keys.modkey, }, "Left", + tiling.key.tileLeft, + { description = "Tile left", group = "tiling" }), + awful.key({ config.keys.modkey, }, "Up", + tiling.key.toggleMaximized, + { description = "Toggle maximized", group = "tiling" }), + awful.key({ config.keys.modkey, }, "Down", + tiling.key.minimize, + { description = "Lower", group = "tiling" }), + + awful.key({ config.keys.modkey, }, "f", + function(c) + c.fullscreen = not c.fullscreen + c:raise() + end, + { description = "toggle fullscreen", group = "client" }), + awful.key({ config.keys.modkey, "Shift" }, "c", function(c) c:kill() end, + { description = "close", group = "client" }), + awful.key({ config.keys.modkey, "Control" }, "space", awful.client.floating.toggle, + { description = "toggle floating", group = "client" }), + awful.key({ config.keys.modkey, "Control" }, "Return", function(c) c:swap(awful.client.getmaster()) end, + { description = "move to master", group = "client" }), + awful.key({ config.keys.modkey, }, "o", function(c) c:move_to_screen() end, + { description = "move to screen", group = "client" }), + awful.key({ config.keys.modkey, }, "t", function(c) c.ontop = not c.ontop end, + { description = "toggle keep on top", group = "client" }), + awful.key({ config.keys.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({ config.keys.modkey, }, "m", + function(c) + c.maximized = not c.maximized + c:raise() + end, + { description = "(un)maximize", group = "client" }), + awful.key({ config.keys.modkey, "Control" }, "m", + function(c) + c.maximized_vertical = not c.maximized_vertical + c:raise() + end, + { description = "(un)maximize vertically", group = "client" }), + awful.key({ config.keys.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 + hotkey.registerKeys(-- View tag only. + awful.key({ config.keys.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({ config.keys.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({ config.keys.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({ config.keys.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 = gears.table.join(awful.button({}, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) +end), + awful.button({ config.keys.modkey }, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) + awful.mouse.client.move(c) + end), + awful.button({ config.keys.modkey }, 3, function(c) + c:emit_signal("request::activate", "mouse_click", { raise = true }) + awful.mouse.client.resize(c) + end)) + +-- Set keys +root.keys(hotkey.getKeys()) +-- }}} + +-- {{{ 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 } + }, + + -- 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) + -- buttons for the titlebar + local buttons = gears.table.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):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 + } +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) +-- }}} diff --git a/media_control.lua b/simple/media_control.lua similarity index 99% rename from media_control.lua rename to simple/media_control.lua index 8683e8b..4f10dcb 100644 --- a/media_control.lua +++ b/simple/media_control.lua @@ -8,7 +8,7 @@ -- -- DEBUG -- -local inspect = require("debug/inspect") +local inspect = require("simple/debug/inspect") local awful = require("awful") local beautiful = require("beautiful") diff --git a/tiling.lua b/simple/tiling.lua similarity index 100% rename from tiling.lua rename to simple/tiling.lua diff --git a/widgets/system_resources/system_resources.lua b/simple/widgets/system_resources.lua similarity index 97% rename from widgets/system_resources/system_resources.lua rename to simple/widgets/system_resources.lua index 576faa6..b839c3e 100644 --- a/widgets/system_resources/system_resources.lua +++ b/simple/widgets/system_resources.lua @@ -3,9 +3,9 @@ local gears = require("gears") local naughty = require("naughty") local wibox = require("wibox") -local config = require("../../config") +local config = require("config") -local inspect = require("../../debug/inspect") +local inspect = require("simple/debug/inspect") local bar = { { diff --git a/theme.lua b/theme.lua new file mode 100644 index 0000000..62c006c --- /dev/null +++ b/theme.lua @@ -0,0 +1,3 @@ +local theme = require("default_theme") + +return theme \ No newline at end of file