ubuntuusers.de

[Sammelthread] Zeig mir deine ".conkyrc"!

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

lua_load = file '$HOME/hacks.lua',

Ich kriege folgende Ausgabe beim Nutzen der Variable 'file' in der Funktion lua_load:

conky: $HOME/.config/conky/conkyrc:72: attempt to call local 'file' (a userdata value)

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Was soll deine Variable "file" sein? Es wäre hilfreich wenn Du alles postest was zu dieser komischen Zeile führt...

lua_load erwartet den Pfad zu einem LUA Script und es kann nicht mit mehreren Scripten umgehen. Oder mit zusätzlichen Parametern. Wenn Dein Pfad nicht schon den kompletten Pfad enthalten würde, würde ich vermuten Du willst etwas verketten. Aber dafür fehlt dann der entsprechende Operator (..).

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

Hallo,

Bleys schrieb:

Was soll deine Variable "file" sein? Es wäre hilfreich wenn Du alles postest was zu dieser komischen Zeile führt...

Ich habe dein Beispiel ausprobiert:

command = "/usr/bin/ip route show|grep default|awk '{print $5}'"
local file = io.popen (command)
iface = file:read ("*a")
local dirname = debug.getinfo(1, "S").source:sub(2):match("(.*[/\\])")

conky.config = {
.
.
.
-- Lua Load
	lua_load = dirname .. 'vr.lua',
	lua_draw_hook_post = 'main',
};

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

karzer schrieb:

Hallo,

Bleys schrieb:

Was soll deine Variable "file" sein? Es wäre hilfreich wenn Du alles postest was zu dieser komischen Zeile führt...

Ich habe dein Beispiel ausprobiert:

das sind zwei unterschiedliche Variablen die da ausgelesen werden! Im ersten Teil (der "file" enhält) wird das Netzwerk Interface ausgelesen. Zum besseren Verständnis einfach mal die genutzten Befehle im Terminal anwenden:

1
2
3
4
ralf@Nexus:~$ /usr/bin/ip route show
default via 192.168.3.1 dev enp7s0 proto dhcp metric 100 
169.254.0.0/16 dev enp7s0 scope link metric 1000 
192.168.3.0/24 dev enp7s0 proto kernel scope link src 192.168.3.30 metric 100

grep im Teil nach der Pipe holt dann mein Interface: enp7s0 Innerhalb der conkyrc, vor dem Textbereich nutze ich dann iface als Template:

	template0 = iface,

Meine Anzeige funktioniert also unabhängig davon ob ich per Lan oder Wlan ins Netz gehe.

file wird also nur temporär genutzt für das LUA io.popen Command und auch nur zur Ermittlung des Netzwerk Interface.

local dirname = debug.getinfo(1, "S").source:sub(2):match("(.*[/\\])")

holt den Namen des Conky Verzeichnis und das Laden des LUA Script funktioniert auch nur so, wenn das Script innnerhalb des Conkyverzeichnis ist.

Du solltest Dich etwas mit LUA beschäftigen. Grundwissen aneignen u.s.w. Wird sonst nur frustrierend...

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

Danke! Bleys, habe das Auslesen des Netzw.Interfaces gleich mal eingebaut, stand eh auf der Liste. 👍

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

Bleys schrieb:

karzer schrieb:

Hallo,

Bleys schrieb:

Was soll deine Variable "file" sein? Es wäre hilfreich wenn Du alles postest was zu dieser komischen Zeile führt...

Ich habe dein Beispiel ausprobiert:

das sind zwei unterschiedliche Variablen die da ausgelesen werden! Im ersten Teil (der "file" enhält) wird das Netzwerk Interface ausgelesen. Zum besseren Verständnis einfach mal die genutzten Befehle im Terminal anwenden:

Das mit den zwei Variablen war mir schon klar. Das ändert aber doch nichts daran, dass

lua_load = file, 
lua_draw_hook_post = 'main',

funktionieren sollte.

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

karzer schrieb:

Das mit den zwei Variablen war mir schon klar.

Das bezweifel ich jetzt mal...

