commit 25bf99d2e0ac7ee168dfc9c959d382edfaa76bf4 from: Omar Polo date: Tue May 22 20:42:43 2018 UTC Finally fixed vertical align with Xft (plus minor improvements) commit - 98747750388ce9b0dbfba565165865d12699817f commit + 25bf99d2e0ac7ee168dfc9c959d382edfaa76bf4 blob - 086bfb8e7d43b6fb5f61ee6c887fb73cf6ab86ec blob + 6b9b264772efa3e36f62d7a16334ea8d88b721ac --- mymenu.c +++ mymenu.c @@ -324,13 +324,18 @@ int readlines (char ***lns, int items) { return items; } +// Compute the dimension of the string str once rendered, return the +// width and save the width and the height in ret_width and ret_height int text_extents(char *str, int len, struct rendering *r, int *ret_width, int *ret_height) { int height; int width; #ifdef USE_XFT XGlyphInfo gi; XftTextExtentsUtf8(r->d, r->font, str, len, &gi); - height = (r->font->ascent - r->font->descent)/2; + // Honestly I don't know why this won't work, but I found that this + // formula seems to work with various ttf font + /* height = gi.height; */ + height = (gi.height + (r->font->ascent - r->font->descent)/2) / 2; width = gi.width - gi.x; #else XRectangle rect; @@ -343,6 +348,7 @@ int text_extents(char *str, int len, struct rendering return width; } +// Draw the string str void draw_string(char *str, int len, int x, int y, struct rendering *r, enum text_type tt) { #ifdef USE_XFT XftColor xftcolor; @@ -360,6 +366,7 @@ void draw_string(char *str, int len, int x, int y, str #endif } +// Duplicate the string str and substitute every space with a 'n' char *strdupn(char *str) { int len = strlen(str); @@ -571,16 +578,16 @@ void release_keyboard(Display *d) { XUngrabKeyboard(d, CurrentTime); } -int parse_integer(const char *str, int default_value, int max) { - int len = strlen(str); - if (len > 0 && str[len-1] == '%') { - char *cpy = strdup(str); - check_allocation(cpy); - cpy[len-1] = '\0'; - int val = parse_integer(cpy, default_value, max); - free(cpy); - return val * max / 100; - } +int parse_integer(const char *str, int default_value) { + /* int len = strlen(str); */ + /* if (len > 0 && str[len-1] == '%') { */ + /* char *cpy = strdup(str); */ + /* check_allocation(cpy); */ + /* cpy[len-1] = '\0'; */ + /* int val = parse_integer(cpy, default_value, max); */ + /* free(cpy); */ + /* return val * max / 100; */ + /* } */ errno = 0; char *ep; @@ -595,13 +602,27 @@ int parse_integer(const char *str, int default_value, return default_value; } return lval; +} + +int parse_int_with_percentage(const char *str, int default_value, int max) { + int len = strlen(str); + if (len > 0 && str[len-1] == '%') { + char *cpy = strdup(str); + check_allocation(cpy); + cpy[len-1] = '\0'; + int val = parse_integer(cpy, default_value); + free(cpy); + return val * max / 100; + } + fprintf(stderr, "%s isn't a valid number/percentage\n", str); + return default_value; } int parse_int_with_middle(const char *str, int default_value, int max, int self) { if (!strcmp(str, "middle")) { return (max - self)/2; } - return parse_integer(str, default_value, max); + return parse_int_with_percentage(str, default_value, max); } int main() { @@ -730,12 +751,12 @@ int main() { fprintf(stderr, "no prompt defined, using \"%s\" as default\n", ps1); if (XrmGetResource(xdb, "MyMenu.width", "*", datatype, &value) == true) - width = parse_integer(value.addr, width, d_width); + width = parse_int_with_percentage(value.addr, width, d_width); else fprintf(stderr, "no width defined, using %d\n", width); if (XrmGetResource(xdb, "MyMenu.height", "*", datatype, &value) == true) - height = parse_integer(value.addr, height, d_height); + height = parse_int_with_percentage(value.addr, height, d_height); else fprintf(stderr, "no height defined, using %d\n", height);