filename | src/drivers/video_gtk.c |
changeset | 665:99ae9dc4cab7 |
prev | 663:553bb7d6befa |
next | 669:ab344e42bca9 |
author | nkeynes |
date | Sat Apr 19 00:36:36 2008 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Move glsl setup out of the drivers Move pvr2 setup call up to video_gtk (probably needs to go higher really) |
view | annotate | diff | log | raw |
1 /**
2 * $Id$
3 *
4 * The PC side of the video support (responsible for actually displaying /
5 * rendering frames)
6 *
7 * Copyright (c) 2005 Nathan Keynes.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 */
20 #include <gdk/gdkkeysyms.h>
21 #include <stdint.h>
22 #include "lxdream.h"
23 #include "display.h"
24 #include "dckeysyms.h"
25 #include "drivers/video_gl.h"
26 #include "pvr2/pvr2.h"
27 #include "gtkui/gtkui.h"
29 #ifdef HAVE_GTK_X11
31 #include <gdk/gdkx.h>
32 #include "drivers/video_glx.h"
34 /************* X11-specificness **********/
36 guint gdk_keycode_to_modifier( GdkDisplay *display, guint keycode )
37 {
38 int i;
39 int result = 0;
40 Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
41 XModifierKeymap *keymap = XGetModifierMapping( xdisplay );
42 for( i=0; i<8*keymap->max_keypermod; i++ ) {
43 if( keymap->modifiermap[i] == keycode ) {
44 result = 1 << (i/keymap->max_keypermod);
45 break;
46 }
47 }
48 XFreeModifiermap(keymap);
49 return result;
50 }
52 #if !(GTK_CHECK_VERSION(2,8,0))
53 /* gdk_display_warp_pointer was added in GTK 2.8. If we're using an earlier
54 * version, include the code here. (Can't just set the dependency on 2.8 as
55 * it still hasn't been included in fink yet...) Original copyright statement
56 * below.
57 */
59 /* GDK - The GIMP Drawing Kit
60 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
61 *
62 * This library is free software; you can redistribute it and/or
63 * modify it under the terms of the GNU Lesser General Public
64 * License as published by the Free Software Foundation; either
65 * version 2 of the License, or (at your option) any later version.
66 *
67 * This library is distributed in the hope that it will be useful,
68 * but WITHOUT ANY WARRANTY; without even the implied warranty of
69 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
70 * Lesser General Public License for more details.
71 *
72 * You should have received a copy of the GNU Lesser General Public
73 * License along with this library; if not, write to the
74 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
75 * Boston, MA 02111-1307, USA.
76 */
78 /*
79 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
80 * file for a list of people on the GTK+ Team. See the ChangeLog
81 * files for a list of changes. These files are distributed with
82 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
83 */
84 void gdk_display_warp_pointer (GdkDisplay *display,
85 GdkScreen *screen,
86 gint x,
87 gint y)
88 {
89 Display *xdisplay;
90 Window dest;
92 xdisplay = GDK_DISPLAY_XDISPLAY (display);
93 dest = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen));
95 XWarpPointer (xdisplay, None, dest, 0, 0, 0, 0, x, y);
96 }
98 #endif
100 #endif
102 #ifdef HAVE_GTK_OSX
103 #include "drivers/video_nsgl.h"
105 // Include this prototype as some systems don't have gdkquartz.h installed
106 NSView *gdk_quartz_window_get_nsview( GdkWindow *window);
108 guint gdk_keycode_to_modifier( GdkDisplay *display, guint keycode )
109 {
110 return 0;
111 }
113 #endif
117 GtkWidget *gtk_video_drawable = NULL;
118 int video_width = 640;
119 int video_height = 480;
121 gboolean video_gtk_init();
122 void video_gtk_shutdown();
123 gboolean video_gtk_display_blank( uint32_t colour );
124 uint16_t video_gtk_resolve_keysym( const gchar *keysym );
125 uint16_t video_gtk_keycode_to_dckeysym(uint16_t keycode);
127 struct display_driver display_gtk_driver = { "gtk", video_gtk_init, video_gtk_shutdown,
128 video_gtk_resolve_keysym,
129 video_gtk_keycode_to_dckeysym,
130 NULL,
131 NULL, NULL, NULL, NULL, NULL,
132 video_gtk_display_blank, NULL };
134 uint16_t video_gtk_resolve_keysym( const gchar *keysym )
135 {
136 int val = gdk_keyval_from_name( keysym );
137 if( val == GDK_VoidSymbol )
138 return 0;
139 return (uint16_t)val;
140 }
142 gboolean video_gtk_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data )
143 {
144 render_buffer_t buffer = pvr2_get_front_buffer();
145 if( buffer == NULL ) {
146 display_gtk_driver.display_blank(pvr2_get_border_colour());
147 } else {
148 display_gtk_driver.display_render_buffer(buffer);
149 }
150 return TRUE;
151 }
153 gboolean video_gtk_resize_callback(GtkWidget *widget, GdkEventConfigure *event, gpointer data )
154 {
155 video_width = event->width;
156 video_height = event->height;
157 video_gtk_expose_callback(widget, NULL, data);
158 return TRUE;
159 }
161 uint16_t video_gtk_keycode_to_dckeysym(uint16_t keycode)
162 {
163 if( keycode >= 'a' && keycode <= 'z' ) {
164 return (keycode - 'a') + DCKB_A;
165 } else if( keycode >= '1' && keycode <= '9' ) {
166 return (keycode - '1') + DCKB_1;
167 }
168 switch(keycode) {
169 case GDK_0: return DCKB_0;
170 case GDK_Return: return DCKB_ENTER;
171 case GDK_Escape: return DCKB_ESCAPE;
172 case GDK_BackSpace: return DCKB_BACKSPACE;
173 case GDK_Tab: return DCKB_TAB;
174 case GDK_space: return DCKB_SPACE;
175 case GDK_minus: return DCKB_MINUS;
176 case GDK_equal: return DCKB_EQUAL;
177 case GDK_bracketleft: return DCKB_LBRACKET;
178 case GDK_bracketright: return DCKB_RBRACKET;
179 case GDK_semicolon: return DCKB_SEMICOLON;
180 case GDK_apostrophe:return DCKB_QUOTE;
181 case GDK_grave : return DCKB_BACKQUOTE;
182 case GDK_comma: return DCKB_COMMA;
183 case GDK_period: return DCKB_PERIOD;
184 case GDK_slash: return DCKB_SLASH;
185 case GDK_Caps_Lock: return DCKB_CAPSLOCK;
186 case GDK_F1: return DCKB_F1;
187 case GDK_F2: return DCKB_F2;
188 case GDK_F3: return DCKB_F3;
189 case GDK_F4: return DCKB_F4;
190 case GDK_F5: return DCKB_F5;
191 case GDK_F6: return DCKB_F6;
192 case GDK_F7: return DCKB_F7;
193 case GDK_F8: return DCKB_F8;
194 case GDK_F9: return DCKB_F9;
195 case GDK_F10: return DCKB_F10;
196 case GDK_F11: return DCKB_F11;
197 case GDK_F12: return DCKB_F12;
198 case GDK_Scroll_Lock: return DCKB_SCROLLLOCK;
199 case GDK_Pause: return DCKB_PAUSE;
200 case GDK_Insert: return DCKB_INSERT;
201 case GDK_Home: return DCKB_HOME;
202 case GDK_Page_Up: return DCKB_PAGEUP;
203 case GDK_Delete: return DCKB_DELETE;
204 case GDK_End: return DCKB_END;
205 case GDK_Page_Down: return DCKB_PAGEDOWN;
206 case GDK_Right: return DCKB_RIGHT;
207 case GDK_Left: return DCKB_LEFT;
208 case GDK_Down: return DCKB_DOWN;
209 case GDK_Up: return DCKB_UP;
210 case GDK_Num_Lock: return DCKB_NUMLOCK;
211 case GDK_KP_Divide: return DCKB_KP_SLASH;
212 case GDK_KP_Multiply: return DCKB_KP_STAR;
213 case GDK_KP_Subtract: return DCKB_KP_MINUS;
214 case GDK_KP_Add: return DCKB_KP_PLUS;
215 case GDK_KP_Enter: return DCKB_KP_ENTER;
216 case GDK_KP_End: return DCKB_KP_1;
217 case GDK_KP_Down: return DCKB_KP_2;
218 case GDK_KP_Page_Down: return DCKB_KP_3;
219 case GDK_KP_Left: return DCKB_KP_4;
220 case GDK_KP_Begin: return DCKB_KP_5;
221 case GDK_KP_Right: return DCKB_KP_6;
222 case GDK_KP_Home: return DCKB_KP_7;
223 case GDK_KP_Up: return DCKB_KP_8;
224 case GDK_KP_Page_Up:return DCKB_KP_9;
225 case GDK_KP_Insert: return DCKB_KP_0;
226 case GDK_KP_Delete: return DCKB_KP_PERIOD;
227 case GDK_backslash: return DCKB_BACKSLASH;
228 case GDK_Control_L: return DCKB_CONTROL_L;
229 case GDK_Shift_L: return DCKB_SHIFT_L;
230 case GDK_Alt_L: return DCKB_ALT_L;
231 case GDK_Meta_L: return DCKB_S1;
232 case GDK_Control_R: return DCKB_CONTROL_R;
233 case GDK_Shift_R: return DCKB_SHIFT_R;
234 case GDK_Alt_R: return DCKB_ALT_R;
235 case GDK_Meta_R: return DCKB_S2;
236 }
237 return DCKB_NONE;
238 }
240 GtkWidget *video_gtk_create_drawable()
241 {
242 GtkWidget *drawable = gtk_drawing_area_new();
243 GTK_WIDGET_SET_FLAGS(drawable, GTK_CAN_FOCUS|GTK_CAN_DEFAULT);
245 g_signal_connect( drawable, "expose_event",
246 G_CALLBACK(video_gtk_expose_callback), NULL );
247 g_signal_connect( drawable, "configure_event",
248 G_CALLBACK(video_gtk_resize_callback), NULL );
250 #ifdef HAVE_GLX
251 Display *display = gdk_x11_display_get_xdisplay( gtk_widget_get_display(drawable));
252 Screen *screen = gdk_x11_screen_get_xscreen( gtk_widget_get_screen(drawable));
253 int screen_no = XScreenNumberOfScreen(screen);
254 if( !video_glx_init(display, screen_no) ) {
255 ERROR( "Unable to initialize GLX, aborting" );
256 exit(3);
257 }
259 XVisualInfo *visual = video_glx_get_visual();
260 if( visual != NULL ) {
261 GdkVisual *gdkvis = gdk_x11_screen_lookup_visual( gtk_widget_get_screen(drawable), visual->visualid );
262 GdkColormap *colormap = gdk_colormap_new( gdkvis, FALSE );
263 gtk_widget_set_colormap( drawable, colormap );
264 }
265 #endif
266 gtk_video_drawable = drawable;
267 return drawable;
268 }
270 gboolean video_gtk_init()
271 {
273 if( gtk_video_drawable == NULL ) {
274 return FALSE;
275 }
277 video_width = gtk_video_drawable->allocation.width;
278 video_height = gtk_video_drawable->allocation.height;
279 #ifdef HAVE_OSMESA
280 video_gdk_init_driver( &display_gtk_driver );
281 #else
282 #ifdef HAVE_GLX
283 Display *display = gdk_x11_display_get_xdisplay( gtk_widget_get_display(GTK_WIDGET(gtk_video_drawable)));
284 Window window = GDK_WINDOW_XWINDOW( GTK_WIDGET(gtk_video_drawable)->window );
285 if( ! video_glx_init_context( display, window ) ||
286 ! video_glx_init_driver( &display_gtk_driver ) ) {
287 return FALSE;
288 }
289 #else
290 #ifdef HAVE_NSGL
291 NSView *view = gdk_quartz_window_get_nsview(gtk_video_drawable->window);
292 if( ! video_nsgl_init_driver( view, &display_gtk_driver ) ) {
293 return FALSE;
294 }
295 #endif
296 #endif
297 #endif
299 pvr2_setup_gl_context();
301 #ifdef HAVE_LINUX_JOYSTICK
302 linux_joystick_init();
303 #endif
304 return TRUE;
305 }
307 gboolean video_gtk_display_blank( uint32_t colour )
308 {
309 GdkGC *gc = gdk_gc_new(gtk_video_drawable->window);
310 GdkColor color = {0, ((colour>>16)&0xFF)*257, ((colour>>8)&0xFF)*257, ((colour)&0xFF)*257 };
311 GdkColormap *cmap = gdk_colormap_get_system();
312 gdk_colormap_alloc_color( cmap, &color, TRUE, TRUE );
313 gdk_gc_set_foreground( gc, &color );
314 gdk_gc_set_background( gc, &color );
315 gdk_draw_rectangle( gtk_video_drawable->window, gc, TRUE, 0, 0, video_width, video_height );
316 gdk_gc_destroy(gc);
317 gdk_colormap_free_colors( cmap, &color, 1 );
318 }
320 void video_gtk_shutdown()
321 {
322 if( gtk_video_drawable != NULL ) {
323 #ifdef HAVE_OSMESA
324 video_gdk_shutdown();
325 #else
326 #ifdef HAVE_GLX
327 video_glx_shutdown();
328 #else
329 #ifdef HAVE_NSGL
330 video_nsgl_shutdown();
331 #endif
332 #endif
333 #endif
334 }
335 #ifdef HAVE_LINUX_JOYSTICK
336 linux_joystick_shutdown();
337 #endif
338 }
.