Das ändert aber doch nichts daran, dass

lua_load = file, 
lua_draw_hook_post = 'main',

funktionieren sollte.

Ernsthaft?

So schwer zu verstehen sind diese beiden Zeilen doch nicht o_O

command = "/usr/bin/ip route show|grep default|awk '{print $5}'"
local file = io.popen (command)

file enthält nach Ausführung das aktuell genutzte Netzwerk Interface...

Die letzte Zeile

iface = file:read ("*a")

sorgt nur noch für die richtige Formatierung.

Das war falsch. *a steht für read all. Wird Zeit das ich mal wieder ein neues Conky entwerfe...

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Conky horizontal. Außer dem Kalender ist alles per LUA erstellt.

Bilder

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4667

Bleys schrieb:

So schwer zu verstehen sind diese beiden Zeilen doch nicht o_O

command = "/usr/bin/ip route show|grep default|awk '{print $5}'"
local file = io.popen (command)

Ich kenne mich mit Conky nicht aus, und nutze es auch nicht. Aber einen Hinweis zur Verschlankung der ersten Zeile hätte ich, da awk die Aufgabe von grep in diesem Fall gleich mitübernehmen kann:

command = "/usr/bin/ip route show | awk '/default/{print $5}'"

Ich hoffe es ist mir niemand böse darüber, dass ich diese kleinen Hinweis hier mal einstreue.

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

trollsportverein schrieb:

Ich hoffe es ist mir niemand böse darüber, dass ich diese kleinen Hinweis hier mal einstreue.

Perfekt, Danke!

Der Hinweis hat mir gerade gefehlt um in LUA "if process running" nach zu bauen:

local result = os.execute("ps -U root -u root -N | awk '/audacious/{print $4}'")

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Die Methode per template ermittelt nur einmal beim Start von Conky das genutzte Netzwerk Interface.

Hier dann noch die automatisches Erkennen des gerade aktuellen Netzwerk Interface wenn es im laufenden Betrieb gewechselt wird.

Lua Script (inet.lua):

do
    function conky_net(typ)
        command = "/usr/bin/ip route show | awk '/default/{print $5}'"
        local file = io.popen (command)
        iface = file:read ("*a")
        file:close()
        if typ == '1' then
            return (conky_parse(string.format('${%s %s}','addr', iface)))
        elseif typ == "2" then
            return (conky_parse(string.format('${%s %s}',"downspeed", iface)))
        elseif typ == "3" then
            return (conky_parse(string.format('${%s %s}',"upspeed", iface)))
        else
            return iface
        end
    end
end

Die notwendigen Zeilen innerhalb der conkyrc:

conky.config = {
-- Lua Load
	lua_load = '~/.conky/inet.lua',	
};
conky.text = [[
IP: ${lua_parse net 1}
Downspeed: ${lua_parse net 2}
Upspeed: ${lua_parse net 3}
]];

Die LUA Funktion kann natürlich auch in ein vorhandenes LUA Script außerhalb! der Main Funktion eingefügt werden. Dann ohne do - end.

Bilder

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Horizonatale Version und vertikale Version. Bis auf den Kalender mit LUA gebaut.

Bilder

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Einfaches Now Playing Conky. conkyrc:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
conky.config = {
-- — Conky settings

	background = false,
	update_interval = 1,
	total_run_times = 0,
	net_avg_samples = 2,
	cpu_avg_samples = 1,
	no_buffers = true,
	imlib_cache_size = 0,
	
	draw_graph_borders = true,
	draw_outline = false,

-- — Window specifications with Background

	own_window = true,
	own_window_type = desktop,
    own_window_transparent = false,
	own_window_hints = 'undecorated,sticky,skip_taskbar,skip_pager,below',
	own_window_argb_visual = true,
	own_window_argb_value = 0,
	own_window_colour = '000000', 
	
	double_buffer = true,
	minimum_width = 150, minimum_height = 194,


-- — Lage auf dem Desktop festlegen
	alignment = 'top_right',
	gap_x = 25,
	gap_y = 850,
	
	border_inner_margin = 10,

-- — Text settings
	use_xft = true,
	font = 'Dyuthi:size=10',
	override_utf8_locale = true,

	default_color = '#FFFFFF',

	default_bar_width=139,
	default_bar_height=6,

};
conky.text = [[
 ${if_running clementine}
    ${goto 10}${exec sh $HOME/.conky/meta.sh c}${image /tmp/tmp.jpg -p 0,70 -s 140x140}
    ${goto 10}${exec sh $HOME/.conky/meta.sh a}
    ${goto 10}${exec sh $HOME/.conky/meta.sh t}
    ${goto 12}${execbar sh $HOME/.conky/meta.sh b}
${endif}
]];

