SDL_Surface into GTK Window

匆匆过客 提交于 2019-12-24 07:47:18

问题


I'm currently making a project in my IT School and I work with SDL (The project is image processing and stuff like that), and currently I just display the image with SDL without interface (buttons etc...). I know a little bit about GTK so I want to know if I can display an image (here a SDL_Surface) into a GTK window I made some research but nothing was very clear... Thank you !


回答1:


Drawing widgets using SDL

Drawing widgets(menu, buttons etc) using SDL drawing functions and handling actions by tracking the cursor position during the occurrence of event(on which item the cursor was while the event was performed). This becomes very complicated and would be better to use an existing GUI library with some simple hacks. You can find code example for drawing a button here.

Copying SDL surface into target GUI widget

This involves copying pixel by pixel(predefined functions might be available to do the same, gdk_draw_rgb_image in case of gtk) of the sdl surface into target gui widget(can be a drawingArea in case of GTK).

Merging SDL window into a GUI widget

In X11 and win32 systems each windows are given with a window id and by default sdl and gtk would have separate window id resulting two different windows, we can exploit SDL_CreateWindowFrom function to use single window for sdl and gtk in which we will force both the libraries to use a single window id. You can find similar question here.

GTK Plug and Socket

Plug and Socket enables embeeding widget from one process to another. GTK will create a socket and pass the socket id to SDL and SDL would create window from that socket ID.

Event loop handling: After merging SDL with GTK you might find gtk and sdl have their own event loops hence handling events might not be as expected. To solve that issue you can handle events in GTK and propagate the event to SDL using SDL_PushEvent function and vice versa in case you are using user defined events.

.
.
static SDL_Event SDLevent;
switch(event->keyval)
{
    case GDK_KEY_m:
       SDLevent.type = SDL_KEYUP;
       SDLevent.key.keysym.sym = SDLK_m;
       SDL_PushEvent(&SDLevent);
       break;
       .
       .
       .

This link has a nice explanation for above methods.



来源:https://stackoverflow.com/questions/47579967/sdl-surface-into-gtk-window

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!