1

我的代码(如下)做了什么:

  1. 创建具有背景颜色的 XLIB 窗口
  2. 在窗口上绘制一个字符串
  3. 在窗口上画一条线
  4. 创建一个 GTK+ 窗口
  5. 使GTK+窗口通过GDK窗口实现XLIB窗口存在
  6. 在 GTK+ 窗口内显示 XLIB 窗口的输出

它可以工作并创建一个正确颜色的窗口,但它不会在屏幕上绘制字符串或线条。关于如何让它出现或我哪里出错的任何想法?

我不使用 GTK+ 绘图功能的原因是因为这是一个测试程序,实际上所有绘图都需要来自 xlib 窗口。

#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void destroy(GtkWidget *widget, gpointer data ) {
    gtk_main_quit ();
}

int main(int argc, char** argv) {

    GtkWidget *xwindow;

    //Open the display
    Display *display = XOpenDisplay(NULL);
    int screen = DefaultScreen(display);

    //Create the window
    Window w = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0,
    200, 100, 20, black, 10201020);
    XSelectInput(display, w, StructureNotifyMask);
    XMapWindow(display, w);
    GC gc = XCreateGC(display, w, 0, NULL);
    for(;;) {
          XEvent e;
          XNextEvent(display, &e);
          if (e.type == MapNotify)
                break;
    } 
    XDrawString(display, w, gc, 10, 10, "HelloWorld!", 12);
    XDrawLine(display, w, gc, 10, 60, 180, 20);
    XFlush(display);

    //SET UP
    gtk_init (&argc, &argv);

    //xwindow
    xwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect (xwindow, "destroy",
          G_CALLBACK (destroy), NULL);
    g_signal_connect (xwindow, "destroy",
          G_CALLBACK (print), NULL);
    gtk_widget_realize(xwindow);
    xwindow->window = gdk_window_foreign_new((guint32)w);

    //SET UP
    gtk_widget_show(xwindow);

    gtk_main ();

    return 0;
}
4

1 回答 1

1

我相信这仅仅是由于误解了“绘画”的真正含义,在这里。

Xlib 绘图模型不是“有状态的”,它不会记住您的特定窗口已经在特定位置绘制了一些文本,然后是一条线,等等。当您请求绘图时,绘图立即发生,然后被视为“完成”,即在协议级别被遗忘。

当您将 X 窗口包装在 GTK+ 小部件中时,它可能会导致 X 窗口系统尝试刷新 X 窗口的内容,但这无济于事,这就是您的初始图形丢失的原因。

简而言之,您需要能够根据需要响应重绘窗口的请求。

于 2013-08-14T09:42:34.210 回答