My slstatus configuration
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

slstatus.c 2.2 KiB

8 år sedan
8 år sedan
8 år sedan
8 år sedan
8 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* See LICENSE file for copyright and license details. */
  2. #include <err.h>
  3. #include <errno.h>
  4. #include <locale.h>
  5. #include <signal.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <X11/Xlib.h>
  11. #include "arg.h"
  12. #include "slstatus.h"
  13. #include "util.h"
  14. struct arg {
  15. const char *(*func)();
  16. const char *fmt;
  17. const char *args;
  18. };
  19. char *argv0;
  20. char buf[1024];
  21. static unsigned short int done;
  22. static Display *dpy;
  23. #include "config.h"
  24. static void
  25. terminate(const int signo)
  26. {
  27. (void)signo;
  28. done = 1;
  29. }
  30. static void
  31. difftimespec(struct timespec *res, struct timespec *a, struct timespec *b)
  32. {
  33. res->tv_sec = a->tv_sec - b->tv_sec - (a->tv_nsec < b->tv_nsec);
  34. res->tv_nsec = a->tv_nsec - b->tv_nsec +
  35. (a->tv_nsec < b->tv_nsec) * 1000000000;
  36. }
  37. static void
  38. usage(void)
  39. {
  40. fprintf(stderr, "usage: %s [-s]\n", argv0);
  41. exit(1);
  42. }
  43. int
  44. main(int argc, char *argv[])
  45. {
  46. struct sigaction act;
  47. struct timespec start, current, diff, intspec, wait;
  48. size_t i, len;
  49. int sflag = 0;
  50. char status[MAXLEN];
  51. ARGBEGIN {
  52. case 's':
  53. sflag = 1;
  54. break;
  55. default:
  56. usage();
  57. } ARGEND
  58. if (argc) {
  59. usage();
  60. }
  61. setlocale(LC_ALL, "");
  62. memset(&act, 0, sizeof(act));
  63. act.sa_handler = terminate;
  64. sigaction(SIGINT, &act, NULL);
  65. sigaction(SIGTERM, &act, NULL);
  66. if (!sflag && !(dpy = XOpenDisplay(NULL))) {
  67. fprintf(stderr, "slstatus: cannot open display");
  68. return 1;
  69. }
  70. while (!done) {
  71. clock_gettime(CLOCK_MONOTONIC, &start);
  72. status[0] = '\0';
  73. for (i = len = 0; i < LEN(args); i++) {
  74. len += snprintf(status + len, sizeof(status) - len,
  75. args[i].fmt, args[i].func(args[i].args));
  76. if (len >= sizeof(status)) {
  77. status[sizeof(status) - 1] = '\0';
  78. }
  79. }
  80. if (sflag) {
  81. printf("%s\n", status);
  82. } else {
  83. XStoreName(dpy, DefaultRootWindow(dpy), status);
  84. XSync(dpy, False);
  85. }
  86. if (!done) {
  87. clock_gettime(CLOCK_MONOTONIC, &current);
  88. difftimespec(&diff, &current, &start);
  89. intspec.tv_sec = interval / 1000;
  90. intspec.tv_nsec = (interval % 1000) * 1000000;
  91. difftimespec(&wait, &intspec, &diff);
  92. if (wait.tv_sec >= 0) {
  93. nanosleep(&wait, NULL);
  94. }
  95. }
  96. }
  97. if (!sflag) {
  98. XStoreName(dpy, DefaultRootWindow(dpy), NULL);
  99. XCloseDisplay(dpy);
  100. }
  101. return 0;
  102. }