Merge remote-tracking branch 'upstream/master' into xft-port
* upstream/master: Update the usage text Minor change to -f handling travis: Run a apt-get update before installing the needed packages Use the maximum width reported by the font if the attributes table isn't found
This commit is contained in:
commit
a707113b55
|
@ -3,5 +3,6 @@ compiler:
|
||||||
- clang
|
- clang
|
||||||
- gcc
|
- gcc
|
||||||
before_install:
|
before_install:
|
||||||
- sudo apt-get install -qq libx11-xcb-dev libxcb-randr0-dev libxcb-xinerama0-dev
|
- sudo apt-get update -qq
|
||||||
|
- sudo apt-get install -y libx11-xcb-dev libxcb-randr0-dev libxcb-xinerama0-dev
|
||||||
script: make
|
script: make
|
||||||
|
|
|
@ -34,7 +34,8 @@ Force docking without asking the window manager. This is needed if the window ma
|
||||||
|
|
||||||
=item B<-f> I<font>
|
=item B<-f> I<font>
|
||||||
|
|
||||||
Comma separated list of fonts, lemonbar supports a maximum of five fonts (the limit can be tweaked by changing the MAX_FONT_COUNT parameter in the source).
|
Define the font to load into one of the five slots (the number of slots is hardcoded and can be tweaked by
|
||||||
|
changing the MAX_FONT_COUNT parameter in the source code).
|
||||||
|
|
||||||
=item B<-p>
|
=item B<-p>
|
||||||
|
|
||||||
|
|
99
lemonbar.c
99
lemonbar.c
|
@ -32,7 +32,7 @@ typedef struct font_t {
|
||||||
|
|
||||||
int ascent;
|
int ascent;
|
||||||
|
|
||||||
int descent, height;
|
int descent, height, width;
|
||||||
uint16_t char_max;
|
uint16_t char_max;
|
||||||
uint16_t char_min;
|
uint16_t char_min;
|
||||||
} font_t;
|
} font_t;
|
||||||
|
@ -211,6 +211,7 @@ xcb_void_cookie_t xcb_poly_text_16_simple(xcb_connection_t * c,
|
||||||
xcb_parts[6].iov_len = -(xcb_parts[4].iov_len + xcb_parts[5].iov_len) & 3;
|
xcb_parts[6].iov_len = -(xcb_parts[4].iov_len + xcb_parts[5].iov_len) & 3;
|
||||||
|
|
||||||
xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
|
xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
|
||||||
|
|
||||||
return xcb_ret;
|
return xcb_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,7 +253,9 @@ draw_char (monitor_t *mon, font_t *cur_font, int x, int align, uint16_t ch)
|
||||||
if (cur_font->xft_ft) {
|
if (cur_font->xft_ft) {
|
||||||
ch_width = xft_char_width(ch, cur_font);
|
ch_width = xft_char_width(ch, cur_font);
|
||||||
} else {
|
} else {
|
||||||
ch_width = cur_font->width_lut[ch - cur_font->char_min].character_width;
|
ch_width = (cur_font->width_lut) ?
|
||||||
|
cur_font->width_lut[ch - cur_font->char_min].character_width:
|
||||||
|
cur_font->width;
|
||||||
}
|
}
|
||||||
switch (align) {
|
switch (align) {
|
||||||
case ALIGN_C:
|
case ALIGN_C:
|
||||||
|
@ -509,13 +512,22 @@ area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x
|
||||||
bool
|
bool
|
||||||
font_has_glyph (font_t *font, const uint16_t c)
|
font_has_glyph (font_t *font, const uint16_t c)
|
||||||
{
|
{
|
||||||
return ((font->ptr &&
|
if (font->xft_ft) {
|
||||||
c >= font->char_min &&
|
if (XftCharExists(dpy, font->xft_ft, (FcChar32) c)) {
|
||||||
c <= font->char_max &&
|
return true;
|
||||||
font->width_lut &&
|
} else {
|
||||||
font->width_lut[c - font->char_min].character_width) ||
|
return false;
|
||||||
(font->xft_ft && XftCharExists(dpy, font->xft_ft, (FcChar32) c))
|
}
|
||||||
);
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c < font->char_min || c > font->char_max)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (font->width_lut && font->width_lut[c - font->char_min].character_width == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
font_t *
|
font_t *
|
||||||
|
@ -694,8 +706,8 @@ parse (char *text)
|
||||||
XftDrawDestroy (xft_draw);
|
XftDrawDestroy (xft_draw);
|
||||||
}
|
}
|
||||||
|
|
||||||
font_t *
|
void
|
||||||
font_load (const char *str)
|
font_load (const char *pattern)
|
||||||
{
|
{
|
||||||
xcb_query_font_cookie_t queryreq;
|
xcb_query_font_cookie_t queryreq;
|
||||||
xcb_query_font_reply_t *font_info;
|
xcb_query_font_reply_t *font_info;
|
||||||
|
@ -707,9 +719,9 @@ font_load (const char *str)
|
||||||
font_t *ret = calloc(1, sizeof(font_t));
|
font_t *ret = calloc(1, sizeof(font_t));
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return NULL;
|
return;
|
||||||
|
|
||||||
cookie = xcb_open_font_checked(c, font, strlen(str), str);
|
cookie = xcb_open_font_checked(c, font, strlen(pattern), pattern);
|
||||||
if (!xcb_request_check (c, cookie)) {
|
if (!xcb_request_check (c, cookie)) {
|
||||||
queryreq = xcb_query_font(c, font);
|
queryreq = xcb_query_font(c, font);
|
||||||
font_info = xcb_query_font_reply(c, queryreq, NULL);
|
font_info = xcb_query_font_reply(c, queryreq, NULL);
|
||||||
|
@ -718,6 +730,7 @@ font_load (const char *str)
|
||||||
ret->ptr = font;
|
ret->ptr = font;
|
||||||
ret->descent = font_info->font_descent;
|
ret->descent = font_info->font_descent;
|
||||||
ret->height = font_info->font_ascent + font_info->font_descent;
|
ret->height = font_info->font_ascent + font_info->font_descent;
|
||||||
|
ret->width = font_info->max_bounds.character_width;
|
||||||
ret->char_max = font_info->max_byte1 << 8 | font_info->max_char_or_byte2;
|
ret->char_max = font_info->max_byte1 << 8 | font_info->max_char_or_byte2;
|
||||||
ret->char_min = font_info->min_byte1 << 8 | font_info->min_char_or_byte2;
|
ret->char_min = font_info->min_byte1 << 8 | font_info->min_char_or_byte2;
|
||||||
// Copy over the width lut as it's part of font_info
|
// Copy over the width lut as it's part of font_info
|
||||||
|
@ -726,18 +739,18 @@ font_load (const char *str)
|
||||||
ret->width_lut = malloc(lut_size);
|
ret->width_lut = malloc(lut_size);
|
||||||
memcpy(ret->width_lut, xcb_query_font_char_infos(font_info), lut_size);
|
memcpy(ret->width_lut, xcb_query_font_char_infos(font_info), lut_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(font_info);
|
free(font_info);
|
||||||
} else if ((ret->xft_ft = XftFontOpenName (dpy, scr_nbr, str))) {
|
} else if ((ret->xft_ft = XftFontOpenName (dpy, scr_nbr, pattern))) {
|
||||||
ret->ptr = 0;
|
ret->ptr = 0;
|
||||||
ret->ascent = ret->xft_ft->ascent;
|
ret->ascent = ret->xft_ft->ascent;
|
||||||
ret->descent = ret->xft_ft->descent;
|
ret->descent = ret->xft_ft->descent;
|
||||||
ret->height = ret->ascent + ret->descent;
|
ret->height = ret->ascent + ret->descent;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Could not load font %s\n", str);
|
fprintf(stderr, "Could not load font %s\n", pattern);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
font_list[font_count++] = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -1124,48 +1137,6 @@ parse_geometry_string (char *str, int *tmp)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
parse_font_list (char *str)
|
|
||||||
{
|
|
||||||
char *tok, *end;
|
|
||||||
|
|
||||||
if (!str)
|
|
||||||
return;
|
|
||||||
|
|
||||||
tok = strtok(str, ",");
|
|
||||||
|
|
||||||
while (tok) {
|
|
||||||
if (font_count > MAX_FONT_COUNT - 1) {
|
|
||||||
fprintf(stderr, "Too many fonts; maximum %i\n", MAX_FONT_COUNT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip the leading and trailing whitespaces
|
|
||||||
while (isspace(*tok) || iscntrl(*tok))
|
|
||||||
tok++;
|
|
||||||
|
|
||||||
end = tok + strlen(tok) - 1;
|
|
||||||
|
|
||||||
while ((end > tok && isspace(*end)) || iscntrl(*end))
|
|
||||||
end--;
|
|
||||||
|
|
||||||
*(end + 1) = '\0';
|
|
||||||
|
|
||||||
if (tok[0]) {
|
|
||||||
// Load the selected font
|
|
||||||
font_t *font = font_load(tok);
|
|
||||||
if (font)
|
|
||||||
font_list[font_count++] = font;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fprintf(stderr, "Empty font name, skipping...\n");
|
|
||||||
|
|
||||||
tok = strtok(NULL, ",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
xconn (void)
|
xconn (void)
|
||||||
{
|
{
|
||||||
|
@ -1197,13 +1168,9 @@ xconn (void)
|
||||||
void
|
void
|
||||||
init (void)
|
init (void)
|
||||||
{
|
{
|
||||||
// This has to be declared as an array because otherwise the compiler would turn it into a const
|
|
||||||
// string, making strtok choke very hard on this
|
|
||||||
char fallback_font[] = "fixed";
|
|
||||||
|
|
||||||
// Try to load a default font
|
// Try to load a default font
|
||||||
if (!font_count)
|
if (!font_count)
|
||||||
parse_font_list(fallback_font);
|
font_load("fixed");
|
||||||
|
|
||||||
// We tried and failed hard, there's something wrong
|
// We tried and failed hard, there's something wrong
|
||||||
if (!font_count)
|
if (!font_count)
|
||||||
|
@ -1379,7 +1346,7 @@ main (int argc, char **argv)
|
||||||
"\t-g Set the bar geometry {width}x{height}+{xoffset}+{yoffset}\n"
|
"\t-g Set the bar geometry {width}x{height}+{xoffset}+{yoffset}\n"
|
||||||
"\t-b Put the bar at the bottom of the screen\n"
|
"\t-b Put the bar at the bottom of the screen\n"
|
||||||
"\t-d Force docking (use this if your WM isn't EWMH compliant)\n"
|
"\t-d Force docking (use this if your WM isn't EWMH compliant)\n"
|
||||||
"\t-f Bar font list, comma separated\n"
|
"\t-f Set the font name to use\n"
|
||||||
"\t-p Don't close after the data ends\n"
|
"\t-p Don't close after the data ends\n"
|
||||||
"\t-u Set the underline/overline height in pixels\n"
|
"\t-u Set the underline/overline height in pixels\n"
|
||||||
"\t-B Set background color in #AARRGGBB\n"
|
"\t-B Set background color in #AARRGGBB\n"
|
||||||
|
@ -1390,7 +1357,7 @@ main (int argc, char **argv)
|
||||||
case 'p': permanent = true; break;
|
case 'p': permanent = true; break;
|
||||||
case 'b': topbar = false; break;
|
case 'b': topbar = false; break;
|
||||||
case 'd': dock = true; break;
|
case 'd': dock = true; break;
|
||||||
case 'f': parse_font_list(optarg); break;
|
case 'f': font_load(optarg); break;
|
||||||
case 'u': bu = strtoul(optarg, NULL, 10); break;
|
case 'u': bu = strtoul(optarg, NULL, 10); break;
|
||||||
case 'o': offset_y = strtol(optarg, NULL, 10); break;
|
case 'o': offset_y = strtol(optarg, NULL, 10); break;
|
||||||
case 'B': dbgc = bgc = parse_color(optarg, NULL, (rgba_t)scr->black_pixel); break;
|
case 'B': dbgc = bgc = parse_color(optarg, NULL, (rgba_t)scr->black_pixel); break;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user