frontend: fix screenshot functionality for pollux
[pcsx_rearmed.git] / maemo / hildon.c
CommitLineData
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
76f7048e 16int g_layer_x = (X_RES - D_WIDTH) / 2;
17int g_layer_y = (Y_RES - D_HEIGHT) / 2;
18int g_layer_w = D_WIDTH, g_layer_h = D_HEIGHT;
19
e0c692d9 20static GdkImage *image;
21static HildonAnimationActor *actor;
22static GtkWidget *window, *drawing;
23
e0c692d9 24static int keymap[65536];
25
26// map psx4m compatible keymap to PSX keys
27static 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 44void hildon_quit()
45{
46 gtk_main_quit();
47 exit(0);
48}
b7b2fb41
B
49
50static void
e0c692d9 51window_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 109void plat_finish()
b7b2fb41 110{
e0c692d9 111 hildon_quit();
b7b2fb41 112}
b7b2fb41
B
113
114void 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 156void menu_loop(void)
157{
158}
159
76f7048e 160void *hildon_set_mode(int w, int h)
b7b2fb41 161{
b7b2fb41 162 if (w <= 0 || h <= 0)
76f7048e 163 return pl_vout_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
76f7048e 168 pl_vout_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
76f7048e 178 return pl_vout_buf;
b7b2fb41
B
179}
180
76f7048e 181void *hildon_flip(void)
b7b2fb41 182{
e0c692d9 183 gtk_widget_queue_draw (drawing);
e0c692d9 184
b7b2fb41
B
185 /* process GTK+ events */
186 while (gtk_events_pending())
187 gtk_main_iteration();
b7b2fb41 188
76f7048e 189 return pl_vout_buf;
b7b2fb41
B
190}
191
76f7048e 192int omap_enable_layer(int enabled)
b7b2fb41 193{
54b4a001 194 return 0;
b7b2fb41
B
195}
196
76f7048e 197void menu_notify_mode_change(int w, int h, int bpp)
29a8c4f3 198{
29a8c4f3 199}
200