Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用根X11窗口作为主SDL2窗口_C_X11_Sdl 2_Xlib - Fatal编程技术网

C 使用根X11窗口作为主SDL2窗口

C 使用根X11窗口作为主SDL2窗口,c,x11,sdl-2,xlib,C,X11,Sdl 2,Xlib,我试图让SDL2使用根X窗口来显示东西,但它似乎不起作用——窗口没有任何变化。此外,由于某种原因,整个程序在执行SDL\u Delay()后不会退出。不可能吗?我做错什么了吗 #include <SDL.h> #include <X11/Xlib.h> #include <stdio.h> // clang -lSDL2 -lX11 -I/usr/include/SDL2 -Weverything x11.c -o x11 int main(void)

我试图让SDL2使用根X窗口来显示东西,但它似乎不起作用——窗口没有任何变化。此外,由于某种原因,整个程序在执行
SDL\u Delay()
后不会退出。不可能吗?我做错什么了吗

#include <SDL.h>

#include <X11/Xlib.h>

#include <stdio.h>

// clang -lSDL2 -lX11 -I/usr/include/SDL2 -Weverything x11.c -o x11

int main(void)
{
    Display *x11_d;
    int x11_s;
    Window x11_w;
    SDL_Window *w;
    SDL_Renderer *r;

    x11_d = XOpenDisplay(NULL);

    if(!x11_d) {
        fprintf(stderr, "couldn't open display\n");
        return 1;
    }

    x11_s = DefaultScreen(x11_d);
    x11_w = RootWindow(x11_d, x11_s);

    if(SDL_Init(SDL_INIT_VIDEO) != 0) {
        fprintf(stderr, "couldn't initialize SDL: %s\n", SDL_GetError());
        return 1;
    }

    w = SDL_CreateWindowFrom((void *)x11_w);

    XCloseDisplay(x11_d);

    if(!w) {
        fprintf(stderr, "couldn't attach to the root X11 window: %s\n", SDL_GetError());
        return 1;
    }

    r = SDL_CreateRenderer(w, -1, 0);

    SDL_SetRenderDrawColor(r, 255, 0, 0, 255);
    SDL_RenderClear(r);
    SDL_RenderPresent(r);

    SDL_Delay(5700);

    SDL_Quit();
    return 0;
}
#包括
#包括
#包括
//clang-lSDL2-lX11-I/usr/include/SDL2-weverythingx11.c-ox11
内部主(空)
{
显示*x11_d;
int x11s;
窗口x11_w;
SDL_窗口*w;
SDL_*r;
x11_d=XOpenDisplay(NULL);
如果(!x11_d){
fprintf(stderr,“无法打开显示\n”);
返回1;
}
x11_s=默认屏幕(x11_d);
x11_w=根窗口(x11_d,x11_s);
如果(SDL_Init(SDL_Init_视频)!=0){
fprintf(stderr,“无法初始化SDL:%s\n”,SDL_GetError());
返回1;
}
w=SDL_CreateWindowFrom((void*)x11_w);
XCloseDisplay(x11_d);
如果(!w){
fprintf(stderr,“无法连接到根X11窗口:%s\n”,SDL_GetError());
返回1;
}
r=SDL_(w,-1,0);
SDL_SetRenderDrawColor(r,255,0,0,255);
SDL_渲染器(r);
SDL_RenderPresent(r);
SDL_延迟(5700);
SDL_退出();
返回0;
}

您在创建SDL窗口后立即关闭X显示屏,因此您失去了连接。这显然没有帮助,但你也一样。教程。

我正在尝试使用尽可能少的Xlib,只需获得根窗口,将其传递到
SDL\u CreateWindowFrom()
并将其余部分留给SDL。除了过早关闭显示器外,我的代码还丢失了什么?创建X事件循环似乎不会改变任何事情。