diff --git a/binds/window/layout.lua b/binds/window/layout.lua index bd30d34..0e6dea2 100755 --- a/binds/window/layout.lua +++ b/binds/window/layout.lua @@ -1,3 +1,5 @@ +local layoutmanager = require("core.layouts.layoutmanager") + return gears.table.join( awful.key( {"Mod4"}, "j", function () diff --git a/core/init.lua b/core/init.lua new file mode 100755 index 0000000..fe3b59e --- /dev/null +++ b/core/init.lua @@ -0,0 +1,4 @@ +return { + -- When everything is ready, call core.start() + start = require("core.start") +} diff --git a/desktop/layoutmanager.lua b/core/layouts/layoutmanager.lua similarity index 98% rename from desktop/layoutmanager.lua rename to core/layouts/layoutmanager.lua index d1acc72..8d3ff2c 100644 --- a/desktop/layoutmanager.lua +++ b/core/layouts/layoutmanager.lua @@ -1,5 +1,3 @@ --- Client layout manager - local LayoutManager = { layouts = nil, -- Table of groups -- current state is kept in each tag, as tag.layout. diff --git a/desktop/widgets/layoutbox.lua b/core/layouts/widget.lua similarity index 91% rename from desktop/widgets/layoutbox.lua rename to core/layouts/widget.lua index 21f5d74..207f1f4 100755 --- a/desktop/widgets/layoutbox.lua +++ b/core/layouts/widget.lua @@ -1,6 +1,4 @@ -local layoutbox = {} - -layoutbox.make = function(screen) +local make = function(screen) local widget widget = wibox.widget { @@ -35,4 +33,4 @@ layoutbox.make = function(screen) return widget end -return layoutbox.make +return make diff --git a/desktop/widgets/shortcut.lua b/core/shortcut.lua similarity index 97% rename from desktop/widgets/shortcut.lua rename to core/shortcut.lua index 762ac87..06892b7 100644 --- a/desktop/widgets/shortcut.lua +++ b/core/shortcut.lua @@ -1,7 +1,7 @@ local shortcuts = {} function shortcuts:new(command, icon) - widget = wibox.widget { + local widget = wibox.widget { { { -- Right space widget = wibox.widget.separator, diff --git a/core/start.lua b/core/start.lua new file mode 100755 index 0000000..79da6f0 --- /dev/null +++ b/core/start.lua @@ -0,0 +1,232 @@ +local function start() + local desktop = { + widgets = { + tasklist = require("core.tasklist"), + textclock = require("core.textclock"), + keymap = modules.ibus.widgets.ibus, + volume = modules.volume.widgets.volume, + launcher = modules.launcher.widgets.launcher, + shortcut = require("core.shortcut"), + + space = function(size) + return wibox.widget { + { + widget = wibox.widget.separator, + color = beautiful.color.transparent, + forced_width = beautiful.dpi(size) + }, + layout = wibox.container.background, + } + end, + + + separator = function(size, margin_h, margin_v) + return wibox.widget { + { + widget = wibox.widget.separator, + color = "#FFFFFF55", + forced_width = beautiful.dpi(size), + thickness = beautiful.dpi(size) + }, + layout = wibox.container.margin, + top = beautiful.dpi(margin_v), + bottom = beautiful.dpi(margin_v), + left = beautiful.dpi(margin_h), + right = beautiful.dpi(margin_h) + } + end + } + } + + + + -- Manages tag grid and widget + local tagger = require("core.tagger.tagger") + + -- Makes a layout indicator. + -- make_layoutbox(screen) will return a widget for the given screen. + local make_layoutbox = require("core.layouts.widget") + + + -- Load conditional modules + if conf.backlight_enabled then + desktop.widgets.backlight = modules.backlight.widgets.backlight + end + if conf.battery_enabled then + desktop.widgets.battery = modules.battery.widgets.battery + end + if conf.mpc_enabled then + desktop.widgets.mpc = modules.mpc.widgets.mpc + end + + + + -- If timed wallpaper is enabled, load timed manager + if (type(beautiful.wallpaper) == "table") then + desktop.wallpaper = require("desktop.wallpaper") + screen.connect_signal("property::geometry", desktop.wallpaper.update) + desktop.wallpaper.update() + desktop.wallpaper.start() + else + + -- Otherwise, set static wallpaper on each screen + -- We loop over screens to prevent the wallpaper from being stretched over + -- all displays. If, for some reason, you want that to happen, use a single + -- call of "gears.wallpaper.maximized(beautiful.wallpaper)" instead of + -- this loop. + + for s in screen do + gears.wallpaper.maximized(beautiful.wallpaper, s) + end + end + + + -- Set a timer that will update the tag indicators of all screens. + -- Even if we do not want continuous updates, we still need a timer: + -- there must be a significant delay (1ish second) before awesome prepares + -- all clients + desktop.screen_timer = gears.timer { + timeout = 2, + call_now = false, + autostart = true, + single_shot = not conf.continuous_tag_updates, + + callback = function() + for s in screen do + s.tagger:update_widget() + end + end + } + + -- Prepare screens + awful.screen.connect_for_each_screen( + function(s) + -- s: the screen this function is being called for + -- Create tag table + + s.tagger = tagger:new(s) + + + -- Create a promptbox for each s + s.mypromptbox = awful.widget.prompt() + + -- Create the bar + s.bar = awful.wibar({ + position = conf.bar_position, + screen = s, + --bg = "#00000000", + bg = beautiful.color.bar.color, + border_width = 0, + height = beautiful.dpi(conf.bar_height), + type = "desktop" + }) + + s.systray = wibox.widget.systray() + s.systraysep = desktop.widgets.separator(2, 5, 3) + s.bar:connect_signal("button::press", + function(_, _, _, button, mods) + + -- Middle-click + if (button == 2) then + s.systray.visible = not s.systray.visible + s.systraysep.visible = s.systray.visible + end + end) + + -- Create shortcut list from config value + if (#conf.bar_shortcuts > 0) then + s.shortcuts = { + layout = wibox.layout.fixed.horizontal, + desktop.widgets.separator(2, 5, 3), + desktop.widgets.space(6) + } + for k, v in pairs(conf.bar_shortcuts) do + s.shortcuts[#s.shortcuts + 1] = desktop.widgets.shortcut:new(v[1], v[2]) + end + end + + + + -- Assemble left bar widgets + + local rightside = { + layout = wibox.layout.fixed.horizontal, + spacing = 0 + } + + rightside = gears.table.join(rightside, { + desktop.widgets.space(10), + s.systraysep, + desktop.widgets.space(10), + { + s.systray, + top = beautiful.dpi(3), + bottom = beautiful.dpi(3), + left = 0, right = 0, + layout = wibox.container.margin, + }, + desktop.widgets.separator(2, 5, 3), + desktop.widgets.space(10), + }) + + if (conf.mpc_enabled) then + rightside = gears.table.join(rightside, { + desktop.widgets.mpc, + desktop.widgets.space(5), + desktop.widgets.separator(2, 5, 3), + desktop.widgets.space(15), + + }) + end + + rightside = gears.table.join(rightside, { + desktop.widgets.textclock, + desktop.widgets.space(8), + + desktop.widgets.battery, + desktop.widgets.backlight, + desktop.widgets.volume, + desktop.widgets.space(8), + + desktop.widgets.keymap, + desktop.widgets.space(8), + + }) + + + + s.bar:setup { + layout = wibox.container.margin, + margins = beautiful.dpi(conf.bar_margin), + + { + layout = wibox.layout.align.horizontal, + { + layout = wibox.layout.fixed.horizontal, + + desktop.widgets.space(8), + + + desktop.widgets.launcher, + + desktop.widgets.space(18), + s.tagger.widget, + make_layoutbox(s), + + s.shortcuts, + + desktop.widgets.space(6), + desktop.widgets.separator(2, 5, 3), + desktop.widgets.space(18), + desktop.widgets.tasklist(s), + }, + + s.mypromptbox, + rightside + } + } + end + ) +end + +return start diff --git a/desktop/tagger.lua b/core/tagger/tagger.lua similarity index 89% rename from desktop/tagger.lua rename to core/tagger/tagger.lua index f337321..e0f9f53 100755 --- a/desktop/tagger.lua +++ b/core/tagger/tagger.lua @@ -1,5 +1,7 @@ -- Tag grid manager +local widget = require("core.tagger.widget") + local Tagger = { screen = nil, rows = 2, cols = 4 } @@ -26,6 +28,8 @@ function Tagger:new(screen) }) end end + + t.widget = widget(t) return t end @@ -53,7 +57,7 @@ function Tagger:setpos(row, col) self:update_widget() end --- Update this tagger's screen's tagindicator +-- Update this tagindicator function Tagger:update_widget() local clients local tgs = self.screen.tags @@ -65,16 +69,16 @@ function Tagger:update_widget() -- Make that the currently active tag is checked and that all -- others are not. if (tgs[i].index == self.screen.selected_tag.index) then - self.screen.tagindicators[i].checked = true + self.widget.tagindicators[i].checked = true else - self.screen.tagindicators[i].checked = false + self.widget.tagindicators[i].checked = false end -- Highlight tags that are not empty if (#clients == 0) then - self.screen.tagindicators[i].border_color = beautiful.color.bar.inactive + self.widget.tagindicators[i].border_color = beautiful.color.bar.inactive else - self.screen.tagindicators[i].border_color = beautiful.color.bar.active + self.widget.tagindicators[i].border_color = beautiful.color.bar.active end end end diff --git a/desktop/widgets/tagindicator.lua b/core/tagger/widget.lua similarity index 61% rename from desktop/widgets/tagindicator.lua rename to core/tagger/widget.lua index 698a873..8a94ce7 100755 --- a/desktop/widgets/tagindicator.lua +++ b/core/tagger/widget.lua @@ -1,13 +1,11 @@ -local tagindicator = {} - -tagindicator.make = function(screen) - local widget +local make = function(tagger) + local widget = {} -- Create tag tagindicators -- We're using flex.vertical and flex.horizontal layouts because the grid -- layout doesn't expand things properly. - screen.tagindicators = {} - screen.tagindicator = wibox.widget { + widget.tagindicators = {} + widget.tagindicator = wibox.widget { homogeneous = true, spacing = beautiful.dpi(2), min_cols_size = 10, @@ -16,9 +14,9 @@ tagindicator.make = function(screen) } local tmp_row - for r=1, screen.tagger.rows do - for c=1, screen.tagger.cols do - screen.tagindicators[(c + (screen.tagger.cols * (r - 1)))] = wibox.widget { + for r=1, tagger.rows do + for c=1, tagger.cols do + widget.tagindicators[(c + (tagger.cols * (r - 1)))] = wibox.widget { checked = false, border_width = beautiful.dpi(2), paddings = beautiful.dpi(3), @@ -30,39 +28,39 @@ tagindicator.make = function(screen) -- Calculate checkbox size limit local cbox_maxsize = beautiful.dpi(conf.bar_height) cbox_maxsize = cbox_maxsize - (2 * beautiful.dpi(conf.bar_margin)) - cbox_maxsize = cbox_maxsize - (screen.tagger.rows - 1)*(beautiful.dpi(screen.tagindicator.spacing)) + cbox_maxsize = cbox_maxsize - (tagger.rows - 1)*(beautiful.dpi(widget.tagindicator.spacing)) if ((conf.bar_position == "bottom") or (conf.bar_position == "top")) then - cbox_maxsize = cbox_maxsize / screen.tagger.rows + cbox_maxsize = cbox_maxsize / tagger.rows else - cbox_maxsize = cbox_maxsize / screen.tagger.cols + cbox_maxsize = cbox_maxsize / tagger.cols end - screen.tagindicator:add_widget_at( + widget.tagindicator:add_widget_at( -- The constraint container is VERY necessary here! -- Otherwise, the checkboxes will fill all the height that is available to them. wibox.container.constraint( - screen.tagindicators[(c + (screen.tagger.cols * (r - 1)))], + widget.tagindicators[(c + (tagger.cols * (r - 1)))], "exact", cbox_maxsize, cbox_maxsize ), r, c) end end - widget = wibox.widget { - screen.tagindicator, + widget.widget = wibox.widget { + widget.tagindicator, layout = wibox.container.background } -- Change background when mouse is over widget - widget:connect_signal("mouse::enter", function(result) + widget.widget:connect_signal("mouse::enter", function(result) widget.bg = beautiful.color.bar.hover_bg end) - widget:connect_signal("mouse::leave", function(result) + widget.widget:connect_signal("mouse::leave", function(result) widget.bg = beautiful.color.transparent end) return widget end -return tagindicator.make +return make diff --git a/desktop/widgets/tasklist.lua b/core/tasklist.lua similarity index 100% rename from desktop/widgets/tasklist.lua rename to core/tasklist.lua diff --git a/desktop/widgets/textclock.lua b/core/textclock.lua similarity index 99% rename from desktop/widgets/textclock.lua rename to core/textclock.lua index aca440f..cdc3e2d 100755 --- a/desktop/widgets/textclock.lua +++ b/core/textclock.lua @@ -2,7 +2,6 @@ local textclock = {} - textclock.widget = wibox.widget { { { -- Right spacer diff --git a/desktop/wallpaper.lua b/core/wallpaper.lua similarity index 100% rename from desktop/wallpaper.lua rename to core/wallpaper.lua diff --git a/desktop/init.lua b/desktop/init.lua deleted file mode 100755 index 1789c7e..0000000 --- a/desktop/init.lua +++ /dev/null @@ -1,225 +0,0 @@ -local desktop = { - Tagger = require("desktop.tagger"), - - widgets = { - tasklist = require("desktop.widgets.tasklist"), - textclock = require("desktop.widgets.textclock"), - layoutbox = require("desktop.widgets.layoutbox"), - keymap = modules.ibus.widgets.ibus, - volume = modules.volume.widgets.volume, - tagindicator = require("desktop.widgets.tagindicator"), - launcher = modules.launcher.widgets.launcher, - shortcut = require("desktop.widgets.shortcut"), - - space = function(size) - return wibox.widget { - { - widget = wibox.widget.separator, - color = beautiful.color.transparent, - forced_width = beautiful.dpi(size) - }, - layout = wibox.container.background, - } - end, - - - separator = function(size, margin_h, margin_v) - return wibox.widget { - { - widget = wibox.widget.separator, - color = "#FFFFFF55", - forced_width = beautiful.dpi(size), - thickness = beautiful.dpi(size) - }, - layout = wibox.container.margin, - top = beautiful.dpi(margin_v), - bottom = beautiful.dpi(margin_v), - left = beautiful.dpi(margin_h), - right = beautiful.dpi(margin_h) - } - end - } -} - - --- Load conditional modules -if conf.backlight_enabled then - desktop.widgets.backlight = modules.backlight.widgets.backlight -end -if conf.battery_enabled then - desktop.widgets.battery = modules.battery.widgets.battery -end -if conf.mpc_enabled then - desktop.widgets.mpc = modules.mpc.widgets.mpc -end - - - --- If timed wallpaper is enabled, load timed manager -if (type(beautiful.wallpaper) == "table") then - desktop.wallpaper = require("desktop.wallpaper") - screen.connect_signal("property::geometry", desktop.wallpaper.update) - desktop.wallpaper.update() - desktop.wallpaper.start() -else - - -- Otherwise, set static wallpaper on each screen - -- We loop over screens to prevent the wallpaper from being stretched over - -- all displays. If, for some reason, you want that to happen, use a single - -- call of "gears.wallpaper.maximized(beautiful.wallpaper)" instead of - -- this loop. - - for s in screen do - gears.wallpaper.maximized(beautiful.wallpaper, s) - end -end - --- Set a timer that will update the tag indicators of all screens. --- Even if we do not want continuous updates, we still need a timer: --- there must be a significant delay (1ish second) before awesome prepares --- all clients -desktop.screen_timer = gears.timer { - timeout = 2, - call_now = false, - autostart = true, - single_shot = not conf.continuous_tag_updates, - - callback = function() - for s in screen do - s.tagger:update_widget() - end - end -} - --- Prepare each screen -awful.screen.connect_for_each_screen( - function(s) - -- s: the screen this function is being called for - -- Create tag table - - s.tagger = desktop.Tagger:new(s) - desktop.widgets.tagindicator(s) - - - -- Create a promptbox for each s - s.mypromptbox = awful.widget.prompt() - - -- Create the bar - s.bar = awful.wibar({ - position = conf.bar_position, - screen = s, - --bg = "#00000000", - bg = beautiful.color.bar.color, - border_width = 0, - height = beautiful.dpi(conf.bar_height), - type = "desktop" - }) - - s.systray = wibox.widget.systray() - s.systraysep = desktop.widgets.separator(2, 5, 3) - s.bar:connect_signal("button::press", - function(_, _, _, button, mods) - - -- Middle-click - if (button == 2) then - s.systray.visible = not s.systray.visible - s.systraysep.visible = s.systray.visible - end - end) - - -- Create shortcut list from config value - if (#conf.bar_shortcuts > 0) then - s.shortcuts = { - layout = wibox.layout.fixed.horizontal, - desktop.widgets.separator(2, 5, 3), - desktop.widgets.space(6) - } - for k, v in pairs(conf.bar_shortcuts) do - s.shortcuts[#s.shortcuts + 1] = desktop.widgets.shortcut:new(v[1], v[2]) - end - end - - - - -- Assemble left bar widgets - - rightside = { - layout = wibox.layout.fixed.horizontal, - spacing = 0 - } - - rightside = gears.table.join(rightside, { - desktop.widgets.space(10), - s.systraysep, - desktop.widgets.space(10), - { - s.systray, - top = beautiful.dpi(3), - bottom = beautiful.dpi(3), - left = 0, right = 0, - layout = wibox.container.margin, - }, - desktop.widgets.separator(2, 5, 3), - desktop.widgets.space(10), - }) - - if (conf.mpc_enabled) then - rightside = gears.table.join(rightside, { - desktop.widgets.mpc, - desktop.widgets.space(5), - desktop.widgets.separator(2, 5, 3), - desktop.widgets.space(15), - - }) - end - - rightside = gears.table.join(rightside, { - desktop.widgets.textclock, - desktop.widgets.space(8), - - desktop.widgets.battery, - desktop.widgets.backlight, - desktop.widgets.volume, - desktop.widgets.space(8), - - desktop.widgets.keymap, - desktop.widgets.space(8), - - }) - - - - s.bar:setup { - layout = wibox.container.margin, - margins = beautiful.dpi(conf.bar_margin), - - { - layout = wibox.layout.align.horizontal, - { - layout = wibox.layout.fixed.horizontal, - - desktop.widgets.space(8), - - - desktop.widgets.launcher, - - desktop.widgets.space(18), - s.tagindicator, - desktop.widgets.layoutbox(s), - - s.shortcuts, - - desktop.widgets.space(6), - desktop.widgets.separator(2, 5, 3), - desktop.widgets.space(18), - desktop.widgets.tasklist(s), - }, - - s.mypromptbox, - rightside - } - } - end -) - -return desktop diff --git a/rc.lua b/rc.lua index 0f84b07..98f9e7e 100755 --- a/rc.lua +++ b/rc.lua @@ -27,7 +27,7 @@ end conf = require("conf") -layoutmanager = require("desktop.layoutmanager") +layoutmanager = require("core.layouts.layoutmanager") layoutmanager.layouts = conf.layouts bin = require("bin") @@ -36,6 +36,8 @@ bin = require("bin") beautiful.init(require("theme")) +core = require("core") + Sound = require("sound") -- Load key bindings @@ -74,8 +76,6 @@ end root.keys(keys) root.buttons(buttons) -desktop = require("desktop") - -- Autostart @@ -88,6 +88,7 @@ end -- when client with a matching name is opened: --require("awful.hotkeys_popup.keys") +core.start() -- Check for errors dofile(configuration_dir .. "errors.lua")