X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/f5700be12b68f73d20e26a7293881707897d8f04..4f3babced781559863e7300491c8d6f0e228810e:/util/init.lua diff --git a/util/init.lua b/util/init.lua index a7b53d2..55bfa26 100644 --- a/util/init.lua +++ b/util/init.lua @@ -1,27 +1,21 @@ - --[[ - - Lain - Layouts, widgets and utilities for Awesome WM - - Utilities section - - Licensed under GNU General Public License v2 - * (c) 2013, Luke Bonham - * (c) 2010-2012, Peter Hofmann - + + Lain + Layouts, widgets and utilities for Awesome WM + + Utilities section + + Licensed under GNU General Public License v2 + * (c) 2013, Luca CPZ + * (c) 2010-2012, Peter Hofmann + --]] 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,26 +23,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.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 @@ -68,91 +59,45 @@ function util.menu_clients_current_tags(menu, args) -- 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. -local magnified_client = nil -function util.magnify_client(c) - if c and not awful.client.floating.get(c) then - util.mc(c) - magnified_client = c +-- Magnify a client: set it to "float" and resize it. +function util.magnify_client(c, width_f, height_f) + if c and not c.floating then + util.magnified_client = c + util.mc(c, width_f, height_f) else - awful.client.floating.set(c, false) - magnified_client = nil + util.magnified_client = nil + c.floating = false end end --- https://github.com/copycat-killer/lain/issues/195 -function util.mc(c) - c = c or magnified_client +-- https://github.com/lcpz/lain/issues/195 +function util.mc(c, width_f, height_f) + c = c or util.magnified_client if not c then return end c.floating = true - local s = awful.screen.selected() - local mg = s.geometry - local tag = s.selected_tag - local mwfact = beautiful.master_width_factor or 0.5 + local s = awful.screen.focused() + local mg = s.workarea local g = {} - g.width = math.sqrt(mwfact) * mg.width - g.height = math.sqrt(mwfact) * mg.height + local mwfact = width_f or s.selected_tag.master_width_factor or 0.5 + g.width = sqrt(mwfact) * mg.width + g.height = sqrt(height_f or 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 --- Read the nice value of pid from /proc. -local function get_nice_value(pid) - local n = first_line('/proc/' .. pid .. '/stat') - if not n then 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 - else - c.border_color = beautiful.border_focus_lowprio - 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 -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 awful.screen.focused() - local scr = screen[s] for i = 1, #s.tags do awful.tag.viewidx(direction, s) @@ -163,15 +108,15 @@ function util.tag_view_nonempty(direction, sc) end -- {{{ Dynamic tagging --- + -- Add a new tag -function util.add_tag() +function util.add_tag(layout) 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() + awful.tag.add(name, { screen = awful.screen.focused(), layout = layout or awful.layout.suit.tile }):view_only() end } end @@ -195,11 +140,10 @@ end -- 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) + awful.tag.move(tag.index - 1, tag) else - awful.tag.move(idx + 1, tag) + awful.tag.move(tag.index + 1, tag) end end @@ -210,22 +154,15 @@ function util.delete_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 = tonumber(beautiful.useless_gap) + thatmuch - awful.layout.arrange(mouse.screen) -end - --- Check if an element exist on a table -function util.element_in_table(element, tbl) - for _, i in pairs(tbl) do - if i == element then - return true - end - end - return false +function util.useless_gaps_resize(thatmuch, s, t) + local scr = s or awful.screen.focused() + local tag = t or scr.selected_tag + tag.gap = tag.gap + tonumber(thatmuch) + awful.layout.arrange(scr) end return setmetatable(util, { __index = wrequire })