Skript für die mpris Abfrage des Players. Im Beispiel ist das Clementine. Das Skript funktioniert auch mit jedem anderem Player der mpris unterstützt. Einfach alle Vorkommen von "clementine" ersetzen. meta.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/sh
#
# Bleys 2020
#

if [ $(ps -C clementine -o pid=) ]; then
	
	convertsec() 
	{
	    x=`expr $1 / 1000000`
	    s=`expr $x % 60`
	    x=`expr $x / 60`
	    m=`expr $x % 60`
	    printf "%02d:%02d\n" $m $s
	}
	case "$1" in
	p|b)
		POSITION=$(qdbus org.mpris.MediaPlayer2.clementine /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Position)

		TOTAL=$(qdbus org.mpris.MediaPlayer2.clementine /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "^mpris:length" | awk '{print $2}')
		case "$1" in
		p)
			if [ -z $TOTAL ]
			then
				echo "00:00"			
			else
				echo $(convertsec $POSITION)/$(convertsec $TOTAL)
			fi;;
		b)
			if [ -z $TOTAL ]
			then
				echo 0
			else
				echo $(( $POSITION*100/$TOTAL ))
			fi;;
		esac
	;;
	a)
		ARTIST=$(qdbus org.mpris.MediaPlayer2.clementine /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "artist:")
		echo ${ARTIST##*:};;
	t)
		TITEL=$(qdbus org.mpris.MediaPlayer2.clementine /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "title:")
		echo ${TITEL##*:};;
	c)
		COVER=$(qdbus org.mpris.MediaPlayer2.clementine /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "artUrl:")
		if [ -n "$COVER" ]
		then
		cp -a ${COVER#*//} '/tmp/tmp.jpg'	
		fi;;
	esac
fi

exit 0
Bilder

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Conky Kalender kpl. in LUA geschrieben. Läßt sich in vorhandene Conkys einbauen. Position des Kalenders wird durch Angabe von x,y bestimmt.

LUA Skript:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
--[[
2023 Bleys
Screenshot ist im ersten Kommentar. (gist.github.com)
Änderungen des Font (Ubuntu Mono) und/oder der Schriftgröße erfordern auch eine Anpassung der Berechnung der Hintergrund Berechnung!
Das sollte man nur machen wenn man weis was man tut...

Screenshot in first Comment
Changing the font (Ubuntu Mono) and font size also requires an adjustment of the background calculation for the current day!
Only change if you know what you are doing!

mainx, mainy innerhalb der Funktion calendar bestimmen die Position des Kalenders.
mainx, mainy within the calendar function determine the position of the calendar.

--    color=0xffffff   --weiß / white
--    color=0x000000   --schwarz / black
--    color=0x0000ff   --blau / blue
--    color=0xffff00   --gelb / yellow
--    color=0xff0000   --rot / red
--    color=0x00ff00   --grün / green

]]
require 'cairo'
require "math"
function rgb_to_rgba(color,alpha)
	return ((color / 0x10000) % 0x100) / 255., ((color / 0x100) % 0x100) / 255., (color % 0x100) / 255., alpha
end
function draw_day(cr,xx,yy,bcolor,balpha) -- zeichne Hintergrund für aktuellen Tag / draw current Day Background 
    local corner_r=2
    local bg_color=0xff0000   --rot / red (Farbe/Color))

    local bg_alpha=0.5
	local w=15
	local h=12
    local x=xx
    local y=yy
	cairo_set_source_rgba(cr,rgb_to_rgba(bcolor,balpha))	
	cairo_move_to(cr,x,y)
	cairo_line_to(cr,x+w,y)
	cairo_line_to(cr,x+w,y+h)
	cairo_line_to(cr,x,y+h)
	cairo_line_to(cr,x,y)
	cairo_close_path(cr)
--	cairo_stroke(cr) -- Markierung "Heute" durch Umrandung / Marking today by border
	cairo_fill(cr) -- Markierung "Heute" durch Hintergrund / Marking today by background
end
function draw_bg(cr,color,alpha,typ) -- zeichne Hintergrund Conky Fenster / draw Conky Area Background
    local corner_r=20
    local bg_color=color 

    local bg_alpha=alpha
	local w=conky_window.width
	local h=conky_window.height
	cairo_set_source_rgba(cr,rgb_to_rgba(bg_color,bg_alpha))
	cairo_move_to(cr,corner_r,0)
	cairo_line_to(cr,w-corner_r,0)
	cairo_curve_to(cr,w,0,w,0,w,corner_r)
	cairo_line_to(cr,w,h-corner_r)
	cairo_curve_to(cr,w,h,w,h,w-corner_r,h)
	cairo_line_to(cr,corner_r,h)
	cairo_curve_to(cr,0,h,0,h,0,h-corner_r)
	cairo_line_to(cr,0,corner_r)
	cairo_curve_to(cr,0,0,0,0,corner_r,0)
	cairo_close_path(cr)
	
    if typ==1 then
	    cairo_fill(cr)
    else
        cairo_stroke(cr)
    end
end 

function write_text(cr, x, y, text, f)
--write_text(cr, x, y, text, {})
--font attributes (Schriftattribute zuweisen oder default Werte annehmen)
      local font=f.font or "Noto Sans"
      local size=f.size or 10
      local align=f.align or 'l'
      local bold=f.bold or false
      local ital=f.italic or false
      local color=f.color or "0xffffff"
      local slant=CAIRO_FONT_SLANT_NORMAL
      if ital then slant=CAIRO_FONT_SLANT_ITALIC end
      local weight=CAIRO_FONT_WEIGHT_NORMAL
      if bold then weight=CAIRO_FONT_WEIGHT_BOLD end

--Text Size (Textgröße für die Plazierung bestimmen.)
      local x_a=0
      local y_a=0
      local te = cairo_text_extents_t:create()
      tolua.takeownership(te)
      cairo_select_font_face (cr, font, slant, weight)
      cairo_set_font_size (cr, size)
      cairo_text_extents (cr, text, te)

--Text Position
      if align=='c' then
        x_a = -(te.width/2+te.x_bearing)
        y_a = -(te.height/2+te.y_bearing)
      end
      if align=='r' then
        x_a = -(te.width+te.x_bearing)
        --y_a = -(te.height+te.y_bearing)
      end

--Schadow 1 Pixel (Schatten für den Text um 1 Pixel versetzt)
      cairo_set_source_rgba(cr, rgb_to_rgba(0x000000,1))

      cairo_move_to (cr, x+1+x_a, y+1+y_a)
      cairo_show_text (cr, text)
      cairo_stroke(cr)

-- Now Text on Top (nun den Text oben drauf)
      cairo_set_source_rgba(cr, rgb_to_rgba(color,1))
      cairo_move_to (cr, x+x_a, y+y_a)
      cairo_show_text (cr, text)
      cairo_stroke(cr)
end

function calendar(cr)
-- x, y Koordinaten für den Kalender (oben, links) / x, y coordinates for the calendar (top, left)
    local mainx=10
    local mainy=16
