nkeynes@94: /** nkeynes@443: * $Id: video_gtk.c,v 1.15 2007-10-13 04:01:02 nkeynes Exp $ nkeynes@94: * nkeynes@94: * The PC side of the video support (responsible for actually displaying / nkeynes@94: * rendering frames) nkeynes@94: * nkeynes@94: * Copyright (c) 2005 Nathan Keynes. nkeynes@94: * nkeynes@94: * This program is free software; you can redistribute it and/or modify nkeynes@94: * it under the terms of the GNU General Public License as published by nkeynes@94: * the Free Software Foundation; either version 2 of the License, or nkeynes@94: * (at your option) any later version. nkeynes@94: * nkeynes@94: * This program is distributed in the hope that it will be useful, nkeynes@94: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@94: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@94: * GNU General Public License for more details. nkeynes@94: */ nkeynes@94: nkeynes@94: #include nkeynes@94: #include nkeynes@94: #include nkeynes@180: #include "dream.h" nkeynes@144: #include "display.h" nkeynes@94: #include "drivers/video_x11.h" nkeynes@435: #include "gui/gtkui.h" nkeynes@94: nkeynes@436: static GtkWidget *video_win = NULL; nkeynes@436: int video_width = 640; nkeynes@436: int video_height = 480; nkeynes@94: nkeynes@352: gboolean video_gtk_init(); nkeynes@352: void video_gtk_shutdown(); nkeynes@144: uint16_t video_gtk_resolve_keysym( const gchar *keysym ); nkeynes@94: nkeynes@370: struct display_driver display_gtk_driver = { "gtk", video_gtk_init, video_gtk_shutdown, nkeynes@352: video_gtk_resolve_keysym, nkeynes@352: NULL, NULL, NULL, NULL, NULL, NULL, NULL }; nkeynes@352: nkeynes@144: nkeynes@144: gboolean video_gtk_keydown_callback(GtkWidget *widget, nkeynes@144: GdkEventKey *event, nkeynes@144: gpointer user_data) nkeynes@144: { nkeynes@144: input_event_keydown( event->keyval ); nkeynes@424: return TRUE; nkeynes@144: } nkeynes@144: nkeynes@144: uint16_t video_gtk_resolve_keysym( const gchar *keysym ) nkeynes@144: { nkeynes@144: int val = gdk_keyval_from_name( keysym ); nkeynes@144: if( val == GDK_VoidSymbol ) nkeynes@144: return 0; nkeynes@144: return (uint16_t)val; nkeynes@144: } nkeynes@144: nkeynes@144: gboolean video_gtk_keyup_callback(GtkWidget *widget, nkeynes@144: GdkEventKey *event, nkeynes@144: gpointer user_data) nkeynes@144: { nkeynes@144: input_event_keyup( event->keyval ); nkeynes@424: return TRUE; nkeynes@144: } nkeynes@94: nkeynes@435: gboolean video_gtk_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data ) nkeynes@435: { nkeynes@443: gl_redisplay_last(); nkeynes@443: return TRUE; nkeynes@435: } nkeynes@435: nkeynes@436: gboolean video_gtk_resize_callback(GtkWidget *widget, GdkEventConfigure *event, gpointer data ) nkeynes@436: { nkeynes@436: video_width = event->width; nkeynes@436: video_height = event->height; nkeynes@443: gl_redisplay_last(); nkeynes@443: return TRUE; nkeynes@436: } nkeynes@436: nkeynes@352: gboolean video_gtk_init() nkeynes@94: { nkeynes@435: video_win = gtk_gui_get_renderarea(); nkeynes@435: nkeynes@352: g_signal_connect( video_win, "key_press_event", nkeynes@352: G_CALLBACK(video_gtk_keydown_callback), NULL ); nkeynes@352: g_signal_connect( video_win, "key_release_event", nkeynes@352: G_CALLBACK(video_gtk_keyup_callback), NULL ); nkeynes@435: g_signal_connect( video_win, "expose_event", nkeynes@435: G_CALLBACK(video_gtk_expose_callback), NULL ); nkeynes@436: g_signal_connect( video_win, "configure_event", nkeynes@436: G_CALLBACK(video_gtk_resize_callback), NULL ); nkeynes@435: gtk_widget_add_events( video_win, nkeynes@352: GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | nkeynes@352: GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK ); nkeynes@443: gtk_widget_set_double_buffered( video_win, FALSE ); nkeynes@436: video_width = video_win->allocation.width; nkeynes@436: video_height = video_win->allocation.height; nkeynes@370: return video_glx_init( gdk_x11_display_get_xdisplay( gtk_widget_get_display(GTK_WIDGET(video_win))), nkeynes@436: gdk_x11_screen_get_xscreen( gtk_widget_get_screen(GTK_WIDGET(video_win))), nkeynes@436: GDK_WINDOW_XWINDOW( GTK_WIDGET(video_win)->window ), nkeynes@436: video_width, video_height, &display_gtk_driver ); nkeynes@94: } nkeynes@94: nkeynes@352: void video_gtk_shutdown() nkeynes@352: { nkeynes@370: video_glx_shutdown(); nkeynes@370: gtk_widget_destroy( GTK_WIDGET(video_win) ); nkeynes@352: nkeynes@94: } nkeynes@94: