Rolinh

Rolinh' release

Awesome, Acpitool Et Widget Pour La Batterie

Je dois être un peu naïf car, pendant longtemps, j’ai cru que tous les utilisateurs d’Awesome WM codaient leurs widgets eux-même et que cela faisait partie du rituel de personnalisation du rc.lua. Il se trouve que j’avais tord. En parcourant les forums d’Archlinux, on peut remarquer que la majorité  des archers utilisent les widgets proposés par  Vicious.

Toujours est-il que je trouve bien plus fun d’écrire tout cela soi-même (voir notamment cet article). Je m’étais donc écrit un widget pour avoir les informations pertinentes concernant la batterie de mon portable (pourcentage de charge, status, temps restant). Or, pour le temps restant, je n’avais pas creusé bien loin et m’appuyais simplement sur acpitool au travers d’un io.popen(acpitool -b). Je suis conscient que ce n’est pas très élégant mais je trouvais cela simple.

Pourquoi je vous parle de cela? Simplement car depuis une mise-à-jour récente d’Archlinux, acpitool n’est plus fonctionnel. En effet, il s’appuie sur /proc/acpi/battery pour la collecte des informations nécessaire. Or, il s’avère que /proc/acpi/ est déprécié et a été ôté depuis le noyau 3.0.6-1 sur Archlinux. Au lieu de cela, acpitool devrait chercher les informations dans /sys/class/power_supply/.

Mon idée première a donc d’abord été de vouloir proposer un patch auprès du développeur d’acpitool étant donné que le problème est upstream. En allant récupéré les sources, j’ai constaté que les derniers changements apportés au code remontent au 13 août 2009. J’ai de plus rapidement constaté qu’un patch ne suffirait pas et que le code doit être revu dans son ensemble. Bref, fort de ce constat, j’ai décidé de récupérer cette info désormais manquante pour mon widget par moi-même.

Voici donc la version réécrite de mon widget de batterie:

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
-- Battery status widget
function activebat()
  local path, perct, res, batime_h, batime_m, batime, f
  -- files we read from
  local charge_full, charge_now, current_now, present, status
  path = "/sys/class/power_supply/BAT0/"
  f = io.input(path .. "present")
  present = io.read("*number")
  f:close()
  if (present == 0) then
      return 'no'
  en
  f = io.input(path .. "status")
  status = io.read("*all")
  f:close()
  if (status == 'Full\n') then
      return '↯'
  end
  f = io.input(path .. "charge_now")
  charge_now = io.read("*number")
  f:close()
  f = io.input(path .. "charge_full")
  charge_full = io.read("*number")
  f:close()
  perct = (charge_now/charge_full) * 100
  res = string.format("%.2f", perct)
  if perct < 10 then
      res = '' .. res .. ''
  elseif   perct < 20 then
      res = '' .. res .. ''
  elseif  perct < 30 then
      res = '' .. res .. ''
  else
      res = '' .. res .. ''
  end
  if (status == 'Discharging\n') then
      status = '-'
      -- get remaining time
      f = io.input(path .. "current_now")
      current_now = io.read("*number")
      f:close()
      batime = math.floor((charge_now / current_now) * 60)
      batime_h = math.floor(batime / 60)
      batime_m = string.format("%02d", batime % 60)
      batime = ' (' .. batime_h .. "h" .. batime_m .. ')'
  else
      status = '+'
      batime = ''
  end
  res = res .. '% ' .. status .. batime
  return res
end
batinfo = widget({ type = "textbox" , name = "batinfo" })
-- Assign a hook to update info
activebat_timer = timer({timeout = 1})
activebat_timer:add_signal("timeout", function() batinfo.text = "BAT: " .. activebat() .. " |" end)
activebat_timer:start()

Bien entendu, si votre batterie n’est pas BAT0 mais BAT1 ou autre, il faudra mettre à jour cette information afin que le widget fonctionne chez vous. Au final, ça ressemble à ça:

Il faudrait encore que je prenne le temps de l’améliorer afin qu’il prenne en compte le temps restant jusqu’à charge complète de la batterie mais je ne me suis pas encore penché sur le problème. En attendant, cela sera peut-être utile à l’un d’entre vous.  ;–)