是否可以使用xlib绘制没有标题栏,关闭按钮,鼠标按钮响应的透明窗口。那么只是具有特定颜色和宽度的边框?像
这个橙色矩形是我需要创建的。另外,我想有可能以编程方式移动,调整大小,关闭并使其滑动(在计时器上更改边框的颜色)。
我设法创建了没有标题栏的透明窗口,并在窗口的每一侧绘制矩形以产生边框效果:
#define W_WIDTH 640
#define W_HEIGHT 480
#define X_POS 100
#define Y_POS 120
#define BORDER_WIDTH 2
Display *dpy;
Window w;
XRectangle rectangles[4] =
{
{ X_POS, Y_POS, W_WIDTH, BORDER_WIDTH },
{ X_POS, Y_POS, BORDER_WIDTH, W_HEIGHT },
{ X_POS, W_HEIGHT - BORDER_WIDTH, W_WIDTH, BORDER_WIDTH },
{ W_WIDTH - BORDER_WIDTH, Y_POS, BORDER_WIDTH, W_HEIGHT }
};
int main(int argc, char *argv[])
{
GC gc;
XGCValues gcv;
int run = 1;
dpy = XOpenDisplay(NULL);
XVisualInfo vinfo;
XMatchVisualInfo(dpy, DefaultScreen(dpy), 32, TrueColor, &vinfo);
XSetWindowAttributes attr;
attr.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vinfo.visual, AllocNone);
w = XCreateWindow(dpy, DefaultRootWindow(dpy), X_POS, Y_POS,
W_WIDTH, W_HEIGHT, BORDER_WIDTH, vinfo.depth,
InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr);
XColor color;
Colormap colormap;
char orangeDark[] = "#FF8000";
colormap = DefaultColormap(dpy, 0);
XParseColor(dpy, colormap, orangeDark, &color);
XAllocColor(dpy, colormap, &color);
gcv.line_width = BORDER_WIDTH;
gc = XCreateGC(dpy, w, GCLineWidth, &gcv);
XSelectInput(dpy, w, ExposureMask);
Atom window_type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
long value = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(dpy, w, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &value, 1);
XMapWindow(dpy, w);
XSync(dpy, False);
while(run)
{
XEvent xe;
XNextEvent(dpy, &xe);
switch (xe.type)
{
case Expose:
XSetForeground(dpy, gc, color.pixel);
XDrawRectangles(dpy, w, gc, rectangles, 4);
XFillRectangles(dpy, w, gc, rectangles, 4);
XSync(dpy, False);
break;
default:
break;
}
}
XDestroyWindow(dpy, w);
XCloseDisplay(dpy);
return 0;
}
这段代码几乎可以正常工作,除了我的橙色边框是半透明的,而且在光窗上几乎不可见:
您能告诉我如何更改代码以绘制橙色矩形吗?我拥有的另一个变体是在橙色窗口内绘制透明矩形。但是我没有在互联网上找到有关该操作的任何信息。
答案 0 :(得分:4)
两个主要错误。
attr
和gcv
初始化为0 attr.colormap
进行颜色分配那应该有帮助:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#define W_WIDTH 640
#define W_HEIGHT 480
#define X_POS 100
#define Y_POS 120
#define BORDER_WIDTH 2
int main(int argc, char *argv[]) {
XRectangle rectangles[4] = {
{ X_POS, Y_POS, W_WIDTH, BORDER_WIDTH },
{ X_POS, Y_POS, BORDER_WIDTH, W_HEIGHT },
{ X_POS, W_HEIGHT - BORDER_WIDTH, W_WIDTH, BORDER_WIDTH },
{ W_WIDTH - BORDER_WIDTH, Y_POS, BORDER_WIDTH, W_HEIGHT }
};
Display *dpy = XOpenDisplay(NULL);
XSetWindowAttributes attr = {0};
XGCValues gcv = {0};
XVisualInfo vinfo;
GC gc;
Window w;
int run = 1;
XMatchVisualInfo(dpy, DefaultScreen(dpy), 32, TrueColor, &vinfo);
attr.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vinfo.visual, AllocNone);
XColor color;
char orangeDark[] = "#FF8000";
XParseColor(dpy, attr.colormap, orangeDark, &color);
XAllocColor(dpy, attr.colormap, &color);
w = XCreateWindow(dpy, DefaultRootWindow(dpy), X_POS, Y_POS,
W_WIDTH, W_HEIGHT, BORDER_WIDTH, vinfo.depth,
InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr);
gcv.line_width = BORDER_WIDTH;
gc = XCreateGC(dpy, w, GCLineWidth, &gcv);
XSelectInput(dpy, w, ExposureMask);
long value = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(dpy, w, XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False),
XA_ATOM, 32, PropModeReplace, (unsigned char *) &value, 1);
XMapWindow(dpy, w);
XSync(dpy, False);
while(run) {
XEvent xe;
XNextEvent(dpy, &xe);
switch (xe.type) {
case Expose:
XSetForeground(dpy, gc, color.pixel);
XDrawRectangles(dpy, w, gc, rectangles, 4);
XFillRectangles(dpy, w, gc, rectangles, 4);
XSync(dpy, False);
break;
default:
break;
}
}
XDestroyWindow(dpy, w);
XCloseDisplay(dpy);
return 0;
}
结果: