radical/init.lua

116 lines
3.3 KiB
Lua

local type = type
local base = require( "wibox.widget.base" )
local tooltip = require( "radical.tooltip" )
local aw_button = require( "awful.button" )
local beautiful = require( "beautiful" )
-- Define some wibox.widget extensions
local function set_tooltip(self, text, args)
if not text then return end
self._tooltip = tooltip(self,text, args)
end
--- Set a menu for widget "self".
-- This function is available for all widgets.
-- Any signals can be used as trigger, the common ones are:
--
-- * "button::press" (default) Left mouse button (normal click_
-- * "mouse::enter" When the mouse enter the widget
--
-- @param self A widget (implicit parameter)
-- @param menu A radical menu or a function returning one (for lazy-loading)
-- @tparam[opt="button1::pressed"] string event The event trigger for showing
-- the menu.
-- @tparam[opt=1] button_id The mouse button 1 (1= left, 3=right)
-- @tparam[opt=widget] The position mode (see `radical.placement`)
local function set_menu(self,menu, event, button_id, mode)
if not menu then return end
local event = event or "button::pressed"
local button_id = button_id or 1
mode = mode or "widget"
local function trigger(_, geo)
local geo = geo or _
local m = menu
if self._data and self._data.is_menu then
geo.parent_menu = self._data
end
if type(menu) == "function" then
if self._tmp_menu and self._tmp_menu.visible then
self._tmp_menu.visible = false
self._tmp_menu = nil
return
end
m = menu(self)
end
if not m then return end
m.parent_geometry = geo
m._internal.w:move_by_parent(geo, mode)
m.visible = not m.visible
end
if event == "button::pressed" then
local current,bt = self:buttons(),aw_button({},b,trigger)
for k, v in pairs(bt) do
current[type(k) == "number" and (#current+1) or k] = v
end
else
self:connect_signal(event, trigger)
end
self._menu = menu
return bt
end
local function get_preferred_size(self, context, width, height)
local context = context or 1
if type(context) == "number" then
context = {dpi=beautiful.xresources.get_dpi(context)}
elseif not context.dpi then
context.dpi = beautiful.xresources.get_dpi(1)
end
return self:fit(context, width or 9999, height or 9999)
end
-- Do some monkey patching to extend all wibox.widget
base._make_widget =base.make_widget
base.make_widget = function(...)
local ret = base._make_widget(...)
ret.set_tooltip = set_tooltip
ret.set_menu = set_menu
-- Textboxes already have it
if not ret.get_preferred_size then
ret.get_preferred_size = get_preferred_size
end
return ret
end
local bar = require( "radical.bar" )
return {
layout = require( "radical.layout" ),
object = require( "radical.object" ),
base = require( "radical.base" ),
radial = require( "radical.radial" ),
context = require( "radical.context" ),
embed = require( "radical.embed" ),
box = require( "radical.box" ),
style = require( "radical.style" ),
widgets = require( "radical.widgets" ),
item = require( "radical.item" ),
dock = require( "radical.dock" ),
bar = bar,
flexbar = bar.flex,
tooltip = tooltip
}
-- kate: space-indent on; indent-width 2; replace-tabs on;