Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477876
  • 博文数量: 55
  • 博客积分: 1867
  • 博客等级: 上尉
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-29 01:33
文章分类

全部博文(55)

文章存档

2013年(1)

2012年(2)

2011年(16)

2010年(11)

2009年(5)

2008年(10)

2007年(8)

2006年(2)

分类: BSD

2008-11-21 22:54:50

    一直都是用FVWM,而且是最简单的那种配置。各方面都很满意,就是在笔记本上不能知道电池状态是个遗憾,今天总算彻底解决了这个问题,解决问题的思路是调用sysctl读取电池装态。

$man 3 sysctl

还是看man就可以了:) 主要关注 sysctlbyname方法,对于电池状态,我只读取以下两项,
 
hw.acpi.battery.life
hw.acpi.battery.state

顺便把系统时钟也显示出来,以替换原来使用的xclock。




#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/sysctl.h>

void updateClock(int sig){

  int life, state;
  size_t len = sizeof(int);
  sysctlbyname("hw.acpi.battery.life",&life,&len,NULL,0);
  sysctlbyname("hw.acpi.battery.state",&state,&len,NULL,0);

  char* color;
  if(state != 1){
    // AC online

    color = "0;32m"; //

  }else{
    // Battery

    color = (life < 30) ? "0;41m" : "0;42m";
  }
  
  time_t now = time(NULL);
  printf("\x1b[0;0H\x1b[0;%s%3d\x1b[0m %s", color,life, ctime(&now));

}

int main(int argc, char** args){
  printf("\x1b[2J\x1b[0;0H"); // clear screen


  struct itimerval timer = {{1,0}, {1,0}};
  int err = setitimer(ITIMER_REAL, &timer, NULL);
  if(err < 0){
    printf("%d: %s\n",err,"Can not set itimer");
    return err;
  }

  signal(SIGALRM, updateClock);

  for(;;)pause();
}

阅读(1640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~