Maemo frontend
[pcsx_rearmed.git] / maemo / hildon.c
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
8 GdkImage *image;
9 HildonAnimationActor *actor;
10 GtkWidget *window, *drawing;
11
12 #define X_RES           800
13 #define Y_RES           480
14 #define D_WIDTH                 640
15 #define D_HEIGHT                480
16
17 int screen_size;
18
19 void *pl_fbdev_buf=NULL;
20 int keymap[65536];
21 void hildon_quit();
22 unsigned long keys = 0;
23
24 static void
25 window_key_proxy (GtkWidget *widget,
26                      GdkEventKey *event,
27                      gpointer user_data)
28 {
29         unsigned long key = 0;
30 switch(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 }
116 unsigned long int gp2x_joystick_read();
117 unsigned 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
188 void hildon_quit()
189 {
190         gtk_main_quit();
191         exit(0);
192 }
193 void plat_finish(){hildon_quit();}
194
195 void 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
239 void 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
260 unsigned 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
270 void gp2x_video_RGB_clearscreen16(void)
271 {
272         //if (screenbuffer && screen_size)
273         //      memset(pl_fbdev_buf, 0, screen_size);
274 }
275
276 void pl_fbdev_flip()
277 {
278         gtk_widget_queue_draw (drawing);
279 }
280
281 void 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
316 void pl_frame_limit(void){
317 }
318
319 void pl_fbdev_close(void){
320 }
321
322 void pl_fbdev_open(void){
323          
324 }
325
326