-- End(e) x,y
-- Parameter Grid Berechnung Monat / Parameters grid calculation month
    local time=os.time{year=os.date("%Y"), month=os.date("%m"), day=1}
    local weekday=os.date("%w", time)
    local mon=tonumber(os.date("%m"))+1
    local time=os.time{year=os.date("%Y"), month=mon, day=0}
    local lastday=tonumber(os.date("%d", time))
    local day=tonumber(os.date("%d"))
    local weekday=tonumber(weekday)
    local start=1
    local posabsbg=0
    if weekday == 0 then
        start=-5
        posabsbg=day+6
    else
        start=(weekday-2)*-1
        posabsbg=day+weekday-1
    end
    local count=0
    local week=1
    local wd={}
    local we={}
    local workdays=""
    local weekend=""
    local bcolor=0xff0000 -- Farbe aktueller Tag / Color current Day
    local balpha=0.5 -- Alpha aktueller Tag /Alpha current Day
-- Ende Berechnung / end Calculation
-- Berechnung aktueller Tag Hintergrund / calculate current day Background
    local yposbg=math.floor(((posabsbg-posabsbg%7)/7)*12+mainy+20)
    if math.floor(posabsbg%7)==0 then yposbg=math.floor(((posabsbg-posabsbg%7)/7-1)*12+mainy+20) end
    local xposbg=math.floor((posabsbg%7)*18+mainx-13)
    if math.floor(posabsbg%7)==0 then xposbg=math.floor((posabsbg%7+7)*18+mainx-13) end
    draw_day(cr,xposbg,yposbg,bcolor,balpha) -- Funktion Hintergrund aktueller Tag / Function Highlight current Day
-- Ende Berechnung aktueller Tag Hintergrund / calculate today Background
-- Monatsübersicht zusammenstellen / Compile monthly overview
    for i=start,lastday do
        if i<1 then -- old Month
            if (start==-5 and i==0) then -- Weekend
                weekend=weekend.."   "
            else -- Work Days
                workdays=workdays.."   "
            end
        else
            if i<10 then
                if count<5 then
                    workdays=workdays.."  "..i
                else
                    weekend=weekend.."  "..i
                end
            else
                if count<5 then
                    workdays=workdays.." "..i
                else
                    weekend=weekend.." "..i
                end
            end
        end
        count=count+1
        if ( count == 7 or i == lastday ) then
            wd[week]=workdays
            we[week]=weekend
            week=week+1
            workdays=""
            weekend=""
            count=0
        end
    end
-- Ende Monatsübersicht zusammenstellen / End Compile monthly overview
-- Schreiben... / write...
    write_text(cr, mainx+66, mainy, os.date("%B").." "..os.date("%Y"), {font="Dyuthi", size=14, align="c"}) 
    write_text(cr, mainx+1, mainy+17, " Mo Di Mi Do Fr ", {font="Ubuntu Mono", size=12, bold=true, align="l"})     
    write_text(cr, mainx+91, mainy+17, " Sa So", {font="Ubuntu Mono", size=12, bold=true, color="0x0ab1ff", align="l"}) 
    for w=1,week do
        wy=mainy+30+((w-1)*12)
        wx=mainx+90
        write_text(cr, mainx, wy, wd[w], {font="Ubuntu Mono", size=12, align="l"})
        write_text(cr, wx, wy, we[w], {font="Ubuntu Mono", size=12, align="l", color="0x1e90ff"}) -- Farbe/Color WE
    end
-- Ende Schreiben / End write
end

function conky_main()
	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>5 then
        color=0xffffff  alpha=0.1   typ=1
        draw_bg(cr,color,alpha,typ) -- Funktion Hintergrund Conky Bereich / Function Backgrounds Conky Area
        color=0xffffff  alpha=0.8   typ=2
        draw_bg(cr,color,alpha,typ) --zeichne Linie um den Bereich / Draw line around Conky Area
        calendar(cr) -- Hauptfunktion erzeuge / Main
	end

   cairo_surface_destroy(cs)
   cairo_destroy(cr)
end
Bilder

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Wenn ich mir den Thread so ansehe, scheint es nur wenig Interesse an Conky zu geben. Ich poste irgendwie immer nur für mich selbst 😉 Also.. schreibt mal kurz hier falls noch Interesse besteht.

Bilder