X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/a659d1a4bc99d27a1746985e13f68efc3dd256c7..bcd37ae4ae4f0e5d11ab6d8f6a9580e840447327:/util/quake.lua diff --git a/util/quake.lua b/util/quake.lua index 771741e..5020eee 100644 --- a/util/quake.lua +++ b/util/quake.lua @@ -6,14 +6,14 @@ --]] -local awful = require("awful") -local capi = { client = client, - mouse = mouse, - screen = screen, - timer = timer } -local string = string +local awful = require("awful") +local capi = { client = client, + timer = require("gears.timer") } +local math = { floor = math.floor } +local string = string local pairs = pairs +local screen = screen local setmetatable = setmetatable local tostring = tostring @@ -64,21 +64,22 @@ function quake:display() client.border_width = self.border client.size_hints_honor = false if self.notexist then + self:compute_size() client:geometry(self.geometry) self.notexist = false end -- Not sticky and on top + client.sticky = false client.ontop = true client.above = true client.skip_taskbar = true - client.sticky = false -- Toggle display if self.visible then client.hidden = false client:raise() - self.last_tag = tostring(awful.tag.selected(self.screen)) + self.last_tag = awful.tag.selected(self.screen) client:tags({awful.tag.selected(self.screen)}) capi.client.focus = client else @@ -93,36 +94,38 @@ function quake:display() return client end +function quake:compute_size() + local geom = screen[self.screen].workarea + local width, height + if self.width <= 1 then width = math.floor(geom.width * self.width) end + if self.height <= 1 then height = math.floor(geom.height * self.height) end + local x, y + if self.horiz == "left" then x = geom.x + elseif self.horiz == "right" then x = geom.width + geom.x - self.width + else x = geom.x + (geom.width - self.width)/2 end + if self.vert == "top" then y = geom.y + elseif self.vert == "bottom" then y = geom.height + geom.y - self.height + else y = geom.y + (geom.height - self.height)/2 end + self.geometry = { x = x, y = y, width = width, height = height } +end + function quake:new(config) local conf = config or {} - conf.app = conf.app or "xterm" -- application to spawn - conf.name = conf.name or "QuakeDD" -- window name - conf.argname = conf.argname or "-name %s" -- how to specify window name - conf.extra = conf.extra or "" -- extra arguments - conf.visible = conf.visible or false -- initially not visible - conf.screen = conf.screen or capi.mouse.screen - conf.border = conf.border or 1 + conf.app = conf.app or "xterm" -- application to spawn + conf.name = conf.name or "QuakeDD" -- window name + conf.argname = conf.argname or "-name %s" -- how to specify window name + conf.extra = conf.extra or "" -- extra arguments + conf.visible = conf.visible or false -- initially not visible + conf.border = conf.border or 1 -- client border width + conf.followtag = conf.followtag or false -- spawn on currently focused screen + conf.screen = conf.screen or awful.screen.focused() -- If width or height <= 1 this is a proportion of the workspace - wibox_height = conf.wibox_height or 18 -- statusbar weight - height = conf.height or 0.25 -- height - width = conf.width or 1 -- width - vert = conf.vert or "top" -- top, bottom or center - horiz = conf.horiz or "center" -- left, right or center - - -- Compute size - local geom = capi.screen[conf.screen].workarea - if width <= 1 then width = geom.width * width end - if height <= 1 then height = geom.height * height end - local x, y - if horiz == "left" then x = geom.x - elseif horiz == "right" then x = geom.width + geom.x - width - else x = geom.x + (geom.width - width)/2 end - if vert == "top" then y = geom.y - elseif vert == "bottom" then y = geom.height + geom.y - height - else y = geom.y + (geom.height - height)/2 end - conf.geometry = { x = x, y = y + wibox_height, width = width, height = height } + conf.height = conf.height or 0.25 -- height + conf.width = conf.width or 1 -- width + conf.vert = conf.vert or "top" -- top, bottom or center + conf.horiz = conf.horiz or "center" -- left, right or center local console = setmetatable(conf, { __index = quake }) capi.client.connect_signal("manage", function(c) @@ -139,6 +142,9 @@ function quake:new(config) -- "Reattach" currently running quake application. This is in case awesome is restarted. local reattach = capi.timer { timeout = 0 } reattach:connect_signal("timeout", function() + if self.followtag then + self.screen = awful.screen.focused() + end reattach:stop() console:display() end) @@ -148,8 +154,11 @@ function quake:new(config) end function quake:toggle() - current_tag = awful.tag.selected(self.screen) - if self.last_tag ~= tostring(current_tag) and self.visible then + if self.followtag then + self.screen = awful.screen.focused() + end + local current_tag = awful.tag.selected(self.screen) + if self.last_tag ~= current_tag and self.visible then awful.client.movetotag(current_tag, self:display()) else self.visible = not self.visible