nkeynes@94: /** nkeynes@435: * $Id: video_gtk.c,v 1.13 2007-10-10 11:02:04 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@94: GdkImage *video_img = NULL; nkeynes@435: GtkWidget *video_win = NULL; nkeynes@94: GtkWidget *video_area = NULL; nkeynes@94: uint32_t video_width = 640; nkeynes@94: uint32_t 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@435: /* redisplay last frame */ nkeynes@435: } nkeynes@435: nkeynes@352: gboolean video_gtk_init() nkeynes@94: { nkeynes@435: /* nkeynes@352: video_win = GTK_WINDOW(gtk_window_new( GTK_WINDOW_TOPLEVEL )); nkeynes@352: gtk_window_set_title( video_win, APP_NAME " - Emulation Window" ); nkeynes@352: gtk_window_set_policy( video_win, FALSE, FALSE, FALSE ); nkeynes@435: gtk_window_set_default_size( video_win, video_width, video_height ); nkeynes@435: */ 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@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@352: video_area = gtk_image_new(); nkeynes@352: gtk_widget_show( GTK_WIDGET(video_area) ); nkeynes@352: gtk_container_add( GTK_CONTAINER(video_win), GTK_WIDGET(video_area) ); nkeynes@352: gtk_widget_show( GTK_WIDGET(video_win) ); nkeynes@352: video_img = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), nkeynes@352: video_width, video_height ); nkeynes@352: gtk_image_set_from_image( GTK_IMAGE(video_area), video_img, NULL ); nkeynes@352: nkeynes@352: nkeynes@370: return video_glx_init( gdk_x11_display_get_xdisplay( gtk_widget_get_display(GTK_WIDGET(video_win))), nkeynes@352: gdk_x11_screen_get_xscreen( gtk_widget_get_screen(GTK_WIDGET(video_win))), nkeynes@352: GDK_WINDOW_XWINDOW( GTK_WIDGET(video_win)->window ), nkeynes@352: 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: