X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/7072b0805828af867fe4f22ee3360e8f9e052ea3..4f3babced781559863e7300491c8d6f0e228810e:/util/quake.lua

diff --git a/util/quake.lua b/util/quake.lua
index 4314a16..64aaca5 100644
--- a/util/quake.lua
+++ b/util/quake.lua
@@ -1,22 +1,21 @@
-
 --[[
-                                                   
-     Licensed under GNU General Public License v2  
-      * (c) 2016, Luke Bonham                      
-      * (c) 2015, unknown                          
-                                                   
+
+     Licensed under GNU General Public License v2
+      * (c) 2016, Luca CPZ
+      * (c) 2015, unknown
+
 --]]
 
 local awful        = require("awful")
-local capi         = { client = client,
-                       timer  = require("gears.timer") }
+local capi         = { client = client }
+
 local math         = { floor  = math.floor }
-local string       = string
+local string       = { format = string.format }
 
 local pairs        = pairs
 local screen       = screen
+
 local setmetatable = setmetatable
-local tostring     = tostring
 
 -- Quake-like Dropdown application spawn
 local quake = {}
@@ -34,7 +33,7 @@ function quake:display()
     for c in awful.client.iterate(function (c)
         -- c.name may be changed!
         return c.instance == self.name
-    end, nil, self.screen)
+    end)
     do
         i = i + 1
         if i == 1 then
@@ -54,29 +53,27 @@ function quake:display()
 
     if not client then
         -- The client does not exist, we spawn it
-        awful.spawn(string.format("%s %s %s", self.app,
-                    string.format(self.argname, self.name), self.extra),
-                    false, self.screen)
-        self.notexist = true
+        cmd = string.format("%s %s %s", self.app,
+              string.format(self.argname, self.name), self.extra)
+        awful.spawn(cmd, { tag = self.screen.selected_tag })
         return
     end
 
-    -- Resize
+    -- Set geometry
     client.floating = true
     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
+    client:geometry(self.geometry[self.screen.index] or self:compute_size())
 
-    -- Not sticky and on top
+    -- Set not sticky and on top
     client.sticky = false
     client.ontop = true
     client.above = true
     client.skip_taskbar = true
 
+    -- Additional user settings
+    if self.settings then self.settings(client) end
+
     -- Toggle display
     if self.visible then
         client.hidden = false
@@ -97,67 +94,74 @@ function quake:display()
 end
 
 function quake:compute_size()
-    local geom = screen[self.screen].workarea
-    local width, height = self.width, self.height
-    if width  <= 1 then width = math.floor(geom.width * width) - 2 * self.border end
-    if height <= 1 then height = math.floor(geom.height * height) end
-    local x, y
-    if     self.horiz == "left"  then x = geom.x
-    elseif self.horiz == "right" then x = geom.width + geom.x - width
-    else   x = geom.x + (geom.width - width)/2 end
-    if     self.vert == "top"    then y = geom.y
-    elseif self.vert == "bottom" then y = geom.height + geom.y - height
-    else   y = geom.y + (geom.height - height)/2 end
-    self.geometry = { x = x, y = y, width = width, height = height }
+    -- skip if we already have a geometry for this screen
+    if not self.geometry[self.screen.index] then
+        local geom
+        if not self.overlap then
+            geom = screen[self.screen.index].workarea
+        else
+            geom = screen[self.screen.index].geometry
+        end
+        local width, height = self.width, self.height
+        if width  <= 1 then width = math.floor(geom.width * width) - 2 * self.border end
+        if height <= 1 then height = math.floor(geom.height * height) end
+        local x, y
+        if     self.horiz == "left"  then x = geom.x
+        elseif self.horiz == "right" then x = geom.width + geom.x - width
+        else   x = geom.x + (geom.width - width)/2 end
+        if     self.vert == "top"    then y = geom.y
+        elseif self.vert == "bottom" then y = geom.height + geom.y - height
+        else   y = geom.y + (geom.height - height)/2 end
+        self.geometry[self.screen.index] = { x = x, y = y, width = width, height = height }
+    end
+    return self.geometry[self.screen.index]
 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.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()
+    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.border     = conf.border    or 1          -- client border width
+    conf.visible    = conf.visible   or false      -- initially not visible
+    conf.followtag  = conf.followtag or false      -- spawn on currently focused screen
+    conf.overlap    = conf.overlap   or false      -- overlap wibox
+    conf.screen     = conf.screen    or awful.screen.focused()
+    conf.settings   = conf.settings
 
     -- If width or height <= 1 this is a proportion of the workspace
-    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 "left"   -- left, right or center
+    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 "left"     -- left, right or center
+    conf.geometry   = {}                           -- internal use
+
+    local dropdown = setmetatable(conf, { __index = quake })
 
-    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()
+        if c.instance == dropdown.name and c.screen == dropdown.screen then
+            dropdown:display()
         end
     end)
     capi.client.connect_signal("unmanage", function(c)
-        if c.instance == console.name and c.screen == console.screen then
-            console.visible = false
+        if c.instance == dropdown.name and c.screen == dropdown.screen then
+            dropdown.visible = false
         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()
-    end)
-    reattach:start()
-
-    return console
+    return dropdown
 end
 
 function quake:toggle()
      if self.followtag then self.screen = awful.screen.focused() end
      local current_tag = self.screen.selected_tag
      if current_tag and self.last_tag ~= current_tag and self.visible then
-         self:display():move_to_tag(current_tag)
+         local c=self:display()
+         if c then
+            c:move_to_tag(current_tag)
+        end
      else
          self.visible = not self.visible
          self:display()