Text now respects right padding
authorSamuel Dudik <redacted>
Fri, 31 Jul 2020 16:58:35 +0000 (18:58 +0200)
committerSamuel Dudik <redacted>
Fri, 31 Jul 2020 16:58:35 +0000 (18:58 +0200)
config.h
herbe.c

index 862c2dbcb9628c734cd4d433081be8e8c43e528b..d28ce3aa8dbfc7489337d5faf7035057a1612341 100644 (file)
--- a/config.h
+++ b/config.h
@@ -2,7 +2,7 @@ const static char *background_color = "#3e3e3e";
 const static char *border_color = "#ececec";
 const static char *font_color = "#ececec";
 const static char *font_pattern = "Inconsolata:style=Medium:size=15";
-const static unsigned int padding = 20;
+const static unsigned int padding = 15;
 
 const static unsigned int width = 300;
 const static unsigned int border_size = 2;
diff --git a/herbe.c b/herbe.c
index 382bb368eaa7b5bbd2443aac3d82ac9017920cf1..3c65b5eed773132609222c1bc791de9c8d476029 100644 (file)
--- a/herbe.c
+++ b/herbe.c
 Display *display;
 Window window;
 
+int get_eol(char *body, XftFont *font)
+{
+       int body_len = strlen(body);
+       XGlyphInfo info;
+       XftTextExtentsUtf8(display, font, body, body_len, &info);
+
+       int max_text_width = width - 2 * padding;
+
+       if (info.width < max_text_width)
+               return body_len;
+
+       int eol = max_text_width / font->max_advance_width;
+       info.width = 0;
+
+       while (info.width < max_text_width)
+       {
+               eol++;
+               XftTextExtentsUtf8(display, font, body, eol, &info);
+       }
+
+       return --eol;
+}
+
 void expire()
 {
        XEvent event;
@@ -26,6 +49,8 @@ int main(int argc, char *argv[])
                exit(EXIT_FAILURE);
        }
 
+       char *body = argv[1];
+
        signal(SIGALRM, expire);
        alarm(duration);
 
@@ -84,6 +109,8 @@ int main(int argc, char *argv[])
 
        XMapWindow(display, window);
 
+       int eol = get_eol(body, font);
+
        XEvent event;
 
        while (1)
@@ -93,7 +120,7 @@ int main(int argc, char *argv[])
                if (event.type == Expose)
                {
                        XClearWindow(display, window);
-                       XftDrawStringUtf8(draw, &color, font, padding, height - padding, (XftChar8 *)argv[1], strlen(argv[1]));
+                       XftDrawStringUtf8(draw, &color, font, padding, height - padding, body, eol);
                }
                if (event.type == ButtonPress)
                        break;
@@ -105,4 +132,4 @@ int main(int argc, char *argv[])
 
        XCloseDisplay(display);
        return EXIT_SUCCESS;
-}
+}
\ No newline at end of file