Maemo frontend
[pcsx_rearmed.git] / maemo / hildon.c
... / ...
CommitLineData
1#include <gtk/gtk.h>
2#include <glib.h>
3#include <stdlib.h>
4#include <unistd.h>
5#include <hildon/hildon.h>
6#include "minimal.h"
7
8GdkImage *image;
9HildonAnimationActor *actor;
10GtkWidget *window, *drawing;
11
12#define X_RES 800
13#define Y_RES 480
14#define D_WIDTH 640
15#define D_HEIGHT 480
16
17int screen_size;
18
19void *pl_fbdev_buf=NULL;
20int keymap[65536];
21void hildon_quit();
22unsigned long keys = 0;
23
24static void
25window_key_proxy (GtkWidget *widget,
26 GdkEventKey *event,
27 gpointer user_data)
28{
29 unsigned long key = 0;
30switch(keymap[event->hardware_keycode]){
31 case -1:
32 return; break;
33 case 0:
34 key = GP2X_LEFT;break;
35 case 1:
36 key = GP2X_RIGHT;break;
37 case 2:
38 key = GP2X_UP;break;
39 case 3:
40 key = GP2X_DOWN;break;
41 case 4:
42 key = GP2X_B;break;
43 case 5:
44 key = GP2X_X;break;
45 case 6:
46 key = GP2X_Y;break;
47 case 7:
48 key = GP2X_A;break;
49 case 8:
50 key = GP2X_SELECT;break;
51 case 9:
52 key = GP2X_START;break;
53 case 10:
54 key = GP2X_VOL_DOWN;break;
55 case 11:
56 key = GP2X_VOL_UP;break;
57 case 12:
58 key = GP2X_L;break;
59 case 13:
60 key = GP2X_R;break;
61 case 14:
62 hildon_quit();break;
63 case 15:
64 if (event->type == GDK_KEY_PRESS){
65 keys |= GP2X_LEFT;
66 keys |= GP2X_UP;
67 }else if (event->type == GDK_KEY_RELEASE){
68 keys &= ~GP2X_LEFT;
69 keys &= ~GP2X_UP;
70 }
71 key = -1; return ; break;
72 case 16:
73 if (event->type == GDK_KEY_PRESS){
74 keys |= GP2X_RIGHT;
75 keys |= GP2X_UP;
76 }else if (event->type == GDK_KEY_RELEASE){
77 keys &= ~GP2X_RIGHT;
78 keys &= ~GP2X_UP;
79 }
80 key = -1; return ; break;
81 case 17:
82 if (event->type == GDK_KEY_PRESS){
83 keys |= GP2X_LEFT;
84 keys |= GP2X_DOWN;
85 }else if (event->type == GDK_KEY_RELEASE){
86 keys &= ~GP2X_LEFT;
87 keys &= ~GP2X_DOWN;
88 }
89 key = -1; return ; break;
90 case 18:
91 if (event->type == GDK_KEY_PRESS){
92 keys |= GP2X_RIGHT;
93 keys |= GP2X_DOWN;
94 }else if (event->type == GDK_KEY_RELEASE){
95 keys &= ~GP2X_RIGHT;
96 keys &= ~GP2X_DOWN;
97 }
98 key = -1; return ; break;
99/* case 19:
100 SaveState(cfile);
101 key = -1; return ; break;
102 break;
103 case 20:
104 LoadState(cfile);
105 key = -1; return ; break;*/
106 break;
107}
108
109 if (event->type == GDK_KEY_PRESS) {
110 keys |= key;
111 }
112 else if (event->type == GDK_KEY_RELEASE) {
113 keys &= ~key;
114 }
115}
116unsigned long int gp2x_joystick_read();
117unsigned int ReadZodKeys()
118{
119 unsigned int pad_status = 0xffff;
120 unsigned long int keys = gp2x_joystick_read();
121
122
123 if( keys & GP2X_VOL_DOWN ) // L2
124 {
125 pad_status &= ~(1<<8);
126 }
127 if (keys & GP2X_L)
128 {
129 pad_status &= ~(1<<10); // L ?
130 }
131
132
133
134 if( keys & GP2X_VOL_UP ) // R2
135 {
136 pad_status &= ~(1<<9);
137 }
138 if (keys & GP2X_R)
139 {
140 pad_status &= ~(1<<11); // R ?
141 }
142
143 if (keys & GP2X_UP)
144 {
145 pad_status &= ~(1<<4);
146 }
147 if (keys & GP2X_DOWN)
148 {
149 pad_status &= ~(1<<6);
150 }
151 if (keys & GP2X_LEFT)
152 {
153 pad_status &= ~(1<<7);
154 }
155 if (keys & GP2X_RIGHT)
156 {
157 pad_status &= ~(1<<5);
158 }
159 if (keys & GP2X_START)
160 {
161 pad_status &= ~(1<<3);
162 }
163 if (keys & GP2X_SELECT)
164 {
165 pad_status &= ~(1);
166 }
167
168 if (keys & GP2X_X)
169 {
170 pad_status &= ~(1<<14);
171 }
172 if (keys & GP2X_B)
173 {
174 pad_status &= ~(1<<13);
175 }
176 if (keys & GP2X_A)
177 {
178 pad_status &= ~(1<<15);
179 }
180 if (keys & GP2X_Y)
181 {
182 pad_status &= ~(1<<12);
183 }
184
185 return pad_status;
186}
187
188void hildon_quit()
189{
190 gtk_main_quit();
191 exit(0);
192}
193void plat_finish(){hildon_quit();}
194
195void maemo_init(int *argc, char ***argv)
196{
197 FILE* pFile;
198 pFile = fopen("/opt/psx4m/keys", "r"); // assume the file exists and has data
199 int ch;
200 int i=0;
201 for (i=0;i<65536;i++)
202 keymap[i]=164;
203 if (NULL != pFile) {
204 for(i=0;i<21;i++){
205 fscanf(pFile, "%i",&ch);
206 keymap[ch]=i;
207 }
208 fclose(pFile);
209 }
210
211
212 gtk_init (argc, argv);
213
214 window = hildon_stackable_window_new ();
215 gtk_widget_realize (window);
216 gtk_window_fullscreen (GTK_WINDOW(window));
217 g_signal_connect (G_OBJECT (window), "key-press-event",
218 G_CALLBACK (window_key_proxy), NULL);
219 g_signal_connect (G_OBJECT (window), "key-release-event",
220 G_CALLBACK (window_key_proxy), NULL);
221 g_signal_connect (G_OBJECT (window), "delete_event",
222 G_CALLBACK (hildon_quit), NULL);
223 gtk_widget_add_events (window,
224 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
225
226 actor = HILDON_ANIMATION_ACTOR (hildon_animation_actor_new());
227 hildon_animation_actor_set_position (actor, (X_RES - D_WIDTH)/2, (Y_RES - D_HEIGHT)/2 );
228 hildon_animation_actor_set_parent (actor, GTK_WINDOW (window));
229
230 drawing = gtk_image_new ();
231
232 gtk_container_add (GTK_CONTAINER (actor), drawing);
233
234 gtk_widget_show_all (GTK_WIDGET (actor));
235 gtk_widget_show_all (GTK_WIDGET (window));
236}
237
238
239void pl_fbdev_set_mode(int w, int h,int bpp)
240{
241//if (bpp==24){w=800;h=480;}
242 if (w <= 0 || h <= 0)
243 return;
244
245 if (image) gdk_image_destroy(image);
246 image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), w, h );
247
248 pl_fbdev_buf = (void*) image->mem;
249 screen_size = image->bpl * h * image->bpp;
250
251 gtk_image_set_from_image (GTK_IMAGE(drawing), image, NULL);
252
253 gtk_window_resize (GTK_WINDOW (actor), w, h);
254 hildon_animation_actor_set_scale (actor,
255 (gdouble)D_WIDTH / (gdouble)w,
256 (gdouble)D_HEIGHT / (gdouble)h
257 );
258}
259
260unsigned long gp2x_joystick_read(void)
261{
262 //printf("gp2x_joystick_read\n");
263 /* process GTK+ events */
264 while (gtk_events_pending())
265 gtk_main_iteration();
266
267 return keys;
268}
269
270void gp2x_video_RGB_clearscreen16(void)
271{
272 //if (screenbuffer && screen_size)
273 // memset(pl_fbdev_buf, 0, screen_size);
274}
275
276void pl_fbdev_flip()
277{
278 gtk_widget_queue_draw (drawing);
279}
280
281void gp2x_printfchar15(gp2x_font *f, unsigned char c)
282{
283 unsigned short *dst=&((unsigned short*)pl_fbdev_buf)[f->x+f->y*(image->bpl>>1)],w,h=f->h;
284//unsigned char *src=f->data[ (c%16)*f->w + (c/16)*f->h ];
285 unsigned char *src=&f->data[c*10];
286
287 if(f->solid)
288 while(h--)
289 {
290 w=f->wmask;
291 while(w)
292 {
293 if( *src & w ) *dst++=f->fg; else *dst++=f->bg;
294 w>>=1;
295 }
296 src++;
297
298 dst+=(image->bpl>>1)-(f->w);
299 }
300 else
301 while(h--)
302 {
303 w=f->wmask;
304 while(w)
305 {
306 if( *src & w ) *dst=f->fg;
307 dst++;
308 w>>=1;
309 }
310 src++;
311
312 dst+=(image->bpl>>1)-(f->w);
313 }
314}
315
316void pl_frame_limit(void){
317}
318
319void pl_fbdev_close(void){
320}
321
322void pl_fbdev_open(void){
323
324}
325
326