My slstatus configuration
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

133 linhas
2.4 KiB

  1. /* See LICENSE file for copyright and license details. */
  2. #include <errno.h>
  3. #include <locale.h>
  4. #include <signal.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <X11/Xlib.h>
  10. #include "arg.h"
  11. #include "slstatus.h"
  12. #include "util.h"
  13. struct arg {
  14. const char *(*func)();
  15. const char *fmt;
  16. const char *args;
  17. };
  18. char *argv0;
  19. char buf[1024];
  20. static int done;
  21. static Display *dpy;
  22. #include "config.h"
  23. static void
  24. terminate(const int signo)
  25. {
  26. (void)signo;
  27. done = 1;
  28. }
  29. static void
  30. difftimespec(struct timespec *res, struct timespec *a, struct timespec *b)
  31. {
  32. res->tv_sec = a->tv_sec - b->tv_sec - (a->tv_nsec < b->tv_nsec);
  33. res->tv_nsec = a->tv_nsec - b->tv_nsec +
  34. (a->tv_nsec < b->tv_nsec) * 1000000000;
  35. }
  36. static void
  37. usage(void)
  38. {
  39. fprintf(stderr, "usage: %s [-s]\n", argv0);
  40. exit(1);
  41. }
  42. int
  43. main(int argc, char *argv[])
  44. {
  45. struct sigaction act;
  46. struct timespec start, current, diff, intspec, wait;
  47. size_t i, len;
  48. int sflag, ret;
  49. char status[MAXLEN];
  50. sflag = 0;
  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, "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. const char * res = args[i].func(args[i].args);
  75. res = (res == NULL) ? unknown_str : res;
  76. if ((ret = snprintf(status + len, sizeof(status) - len,
  77. args[i].fmt, res)) < 0) {
  78. fprintf(stderr, "snprintf: %s\n",
  79. strerror(errno));
  80. break;
  81. } else if ((size_t)ret >= sizeof(status) - len) {
  82. fprintf(stderr, "snprintf: Output truncated\n");
  83. break;
  84. }
  85. len += ret;
  86. }
  87. if (sflag) {
  88. printf("%s\n", status);
  89. fflush(stdout);
  90. } else {
  91. XStoreName(dpy, DefaultRootWindow(dpy), status);
  92. XSync(dpy, False);
  93. }
  94. if (!done) {
  95. clock_gettime(CLOCK_MONOTONIC, &current);
  96. difftimespec(&diff, &current, &start);
  97. intspec.tv_sec = interval / 1000;
  98. intspec.tv_nsec = (interval % 1000) * 1000000;
  99. difftimespec(&wait, &intspec, &diff);
  100. if (wait.tv_sec >= 0) {
  101. nanosleep(&wait, NULL);
  102. }
  103. }
  104. }
  105. if (!sflag) {
  106. XStoreName(dpy, DefaultRootWindow(dpy), NULL);
  107. XCloseDisplay(dpy);
  108. }
  109. return 0;
  110. }