我正在尝试为小触摸屏(7-10英寸)编写一个非常简单的窗口管理器。我想实现一个简单的窗口可滚动视图,类似于android的打开的应用程序视图,每个打开的窗口都有一个图像。
我为此进行了几次尝试,但是我最多可以得到一个蓝色正方形来代替正确的图像。
首先,我尝试将图像绘制到GtkImage,但是我找不到任何将x11窗口的像素图绘制到GtkImage的方法。我也尝试过开罗表面,但没有运气。
现在我正在尝试使用GtkSocket,获取套接字的XID并尝试对其进行绘制,但是再没有运气了:只是一个蓝色方块。
我尝试在根窗口上同时使用初始XCompositeRedirectSubwindows和特定窗口上的XCompositeRedirectWindow,但是没有任何变化。
我当前的代码如下:
if (this->thumb_) {
XFreePixmap(dsp, thumb_);
XRenderFreePicture(dsp, thumbPict_);
}
XWindowAttributes attrs;
XGetWindowAttributes(dsp, this->frame, &attrs);
thumb_ = XCompositeNameWindowPixmap(dsp, this->frame);
XRenderPictFormat* format = XRenderFindVisualFormat(dsp, attrs.visual);
XRenderPictureAttributes pa;
pa.subwindow_mode = IncludeInferiors;
thumbPict_ = XRenderCreatePicture(dsp, thumb_, format, CPSubwindowMode, &pa);
用于窗口上的每个MapNotify和ConfigureNotify事件。然后,当我必须显示图片时,请执行以下操作:
XRenderColor c = { 0, 0, 0, 0 };
XWindowAttributes x_window_attrs;
CHECK(XGetWindowAttributes(dsp, win->GetFrame(), &x_window_attrs));
unsigned int width = x_window_attrs.width;
unsigned int height = x_window_attrs.height;
XRenderPictFormat *format = XRenderFindVisualFormat(dsp, x_window_attrs.visual );
char *name = NULL;
XFetchName(dsp, win->GetFramed(), &name);
std::string str = "[Nessun titolo ";
if (name == NULL) {
str.append(std::to_string((unsigned long) win->GetFramed())).append("]");
name = (char*) str.c_str();
}
GtkWidget* fr = gtk_frame_new(name);
gtk_widget_set_hexpand(fr, true);
gtk_container_add(container, fr);
GtkWidget* socket = gtk_socket_new();
gtk_widget_set_size_request(socket, width, height);
gtk_container_add(GTK_CONTAINER(fr), socket);
gtk_widget_show_all(fr);
Window sw = gtk_socket_get_id(GTK_SOCKET(socket));
XRenderPictureAttributes pa;
pa.subwindow_mode = IncludeInferiors;
Picture srcPicture = win->GetThumbnailPicture();
//XRenderSetPictureFilter (dsp, srcPicture, FilterBilinear, 0, 0);
//XRenderSetPictureTransform (dsp, srcPicture, &transform);
XRenderPictFormat* render_format = format; //XRenderFindStandardFormat (dsp, PictStandardARGB32);
Picture destPicture = XRenderCreatePicture(dsp, sw, render_format, 0, &pa);
XRenderFillRectangle(dsp, PictOpSrc, destPicture, &c, 0, 0, width, height);
XRenderComposite (dsp, PictOpSrc, srcPicture, None, destPicture, 0, 0, 0, 0, 0, 0, width, height);
我也试图调整图片的大小,但是因为它不起作用,所以我很乐意在不调整图片大小的情况下使其正常工作。
此刻,我在窗口管理器上使用on线程,在GTK部分上使用另一个线程,该线程调用gtk_main函数。因为我找不到用GTK3获取显示指针的任何方法,所以我打开了另一个显示器来执行第二个代码段(否则所有程序都将挂起)。
如果基于窗口创建目标图片是错误的,我尝试基于另一个新的Pixmap创建它,并在渲染后尝试将该pixmap绘制为套接字窗口,如下所示:
gc = XCreateGC(dsp, sw, 0, 0);
XSetWindowBackgroundPixmap(dsp, sw, pixmap);
XClearWindow(dsp, sw);
XFreeGC(dsp, gc);
但我刚刚获得了相同的结果。
我实际上不明白这是怎么回事,所以我实际上需要一些建议。有人可以帮我吗?我会很感激。预先谢谢你。