From e2bd14e7b7dcde5c60044b6f806f9f708d575a61 Mon Sep 17 00:00:00 2001 From: Ovnuniarchos Date: Thu, 14 Jul 2016 18:45:06 +0200 Subject: [PATCH] Use coordinate offsets to draw shades/outlines. Corrects behavior when GOTO-ing. (#287) --- src/conky.cc | 59 +++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/conky.cc b/src/conky.cc index d1dbad8b..93214479 100644 --- a/src/conky.cc +++ b/src/conky.cc @@ -422,6 +422,7 @@ struct _x11_stuff_s { /* text size */ static int text_start_x, text_start_y; /* text start position in window */ +static int text_offset_x, text_offset_y; /* offset for start position */ static int text_width = 1, text_height = 1; /* initially 1 so no zero-sized window is created */ #endif /* BUILD_X11 */ @@ -1372,20 +1373,20 @@ static void draw_string(const char *s) c2.color.alpha = fonts[selected_font].font_alpha; if (utf8_mode.get(*state)) { XftDrawStringUtf8(window.xftdraw, &c2, fonts[selected_font].xftfont, - cur_x, cur_y, (const XftChar8 *) s, strlen(s)); + text_offset_x + cur_x, text_offset_y + cur_y, (const XftChar8 *) s, strlen(s)); } else { XftDrawString8(window.xftdraw, &c2, fonts[selected_font].xftfont, - cur_x, cur_y, (const XftChar8 *) s, strlen(s)); + text_offset_x + cur_x, text_offset_y + cur_y, (const XftChar8 *) s, strlen(s)); } } else #endif { if (utf8_mode.get(*state)) { - Xutf8DrawString(display, window.drawable, fonts[selected_font].fontset, window.gc, cur_x, cur_y, s, - strlen(s)); + Xutf8DrawString(display, window.drawable, fonts[selected_font].fontset, window.gc, + text_offset_x + cur_x, text_offset_y + cur_y, s, strlen(s)); } else { - XDrawString(display, window.drawable, window.gc, cur_x, cur_y, s, - strlen(s)); + XDrawString(display, window.drawable, window.gc, + text_offset_x + cur_x, text_offset_y + cur_y, s, strlen(s)); } } cur_x += width_of_s; @@ -1443,8 +1444,8 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) XSetLineAttributes(display, window.gc, h, LineSolid, CapButt, JoinMiter); - XDrawLine(display, window.drawable, window.gc, cur_x, - cur_y - mid / 2, cur_x + w, cur_y - mid / 2); + XDrawLine(display, window.drawable, window.gc, text_offset_x + cur_x, + text_offset_y + cur_y - mid / 2, text_offset_x + cur_x + w, text_offset_y + cur_y - mid / 2); break; } @@ -1459,8 +1460,8 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) XSetLineAttributes(display, window.gc, h, LineOnOffDash, CapButt, JoinMiter); XSetDashes(display, window.gc, 0, ss, 2); - XDrawLine(display, window.drawable, window.gc, cur_x, - cur_y - mid / 2, cur_x + w, cur_y - mid / 2); + XDrawLine(display, window.drawable, window.gc, text_offset_x + cur_x, + text_offset_y + cur_y - mid / 2, text_offset_x + cur_x + w, text_offset_x + cur_y - mid / 2); break; } @@ -1490,10 +1491,10 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) XSetLineAttributes(display, window.gc, 1, LineSolid, CapButt, JoinMiter); - XDrawRectangle(display, window.drawable, window.gc, cur_x, - by, w, h); - XFillRectangle(display, window.drawable, window.gc, cur_x, - by, w * bar_usage / scale, h); + XDrawRectangle(display, window.drawable, window.gc, text_offset_x + cur_x, + text_offset_y + by, w, h); + XFillRectangle(display, window.drawable, window.gc, text_offset_x + cur_x, + text_offset_y + by, w * bar_usage / scale, h); if (h > cur_y_add && h > font_h) { cur_y_add = h; @@ -1532,7 +1533,7 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) CapButt, JoinMiter); XDrawArc(display, window.drawable, window.gc, - cur_x, by, w, h * 2, 0, 180*64); + text_offset_x + cur_x, text_offset_y + by, w, h * 2, 0, 180*64); #ifdef BUILD_MATH usage = current->arg; @@ -1542,7 +1543,7 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) py = (float)(by+(h))-(float)(h)*sin(angle); XDrawLine(display, window.drawable, window.gc, - cur_x + (w/2.), by+(h), (int)(px), (int)(py)); + text_offset_x + cur_x + (w/2.), text_offset_y + by+(h), text_offset_x + (int)(px), text_offset_y + (int)(py)); #endif /* BUILD_MATH */ if (h > cur_y_add @@ -1586,7 +1587,7 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) XSetLineAttributes(display, window.gc, 1, LineSolid, CapButt, JoinMiter); XDrawRectangle(display, window.drawable, window.gc, - cur_x, by, w, h); + text_offset_x + cur_x, text_offset_y + by, w, h); } XSetLineAttributes(display, window.gc, 1, LineSolid, CapButt, JoinMiter); @@ -1633,8 +1634,8 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied) } /* this is mugfugly, but it works */ XDrawLine(display, window.drawable, window.gc, - cur_x + i + 1, by + h, cur_x + i + 1, - round_to_int((double)by + h - current->graph[j] * + text_offset_x + cur_x + i + 1, text_offset_y + by + h, text_offset_x + cur_x + i + 1, + text_offset_y + round_to_int((double)by + h - current->graph[j] * (h - 1) / current->scale)); ++j; } @@ -1897,7 +1898,7 @@ static void draw_text(void) int offset = border_inner_margin.get(*state) + bw; XDrawRectangle(display, window.drawable, window.gc, - text_start_x - offset, text_start_y - offset, + text_offset_x + text_start_x - offset, text_offset_y + text_start_y - offset, text_width + 2*offset, text_height + 2*offset); } @@ -1919,6 +1920,7 @@ static void draw_text(void) static void draw_stuff(void) { + text_offset_x = text_offset_y = 0; #ifdef BUILD_IMLIB2 cimlib_render(text_start_x, text_start_y, window.width, window.height); #endif /* BUILD_IMLIB2 */ @@ -1937,33 +1939,28 @@ static void draw_stuff(void) if (out_to_x.get(*state)) { selected_font = 0; if (draw_shades.get(*state) && !draw_outline.get(*state)) { - text_start_x++; + text_offset_x = text_offset_y = 1; text_start_y++; set_foreground_color(default_shade_color.get(*state)); draw_mode = BG; draw_text(); - text_start_x--; - text_start_y--; + text_offset_x = text_offset_y = 0; } if (draw_outline.get(*state)) { - int i, j; selected_font = 0; - for (i = -1; i < 2; i++) { - for (j = -1; j < 2; j++) { - if (i == 0 && j == 0) { + for (text_offset_x = -1; text_offset_x < 2; text_offset_x++) { + for (text_offset_y = -1; text_offset_y < 2; text_offset_y++) { + if (text_offset_x == 0 && text_offset_y == 0) { continue; } - text_start_x += i; - text_start_y += j; set_foreground_color(default_outline_color.get(*state)); draw_mode = OUTLINE; draw_text(); - text_start_x -= i; - text_start_y -= j; } } + text_offset_x = text_offset_y = 0; } set_foreground_color(default_color.get(*state));