Xlib / Gtk3检索窗口图像并将其绘制到GtkImage

时间:2018-08-16 09:29:33

标签: x11 gtk3

我正在尝试为小触摸屏(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);

但我刚刚获得了相同的结果。

我实际上不明白这是怎么回事,所以我实际上需要一些建议。有人可以帮我吗?我会很感激。预先谢谢你。

0 个答案:

没有答案