XFillRectangle不适用于屏幕的某些区域

时间:2018-06-15 10:01:43

标签: archlinux xlib x-dwm

我在ArchLinux上使用DWM 6.1,我有一个针对电力线状态栏的自定义补丁。

我添加了此功能drw_arrow以使用XFillRectangleXFillPolygon

绘制箭头
void
drw_arrow(Drw *drw, int x, int y, unsigned int w, unsigned int h, int direction, int slash)
{
        if (!drw)
                return;

        /* direction=1 draws right arrow */
        x = direction ? x : x + w;
        w = direction ? w : -w;
        /* slash=1 draws slash instead of arrow */
        unsigned int hh = slash ? (direction ? 0 : h) : h/2;

        XPoint points[] = {
                {x    , y      },
                {x + w, y + hh },
                {x    , y + h  },
        };

        XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
        XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
        XSetForeground(drw->dpy, drw->gc, drw->scheme[ColFg].pixel);
        XFillPolygon(drw->dpy, drw->drawable, drw->gc, points, 3, Nonconvex, CoordModeOrigin);

        /* For debugging */
        XSetForeground(drw->dpy, drw->gc, ox000000);
        XFillRectangle(drw->dpy, drw->drawable, drw->gc, x+3, y+3, w-6, h-6);

}

在我运行系统范围的更新之前,此功能正常工作。我不知道哪个包导致了这个休息。现在,XFillRectangle不会在栏的某些区域绘制矩形。

结果如下:

wrong bar

我添加了对XFillRectangle的另一个调用,在箭头上打印一个较小的黑色矩形以进行调试。圆圈区域XFillRectangle不起作用。对于bakcground矩形和调试矩形。箭头指向的区域是正确绘制两个矩形的位置。另请注意,在绘制文本时,通过调用另一个函数中的XFillRectangle来添加背景颜色,这样也可以正常工作。

我通过使用XFillPolygon而不是XFillRectangle绘制背景来修复此问题。

void
drw_arrow(Drw *drw, int x, int y, unsigned int w, unsigned int h, int direction, int slash)
{
        if (!drw || !drw->scheme)
                return;

        /* direction=1 draws right arrow */
        x = direction ? x : x + w;
        w = direction ? w : -w;
        /* slash=1 draws slash instead of arrow */
        unsigned int hh = slash ? (direction ? 0 : h) : h/2;

        XPoint points[] = {
                {x    , y      },
                {x + w, y + hh },
                {x    , y + h  },
        };

        XPoint bg[] = {
            {x    , y    },
            {x + w, y    },
            {x + w, y + h},
            {x    , y + h},
        };

        XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
        XFillPolygon(drw->dpy, drw->drawable, drw->gc, bg, 4, Convex, CoordModeOrigin);
        XSetForeground(drw->dpy, drw->gc, drw->scheme[ColFg].pixel);
        XFillPolygon(drw->dpy, drw->drawable, drw->gc, points, 3, Nonconvex, CoordModeOrigin);
}

正确的结果:

correct bar

所以我的问题是为什么XFillRectangle有时不起作用。是因为拨打XFillPolygon?还有其他原因吗?

0 个答案:

没有答案