Jump to content


Photo
- - - - -

Conky + Lua + Cairo + Gentoo = that darn nil error


  • Please log in to reply
No replies to this topic

#1 TheFunk

TheFunk

    SUP3R 31337

  • Binrev Financier
  • 185 posts
  • Country:
  • Gender:Male

Posted 10 September 2012 - 10:01 PM

I've been trying to set up conky + lua/cairo on my gentoo laptop but I keep getting the evil nil error that everyone seems to get. I've tried so many different solutions, but I can't for the life of me figure out what might be wrong. At first I was trying to get the set up working with some really basic scripts of my own, now I'm using other people's scripts hoping that I was just terrible at lua.

Here's my take on the situation:

- I'm fairly certain I have everything installed that I need, and that I compiled everything with the proper use flags, but I could be wrong.
- I'm almost certain it has something to do with cairo (don't ask me why)
- I really wish I could debug this stuff more easily.

SOLVED: I'm an idiot. I just found what's wrong. It's working now, and it looks all pretty! I'll leave this here for someone to test their lua skills, it's pretty obvious once you see it.

Output of conky -v:
Conky 1.9.0 compiled Mon Sep 10 17:54:19 EDT 2012 for Linux 3.4.9-gentoo (x86_64)

Compiled in features:

System config file: /etc/conky/conky.conf
Package library path: /usr/lib64/conky


 X11:
  * Xdamage extension
  * XDBE (double buffer extension)
  * Xft
  * ARGB visual

 Music detection:

 General:
  * math
  * hddtemp
  * portmon
  * wireless
  * config-output
  * Imlib2
  * ncurses
  * Lua

  Lua bindings:
   * Cairo
   * Imlib2

Conkyrc file (located in ~/.conky)
# Conky settings #
background no
update_interval 1

cpu_avg_samples  2
#net_avg_samples 2

override_utf8_locale yes

double_buffer yes
no_buffers yes

text_buffer_size 2048
#imlib_cache_size 0

#temperature_unit fahrenheit

# Window specifications #

own_window yes
own_window_transparent yes
own_window_type override
#own_window_argb_visual yes
#own_window_class conky-semi
#own_window_argb_value 255
#own_window_hints undecorate,sticky,skip_taskbar,skip_pager,below

border_inner_margin 0
border_outer_margin 0

minimum_size 200 150
maximum_width 200

alignment tr
gap_x 0
gap_y 0

# Graphics settings #
draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no

# Text settings #
use_xft yes
xftfont Ubuntu:size=9
xftalpha 0.5

uppercase no

#temperature_unit celsius


default_color 000000

# Lua Load  #

lua_load ~/.conky/compactlua/clock_rings.lua
lua_draw_hook_pre clock_rings

TEXT
${voffset 1}${goto 15}${color BDB5A1}${font Ubuntu:size=15}${time %A}${font}
${voffset -10}${alignr 50}${color gray}${font Ubuntu:size=35}${time %e}${font}
${color gray}${voffset -30}${color gray}${font Ubuntu:size=17}${time %b}${font}
${voffset -3} ${color gray}${font Ubuntu:size=19}${time %Y}${font}${color FFA300}${hr}
#${voffset 140}${font Ubuntu:size=10}${alignr}HOME${font}
#${font Ubuntu:size=12}${color gray}${alignr}${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ LQBK temperature temperature 30} °C${font}
#${image /root/.conky/compactlua/linux-mint1-300x300a.png -p 58,115 -s 80x35}

${color gray}${goto 172}${voffset 15}${cpu cpu0}%
${color FFA300}${goto 172}CPU
${color gray}${goto 138}${voffset -45}${memperc}%
${color FFA300}${goto 138}RAM
#${color gray}${goto 75}${voffset 23}${swapperc}%
#${color FFA300}${goto 75}Swap
${color gray}${goto 172}${voffset 100}${fs_used_perc /}%
${color FFA300}${goto 172}Disk
#${color gray}${goto 125}${voffset 25}${downspeed eth0}
#${color gray}${goto 125}${upspeed eth0}
#${color FFA300}${goto 125}Net



#${color gray}${font Ubuntu:size=8}Uptime: ${uptime_short}
${color gray}${font Ubuntu:size=8}${voffset -30}${goto 143}Processes: ${processes}
${color gray}${font Ubuntu:size=8}${goto 143}Running: ${running_processes}


#${color FFA300}${font Ubuntu:size=8}${alignr}${nodename}
#${color FFA300}${font Ubuntu:size=8}${alignr}${pre_exec cat /etc/issue.net}  $machine
#${color FFA300}${font Ubuntu:size=8}${alignr}Kernel: ${kernel}

And my clock rings file (located in ~/.conky/compactlua)
--[[
Clock Rings by Linux Mint (2011) reEdited by despot77

This script draws percentage meters as rings, and also draws clock hands if you want! It is fully customisable; all options are described in the script. This script is based off a combination of my clock.lua script and my rings.lua script.

IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement on line 145 uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num>5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num>3; conversely if you update Conky every 0.5s, you should use update_num>10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error.

To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
    lua_load ~/scripts/clock_rings.lua
    lua_draw_hook_pre clock_rings
    
Changelog:
+ v1.0 -- Original release (30.09.2009)
   v1.1p -- Jpope edit londonali1010 (05.10.2009)
*v Mint-lua -- reEdit despot77 (18.02.2011)
]]

if value == nil then value = 0 end
pct = value/pt['max']

