我在ArchLinux上使用DWM 6.1,我有一个针对电力线状态栏的自定义补丁。
我添加了此功能drw_arrow
以使用XFillRectangle
和XFillPolygon
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
不会在栏的某些区域绘制矩形。
结果如下:
我添加了对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);
}
正确的结果:
所以我的问题是为什么XFillRectangle
有时不起作用。是因为拨打XFillPolygon
?还有其他原因吗?