summaryrefslogtreecommitdiff
path: root/awesome/lib/awful/wibar.lua
diff options
context:
space:
mode:
Diffstat (limited to 'awesome/lib/awful/wibar.lua')
-rw-r--r--awesome/lib/awful/wibar.lua603
1 files changed, 0 insertions, 603 deletions
diff --git a/awesome/lib/awful/wibar.lua b/awesome/lib/awful/wibar.lua
deleted file mode 100644
index bbe7289..0000000
--- a/awesome/lib/awful/wibar.lua
+++ /dev/null
@@ -1,603 +0,0 @@
----------------------------------------------------------------------------
---- Wibox module for awful.
--- This module allows you to easily create wibox and attach them to the edge of
--- a screen.
---
--- @author Emmanuel Lepage Vallee <elv1313@gmail.com>
--- @copyright 2016 Emmanuel Lepage Vallee
--- @classmod awful.wibar
----------------------------------------------------------------------------
-
--- Grab environment we need
-local capi =
-{
- screen = screen,
- client = client
-}
-local setmetatable = setmetatable
-local tostring = tostring
-local ipairs = ipairs
-local error = error
-local wibox = require("wibox")
-local beautiful = require("beautiful")
-local util = require("awful.util")
-local placement = require("awful.placement")
-
-local function get_screen(s)
- return s and capi.screen[s]
-end
-
-local awfulwibar = { mt = {} }
-
---- Array of table with wiboxes inside.
--- It's an array so it is ordered.
-local wiboxes = setmetatable({}, {__mode = "v"})
-
--- Compute the margin on one side
-local function get_margin(w, position, auto_stop)
- local h_or_w = (position == "top" or position == "bottom") and "height" or "width"
- local ret = 0
-
- for _, v in ipairs(wiboxes) do
- -- Ignore the wibars placed after this one
- if auto_stop and v == w then break end
-
- if v.position == position and v.screen == w.screen and v.visible then
- ret = ret + v[h_or_w]
- end
- end
-
- return ret
-end
-
--- `honor_workarea` cannot be used as it does modify the workarea itself.
--- a manual padding has to be generated.
-local function get_margins(w)
- local position = w.position
- assert(position)
-
- local margins = {left=0, right=0, top=0, bottom=0}
-
- margins[position] = get_margin(w, position, true)
-
- -- Avoid overlapping wibars
- if position == "left" or position == "right" then
- margins.top = get_margin(w, "top" )
- margins.bottom = get_margin(w, "bottom")
- end
-
- return margins
-end
-
--- Create the placement function
-local function gen_placement(position, stretch)
- local maximize = (position == "right" or position == "left") and
- "maximize_vertically" or "maximize_horizontally"
-
- return placement[position] + (stretch and placement[maximize] or nil)
-end
-
--- Attach the placement function.
-local function attach(wb, align)
- gen_placement(align, wb._stretch)(wb, {
- attach = true,
- update_workarea = true,
- margins = get_margins(wb)
- })
-end
-
--- Re-attach all wibars on a given wibar screen
-local function reattach(wb)
- local s = wb.screen
- for _, w in ipairs(wiboxes) do
- if w ~= wb and w.screen == s then
- if w.detach_callback then
- w.detach_callback()
- w.detach_callback = nil
- end
- attach(w, w.position)
- end
- end
-end
-
---- The wibox position.
--- @property position
--- @param string Either "left", right", "top" or "bottom"
-
-local function get_position(wb)
- return wb._position or "top"
-end
-
-local function set_position(wb, position)
- -- Detach first to avoid any uneeded callbacks
- if wb.detach_callback then
- wb.detach_callback()
-
- -- Avoid disconnecting twice, this produces a lot of warnings
- wb.detach_callback = nil
- end
-
- -- Move the wibar to the end of the list to avoid messing up the others in
- -- case there is stacked wibars on one side.
- if wb._position then
- for k, w in ipairs(wiboxes) do
- if w == wb then
- table.remove(wiboxes, k)
- end
- end
- table.insert(wiboxes, wb)
- end
-
- -- In case the position changed, it may be necessary to reset the size
- if (wb._position == "left" or wb._position == "right")
- and (position == "top" or position == "bottom") then
- wb.height = math.ceil(beautiful.get_font_height(wb.font) * 1.5)
- elseif (wb._position == "top" or wb._position == "bottom")
- and (position == "left" or position == "right") then
- wb.width = math.ceil(beautiful.get_font_height(wb.font) * 1.5)
- end
-
- -- Changing the position will also cause the other margins to be invalidated.
- -- For example, adding a wibar to the top will change the margins of any left
- -- or right wibars. To solve, this, they need to be re-attached.
- reattach(wb)
-
- -- Set the new position
- wb._position = position
-
- -- Attach to the new position
- attach(wb, position)
-end
-
---- Stretch the wibar.
---
--- @property stretch
--- @param[opt=true] boolean
-
-local function get_stretch(w)
- return w._stretch
-end
-
-local function set_stretch(w, value)
- w._stretch = value
-
- attach(w, w.position)
-end
-
---- Remove a wibar.
--- @function remove
-local function remove(self)
- self.visible = false
-
- if self.detach_callback then
- self.detach_callback()
- self.detach_callback = nil
- end
-
- for k, w in ipairs(wiboxes) do
- if w == self then
- table.remove(wiboxes, k)
- end
- end
-
- self._screen = nil
-end
-
---- Get a wibox position if it has been set, or return top.
--- @param wb The wibox
--- @deprecated awful.wibar.get_position
--- @return The wibox position.
-function awfulwibar.get_position(wb)
- util.deprecate("Use wb:get_position() instead of awful.wibar.get_position")
- return get_position(wb)
-end
-
---- Put a wibox on a screen at this position.
--- @param wb The wibox to attach.
--- @param position The position: top, bottom left or right.
--- @param screen This argument is deprecated, use wb.screen directly.
--- @deprecated awful.wibar.set_position
-function awfulwibar.set_position(wb, position, screen) --luacheck: no unused args
- util.deprecate("Use wb:set_position(position) instead of awful.wibar.set_position")
-
- set_position(wb, position)
-end
-
---- Attach a wibox to a screen.
---
--- This function has been moved to the `awful.placement` module. Calling this
--- no longer does anything.
---
--- @param wb The wibox to attach.
--- @param position The position of the wibox: top, bottom, left or right.
--- @param screen The screen to attach to
--- @see awful.placement
--- @deprecated awful.wibar.attach
-function awfulwibar.attach(wb, position, screen) --luacheck: no unused args
- util.deprecate("awful.wibar.attach is deprecated, use the 'attach' property"..
- " of awful.placement. This method doesn't do anything anymore"
- )
-end
-
---- Align a wibox.
---
--- Supported alignment are:
---
--- * top_left
--- * top_right
--- * bottom_left
--- * bottom_right
--- * left
--- * right
--- * top
--- * bottom
--- * centered
--- * center_vertical
--- * center_horizontal
---
--- @param wb The wibox.
--- @param align The alignment
--- @param screen This argument is deprecated. It is not used. Use wb.screen
--- directly.
--- @deprecated awful.wibar.align
--- @see awful.placement.align
-function awfulwibar.align(wb, align, screen) --luacheck: no unused args
- if align == "center" then
- util.deprecate("awful.wibar.align(wb, 'center' is deprecated, use 'centered'")
- align = "centered"
- end
-
- if screen then
- util.deprecate("awful.wibar.align 'screen' argument is deprecated")
- end
-
- if placement[align] then
- return placement[align](wb)
- end
-end
-
---- Stretch a wibox so it takes all screen width or height.
---
--- **This function has been removed.**
---
--- @deprecated awful.wibox.stretch
--- @see awful.placement
--- @see awful.wibar.stretch
-
---- Create a new wibox and attach it to a screen edge.
--- You can add also position key with value top, bottom, left or right.
--- You can also use width or height in % and set align to center, right or left.
--- You can also set the screen key with a screen number to attach the wibox.
--- If not specified, the primary screen is assumed.
--- @see wibox
--- @tparam[opt=nil] table arg
--- @tparam string arg.position The position.
--- @tparam string arg.stretch If the wibar need to be stretched to fill the screen.
--- @tparam integer arg.border_width Border width.
--- @tparam string arg.border_color Border color.
--- @tparam boolean arg.ontop On top of other windows.
--- @tparam string arg.cursor The mouse cursor.
--- @tparam boolean arg.visible Visibility.
--- @tparam number arg.opacity The opacity of the wibox, between 0 and 1.
--- @tparam string arg.type The window type (desktop, normal, dock, …).
--- @tparam integer arg.x The x coordinates.
--- @tparam integer arg.y The y coordinates.
--- @tparam integer arg.width The width of the wibox.
--- @tparam integer arg.height The height of the wibox.
--- @tparam screen arg.screen The wibox screen.
--- @tparam wibox.widget arg.widget The widget that the wibox displays.
--- @param arg.shape_bounding The wibox’s bounding shape as a (native) cairo surface.
--- @param arg.shape_clip The wibox’s clip shape as a (native) cairo surface.
--- @tparam color arg.bg The background of the wibox.
--- @tparam surface arg.bgimage The background image of the drawable.
--- @tparam color arg.fg The foreground (text) of the wibox.
--- @return The new wibar
--- @function awful.wibar
-function awfulwibar.new(arg)
- arg = arg or {}
- local position = arg.position or "top"
- local has_to_stretch = true
- local screen = get_screen(arg.screen or 1)
-
- arg.type = arg.type or "dock"
-
- if position ~= "top" and position ~="bottom"
- and position ~= "left" and position ~= "right" then
- error("Invalid position in awful.wibar(), you may only use"
- .. " 'top', 'bottom', 'left' and 'right'")
- end
-
- -- Set default size
- if position == "left" or position == "right" then
- arg.width = arg.width or math.ceil(beautiful.get_font_height(arg.font) * 1.5)
- if arg.height then
- has_to_stretch = false
- if arg.screen then
- local hp = tostring(arg.height):match("(%d+)%%")
- if hp then
- arg.height = math.ceil(screen.geometry.height * hp / 100)
- end
- end
- end
- else
- arg.height = arg.height or math.ceil(beautiful.get_font_height(arg.font) * 1.5)
- if arg.width then
- has_to_stretch = false
- if arg.screen then
- local wp = tostring(arg.width):match("(%d+)%%")
- if wp then
- arg.width = math.ceil(screen.geometry.width * wp / 100)
- end
- end
- end
- end
-
- arg.screen = nil
-
- local w = wibox(arg)
-
- w.screen = screen
- w._screen = screen --HACK When a screen is removed, then getbycoords wont work
- w._stretch = arg.stretch == nil and has_to_stretch or arg.stretch
-
- w.get_position = get_position
- w.set_position = set_position
-
- w.get_stretch = get_stretch
- w.set_stretch = set_stretch
- w.remove = remove
-
- if arg.visible == nil then w.visible = true end
-
- w:set_position(position)
-
- table.insert(wiboxes, w)
-
- w:connect_signal("property::visible", function() reattach(w) end)
-
- return w
-end
-
-capi.screen.connect_signal("removed", function(s)
- for _, wibar in ipairs(wiboxes) do
- if wibar._screen == s then
- wibar:remove()
- end
- end
-end)
-
-function awfulwibar.mt:__call(...)
- return awfulwibar.new(...)
-end
-
---Imported documentation
-
---- Border width.
---
--- **Signal:**
---
--- * *property::border_width*
---
--- @property border_width
--- @param integer
-
---- Border color.
---
--- Please note that this property only support string based 24 bit or 32 bit
--- colors:
---
--- Red Blue
--- _| _|
--- #FF00FF
--- T‾
--- Green
---
---
--- Red Blue
--- _| _|
--- #FF00FF00
--- T‾ ‾T
--- Green Alpha
---
--- **Signal:**
---
--- * *property::border_color*
---
--- @property border_color
--- @param string
-
---- On top of other windows.
---
--- **Signal:**
---
--- * *property::ontop*
---
--- @property ontop
--- @param boolean
-
---- The mouse cursor.
---
--- **Signal:**
---
--- * *property::cursor*
---
--- @property cursor
--- @param string
--- @see mouse
-
---- Visibility.
---
--- **Signal:**
---
--- * *property::visible*
---
--- @property visible
--- @param boolean
-
---- The opacity of the wibox, between 0 and 1.
---
--- **Signal:**
---
--- * *property::opacity*
---
--- @property opacity
--- @tparam number opacity (between 0 and 1)
-
---- The window type (desktop, normal, dock, ...).
---
--- **Signal:**
---
--- * *property::type*
---
--- @property type
--- @param string
--- @see client.type
-
---- The x coordinates.
---
--- **Signal:**
---
--- * *property::x*
---
--- @property x
--- @param integer
-
---- The y coordinates.
---
--- **Signal:**
---
--- * *property::y*
---
--- @property y
--- @param integer
-
---- The width of the wibox.
---
--- **Signal:**
---
--- * *property::width*
---
--- @property width
--- @param width
-
---- The height of the wibox.
---
--- **Signal:**
---
--- * *property::height*
---
--- @property height
--- @param height
-
---- The wibox screen.
---
--- @property screen
--- @param screen
-
---- The wibox's `drawable`.
---
--- **Signal:**
---
--- * *property::drawable*
---
--- @property drawable
--- @tparam drawable drawable
-
---- The widget that the `wibox` displays.
--- @property widget
--- @param widget
-
---- The X window id.
---
--- **Signal:**
---
--- * *property::window*
---
--- @property window
--- @param string
--- @see client.window
-
---- The wibox's bounding shape as a (native) cairo surface.
---
--- **Signal:**
---
--- * *property::shape_bounding*
---
--- @property shape_bounding
--- @param surface._native
-
---- The wibox's clip shape as a (native) cairo surface.
---
--- **Signal:**
---
--- * *property::shape_clip*
---
--- @property shape_clip
--- @param surface._native
-
---- Get or set mouse buttons bindings to a wibox.
---
--- @param buttons_table A table of buttons objects, or nothing.
--- @function buttons
-
---- Get or set wibox geometry. That's the same as accessing or setting the x,
--- y, width or height properties of a wibox.
---
--- @param A table with coordinates to modify.
--- @return A table with wibox coordinates and geometry.
--- @function geometry
-
---- Get or set wibox struts.
---
--- @param strut A table with new strut, or nothing
--- @return The wibox strut in a table.
--- @function struts
--- @see client.struts
-
---- The default background color.
--- @beautiful beautiful.bg_normal
--- @see bg
-
---- The default foreground (text) color.
--- @beautiful beautiful.fg_normal
--- @see fg
-
---- Set a declarative widget hierarchy description.
--- See [The declarative layout system](../documentation/03-declarative-layout.md.html)
--- @param args An array containing the widgets disposition
--- @name setup
--- @class function
-
---- The background of the wibox.
--- @param c The background to use. This must either be a cairo pattern object,
--- nil or a string that gears.color() understands.
--- @property bg
--- @see gears.color
-
---- The background image of the drawable.
--- If `image` is a function, it will be called with `(context, cr, width, height)`
--- as arguments. Any other arguments passed to this method will be appended.
--- @param image A background image or a function
--- @property bgimage
--- @see gears.surface
-
---- The foreground (text) of the wibox.
--- @param c The foreground to use. This must either be a cairo pattern object,
--- nil or a string that gears.color() understands.
--- @property fg
--- @see gears.color
-
---- Find a widget by a point.
--- The wibox must have drawn itself at least once for this to work.
--- @tparam number x X coordinate of the point
--- @tparam number y Y coordinate of the point
--- @treturn table A sorted table of widgets positions. The first element is the biggest
--- container while the last is the topmost widget. The table contains *x*, *y*,
--- *width*, *height* and *widget*.
--- @name find_widgets
--- @class function
-
-
-return setmetatable(awfulwibar, awfulwibar.mt)
-
--- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80