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

问题描述 投票:0回答:2

我试图让 SDL2 使用根 X 窗口来显示内容,但它似乎不起作用 - 窗口没有以任何方式改变。另外,由于某种原因,整个程序在

SDL_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;
}
c x11 sdl-2 xlib
2个回答
1
投票

您在创建 SDL 窗口后立即关闭 X Display,因此您失去了连接。这显然没有帮助,但您也遗漏了让 X 工作所需的大约 95% 的代码。教程这里


0
投票

再多的代码也无法修复 SDL 中的错误。但我能够找到如何创建一个 X 窗口,然后让 SDL 绘制它,尽管这并不完全是答案,但我想将其发布在这里,供任何寻找替代方案的人使用。

Display *x11_d;
int x11_s;
Window x11_w;
x11_d = XOpenDisplay(NULL);
SDL_Window *window;

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

x11_s = DefaultScreen(x11_d);
x11_w = XCreateSimpleWindow(x11_d, DefaultRootWindow(x11_d), 0, 0, 640, 480, 0, 0, 0);

if (None == x11_w)
{
    fprintf(stderr, "Failed to create window");
    XCloseDisplay(x11_d);
    return;
}
XMapWindow(x11_d, x11_w);
Atom wm_delete_window = XInternAtom(x11_d, "WM_DELETE_WINDOW", False);
XSetWMProtocols(x11_d, x11_w, &wm_delete_window, 1);
window = SDL_CreateWindowFrom((void *)x11_w);
© www.soinside.com 2019 - 2024. All rights reserved.