X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/85ed92417dfca8fbdcfc89b7efb5308edd4d1193..716595550f974afc115b492b6f9be6d048dbfca4:/util/quake.lua diff --git a/util/quake.lua b/util/quake.lua index 5a55200..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 @@ -31,7 +31,7 @@ function quake:display() local i = 0 for c in awful.client.iterate(function (c) -- c.name may be changed! - return c.instance == self.name + return c.instance == self.name end, nil, self.screen) do i = i + 1 @@ -52,33 +52,34 @@ function quake:display() if not client then -- The client does not exist, we spawn it - awful.util.spawn(self.app .. " " .. string.format(self.argname, self.name), - false, self.screen) - self.exist = true + awful.util.spawn(string.format("%s %s %s", self.app, + string.format(self.argname, self.name), self.extra), + false, self.screen) + self.notexist = true return end -- Resize awful.client.floating.set(client, true) - client.border_width = 0 + client.border_width = self.border client.size_hints_honor = false if self.notexist then - -- set default geometry only on first spawn + 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,52 +94,59 @@ 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.visible = conf.visible or false -- initially not visible - conf.screen = conf.screen or capi.mouse.screen + 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) if c.instance == console.name and c.screen == console.screen then console:display() - end + end end) capi.client.connect_signal("unmanage", function(c) if c.instance == console.name and c.screen == console.screen then console.visible = false - end - end) + end + end) -- "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() + console:display() end) reattach:start() @@ -146,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