X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/17079866150227a7a12798ea97961b7f6370574b..1b428513fdede06ef54679edbfd267534f49659e:/util/init.lua

diff --git a/util/init.lua b/util/init.lua
index 06db0d4..25470e4 100644
--- a/util/init.lua
+++ b/util/init.lua
@@ -13,15 +13,10 @@
 --]]
 
 local awful        = require("awful")
-local beautiful    = require("beautiful")
-local math         = { sqrt = math.sqrt }
-local mouse        = mouse
+local sqrt         = math.sqrt
 local pairs        = pairs
-local string       = { gsub = string.gsub }
 local client       = client
-local screen       = screen
 local tonumber     = tonumber
-
 local wrequire     = require("lain.helpers").wrequire
 local setmetatable = setmetatable
 
@@ -29,29 +24,23 @@ local setmetatable = setmetatable
 -- lain.util
 local util = { _NAME = "lain.util" }
 
--- Like awful.menu.clients, but only show clients of currently selected
--- tags.
+-- Like awful.menu.clients, but only show clients of currently selected tags
 function util.menu_clients_current_tags(menu, args)
     -- List of currently selected tags.
-    local cls_tags = awful.tag.selectedlist(mouse.screen)
+    local cls_tags = awful.screen.focused().selected_tags
+
+    if cls_tags == nil then return nil end
 
     -- Final list of menu items.
     local cls_t = {}
 
-    if cls_tags == nil
-    then
-        return nil
-    end
-
     -- For each selected tag get all clients of that tag and add them to
     -- the menu. A click on a menu item will raise that client.
-    for i = 1,#cls_tags
-    do
-        local t = cls_tags[i]
+    for i = 1,#cls_tags do
+        local t   = cls_tags[i]
         local cls = t:clients()
 
