collision/util.lua

107 lines
2.9 KiB
Lua

local capi = {screen = screen}
local math = math
local color = require( "gears.color" )
local beautiful = require( "beautiful" )
local glib = require("lgi").GLib
local cairo = require( "lgi" ).cairo
local module = {settings={}}
local rr,rg,rb
function module.get_rgb()
if not rr then
local pat = color(beautiful.fg_normal)
local s,r,g,b,a = pat:get_rgba()
rr,rg,rb = r,g,b
end
return rr,rg,rb
end
function module.arrow_path(cr, width, sidesize)
cr:rel_move_to( 0 , -width/2 )
cr:rel_line_to( width/2 , width/2 )
cr:rel_line_to( -sidesize , 0 )
cr:rel_line_to( 0 , width/2 )
cr:rel_line_to( (-width)+2*sidesize , 0 )
cr:rel_line_to( 0 , -width/2 )
cr:rel_line_to( -sidesize , 0 )
cr:rel_line_to( width/2 , -width/2 )
cr:close_path()
end
function module.arrow(width, sidesize, margin, bg_color, fg_color)
local img = cairo.ImageSurface(cairo.Format.ARGB32, width+2*margin, width+2*margin)
local cr = cairo.Context(img)
cr:set_source(color(bg_color))
cr:paint()
cr:set_source(color(fg_color))
cr:set_antialias(cairo.Antialias.NONE)
cr:move_to(margin+width/2, margin+width/2)
module.arrow_path(cr, width, sidesize)
cr:fill()
return cairo.Pattern.create_for_surface(img)
end
function module.draw_round_rect(cr,x,y,w,h,radius)
cr:save()
cr:translate(x,y)
cr:move_to(0,radius)
cr:arc(radius,radius,radius,math.pi,3*(math.pi/2))
cr:arc(w-radius,radius,radius,3*(math.pi/2),math.pi*2)
cr:arc(w-radius,h-radius,radius,math.pi*2,math.pi/2)
cr:arc(radius,h-radius,radius,math.pi/2,math.pi)
cr:close_path()
cr:restore()
end
local function refresh_dt(last_sec,last_usec,callback,delay)
local tv = glib.TimeVal()
glib.get_current_time(tv)
local dt = (tv.tv_sec*1000000+tv.tv_usec)-(last_sec*1000000+last_usec)
if dt < delay then
callback()
end
return tv.tv_sec,tv.tv_usec
end
function module.double_click(callback,delay)
delay = delay or 250000
local ds,du = 0,0
return function()
ds,du = refresh_dt(ds,du,callback,delay)
end
end
-- Screen order is not always geometrical, sort them
local screens,screens_inv
function module.get_ordered_screens()
if screens then return screens,screens_inv end
screens = {}
for i=1,capi.screen.count() do
local geom = capi.screen[i].geometry
if #screens == 0 then
screens[1] = i
elseif geom.x < capi.screen[screens[1]].geometry.x then
table.insert(screens,1,i)
else
for j=#screens,1,-1 do
if geom.x > capi.screen[screens[j]].geometry.x then
table.insert(screens,j+1,i)
break
end
end
end
end
screens_inv = {}
for k,v in ipairs(screens) do
screens_inv[v] = k
end
return screens,screens_inv
end
return module
-- kate: space-indent on; indent-width 2; replace-tabs on;