My slstatus configuration
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

303 Zeilen
6.7 KiB

  1. /* See LICENSE file for copyright and license details. */
  2. #include <alsa/asoundlib.h>
  3. #include <stdarg.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #include <unistd.h>
  9. #include <X11/Xlib.h>
  10. #include "config.h"
  11. char *smprintf(char *fmt, ...);
  12. void *setstatus(char *str);
  13. char *wifi_signal();
  14. char *battery();
  15. char *cpu_usage();
  16. char *cpu_temperature();
  17. char *ram_usage();
  18. char *volume();
  19. char *datetime();
  20. static Display *dpy;
  21. /* smprintf function */
  22. char *
  23. smprintf(char *fmt, ...)
  24. {
  25. va_list fmtargs;
  26. char *ret;
  27. int len;
  28. va_start(fmtargs, fmt);
  29. len = vsnprintf(NULL, 0, fmt, fmtargs);
  30. va_end(fmtargs);
  31. ret = malloc(++len);
  32. if (ret == NULL) {
  33. fprintf(stderr, "Malloc error.");
  34. exit(1);
  35. }
  36. va_start(fmtargs, fmt);
  37. vsnprintf(ret, len, fmt, fmtargs);
  38. va_end(fmtargs);
  39. return ret;
  40. }
  41. /* set statusbar (WM_NAME) */
  42. void
  43. setstatus(char *str)
  44. {
  45. XStoreName(dpy, DefaultRootWindow(dpy), str);
  46. XSync(dpy, False);
  47. }
  48. /* alsa volume percentage */
  49. char *
  50. volume()
  51. {
  52. int mute = 0;
  53. long vol = 0, max = 0, min = 0;
  54. snd_mixer_t *handle;
  55. snd_mixer_elem_t *pcm_mixer, *mas_mixer;
  56. snd_mixer_selem_id_t *vol_info, *mute_info;
  57. snd_mixer_open(&handle, 0);
  58. snd_mixer_attach(handle, soundcard);
  59. snd_mixer_selem_register(handle, NULL, NULL);
  60. snd_mixer_load(handle);
  61. snd_mixer_selem_id_malloc(&vol_info);
  62. snd_mixer_selem_id_malloc(&mute_info);
  63. snd_mixer_selem_id_set_name(vol_info, channel);
  64. snd_mixer_selem_id_set_name(mute_info, channel);
  65. pcm_mixer = snd_mixer_find_selem(handle, vol_info);
  66. mas_mixer = snd_mixer_find_selem(handle, mute_info);
  67. snd_mixer_selem_get_playback_volume_range((snd_mixer_elem_t *)pcm_mixer,
  68. &min, &max);
  69. snd_mixer_selem_get_playback_volume((snd_mixer_elem_t *)pcm_mixer,
  70. SND_MIXER_SCHN_MONO, &vol);
  71. snd_mixer_selem_get_playback_switch(mas_mixer, SND_MIXER_SCHN_MONO,
  72. &mute);
  73. if (vol_info)
  74. snd_mixer_selem_id_free(vol_info);
  75. if (mute_info)
  76. snd_mixer_selem_id_free(mute_info);
  77. if (handle)
  78. snd_mixer_close(handle);
  79. if (!mute)
  80. return "mute";
  81. else
  82. return smprintf("%d%%", (vol * 100) / max);
  83. }
  84. /* cpu temperature */
  85. char *
  86. cpu_temperature()
  87. {
  88. int temperature;
  89. FILE *fp;
  90. /* open temperature file */
  91. if (!(fp = fopen(tempfile, "r"))) {
  92. fprintf(stderr, "Could not open temperature file.\n");
  93. exit(1);
  94. }
  95. /* extract temperature, close file */
  96. fscanf(fp, "%d", &temperature);
  97. fclose(fp);
  98. /* return temperature in degrees */
  99. return smprintf("%d°C", temperature / 1000);
  100. }
  101. /* wifi percentage */
  102. char *
  103. wifi_signal()
  104. {
  105. int bufsize = 255;
  106. int strength;
  107. char buf[bufsize];
  108. char *datastart;
  109. char path_start[16] = "/sys/class/net/";
  110. char path_end[11] = "/operstate";
  111. char path[32];
  112. FILE *fp;
  113. /* generate the path name */
  114. strcat(path, path_start);
  115. strcat(path, wificard);
  116. strcat(path, path_end);
  117. /* open wifi file, extract status, close file */
  118. if(!(fp = fopen(path, "r"))) {
  119. fprintf(stderr, "Error opening wifi operstate file.");
  120. exit(1);
  121. }
  122. char status[5];
  123. fgets(status, 5, fp);
  124. fclose(fp);
  125. /* check if interface down */
  126. if(strcmp(status, "up\n") != 0){
  127. return "n/a";
  128. }
  129. /* open wifi file */
  130. if (!(fp = fopen("/proc/net/wireless", "r"))) {
  131. fprintf(stderr, "Error opening wireless file.");
  132. exit(1);
  133. }
  134. /* extract the signal strength and close the file */
  135. fgets(buf, bufsize, fp);
  136. fgets(buf, bufsize, fp);
  137. fgets(buf, bufsize, fp);
  138. if ((datastart = strstr(buf, "wlp3s0:")) != NULL) {
  139. datastart = strstr(buf, ":");
  140. sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d",
  141. &strength);
  142. }
  143. fclose(fp);
  144. /* return strength in percent */
  145. return smprintf("%d%%", strength);
  146. }
  147. /* battery percentage */
  148. char *
  149. battery()
  150. {
  151. int batt_now;
  152. int batt_full;
  153. int batt_perc;
  154. FILE *fp;
  155. /* open battery now file, extract and close */
  156. if (!(fp = fopen(batterynowfile, "r"))) {
  157. fprintf(stderr, "Error opening battery file.");
  158. exit(1);
  159. }
  160. fscanf(fp, "%i", &batt_now);
  161. fclose(fp);
  162. /* extract battery full file, extract and close */
  163. if (!(fp = fopen(batteryfullfile, "r"))) {
  164. fprintf(stderr, "Error opening battery file.");
  165. exit(1);
  166. }
  167. fscanf(fp, "%i", &batt_full);
  168. fclose(fp);
  169. /* calculate percent */
  170. batt_perc = batt_now / (batt_full / 100);
  171. /* return percent */
  172. return smprintf("%d%%", batt_perc);
  173. }
  174. /* date and time */
  175. char *
  176. datetime()
  177. {
  178. time_t tm;
  179. size_t bufsize = 19;
  180. char *buf = malloc(bufsize);
  181. /* get time in format */
  182. time(&tm);
  183. if(!strftime(buf, bufsize, timeformat, localtime(&tm))) {
  184. fprintf(stderr, "Strftime failed.\n");
  185. exit(1);
  186. }
  187. /* return time */
  188. return buf;
  189. }
  190. /* cpu percentage */
  191. char *
  192. cpu_usage()
  193. {
  194. FILE *fp;
  195. long double a[4], b[4], cpu_perc;
  196. /* open stat file, read and close, do same after 1 second */
  197. if (!(fp = fopen("/proc/stat","r"))) {
  198. fprintf(stderr, "Error opening stat file.");
  199. exit(1);
  200. }
  201. fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]);
  202. fclose(fp);
  203. sleep(1);
  204. if (!(fp = fopen("/proc/stat","r"))) {
  205. fprintf(stderr, "Error opening stat file.");
  206. exit(1);
  207. }
  208. fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]);
  209. fclose(fp);
  210. /* calculate average in 1 second */
  211. cpu_perc = 100 * ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
  212. /* return avg cpu percentage */
  213. return smprintf("%d%%", (int)cpu_perc);
  214. }
  215. /* ram percentage */
  216. char *
  217. ram_usage()
  218. {
  219. FILE *fp;
  220. long total, free, available;
  221. int ram_perc;
  222. /* read meminfo file, extract and close */
  223. if (!(fp = fopen("/proc/meminfo", "r"))) {
  224. fprintf(stderr, "Error opening meminfo file.");
  225. exit(1);
  226. }
  227. fscanf(fp, "MemTotal: %ld kB\n", &total);
  228. fscanf(fp, "MemFree: %ld kB\n", &free);
  229. fscanf(fp, "MemAvailable: %ld kB\n", &available);
  230. fclose(fp);
  231. /* calculate percentage */
  232. ram_perc = 100 * (total - available) / total;
  233. /* return in percent */
  234. return smprintf("%d%%",ram_perc);
  235. }
  236. int
  237. main()
  238. {
  239. char status[1024];
  240. /* open display */
  241. if (( dpy = XOpenDisplay(0x0)) == NULL ) {
  242. fprintf(stderr, "Cannot open display!\n");
  243. exit(1);
  244. }
  245. /* return status every second */
  246. for (;;) {
  247. sprintf(status, FORMATSTRING, ARGUMENTS);
  248. setstatus(status);
  249. }
  250. /* close display */
  251. XCloseDisplay(dpy);
  252. /* exit successfully */
  253. return 0;
  254. }