Замена SDL на GTK + для мыши и клавиатуры и отображение буфера кадров - PullRequest
2 голосов
/ 18 ноября 2011

Я начал строить свою программу с 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 (с точки зрения пользовательского интерфейса). Я начал включать SDL в окно GTK + с помощью среды putenv ( Хак SDL_WINDOWID ), но у меня есть две проблемы:

a) С этим решением не принимаются события SDL. б) Экран буфера кадров всегда помещается в верхнем левом углу окна (0,0), но я бы хотел, чтобы этот экран отображался где-то посередине моего окна с некоторыми кнопками выше и ниже.

Я думаю о том, чтобы избавиться от SDL и просто использовать GTK + сам. Я хотел бы спросить вас о нескольких вещах, так как я очень новичок в GTK +.

Не могли бы вы сказать, какой тип GtkWidget следует использовать для отображения моего буфера кадров в окне? Кто-нибудь также, пожалуйста, знает, какую функцию я мог бы использовать в GTK для выполнения той же задачи, что и SDL_CreateRGBSurfaceFrom () (если это вообще возможно)? И, наконец, не могли бы вы связать меня со способом получения координат x и y в GtkWidget, который щелкается или перемещается, а не с координатами всего окна, а также с клавиатуры?

(Я нашел какое-то решение для мыши и клавиатуры. Я видел "configure-event", используемый для получения значений x и y, но я не уверен, работает ли это событие на любом GtkWidget. Также для клавиатуры я обнаружил, что нужно использовать «активировать», но я хотел бы подтвердить, что это правильный подход.)

1 Ответ

4 голосов
/ 21 ноября 2011

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.
Это возможно.Используемый вами хак в основном использует тот факт, что SDL (в случае, если аппаратное обеспечение не используется напрямую) и Gtk зависят от Windowing system для отображения в окне и более точно от X11 на большинстве настольных систем Linux.Таким образом, создание окна выполняется с помощью X, который имеет XID, который SDL использует из того, который создан для GtkWidget.В настоящее время вы используете * X-окно, соответствующее GtkWindow, вместо этого, если вы используете X-окно GtkDrawingArea, вы можете сделать отображение по вашему желанию.Теперь, чтобы получить события, зарегистрируйтесь обратный звонок.Я попытался создать mash up , где при нажатии «Запустить SDL-анимацию» запускается анимация SDL, а нажатие в области анимации вызывает "button-release-event", который печатает относительные координаты x & y на выходе консолино ключевые события не принимаются.Надеемся, что вы можете развить это или использовать для дальнейшего использования (на всякий случай).

Could you please tell me what kind of GtkWidget should be used to display my frame buffer inside a window?
Вы можете посмотреть GtkDrawingArea, который предназначен для пользовательских интерфейсов пользовательского интерфейса, или GtkImage с помощью 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, а 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 и получите необходимую информацию, например, относительные координаты x & y и т. Д.
Для событий клавиатуры необходимо зарегистрировать обратный вызов для "key-press-event" или "key-release-event".Сигнал обратного вызова имеет параметр GdkEvent.Введите в обратном вызове GdkEventKey и получите необходимую информацию.Кроме того, для событий клавиатуры виджет должен быть в состоянии захватить фокус, который вы можете применить посредством вызова gtk_widget_set_can_focus
Надеюсь, это поможет!

...