用GTK +替换SDL用于鼠标和键盘并显示帧缓冲区

时间:2011-11-18 16:53:03

标签: sdl gtk

我开始使用SDL构建我的程序。我正在使用SDL在屏幕上实时渲染帧缓冲区,并从键盘和鼠标中查找用户输入。

我一直在使用以下代码在屏幕上显示5-6-5 RGB帧缓冲区。

SDL_Surface* screen = SDL_SetVideoMode(width, height, bitsPerPixel, SDL_SWSURFACE);
SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(frameBuffer, width, height, depth, lineWidth, Rmask, Gmask, Bmask, Amask);
SDL_BlitSurface(surface, NULL, screen, NULL);
SDL_Flip(screen);

请注意,Rmask,Gmask和Bmask以及Amask都是0.我正在使用SDL的默认屏蔽。

对于键盘和鼠标,我一直在使用以下代码:

while (run) {
    SDL_WaitEvent(&event);
    switch (event.type) {
        // Key is pressed
        case SDL_KEYDOWN:
            map<int, int>::iterator it = SDLToAndroid.find(event.key.keysym.sym);
            if (it != SDLToAndroid.end()) { /* ... */ }
            break;
        case SDL_MOUSEBUTTONDOWN:
            // Left click
            if (event.button.button == SDL_BUTTON_LEFT) { /* ... */ }
            break;

按键的位置我在地图中查找它们以将它们转换为其他键。

这很好用,但我想使用GTK的功能(就UI而言)。我开始使用putenv环境(The SDL_WINDOWID hack)将SDL包含到我的GTK +窗口中,但我有两个问题:

a)此解决方案未收到SDL事件。 b)帧缓冲区显示总是放在窗口的左上角(0,0),但实际上我希望这个显示在窗口中间某处显示,上面和下面有一些按钮。

我正在考虑摆脱SDL并且只使用GTK +本身。有些事我想问你,因为我对GTK +很新。

你能告诉我应该使用什么样的GtkWidget在窗口内显示我的帧缓冲区吗?有没有人也知道我可以在GTK中使用什么功能来执行与SDL_CreateRGBSurfaceFrom()相同的任务(如果可能的话)?最后,请您链接到一个获取点击或移入的GtkWidget中的x和y坐标的方法,而不是整个窗口的坐标以及键盘输入?

(我已经找到了鼠标和键盘的一些解决方案。我已经看到用于获取x和y值的“configure-event”,但我不确定这个事件是否适用于任何GtkWidget。也适用于键盘,我发现使用“激活”,但我想确认这是正确的方法。)

1 个答案:

答案 0 :(得分:4)

a) SDL events are not received with this solution.
如页面所述,SDL事件循环不接收事件,而是由Gtk事件循环接收。因此,您可以尝试通过Gtk事件循环捕获事件。

b) The frame buffer display is always put on the top left of the window (0,0) but I would actually like this display to show up somewhere in the middle on my window, with some buttons above and below.
这个有可能。你正在使用的hack,基本上利用了SDL(如果硬件没有直接使用)和&amp; Gtk依赖Windowing system显示在窗口和窗口上。更准确地说,在大多数Linux桌面上的X11上。因此,窗口创建由具有XID的X完成,SDL正在使用为GtkWidget创建的XID。目前您正在使用GtkWindow相应的X窗口,相反,如果您使用GtkDrawingArea的X窗口,则可以根据需要进行显示。现在要获取事件,注册回调。我尝试创建一个mash up,点击“开始SDL动画”,SDL动画启动&amp;单击动画区域将触发"button-release-event"打印相对x&amp; y坐标到控制台输出,但没有收到关键事件。希望您可以在此基础上进行构建或将其用于将来参考(以防万一)。

Could you please tell me what kind of GtkWidget should be used to display my frame buffer inside a window?
您可以查看适用于自定义UI界面的GtkDrawingAreaGtkImage GdkPixbuf作为替代选项。您可以查看gtk-demo代码或Cairo animation sample,了解如何继续执行您的要求。

Does anyone also please know what function I could use in GTK to perform the same task as SDL_CreateRGBSurfaceFrom() (if it is even possible)?
为此,您可以查看GdkPixbuf。可以将原始数据设置为GdkPixbuf&amp; pixbuf可用于创建GtkImage等可用于显示的内容。

And finally, would you please link me to a way to get the x and y coordinates in the GtkWidget that gets clicked or moved in, and not the coordinates of the whole window, as well as keyboards input?
对于鼠标事件,您需要注册"button-press-event""button-release-event"的回调。信号回调具有GdkEvent参数。在回调GdkEventButton&amp;回调中的Typecast得到你需要的信息,比如x&amp; y坐标等 对于键盘事件,您需要为"key-press-event""key-release-event"注册回调。信号回调具有GdkEvent参数。在回调GdkEventKey&amp;回调中的Typecast获取您需要的信息。此外,对于键盘事件,窗口小部件应该能够抓住焦点,您可以通过调用强制执行gtk_widget_set_can_focus
希望这有帮助!