diff --git a/src/vte.c b/src/vte.c
index 0ad759d..413b69c 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -9923,6 +9923,7 @@ vte_terminal_draw_graphic(VteTerminal *terminal, vteunistr c,
         {
                 const guint v = c - 0x256d;
                 int line_width;
+                double radius;
 
                 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
 
@@ -9930,13 +9931,31 @@ vte_terminal_draw_graphic(VteTerminal *terminal, vteunistr c,
                 adjust = (line_width & 1) ? .5 : 0.;
                 cairo_set_line_width(cr, line_width);
 
-                cairo_move_to(cr, xcenter + adjust, (v & 2) ? y : ybottom);
-                cairo_curve_to(cr, 
-                               xcenter + adjust, ycenter + adjust,
-                               xcenter + adjust, ycenter + adjust,
-                               (v == 1 || v == 2) ? x : xright, ycenter + adjust);
+                radius = MIN(MIN(MIN(left_half + adjust, right_half - adjust), upper_half + adjust), lower_half - adjust);
+
+                cairo_arc(cr,
+                          (v == 1 || v == 2) ? xcenter + adjust - radius : xcenter + adjust + radius,
+                          (v & 2) ? ycenter + adjust - radius : ycenter + adjust + radius,
+                          radius,
+                          (v + 2) * M_PI / 2.0, (v + 3) * M_PI / 2.0);
                 cairo_stroke(cr);
 
+                if (v == 1 || v == 2) {
+                        cairo_move_to(cr, x, ycenter + adjust);
+                        cairo_line_to(cr, xcenter + adjust - radius, ycenter + adjust);
+                } else {
+                        cairo_move_to(cr, xright, ycenter + adjust);
+                        cairo_line_to(cr, xcenter + adjust + radius, ycenter + adjust);
+                }
+                cairo_stroke(cr);
+                if (v & 2) {
+                        cairo_move_to(cr, xcenter + adjust, y);
+                        cairo_line_to(cr, xcenter + adjust, ycenter + adjust - radius);
+                } else {
+                        cairo_move_to(cr, xcenter + adjust, ybottom);
+                        cairo_line_to(cr, xcenter + adjust, ycenter + adjust + radius);
+                }
+                cairo_stroke(cr);
                 break;
         }
 
