My dmenu build
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

64 lines
1.5 KiB

  1. /* © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
  2. * © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
  3. * See LICENSE file for license details. */
  4. #include "dmenu.h"
  5. #include <string.h>
  6. /* extern */
  7. void
  8. drawtext(const char *text, unsigned long col[ColLast]) {
  9. int x, y, w, h;
  10. static char buf[256];
  11. unsigned int len, olen;
  12. XRectangle r = { dc.x, dc.y, dc.w, dc.h };
  13. XSetForeground(dpy, dc.gc, col[ColBG]);
  14. XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
  15. if(!text)
  16. return;
  17. w = 0;
  18. olen = len = strlen(text);
  19. if(len >= sizeof buf)
  20. len = sizeof buf - 1;
  21. memcpy(buf, text, len);
  22. buf[len] = 0;
  23. h = dc.font.ascent + dc.font.descent;
  24. y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
  25. x = dc.x + (h / 2);
  26. /* shorten text if necessary */
  27. while(len && (w = textnw(buf, len)) > dc.w - h)
  28. buf[--len] = 0;
  29. if(len < olen) {
  30. if(len > 1)
  31. buf[len - 1] = '.';
  32. if(len > 2)
  33. buf[len - 2] = '.';
  34. if(len > 3)
  35. buf[len - 3] = '.';
  36. }
  37. if(w > dc.w)
  38. return; /* too long */
  39. XSetForeground(dpy, dc.gc, col[ColFG]);
  40. if(dc.font.set)
  41. XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
  42. else
  43. XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
  44. }
  45. unsigned int
  46. textw(const char *text) {
  47. return textnw(text, strlen(text)) + dc.font.height;
  48. }
  49. unsigned int
  50. textnw(const char *text, unsigned int len) {
  51. XRectangle r;
  52. if(dc.font.set) {
  53. XmbTextExtents(dc.font.set, text, len, NULL, &r);
  54. return r.width;
  55. }
  56. return XTextWidth(dc.font.xfont, text, len);
  57. }