-        for k, c in pairs(cls)
-        do
+        for k, c in pairs(cls) do
             cls_t[#cls_t + 1] = { awful.util.escape(c.name) or "",
                                   function ()
                                       c.minimized = false
@@ -63,148 +52,118 @@ function util.menu_clients_current_tags(menu, args)
     end
 
     -- No clients? Then quit.
-    if #cls_t <= 0
-    then
-        return nil
-    end
+    if #cls_t <= 0 then return nil end
 
     -- menu may contain some predefined values, otherwise start with a
     -- fresh menu.
-    if not menu
-    then
-        menu = {}
-    end
+    if not menu then menu = {} end
 
     -- Set the list of items and show the menu.
     menu.items = cls_t
-    local m = awful.menu.new(menu)
+    local m = awful.menu(menu)
     m:show(args)
+
     return m
 end
 
--- Magnify a client: Set it to "float" and resize it.
+-- Magnify a client: set it to "float" and resize it.
 function util.magnify_client(c)
-    if not awful.client.floating.get(c) then
-        awful.client.floating.set(c, true)
-
-        local mg = screen[mouse.screen].geometry
-        local tag = awful.tag.selected(mouse.screen)
-        local mwfact = awful.tag.getmwfact(tag)
-        local g = {}
-        g.width = math.sqrt(mwfact) * mg.width
-        g.height = math.sqrt(mwfact) * mg.height
-        g.x = mg.x + (mg.width - g.width) / 2
-        g.y = mg.y + (mg.height - g.height) / 2
-        c:geometry(g)
-    else
-        awful.client.floating.set(c, false)
-    end
-end
-
--- Read the nice value of pid from /proc.
-local function get_nice_value(pid)
-    local n = first_line('/proc/' .. pid .. '/stat')
-    if n == nil
-    then
-        -- This should not happen. But I don't want to crash, either.
-        return 0
-    end
-
-    -- Remove pid and tcomm. This is necessary because tcomm may contain
-    -- nasty stuff such as whitespace or additional parentheses...
-    n = string.gsub(n, '.*%) ', '')
-
-    -- Field number 17 now is the nice value.
-    fields = split(n, ' ')
-    return tonumber(fields[17])
-end
-
--- To be used as a signal handler for "focus"
--- This requires beautiful.border_focus{,_highprio,_lowprio}.
-function util.niceborder_focus(c)
-    local n = get_nice_value(c.pid)
-    if n == 0
-    then
-        c.border_color = beautiful.border_focus
-    elseif n < 0
-    then
-        c.border_color = beautiful.border_focus_highprio
+    if c and not c.floating then
+        util.mc(c)
+        util.magnified_client = c
     else
-        c.border_color = beautiful.border_focus_lowprio
+        c.floating = false
+        util.magnified_client = nil
     end
 end
 
--- To be used as a signal handler for "unfocus"
--- This requires beautiful.border_normal{,_highprio,_lowprio}.
-function util.niceborder_unfocus(c)
-    local n = get_nice_value(c.pid)
-    if n == 0
-    then
-        c.border_color = beautiful.border_normal
-    elseif n < 0
-    then
-        c.border_color = beautiful.border_normal_highprio
-    else
-        c.border_color = beautiful.border_normal_lowprio
-    end
+-- https://github.com/copycat-killer/lain/issues/195
+function util.mc(c)
+    c = c or util.magnified_client
+    if not c then return end
+
+    c.floating   = true
+    local s      = awful.screen.focused()
+    local mg     = s.geometry
+    local mwfact = s.selected_tag.master_width_factor or 0.5
+    local g      = {}
+    g.width      = sqrt(mwfact) * mg.width
+    g.height     = sqrt(mwfact) * mg.height
+    g.x          = mg.x + (mg.width - g.width) / 2
+    g.y          = mg.y + (mg.height - g.height) / 2
+
+    if c then c:geometry(g) end -- if c is still a valid object
 end
 
 -- Non-empty tag browsing
 -- direction in {-1, 1} <-> {previous, next} non-empty tag
 function util.tag_view_nonempty(direction, sc)
-   local s = sc or mouse.screen or 1
-   local scr = screen[s]
+   local s = sc or awful.screen.focused()
 
-   for i = 1, #tags[s] do
-       awful.tag.viewidx(direction,s)
-       if #awful.client.visible(s) > 0 then
+   for i = 1, #s.tags do
+       awful.tag.viewidx(direction, s)
+       if #s.clients > 0 then
            return
        end
    end
 end
 
 -- {{{ Dynamic tagging
---
+
 -- Add a new tag
-function util.add_tag(mypromptbox)
-    awful.prompt.run({prompt="New tag name: "}, mypromptbox[mouse.screen].widget,
-    function(text)
-        if text:len() > 0 then
-            props = { selected = true }
-            tag = awful.tag.add(new_name, props)
-            tag.name = text
-            tag:emit_signal("property::name")
+function util.add_tag()
+    awful.prompt.run {
+        prompt       = "New tag name: ",
+        textbox      = awful.screen.focused().mypromptbox.widget,
+        exe_callback = function(name)
+            if not name or #name == 0 then return end
+            awful.tag.add(name, { screen = awful.screen.focused() }):view_only()
         end
-    end)
+    }
 end
 
 -- Rename current tag
--- @author: minism
-function util.rename_tag(mypromptbox)
-    local tag = awful.tag.selected(mouse.screen)
-    awful.prompt.run({prompt="Rename tag: "}, mypromptbox[mouse.screen].widget,
-    function(text)
-        if text:len() > 0 then
-            tag.name = text
-            tag:emit_signal("property::name")
+function util.rename_tag()
+    awful.prompt.run {
+        prompt       = "Rename tag: ",
+        textbox      = awful.screen.focused().mypromptbox.widget,
+        exe_callback = function(new_name)
+            if not new_name or #new_name == 0 then return end
+            local t = awful.screen.focused().selected_tag
+            if t then
+                t.name = new_name
+            end
         end
-    end)
+    }
+end
+
+-- Move current tag
+-- pos in {-1, 1} <-> {previous, next} tag position
+function util.move_tag(pos)
+    local tag = awful.screen.focused().selected_tag
+    local idx = awful.tag.getidx(tag)
+    if tonumber(pos) <= -1 then
+        awful.tag.move(idx - 1, tag)
+    else
+        awful.tag.move(idx + 1, tag)
+    end
 end
 
--- Delete current tag (if empty)
+-- Delete current tag
 -- Any rule set on the tag shall be broken
-function util.remove_tag()
-    local tag = awful.tag.selected(mouse.screen)
-    local prevtag = awful.tag.gettags(mouse.screen)[awful.tag.getidx(tag) - 1]
-    awful.tag.delete(tag, prevtag)
+function util.delete_tag()
+    local t = awful.screen.focused().selected_tag
+    if not t then return end
+    t:delete()
 end
---
+
 -- }}}
 
 -- On the fly useless gaps change
 function util.useless_gaps_resize(thatmuch)
-    beautiful.useless_gap_width = tonumber(beautiful.useless_gap_width) + thatmuch
-    awful.layout.arrange(mouse.screen)
+    local scr = awful.screen.focused()
+    scr.selected_tag.gap = scr.selected_tag.gap + tonumber(thatmuch)
+    awful.layout.arrange(scr)
 end
 
 return setmetatable(util, { __index = wrequire })