diff --git a/tests/examples/awful/template.lua b/tests/examples/awful/template.lua new file mode 100644 index 00000000..42c0a897 --- /dev/null +++ b/tests/examples/awful/template.lua @@ -0,0 +1,154 @@ +local file_path, image_path, luacovpath = ... + +local cairo = require("lgi").cairo +local pango = require("lgi").Pango +local pangocairo = require("lgi").PangoCairo + +-- Set the global shims +-- luacheck: globals awesome root tag screen client mouse +awesome = require( "awesome" ) +root = require( "root" ) +tag = require( "tag" ) +screen = require( "screen" ) +client = require( "client" ) +mouse = require( "mouse" ) + +-- Force luacheck to be silent about setting those as unused globals +assert(awesome and root and tag and screen and client and mouse) + +-- If luacov is available, use it. Else, do nothing. +pcall(function() + require("luacov.runner")(luacovpath) +end) + +local color = require( "gears.color" ) +local shape = require( "gears.shape" ) +local beautiful = require( "beautiful" ) + +-- Run the test +local args = loadfile(file_path)() or {} + +-- Draw the result +local img = cairo.SvgSurface.create(image_path..".svg", screen._get_extents() ) + +local cr = cairo.Context(img) + +local pango_crx = pangocairo.font_map_get_default():create_context() +local pl = pango.Layout.new(pango_crx) + +-- Draw some text inside of the geometry +local function draw_label(geo, text) + cr:save() + cr:set_source(color(beautiful.fg_normal)) + cr:translate(geo.x, geo.y) + pl.text = text + cr:show_layout(pl) + cr:restore() +end + +-- Draw a mouse cursor at [x,y] +local function draw_mouse(x, y) + cr:move_to(x, y) + cr:rel_line_to( 0, 10) + cr:rel_line_to( 3, -2) + cr:rel_line_to( 3, 4) + cr:rel_line_to( 2, 0) + cr:rel_line_to(-3, -4) + cr:rel_line_to( 4, 0) + cr:close_path() + cr:fill() +end + +-- Print an outline for the screens +for _, s in ipairs(screen) do + cr:save() + -- Draw the screen outline + cr:set_source(color("#00000044")) + cr:set_line_width(1.5) + cr:set_dash({10,4},1) + cr:rectangle(s.geometry.x+0.75,s.geometry.y+0.75,s.geometry.width-1.5,s.geometry.height-1.5) + cr:stroke() + + -- Draw the workarea outline + cr:set_source(color("#00000033")) + cr:rectangle(s.workarea.x,s.workarea.y,s.workarea.width,s.workarea.height) + cr:stroke() + + -- Draw the padding outline + --TODO + cr:restore() +end + +cr:set_line_width(beautiful.border_width) +cr:set_source(color(beautiful.border_color)) + +-- Loop each clients geometry history and paint it +for _, c in ipairs(client.get()) do + local pgeo = nil + for _, geo in ipairs(c._old_geo) do + if not geo._hide then + cr:save() + cr:translate(geo.x, geo.y) + shape.rounded_rect(cr, geo.width, geo.height, args.radius or 5) + cr:stroke_preserve() + cr:set_source(color(c.color or geo._color or beautiful.bg_normal)) + cr:fill() + cr:restore() + + if geo._label then + draw_label(geo, geo._label) + end + end + + -- Draw lines between the old and new corners + if pgeo and not args.hide_lines then + cr:save() + cr:set_source_rgba(0,0,0,.1) + + -- Top left + cr:move_to(pgeo.x, pgeo.y) + cr:line_to(geo.x, geo.y) + cr:stroke() + + -- Top right + cr:move_to(pgeo.x+pgeo.width, pgeo.y) + cr:line_to(geo.x+pgeo.width, geo.y) + + -- Bottom left + cr:move_to(pgeo.x, pgeo.y+pgeo.height) + cr:line_to(geo.x, geo.y+geo.height) + cr:stroke() + + -- Bottom right + cr:move_to(pgeo.x+pgeo.width, pgeo.y+pgeo.height) + cr:line_to(geo.x+pgeo.width, geo.y+geo.height) + cr:stroke() + + cr:restore() + end + + pgeo = geo + end +end + +cr:set_source_rgba(1,0,0,1) +cr:set_dash({1,1},1) + +-- Paint the mouse cursor position history +for _, h in ipairs(mouse.old_histories) do + local pos = nil + for _, coords in ipairs(h) do + draw_mouse(coords.x, coords.y) + cr:fill() + + if pos then + cr:move_to(pos.x, pos.y) + cr:line_to(coords.x, coords.y) + cr:stroke() + end + + pos = coords + end +end + +img:finish()