settings_table = {
    {
        -- Edit this table to customise your rings.
        -- You can create more rings simply by adding more elements to settings_table.
        -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.
        name='time',
        -- "arg" is the argument to the stat type, e.g. if in Conky you would write ${cpu cpu0}, 'cpu0' would be the argument. If you would not use an argument in the Conky variable, use ''.
        arg='%I.%M',
        -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100.
        max=12,
        -- "bg_colour" is the colour of the base ring.
        bg_colour=0xEAEAEA,
        -- "bg_alpha" is the alpha value of the base ring.
        bg_alpha=0.1,
        -- "fg_colour" is the colour of the indicator part of the ring.
        fg_colour=0xFFA300,
        -- "fg_alpha" is the alpha value of the indicator part of the ring.
        fg_alpha=0.2,
        -- "x" and "y" are the x and y coordinates of the centre of the ring, relative to the top left corner of the Conky window.
        x=100, y=150,
        -- "radius" is the radius of the ring.
        radius=50,
        -- "thickness" is the thickness of the ring, centred around the radius.
        thickness=5,
        -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative.
        start_angle=0,
        -- "end_angle" is the ending angle of the ring, in degrees, clockwise from top. Value can be either positive or negative, but must be larger than start_angle.
        end_angle=360
    },
    {
        name='time',
        arg='%M.%S',
        max=60,
        bg_colour=0xEAEAEA,
        bg_alpha=0.1,
        fg_colour=0xFFA300,
        fg_alpha=0.4,
        x=100, y=150,
        radius=56,
        thickness=5,
        start_angle=0,
        end_angle=360
    },
    {
        name='time',
        arg='%S',
        max=60,
        bg_colour=0xEAEAEA,
        bg_alpha=0.1,
        fg_colour=0xFFA300,
        fg_alpha=0.6,
        x=100, y=150,
        radius=62,
        thickness=5,
        start_angle=0,
        end_angle=360
    },
    {
        name='time',
        arg='%d',
        max=31,
        bg_colour=0xEAEAEA,
        bg_alpha=0.1,
        fg_colour=0xFFA300,
        fg_alpha=0.8,
        x=100, y=150,
        radius=70,
        thickness=5,
        start_angle=-90,
        end_angle=90
    },
    {
        name='time',
        arg='%m',
        max=12,
        bg_colour=0xEAEAEA,
        bg_alpha=0.1,
        fg_colour=0xFFA300,
        fg_alpha=1,
        x=100, y=150,
        radius=76,
        thickness=5,
        start_angle=-90,
        end_angle=90
    },
    
           
}

-- Use these settings to define the origin and extent of your clock.

clock_r=65

-- "clock_x" and "clock_y" are the coordinates of the centre of the clock, in pixels, from the top left of the Conky window.

clock_x=100
clock_y=150

show_seconds=false

require 'cairo'

function rgb_to_r_g_b(colour,alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

function draw_ring(cr,t,pt)
    local w,h=conky_window.width,conky_window.height
    
    local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
    local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']

    local angle_0=sa*(2*math.pi/360)-math.pi/2
    local angle_f=ea*(2*math.pi/360)-math.pi/2
    local t_arc=t*(angle_f-angle_0)

    -- Draw background ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
    cairo_set_line_width(cr,ring_w)
    cairo_stroke(cr)
    
    -- Draw indicator ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
    cairo_stroke(cr)        
end

function draw_clock_hands(cr,xc,yc)
    local secs,mins,hours,secs_arc,mins_arc,hours_arc
    local xh,yh,xm,ym,xs,ys
    
    secs=os.date("%S")    
    mins=os.date("%M")
    hours=os.date("%I")
        
    secs_arc=(2*math.pi/60)*secs
    mins_arc=(2*math.pi/60)*mins+secs_arc/60
    hours_arc=(2*math.pi/12)*hours+mins_arc/12
        
    -- Draw hour hand
    
    xh=xc+0.5*clock_r*math.sin(hours_arc)
    yh=yc-0.5*clock_r*math.cos(hours_arc)
    cairo_move_to(cr,xc,yc)
    cairo_line_to(cr,xh,yh)
    
    cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
    cairo_set_line_width(cr,3.5)
    cairo_set_source_rgba(cr,0.7,0.7,0.7,0.7)
    cairo_stroke(cr)
    
    -- Draw minute hand
    
    xm=xc+0.75*clock_r*math.sin(mins_arc)
    ym=yc-0.75*clock_r*math.cos(mins_arc)
    cairo_move_to(cr,xc,yc)
    cairo_line_to(cr,xm,ym)
    
    cairo_set_line_width(cr,2)
    cairo_stroke(cr)
    
    -- Draw seconds hand
    
    if show_seconds then
        xs=xc+clock_r*math.sin(secs_arc)
        ys=yc-clock_r*math.cos(secs_arc)
        cairo_move_to(cr,xc,yc)
        cairo_line_to(cr,xs,ys)
    
        cairo_set_line_width(cr,1)
        cairo_stroke(cr)
    end
end

function conky_clock_rings()
    local function setup_rings(cr,pt)
        local str=''
        local value=0
        
        str=string.format('${%s %s}',pt['name'],pt['arg'])
        str=conky_parse(str)
        
        value=tonumber(str)
        if value == nil then value = 0 end
        pct=value/pt['max']
        
        draw_ring(cr,pct,pt)
    end
    
    -- Check that Conky has been running for at least 5s

    if conky_window==nil then return end
    local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
    
    local cr=cairo_create(cs)    
    
    local updates=conky_parse('${updates}')
    update_num=tonumber(updates)
    
    if update_num>2 then
        for i in pairs(settings_table) do
            setup_rings(cr,settings_table[i])
        end
    end
    
    draw_clock_hands(cr,clock_x,clock_y)
end

Edited by TheFunk, 10 September 2012 - 10:05 PM.





BinRev is hosted by the great people at Lunarpages!