msgbox

Untitled

Sep 10th, 2011
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.75 KB | None | 0 0
  1. #! /usr/bin/perl -w
  2. use strict;
  3. $| = 1;
  4. use constant COLOR_BG => scalar 'None';
  5. use constant COLOR_FG => scalar '#303030';
  6. use constant COLOR_BORDER => scalar 'None';
  7.  
  8. sub display_normalize {
  9. my $disp = shift() || '';
  10. my ($host, $display, $screen) = ('localhost', '0', '0');
  11. $disp =~ m{^([^:]+)?(?::(\d+)(?:\.(\d+))?)?$};
  12. $host = $1 if ($1);
  13. $display = $2 if ($2);
  14. $screen = $3 if ($3);
  15. return sprintf('%s:%s.%s', $host, $display, $screen);
  16. }
  17.  
  18. sub get_cmdline {
  19. my $cmdline = '';
  20. my $pid = shift() || -1;
  21. return $cmdline unless ($pid > 0);
  22. my $dirname = sprintf('/proc/%d/', $pid);
  23. if (-d $dirname) {
  24. my %prepend = ();
  25. if (my (undef, undef, undef, undef, $uid, $gid) = stat($dirname)) {
  26. $prepend{'UID'} = $uid;
  27. if ($uid >= 0) {
  28. my ($user) = getpwuid($uid);
  29. $prepend{'USER'} = $user if ($user);
  30. }
  31. $prepend{'GID'} = $gid;
  32. if ($gid >= 0) {
  33. my ($group) = getgrgid($gid);
  34. $prepend{'GROUP'} = $group if ($group);
  35. }
  36. }
  37. my $filename = $dirname.'cmdline';
  38. if (-r $filename && open(F, '<', $filename)) {
  39. $cmdline = join('', <F>);
  40. close(F);
  41. $cmdline =~ tr/\x00/ /;
  42. $cmdline =~ s/(^\s+|\s+$)//;
  43. if ($pid == $$) {
  44. $prepend{'DISPLAY'} = &display_normalize($ENV{'DISPLAY'}) if ($ENV{'DISPLAY'});
  45. } else {
  46. $filename = $dirname.'environ';
  47. if (-r $filename && open(F, '<', $filename)) {
  48. my $env = join('', <F>);
  49. close(F);
  50. foreach my $var (split(/\x00/, $env)) {
  51. my @tmp = split(/=/, $var);
  52. my $name = shift(@tmp);
  53. my $value = join('=', @tmp);
  54. $prepend{$name} = &display_normalize($value) if ($name eq 'DISPLAY');
  55. }
  56. }
  57. }
  58. }
  59. if ($cmdline) {
  60. $cmdline = sprintf('U=%d:%s/G=%d:%s/D=%s#%s',
  61. $prepend{'UID'} || 0,
  62. $prepend{'USER'} || '',
  63. $prepend{'GID'} || 0,
  64. $prepend{'GROUP'} || '',
  65. $prepend{'DISPLAY'} || '',
  66. $cmdline || ''
  67. );
  68. }
  69. #$cmdline = join(' ', map({ sprintf('%s=%s', $_, $prepend{$_}); } sort(keys(%prepend))), $cmdline) if ($cmdline);
  70. }
  71. return $cmdline;
  72. }
  73.  
  74. sub is_running {
  75. my $my_cmdline = &get_cmdline($$);
  76. foreach my $d (</proc/*>) {
  77. (-d $d) or next;
  78. my $pid = -1;
  79. $pid = int($1) if ($d =~ m{/(\d+)(/|$)});
  80. next if ($pid <= 0 || $pid == $$);
  81. my $cmdline = &get_cmdline($pid);
  82. next unless ($cmdline);
  83. return 1 if ($cmdline eq $my_cmdline);
  84. }
  85. return 0;
  86. }
  87. &is_running($0) and die("Applet is already running!\n");
  88.  
  89. my $sysfs = '';
  90. open(F, '</proc/mounts') || die $!;
  91. while (<F>) {
  92. last if ($sysfs);
  93. chomp();
  94. my ($dev, $mntpt, $type, $opts, $n1, $n2) = split(/\s+/);
  95. $sysfs = $mntpt if ($type eq 'sysfs');
  96. }
  97. close(F);
  98. my @sensors = ();
  99. if ($sysfs) {
  100. foreach my $d (<$sysfs/bus/i2c/devices/*>) {
  101. (-d $d) or next;
  102. foreach my $f (<$d/temp*_input>) {
  103. (-r $f) or next;
  104. $f =~ m{^/.*/temp(\d+)_input$};
  105. ($1 == 2) or next; # FIXME: use sensor #2 (works for me...)
  106. push(@sensors, [ $f, sub {
  107. my $fh = shift();
  108. my $ret = <$fh> || '';
  109. chomp($ret);
  110. return int($ret) / 1000;
  111. } ]) if ($1);
  112. }
  113. }
  114. }
  115. unless (@sensors) {
  116. foreach my $d (</proc/acpi/thermal_zone/*>) {
  117. (-d $d) or next;
  118. foreach my $f (<$d/temperature>) {
  119. (-r $f) or next;
  120. push(@sensors, [ $f, sub {
  121. my $fh = shift();
  122. my $ln = <$fh> || '';
  123. $ln = ($ln =~ m{^temperature:\s*(\d+)}) ? $1 : -1;
  124. return int($ln);
  125. } ]);
  126. }
  127. }
  128. }
  129. die("Can't find any temperature sensors!\n") unless (@sensors);
  130.  
  131. sub lm_get_temp {
  132. my @temps = ();
  133. foreach (@sensors) {
  134. open(F, '<', $_->[0]) || die $!;
  135. my $temp = undef;
  136. if ($_->[1]) {
  137. $temp = $_->[1](\*F);
  138. } else {
  139. $temp = <F>;
  140. }
  141. close(F);
  142. push(@temps, $temp);
  143. }
  144. return wantarray() ? @temps : shift(@temps);
  145. }
  146.  
  147. use Gtk2;
  148. use Gtk2::TrayIcon;
  149. my ($icon, $eventbox, $img, $tt, $timeout) = (undef, undef, undef, undef, undef);
  150.  
  151. my %nums = (
  152. '-w' => 6,
  153. '-h' => 15,
  154. '0' => [
  155. ' oooo ',
  156. 'o oo o',
  157. 'oo oo',
  158. 'oo oo',
  159. 'oo oo',
  160. 'oo oo',
  161. 'o o',
  162. ' ',
  163. 'o o',
  164. 'oo oo',
  165. 'oo oo',
  166. 'oo oo',
  167. 'oo oo',
  168. 'o oo o',
  169. ' oooo '
  170. ],
  171. '1' => [
  172. ' ',
  173. ' o',
  174. ' oo',
  175. ' oo',
  176. ' oo',
  177. ' oo',
  178. ' o',
  179. ' ',
  180. ' o',
  181. ' oo',
  182. ' oo',
  183. ' oo',
  184. ' oo',
  185. ' o',
  186. ' '
  187. ],
  188. '2' => [
  189. ' oooo ',
  190. ' oo o',
  191. ' oo',
  192. ' oo',
  193. ' oo',
  194. ' oo',
  195. ' oo o',
  196. ' oooo ',
  197. 'o oo ',
  198. 'oo ',
  199. 'oo ',
  200. 'oo ',
  201. 'oo ',
  202. 'o oo ',
  203. ' oooo '
  204. ],
  205. '3' => [
  206. ' oooo ',
  207. ' oo o',
  208. ' oo',
  209. ' oo',
  210. ' oo',
  211. ' oo',
  212. ' oo o',
  213. ' oooo ',
  214. ' oo o',
  215. ' oo',
  216. ' oo',
  217. ' oo',
  218. ' oo',
  219. ' oo o',
  220. ' oooo '
  221. ],
  222. '4' => [
  223. ' ',
  224. 'o o',
  225. 'oo oo',
  226. 'oo oo',
  227. 'oo oo',
  228. 'oo oo',
  229. 'o oo o',
  230. ' oooo ',
  231. ' oo o',
  232. ' oo',
  233. ' oo',
  234. ' oo',
  235. ' oo',
  236. ' o',
  237. ' '
  238. ],
  239. '5' => [
  240. ' oooo ',
  241. 'o oo ',
  242. 'oo ',
  243. 'oo ',
  244. 'oo ',
  245. 'oo ',
  246. 'o oo ',
  247. ' oooo ',
  248. ' oo o',
  249. ' oo',
  250. ' oo',
  251. ' oo',
  252. ' oo',
  253. ' oo o',
  254. ' oooo '
  255. ],
  256. '6' => [
  257. ' oooo ',
  258. 'o oo ',
  259. 'oo ',
  260. 'oo ',
  261. 'oo ',
  262. 'oo ',
  263. 'o oo ',
  264. ' oooo ',
  265. 'o oo o',
  266. 'oo oo',
  267. 'oo oo',
  268. 'oo oo',
  269. 'oo oo',
  270. 'o oo o',
  271. ' oooo '
  272. ],
  273. '7' => [
  274. ' oooo ',
  275. ' oo o',
  276. ' oo',
  277. ' oo',
  278. ' oo',
  279. ' oo',
  280. ' o',
  281. ' ',
  282. ' o',
  283. ' oo',
  284. ' oo',
  285. ' oo',
  286. ' oo',
  287. ' o',
  288. ' '
  289. ],
  290. '8' => [
  291. ' oooo ',
  292. 'o oo o',
  293. 'oo oo',
  294. 'oo oo',
  295. 'oo oo',
  296. 'oo oo',
  297. 'o oo o',
  298. ' oooo ',
  299. 'o oo o',
  300. 'oo oo',
  301. 'oo oo',
  302. 'oo oo',
  303. 'oo oo',
  304. 'o oo o',
  305. ' oooo '
  306. ],
  307. '9' => [
  308. ' oooo ',
  309. 'o oo o',
  310. 'oo oo',
  311. 'oo oo',
  312. 'oo oo',
  313. 'oo oo',
  314. 'o oo o',
  315. ' oooo ',
  316. ' oo o',
  317. ' oo',
  318. ' oo',
  319. ' oo',
  320. ' oo',
  321. ' oo o',
  322. ' oooo '
  323. ],
  324. '-deg' => [
  325. ' oo ',
  326. 'o o',
  327. 'o o',
  328. ' oo ',
  329. ' ',
  330. ' ',
  331. ' ',
  332. ' ',
  333. ' ',
  334. ' ',
  335. ' ',
  336. ' ',
  337. ' ',
  338. ' '
  339. ]
  340. );
  341.  
  342. my $old_temp = 0;
  343. sub icon_refresh {
  344. my $val = int(shift() || 0);
  345. return if ($old_temp == $val);
  346. $old_temp = $val;
  347. my $w = 24;
  348. my $h = 24;
  349. my ($i, $j, $k) = (0, 0, 0);
  350. my $pixbuf = $img->get_pixbuf();
  351. my @data = (
  352. sprintf('%d %d 4 1', $w, $h),
  353. '# c None',
  354. ' c '.COLOR_BG,
  355. 'o c '.COLOR_FG,
  356. '. c '.COLOR_BORDER
  357. );
  358. push(@data, '#' x $w);
  359. push(@data, '##'.('.' x ($w - 4)).'##');
  360. $j++;
  361. my $h_top = int(($h - $nums{'-h'}) / 2 + 0.5);
  362. while ($j <= $h_top - 2) {
  363. push(@data, '#.'.(' ' x ($w - 4)).'.#');
  364. $j++;
  365. }
  366. my @nums = split(//, int($val)."");
  367. my $w_left = int(($w - ($nums{'-w'} * (scalar(@nums) - 1) + (scalar(@nums) - 1))) / 2) - length($nums{'-deg'}->[0]) - 1;
  368. push(@nums, '-deg');
  369. $k = 0;
  370. while ($k < $nums{'-h'}) {
  371. my $ln = '#.'.(' ' x ($w_left - 2));
  372. foreach (@nums) {
  373. $ln .= $nums{$_}->[$k] || (' ' x ($nums{'-w'} - 2));
  374. $ln .= ' ';
  375. }
  376. $k++;
  377. $ln .= (' ' x ($w - length($ln) - 2)).'.#';
  378. push(@data, $ln);
  379. $j++;
  380. }
  381. while ($j < $h - 3) {
  382. push(@data, '#.'.(' ' x ($w - 4)).'.#');
  383. $j++;
  384. }
  385. push(@data, '##'.('.' x ($w - 4)).'##');
  386. push(@data, '#' x $w);
  387. my $tmp = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@data);
  388. $img->set_from_pixbuf($tmp);
  389. $tt->set_tip($eventbox, sprintf('CPU temperature: %.01f%sC', $val, chr(176)));
  390. }
  391.  
  392. Gtk2->init();
  393. $icon = Gtk2::TrayIcon->new("TempSensor_Applet");
  394. $eventbox = Gtk2::EventBox->new();
  395. $img = Gtk2::Image->new();
  396. $eventbox->add($img);
  397. $icon->add($eventbox);
  398. $tt = Gtk2::Tooltips->new();
  399. &icon_refresh(&lm_get_temp());
  400. $timeout = Glib::Timeout->add(1500, sub {
  401. &icon_refresh(&lm_get_temp());
  402. 1;
  403. });
  404. $icon->show_all();
  405. Gtk2->main();
  406. exit $?;
Advertisement
Add Comment
Please, Sign In to add comment