Commit | Line | Data |
---|---|---|
b7b2fb41 B |
1 | #include <gtk/gtk.h> |
2 | #include <glib.h> | |
3 | #include <stdlib.h> | |
54b4a001 | 4 | #include <stdint.h> |
b7b2fb41 B |
5 | #include <unistd.h> |
6 | #include <hildon/hildon.h> | |
e0c692d9 | 7 | #include "plugin_lib.h" |
bbd471af | 8 | |
8f892648 | 9 | #include "main.h" |
6469a8c4 | 10 | #include "plat.h" |
54b4a001 | 11 | #include "../libpcsxcore/psemu_plugin_defs.h" |
bbd471af | 12 | #include "common/readpng.h" |
d64280d6 | 13 | #include "maemo_common.h" |
b7b2fb41 B |
14 | |
15 | #define X_RES 800 | |
16 | #define Y_RES 480 | |
17 | #define D_WIDTH 640 | |
18 | #define D_HEIGHT 480 | |
19 | ||
e0c692d9 | 20 | static GdkImage *image; |
21 | static HildonAnimationActor *actor; | |
22 | static GtkWidget *window, *drawing; | |
23 | ||
bbd471af B |
24 | static int pl_buf_w, pl_buf_h; |
25 | static int sens, y_def; | |
e0c692d9 | 26 | static int keymap[65536]; |
27 | ||
28 | // map psx4m compatible keymap to PSX keys | |
29 | static const unsigned char keymap2[14] = { | |
30 | DKEY_LEFT, // 0 | |
31 | DKEY_RIGHT, | |
32 | DKEY_UP, | |
33 | DKEY_DOWN, | |
34 | DKEY_CIRCLE, | |
35 | DKEY_CROSS, // 5 | |
36 | DKEY_TRIANGLE, | |
37 | DKEY_SQUARE, | |
38 | DKEY_SELECT, | |
39 | DKEY_START, | |
40 | DKEY_L2, // 10 | |
41 | DKEY_R2, | |
42 | DKEY_L1, | |
43 | DKEY_R1, | |
44 | }; | |
b7b2fb41 | 45 | |
e0c692d9 | 46 | void hildon_quit() |
47 | { | |
48 | gtk_main_quit(); | |
49 | exit(0); | |
50 | } | |
b7b2fb41 B |
51 | |
52 | static void | |
e0c692d9 | 53 | window_key_proxy(GtkWidget *widget, |
b7b2fb41 B |
54 | GdkEventKey *event, |
55 | gpointer user_data) | |
56 | { | |
e0c692d9 | 57 | int key, psxkey1 = -1, psxkey2 = -1; |
58 | ||
59 | key = keymap[event->hardware_keycode]; | |
60 | if (key < 0) | |
61 | return; | |
62 | ||
63 | if (key < ARRAY_SIZE(keymap2)) | |
64 | psxkey1 = keymap2[key]; | |
65 | else switch (key) { | |
66 | case 14: | |
67 | hildon_quit(); | |
68 | break; | |
69 | case 15: | |
70 | psxkey1 = DKEY_UP; | |
71 | psxkey2 = DKEY_LEFT; | |
72 | break; | |
73 | case 16: | |
74 | psxkey1 = DKEY_UP; | |
75 | psxkey2 = DKEY_RIGHT; | |
76 | break; | |
77 | case 17: | |
78 | psxkey1 = DKEY_DOWN; | |
79 | psxkey2 = DKEY_LEFT; | |
80 | break; | |
81 | case 18: | |
82 | psxkey1 = DKEY_DOWN; | |
83 | psxkey2 = DKEY_RIGHT; | |
84 | break; | |
85 | case 19: | |
8f892648 | 86 | if (event->type == GDK_KEY_PRESS) |
bbd471af B |
87 | { |
88 | emu_save_state(state_slot); | |
89 | char buf[MAXPATHLEN]; | |
90 | sprintf (buf,"/opt/maemo/usr/games/screenshots%s.%3.3d",file_name,state_slot); | |
91 | writepng(buf, image->mem, pl_buf_w,pl_buf_h); | |
92 | } | |
e0c692d9 | 93 | return; |
94 | case 20: | |
8f892648 | 95 | if (event->type == GDK_KEY_PRESS) |
bbd471af B |
96 | emu_load_state(state_slot); |
97 | return; | |
98 | case 21: | |
99 | if (event->type == GDK_KEY_PRESS) | |
100 | state_slot=(state_slot<9)?state_slot+1:0; | |
101 | return; | |
102 | case 22: | |
103 | if (event->type == GDK_KEY_PRESS) | |
104 | state_slot=(state_slot>0)?state_slot-1:8; | |
e0c692d9 | 105 | return; |
106 | } | |
107 | ||
b7b2fb41 | 108 | if (event->type == GDK_KEY_PRESS) { |
e0c692d9 | 109 | if (psxkey1 >= 0) |
54b4a001 | 110 | in_keystate |= 1 << psxkey1; |
e0c692d9 | 111 | if (psxkey2 >= 0) |
54b4a001 | 112 | in_keystate |= 1 << psxkey2; |
b7b2fb41 B |
113 | } |
114 | else if (event->type == GDK_KEY_RELEASE) { | |
e0c692d9 | 115 | if (psxkey1 >= 0) |
54b4a001 | 116 | in_keystate &= ~(1 << psxkey1); |
e0c692d9 | 117 | if (psxkey2 >= 0) |
54b4a001 | 118 | in_keystate &= ~(1 << psxkey2); |
8f892648 | 119 | |
120 | emu_set_action(SACTION_NONE); | |
b7b2fb41 B |
121 | } |
122 | } | |
b7b2fb41 | 123 | |
e0c692d9 | 124 | void plat_finish() |
b7b2fb41 | 125 | { |
e0c692d9 | 126 | hildon_quit(); |
b7b2fb41 | 127 | } |
b7b2fb41 B |
128 | |
129 | void maemo_init(int *argc, char ***argv) | |
130 | { | |
131 | FILE* pFile; | |
132 | pFile = fopen("/opt/psx4m/keys", "r"); // assume the file exists and has data | |
133 | int ch; | |
134 | int i=0; | |
135 | for (i=0;i<65536;i++) | |
136 | keymap[i]=164; | |
137 | if (NULL != pFile) { | |
138 | for(i=0;i<21;i++){ | |
139 | fscanf(pFile, "%i",&ch); | |
140 | keymap[ch]=i; | |
141 | } | |
142 | fclose(pFile); | |
143 | } | |
b7b2fb41 | 144 | |
bbd471af B |
145 | pFile = fopen("/opt/psx4m/config", "r"); |
146 | if (NULL != pFile) { | |
147 | fscanf(pFile, "%d %d",&sens,&y_def); | |
148 | fclose(pFile); | |
149 | } else { | |
150 | sens=150; | |
151 | y_def=500; //near 45 degrees =) | |
152 | } | |
153 | ||
b7b2fb41 B |
154 | gtk_init (argc, argv); |
155 | ||
156 | window = hildon_stackable_window_new (); | |
157 | gtk_widget_realize (window); | |
158 | gtk_window_fullscreen (GTK_WINDOW(window)); | |
159 | g_signal_connect (G_OBJECT (window), "key-press-event", | |
160 | G_CALLBACK (window_key_proxy), NULL); | |
161 | g_signal_connect (G_OBJECT (window), "key-release-event", | |
162 | G_CALLBACK (window_key_proxy), NULL); | |
163 | g_signal_connect (G_OBJECT (window), "delete_event", | |
164 | G_CALLBACK (hildon_quit), NULL); | |
165 | gtk_widget_add_events (window, | |
166 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); | |
167 | ||
168 | actor = HILDON_ANIMATION_ACTOR (hildon_animation_actor_new()); | |
d64280d6 | 169 | if (g_maemo_opts & 2) |
bbd471af B |
170 | hildon_animation_actor_set_position (actor, 0, 0 ); |
171 | else | |
172 | hildon_animation_actor_set_position (actor, (X_RES - D_WIDTH)/2, (Y_RES - D_HEIGHT)/2 ); | |
b7b2fb41 B |
173 | hildon_animation_actor_set_parent (actor, GTK_WINDOW (window)); |
174 | ||
175 | drawing = gtk_image_new (); | |
176 | ||
177 | gtk_container_add (GTK_CONTAINER (actor), drawing); | |
178 | ||
179 | gtk_widget_show_all (GTK_WIDGET (actor)); | |
180 | gtk_widget_show_all (GTK_WIDGET (window)); | |
6469a8c4 | 181 | |
182 | g_layer_x = (X_RES - D_WIDTH) / 2; | |
183 | g_layer_y = (Y_RES - D_HEIGHT) / 2; | |
184 | g_layer_w = D_WIDTH, g_layer_h = D_HEIGHT; | |
b7b2fb41 B |
185 | } |
186 | ||
8f892648 | 187 | void menu_loop(void) |
188 | { | |
189 | } | |
190 | ||
6469a8c4 | 191 | void *plat_gvideo_set_mode(int *w_, int *h_, int *bpp_) |
b7b2fb41 | 192 | { |
6469a8c4 | 193 | int w = *w_, h = *h_; |
194 | ||
b7b2fb41 | 195 | if (w <= 0 || h <= 0) |
76f7048e | 196 | return pl_vout_buf; |
b7b2fb41 B |
197 | |
198 | if (image) gdk_image_destroy(image); | |
199 | image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), w, h ); | |
200 | ||
76f7048e | 201 | pl_vout_buf = (void *) image->mem; |
b7b2fb41 B |
202 | |
203 | gtk_image_set_from_image (GTK_IMAGE(drawing), image, NULL); | |
204 | ||
205 | gtk_window_resize (GTK_WINDOW (actor), w, h); | |
d64280d6 | 206 | if (g_maemo_opts & 2) |
bbd471af B |
207 | hildon_animation_actor_set_scale (actor, |
208 | (gdouble)800 / (gdouble)w, | |
209 | (gdouble)480 / (gdouble)h | |
210 | ); | |
211 | else | |
212 | hildon_animation_actor_set_scale (actor, | |
b7b2fb41 B |
213 | (gdouble)D_WIDTH / (gdouble)w, |
214 | (gdouble)D_HEIGHT / (gdouble)h | |
bbd471af B |
215 | ); |
216 | pl_buf_w=w;pl_buf_h=h; | |
76f7048e | 217 | return pl_vout_buf; |
b7b2fb41 B |
218 | } |
219 | ||
6469a8c4 | 220 | void *plat_gvideo_flip(void) |
b7b2fb41 | 221 | { |
e0c692d9 | 222 | gtk_widget_queue_draw (drawing); |
e0c692d9 | 223 | |
bbd471af | 224 | // process accelometer |
d64280d6 | 225 | if (g_maemo_opts & 4) { |
bbd471af B |
226 | int x, y, z; |
227 | FILE* f = fopen( "/sys/class/i2c-adapter/i2c-3/3-001d/coord", "r" ); | |
228 | if( !f ) {printf ("err in accel"); exit(1);} | |
229 | fscanf( f, "%d %d %d", &x, &y, &z ); | |
230 | fclose( f ); | |
231 | ||
d64280d6 | 232 | if( x > sens ) in_keystate |= 1 << DKEY_LEFT; |
233 | else if( x < -sens ) in_keystate |= 1 << DKEY_RIGHT; | |
234 | else {in_keystate &= ~(1 << DKEY_LEFT);in_keystate &= ~(1 << DKEY_RIGHT);} | |
bbd471af B |
235 | |
236 | y+=y_def; | |
d64280d6 | 237 | if( y > sens )in_keystate |= 1 << DKEY_UP; |
238 | else if( y < -sens ) in_keystate |= 1 << DKEY_DOWN; | |
239 | else {in_keystate &= ~(1 << DKEY_DOWN);in_keystate &= ~(1 << DKEY_UP);} | |
bbd471af B |
240 | |
241 | } | |
242 | ||
b7b2fb41 B |
243 | /* process GTK+ events */ |
244 | while (gtk_events_pending()) | |
245 | gtk_main_iteration(); | |
b7b2fb41 | 246 | |
76f7048e | 247 | return pl_vout_buf; |
b7b2fb41 B |
248 | } |
249 | ||
6469a8c4 | 250 | void plat_gvideo_open(void) |
b7b2fb41 | 251 | { |
b7b2fb41 B |
252 | } |
253 | ||
6469a8c4 | 254 | void plat_gvideo_close(void) |
29a8c4f3 | 255 | { |
29a8c4f3 | 256 | } |
257 | ||
88d6397d | 258 | void *plat_prepare_screenshot(int *w, int *h, int *bpp) |
259 | { | |
260 | return NULL; | |
261 | } | |
262 | ||
221be40d | 263 | void plat_step_volume(int is_up) |
264 | { | |
265 | } | |
266 | ||
3a40ff14 | 267 | void plat_trigger_vibrate(int is_strong) |
b944a30e | 268 | { |
269 | } | |
a805c855 | 270 | |
271 | void plat_minimize(void) | |
272 | { | |
273 | } |