barM.c - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       barM.c (3133B)
       ---
            1 /*
            2  * Copyright (C) 2014,2015 levi0x0 with enhancements by ProgrammerNerd
            3  * 
            4  * barM (bar_monitor or BarMonitor) is free software; you can redistribute it and/or
            5  * modify it under the terms of the GNU General Public License
            6  * as published by the Free Software Foundation; either version 2
            7  * of the License, or (at your option) any later version.
            8  * 
            9  *  This is a new version of bar monitor, even less lines of code more effective.
           10  *
           11  *  Read main() to configure your new status Bar.
           12  *
           13  *  compile: gcc -o barM barM.c -O2 -s -lX11
           14  *  
           15  *  mv barM /usr/local/bin/
           16  */
           17 
           18 #include <stdio.h>
           19 #include <stdlib.h>
           20 #include <time.h>
           21 #include <string.h>
           22 #include <stdarg.h>
           23 #include <X11/Xlib.h>
           24 #include <sys/utsname.h>
           25 #include <sys/sysinfo.h>
           26 
           27 /*
           28  *  Put this in your .xinitrc file: 
           29  *
           30  *  barM&
           31  *  
           32  */
           33 
           34 #define VERSION "0.12"
           35 #define TIME_FORMAT "%H:%M) (%d-%m-%Y"
           36 #define MAXSTR  1024
           37 
           38 static const char * date(void);
           39 static const char * getuname(void);
           40 static const char * ram(void);
           41 static void XSetRoot(const char *name);
           42 /*Append here your functions.*/
           43 static const char*(*const functab[])(void)={
           44         ram,date
           45 };
           46 
           47 int main(void){
           48         char status[MAXSTR];
           49         /* It is foolish to repeatedly update uname. */
           50         int ret;
           51         {struct utsname u;
           52         if(uname(&u)){
           53                 perror("uname failed");
           54                 return 1;
           55         }
           56         ret=snprintf(status,sizeof(status),"(%s %s %s) ",u.sysname,u.nodename,u.release);}
           57         char*off=status+ret;
           58         if(off>=(status+MAXSTR)){
           59                 XSetRoot(status);
           60                 return 1;/*This should not happen*/
           61         }
           62         for(;;){
           63                 int left=sizeof(status)-ret,i;
           64                 char*sta=off;
           65                 for(i = 0; i<sizeof(functab)/sizeof(functab[0]); ++i ) {
           66                         int ret=snprintf(sta,left,"(%s) ",functab[i]());
           67                         sta+=ret;
           68                         left-=ret;
           69                         if(sta>=(status+MAXSTR))/*When snprintf has to resort to truncating a string it will return the length as if it were not truncated.*/
           70                                 break;
           71                 }
           72                 XSetRoot(status);
           73                 sleep(1);
           74         }
           75         return 0;
           76 }
           77 
           78 /* Returns the date*/
           79 static const char * date(void){
           80         static char date[MAXSTR];
           81         time_t now = time(0);
           82 
           83         strftime(date, MAXSTR, TIME_FORMAT, localtime(&now));
           84         return date;
           85 }
           86 /* Returns a string that contains the amount of free and available ram in megabytes*/
           87 static const char * ram(void){
           88         static char ram[MAXSTR];
           89         struct sysinfo s;
           90         sysinfo(&s);
           91         snprintf(ram,sizeof(ram),"%.1fM,%.1fM",((double)(s.totalram-s.freeram))/1048576.,((double)s.totalram)/1048576.);
           92         return ram;
           93 }
           94 
           95 static void XSetRoot(const char *name){
           96         Display *display;
           97 
           98         if (( display = XOpenDisplay(0x0)) == NULL ) {
           99                 fprintf(stderr, "[barM] cannot open display!\n");
          100                 exit(1);
          101         }
          102 
          103         XStoreName(display, DefaultRootWindow(display), name);
          104         XSync(display, 0);
          105 
          106         XCloseDisplay(display);
          107 }
          108