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" |
8f892648 | 8 | #include "main.h" |
54b4a001 | 9 | #include "../libpcsxcore/psemu_plugin_defs.h" |
b7b2fb41 B |
10 | |
11 | #define X_RES 800 | |
12 | #define Y_RES 480 | |
13 | #define D_WIDTH 640 | |
14 | #define D_HEIGHT 480 | |
15 | ||
e0c692d9 | 16 | static GdkImage *image; |
17 | static HildonAnimationActor *actor; | |
18 | static GtkWidget *window, *drawing; | |
19 | ||
20 | void *pl_fbdev_buf; | |
54b4a001 | 21 | int in_type = PSE_PAD_TYPE_STANDARD; |
22 | int in_keystate, in_a1[2], in_a2[2]; | |
e0c692d9 | 23 | |
24 | static int keymap[65536]; | |
25 | ||
26 | // map psx4m compatible keymap to PSX keys | |
27 | static const unsigned char keymap2[14] = { | |
28 | DKEY_LEFT, // 0 | |
29 | DKEY_RIGHT, | |
30 | DKEY_UP, | |
31 | DKEY_DOWN, | |
32 | DKEY_CIRCLE, | |
33 | DKEY_CROSS, // 5 | |
34 | DKEY_TRIANGLE, | |
35 | DKEY_SQUARE, | |
36 | DKEY_SELECT, | |
37 | DKEY_START, | |
38 | DKEY_L2, // 10 | |
39 | DKEY_R2, | |
40 | DKEY_L1, | |
41 | DKEY_R1, | |
42 | }; | |
b7b2fb41 | 43 | |
e0c692d9 | 44 | void hildon_quit() |
45 | { | |
46 | gtk_main_quit(); | |
47 | exit(0); | |
48 | } | |
b7b2fb41 B |
49 | |
50 | static void | |
e0c692d9 | 51 | window_key_proxy(GtkWidget *widget, |
b7b2fb41 B |
52 | GdkEventKey *event, |
53 | gpointer user_data) | |
54 | { | |
e0c692d9 | 55 | int key, psxkey1 = -1, psxkey2 = -1; |
56 | ||
57 | key = keymap[event->hardware_keycode]; | |
58 | if (key < 0) | |
59 | return; | |
60 | ||
61 | if (key < ARRAY_SIZE(keymap2)) | |
62 | psxkey1 = keymap2[key]; | |
63 | else switch (key) { | |
64 | case 14: | |
65 | hildon_quit(); | |
66 | break; | |
67 | case 15: | |
68 | psxkey1 = DKEY_UP; | |
69 | psxkey2 = DKEY_LEFT; | |
70 | break; | |
71 | case 16: | |
72 | psxkey1 = DKEY_UP; | |
73 | psxkey2 = DKEY_RIGHT; | |
74 | break; | |
75 | case 17: | |
76 | psxkey1 = DKEY_DOWN; | |
77 | psxkey2 = DKEY_LEFT; | |
78 | break; | |
79 | case 18: | |
80 | psxkey1 = DKEY_DOWN; | |
81 | psxkey2 = DKEY_RIGHT; | |
82 | break; | |
83 | case 19: | |
8f892648 | 84 | if (event->type == GDK_KEY_PRESS) |
85 | emu_set_action(SACTION_SAVE_STATE); | |
e0c692d9 | 86 | return; |
87 | case 20: | |
8f892648 | 88 | if (event->type == GDK_KEY_PRESS) |
89 | emu_set_action(SACTION_LOAD_STATE); | |
e0c692d9 | 90 | return; |
91 | } | |
92 | ||
b7b2fb41 | 93 | if (event->type == GDK_KEY_PRESS) { |
e0c692d9 | 94 | if (psxkey1 >= 0) |
54b4a001 | 95 | in_keystate |= 1 << psxkey1; |
e0c692d9 | 96 | if (psxkey2 >= 0) |
54b4a001 | 97 | in_keystate |= 1 << psxkey2; |
b7b2fb41 B |
98 | } |
99 | else if (event->type == GDK_KEY_RELEASE) { | |
e0c692d9 | 100 | if (psxkey1 >= 0) |
54b4a001 | 101 | in_keystate &= ~(1 << psxkey1); |
e0c692d9 | 102 | if (psxkey2 >= 0) |
54b4a001 | 103 | in_keystate &= ~(1 << psxkey2); |
8f892648 | 104 | |
105 | emu_set_action(SACTION_NONE); | |
b7b2fb41 B |
106 | } |
107 | } | |
b7b2fb41 | 108 | |
e0c692d9 | 109 | void plat_finish() |
b7b2fb41 | 110 | { |
e0c692d9 | 111 | hildon_quit(); |
b7b2fb41 | 112 | } |
b7b2fb41 B |
113 | |
114 | void maemo_init(int *argc, char ***argv) | |
115 | { | |
116 | FILE* pFile; | |
117 | pFile = fopen("/opt/psx4m/keys", "r"); // assume the file exists and has data | |
118 | int ch; | |
119 | int i=0; | |
120 | for (i=0;i<65536;i++) | |
121 | keymap[i]=164; | |
122 | if (NULL != pFile) { | |
123 | for(i=0;i<21;i++){ | |
124 | fscanf(pFile, "%i",&ch); | |
125 | keymap[ch]=i; | |
126 | } | |
127 | fclose(pFile); | |
128 | } | |
b7b2fb41 B |
129 | |
130 | gtk_init (argc, argv); | |
131 | ||
132 | window = hildon_stackable_window_new (); | |
133 | gtk_widget_realize (window); | |
134 | gtk_window_fullscreen (GTK_WINDOW(window)); | |
135 | g_signal_connect (G_OBJECT (window), "key-press-event", | |
136 | G_CALLBACK (window_key_proxy), NULL); | |
137 | g_signal_connect (G_OBJECT (window), "key-release-event", | |
138 | G_CALLBACK (window_key_proxy), NULL); | |
139 | g_signal_connect (G_OBJECT (window), "delete_event", | |
140 | G_CALLBACK (hildon_quit), NULL); | |
141 | gtk_widget_add_events (window, | |
142 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); | |
143 | ||
144 | actor = HILDON_ANIMATION_ACTOR (hildon_animation_actor_new()); | |
145 | hildon_animation_actor_set_position (actor, (X_RES - D_WIDTH)/2, (Y_RES - D_HEIGHT)/2 ); | |
146 | hildon_animation_actor_set_parent (actor, GTK_WINDOW (window)); | |
147 | ||
148 | drawing = gtk_image_new (); | |
149 | ||
150 | gtk_container_add (GTK_CONTAINER (actor), drawing); | |
151 | ||
152 | gtk_widget_show_all (GTK_WIDGET (actor)); | |
153 | gtk_widget_show_all (GTK_WIDGET (window)); | |
154 | } | |
155 | ||
8f892648 | 156 | void menu_loop(void) |
157 | { | |
158 | } | |
159 | ||
e0c692d9 | 160 | void *pl_fbdev_set_mode(int w, int h, int bpp) |
b7b2fb41 | 161 | { |
b7b2fb41 | 162 | if (w <= 0 || h <= 0) |
54b4a001 | 163 | return pl_fbdev_buf; |
b7b2fb41 B |
164 | |
165 | if (image) gdk_image_destroy(image); | |
166 | image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), w, h ); | |
167 | ||
e0c692d9 | 168 | pl_fbdev_buf = (void *) image->mem; |
b7b2fb41 B |
169 | |
170 | gtk_image_set_from_image (GTK_IMAGE(drawing), image, NULL); | |
171 | ||
172 | gtk_window_resize (GTK_WINDOW (actor), w, h); | |
173 | hildon_animation_actor_set_scale (actor, | |
174 | (gdouble)D_WIDTH / (gdouble)w, | |
175 | (gdouble)D_HEIGHT / (gdouble)h | |
176 | ); | |
e0c692d9 | 177 | |
178 | return pl_fbdev_buf; | |
b7b2fb41 B |
179 | } |
180 | ||
e0c692d9 | 181 | void *pl_fbdev_flip(void) |
b7b2fb41 | 182 | { |
e0c692d9 | 183 | gtk_widget_queue_draw (drawing); |
54b4a001 | 184 | return pl_fbdev_buf; |
e0c692d9 | 185 | } |
186 | ||
187 | void pl_frame_limit(void) | |
188 | { | |
189 | extern void CheckFrameRate(void); | |
190 | //CheckFrameRate(); | |
191 | ||
b7b2fb41 B |
192 | /* process GTK+ events */ |
193 | while (gtk_events_pending()) | |
194 | gtk_main_iteration(); | |
b7b2fb41 B |
195 | } |
196 | ||
e0c692d9 | 197 | void pl_fbdev_close(void) |
b7b2fb41 | 198 | { |
b7b2fb41 B |
199 | } |
200 | ||
e0c692d9 | 201 | int pl_fbdev_open(void) |
b7b2fb41 | 202 | { |
54b4a001 | 203 | return 0; |
b7b2fb41 B |
204 | } |
205 | ||
e0c692d9 | 206 | static void pl_get_layer_pos(int *x, int *y, int *w, int *h) |
b7b2fb41 | 207 | { |
e0c692d9 | 208 | *x = 0; |
209 | *y = 0; | |
210 | *w = 800; | |
211 | *h = 640; | |
b7b2fb41 B |
212 | } |
213 | ||
29a8c4f3 | 214 | void *pl_prepare_screenshot(int *w, int *h, int *bpp) |
215 | { | |
216 | return NULL; | |
217 | } | |
218 | ||
219 | int writepng() | |
220 | { | |
221 | return -1; | |
222 | } | |
223 | ||
e0c692d9 | 224 | extern int UseFrameSkip; // hmh |
b7b2fb41 | 225 | |
e0c692d9 | 226 | const struct rearmed_cbs pl_rearmed_cbs = { |
227 | pl_get_layer_pos, | |
228 | pl_fbdev_open, | |
229 | pl_fbdev_set_mode, | |
230 | pl_fbdev_flip, | |
231 | pl_fbdev_close, | |
232 | &UseFrameSkip, | |
233 | }; | |
b7b2fb41 | 234 |