X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=maemo%2Fhildon.c;h=8e7635a6c09b223d7f3f3852518b0340c9718a0f;hp=41d8f63f915b52311d0c08545fd0720986128e36;hb=ac6575cdd93d665efc374c1a14b391c6a5308972;hpb=b7b2fb4165eee505bc05cbf23309bb5ed4289494 diff --git a/maemo/hildon.c b/maemo/hildon.c index 41d8f63f..8e7635a6 100644 --- a/maemo/hildon.c +++ b/maemo/hildon.c @@ -1,196 +1,130 @@ #include #include #include +#include #include #include -#include "minimal.h" +#include "plugin_lib.h" -GdkImage *image; -HildonAnimationActor *actor; -GtkWidget *window, *drawing; +#include "main.h" +#include "plat.h" +#include "../libpcsxcore/psemu_plugin_defs.h" +#include "common/readpng.h" +#include "maemo_common.h" #define X_RES 800 #define Y_RES 480 #define D_WIDTH 640 #define D_HEIGHT 480 -int screen_size; +static GdkImage *image; +static HildonAnimationActor *actor; +static GtkWidget *window, *drawing; + +static int pl_buf_w, pl_buf_h; +static int sens, y_def; +static int keymap[65536]; + +// map psx4m compatible keymap to PSX keys +static const unsigned char keymap2[14] = { + DKEY_LEFT, // 0 + DKEY_RIGHT, + DKEY_UP, + DKEY_DOWN, + DKEY_CIRCLE, + DKEY_CROSS, // 5 + DKEY_TRIANGLE, + DKEY_SQUARE, + DKEY_SELECT, + DKEY_START, + DKEY_L2, // 10 + DKEY_R2, + DKEY_L1, + DKEY_R1, +}; -void *pl_fbdev_buf=NULL; -int keymap[65536]; -void hildon_quit(); -unsigned long keys = 0; +void hildon_quit() +{ + gtk_main_quit(); + exit(0); +} static void -window_key_proxy (GtkWidget *widget, +window_key_proxy(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { - unsigned long key = 0; -switch(keymap[event->hardware_keycode]){ - case -1: - return; break; - case 0: - key = GP2X_LEFT;break; - case 1: - key = GP2X_RIGHT;break; - case 2: - key = GP2X_UP;break; - case 3: - key = GP2X_DOWN;break; - case 4: - key = GP2X_B;break; - case 5: - key = GP2X_X;break; - case 6: - key = GP2X_Y;break; - case 7: - key = GP2X_A;break; - case 8: - key = GP2X_SELECT;break; - case 9: - key = GP2X_START;break; - case 10: - key = GP2X_VOL_DOWN;break; - case 11: - key = GP2X_VOL_UP;break; - case 12: - key = GP2X_L;break; - case 13: - key = GP2X_R;break; - case 14: - hildon_quit();break; - case 15: - if (event->type == GDK_KEY_PRESS){ - keys |= GP2X_LEFT; - keys |= GP2X_UP; - }else if (event->type == GDK_KEY_RELEASE){ - keys &= ~GP2X_LEFT; - keys &= ~GP2X_UP; - } - key = -1; return ; break; - case 16: - if (event->type == GDK_KEY_PRESS){ - keys |= GP2X_RIGHT; - keys |= GP2X_UP; - }else if (event->type == GDK_KEY_RELEASE){ - keys &= ~GP2X_RIGHT; - keys &= ~GP2X_UP; - } - key = -1; return ; break; - case 17: - if (event->type == GDK_KEY_PRESS){ - keys |= GP2X_LEFT; - keys |= GP2X_DOWN; - }else if (event->type == GDK_KEY_RELEASE){ - keys &= ~GP2X_LEFT; - keys &= ~GP2X_DOWN; - } - key = -1; return ; break; - case 18: - if (event->type == GDK_KEY_PRESS){ - keys |= GP2X_RIGHT; - keys |= GP2X_DOWN; - }else if (event->type == GDK_KEY_RELEASE){ - keys &= ~GP2X_RIGHT; - keys &= ~GP2X_DOWN; + int key, psxkey1 = -1, psxkey2 = -1; + + key = keymap[event->hardware_keycode]; + if (key < 0) + return; + + if (key < ARRAY_SIZE(keymap2)) + psxkey1 = keymap2[key]; + else switch (key) { + case 14: + hildon_quit(); + break; + case 15: + psxkey1 = DKEY_UP; + psxkey2 = DKEY_LEFT; + break; + case 16: + psxkey1 = DKEY_UP; + psxkey2 = DKEY_RIGHT; + break; + case 17: + psxkey1 = DKEY_DOWN; + psxkey2 = DKEY_LEFT; + break; + case 18: + psxkey1 = DKEY_DOWN; + psxkey2 = DKEY_RIGHT; + break; + case 19: + if (event->type == GDK_KEY_PRESS) + { + emu_save_state(state_slot); + char buf[MAXPATHLEN]; + sprintf (buf,"/opt/maemo/usr/games/screenshots%s.%3.3d",file_name,state_slot); + writepng(buf, image->mem, pl_buf_w,pl_buf_h); } - key = -1; return ; break; -/* case 19: - SaveState(cfile); - key = -1; return ; break; - break; - case 20: - LoadState(cfile); - key = -1; return ; break;*/ - break; -} - + return; + case 20: + if (event->type == GDK_KEY_PRESS) + emu_load_state(state_slot); + return; + case 21: + if (event->type == GDK_KEY_PRESS) + state_slot=(state_slot<9)?state_slot+1:0; + return; + case 22: + if (event->type == GDK_KEY_PRESS) + state_slot=(state_slot>0)?state_slot-1:8; + return; + } + if (event->type == GDK_KEY_PRESS) { - keys |= key; + if (psxkey1 >= 0) + in_keystate |= 1 << psxkey1; + if (psxkey2 >= 0) + in_keystate |= 1 << psxkey2; } else if (event->type == GDK_KEY_RELEASE) { - keys &= ~key; - } -} -unsigned long int gp2x_joystick_read(); -unsigned int ReadZodKeys() -{ - unsigned int pad_status = 0xffff; - unsigned long int keys = gp2x_joystick_read(); - - - if( keys & GP2X_VOL_DOWN ) // L2 - { - pad_status &= ~(1<<8); - } - if (keys & GP2X_L) - { - pad_status &= ~(1<<10); // L ? - } - - - - if( keys & GP2X_VOL_UP ) // R2 - { - pad_status &= ~(1<<9); - } - if (keys & GP2X_R) - { - pad_status &= ~(1<<11); // R ? - } - - if (keys & GP2X_UP) - { - pad_status &= ~(1<<4); - } - if (keys & GP2X_DOWN) - { - pad_status &= ~(1<<6); - } - if (keys & GP2X_LEFT) - { - pad_status &= ~(1<<7); - } - if (keys & GP2X_RIGHT) - { - pad_status &= ~(1<<5); - } - if (keys & GP2X_START) - { - pad_status &= ~(1<<3); - } - if (keys & GP2X_SELECT) - { - pad_status &= ~(1); - } - - if (keys & GP2X_X) - { - pad_status &= ~(1<<14); - } - if (keys & GP2X_B) - { - pad_status &= ~(1<<13); - } - if (keys & GP2X_A) - { - pad_status &= ~(1<<15); - } - if (keys & GP2X_Y) - { - pad_status &= ~(1<<12); - } + if (psxkey1 >= 0) + in_keystate &= ~(1 << psxkey1); + if (psxkey2 >= 0) + in_keystate &= ~(1 << psxkey2); - return pad_status; + emu_set_action(SACTION_NONE); + } } -void hildon_quit() +void plat_finish() { - gtk_main_quit(); - exit(0); + hildon_quit(); } -void plat_finish(){hildon_quit();} void maemo_init(int *argc, char ***argv) { @@ -207,8 +141,16 @@ void maemo_init(int *argc, char ***argv) } fclose(pFile); } - + pFile = fopen("/opt/psx4m/config", "r"); + if (NULL != pFile) { + fscanf(pFile, "%d %d",&sens,&y_def); + fclose(pFile); + } else { + sens=150; + y_def=500; //near 45 degrees =) + } + gtk_init (argc, argv); window = hildon_stackable_window_new (); @@ -224,7 +166,10 @@ void maemo_init(int *argc, char ***argv) GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); actor = HILDON_ANIMATION_ACTOR (hildon_animation_actor_new()); - hildon_animation_actor_set_position (actor, (X_RES - D_WIDTH)/2, (Y_RES - D_HEIGHT)/2 ); + if (g_maemo_opts & 2) + hildon_animation_actor_set_position (actor, 0, 0 ); + else + hildon_animation_actor_set_position (actor, (X_RES - D_WIDTH)/2, (Y_RES - D_HEIGHT)/2 ); hildon_animation_actor_set_parent (actor, GTK_WINDOW (window)); drawing = gtk_image_new (); @@ -233,94 +178,98 @@ void maemo_init(int *argc, char ***argv) gtk_widget_show_all (GTK_WIDGET (actor)); gtk_widget_show_all (GTK_WIDGET (window)); + + g_layer_x = (X_RES - D_WIDTH) / 2; + g_layer_y = (Y_RES - D_HEIGHT) / 2; + g_layer_w = D_WIDTH, g_layer_h = D_HEIGHT; + + pl_rearmed_cbs.only_16bpp = 1; } +void menu_loop(void) +{ +} -void pl_fbdev_set_mode(int w, int h,int bpp) +void *plat_gvideo_set_mode(int *w_, int *h_, int *bpp_) { -//if (bpp==24){w=800;h=480;} + int w = *w_, h = *h_; + if (w <= 0 || h <= 0) - return; + return pl_vout_buf; if (image) gdk_image_destroy(image); image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), w, h ); - pl_fbdev_buf = (void*) image->mem; - screen_size = image->bpl * h * image->bpp; + pl_vout_buf = (void *) image->mem; gtk_image_set_from_image (GTK_IMAGE(drawing), image, NULL); gtk_window_resize (GTK_WINDOW (actor), w, h); - hildon_animation_actor_set_scale (actor, + if (g_maemo_opts & 2) + hildon_animation_actor_set_scale (actor, + (gdouble)800 / (gdouble)w, + (gdouble)480 / (gdouble)h + ); + else + hildon_animation_actor_set_scale (actor, (gdouble)D_WIDTH / (gdouble)w, (gdouble)D_HEIGHT / (gdouble)h - ); + ); + pl_buf_w=w;pl_buf_h=h; + return pl_vout_buf; } -unsigned long gp2x_joystick_read(void) +void *plat_gvideo_flip(void) { - //printf("gp2x_joystick_read\n"); + gtk_widget_queue_draw (drawing); + + // process accelometer + if (g_maemo_opts & 4) { + int x, y, z; + FILE* f = fopen( "/sys/class/i2c-adapter/i2c-3/3-001d/coord", "r" ); + if( !f ) {printf ("err in accel"); exit(1);} + fscanf( f, "%d %d %d", &x, &y, &z ); + fclose( f ); + + if( x > sens ) in_keystate |= 1 << DKEY_LEFT; + else if( x < -sens ) in_keystate |= 1 << DKEY_RIGHT; + else {in_keystate &= ~(1 << DKEY_LEFT);in_keystate &= ~(1 << DKEY_RIGHT);} + + y+=y_def; + if( y > sens )in_keystate |= 1 << DKEY_UP; + else if( y < -sens ) in_keystate |= 1 << DKEY_DOWN; + else {in_keystate &= ~(1 << DKEY_DOWN);in_keystate &= ~(1 << DKEY_UP);} + + } + /* process GTK+ events */ while (gtk_events_pending()) gtk_main_iteration(); - return keys; + return pl_vout_buf; } -void gp2x_video_RGB_clearscreen16(void) +void plat_gvideo_open(void) { - //if (screenbuffer && screen_size) - // memset(pl_fbdev_buf, 0, screen_size); } -void pl_fbdev_flip() +void plat_gvideo_close(void) { - gtk_widget_queue_draw (drawing); } -void gp2x_printfchar15(gp2x_font *f, unsigned char c) +void *plat_prepare_screenshot(int *w, int *h, int *bpp) { - unsigned short *dst=&((unsigned short*)pl_fbdev_buf)[f->x+f->y*(image->bpl>>1)],w,h=f->h; -//unsigned char *src=f->data[ (c%16)*f->w + (c/16)*f->h ]; - unsigned char *src=&f->data[c*10]; - - if(f->solid) - while(h--) - { - w=f->wmask; - while(w) - { - if( *src & w ) *dst++=f->fg; else *dst++=f->bg; - w>>=1; - } - src++; - - dst+=(image->bpl>>1)-(f->w); - } - else - while(h--) - { - w=f->wmask; - while(w) - { - if( *src & w ) *dst=f->fg; - dst++; - w>>=1; - } - src++; - - dst+=(image->bpl>>1)-(f->w); - } + return NULL; } -void pl_frame_limit(void){ +void plat_step_volume(int is_up) +{ } -void pl_fbdev_close(void){ +void plat_trigger_vibrate(int is_strong) +{ } -void pl_fbdev_open(void){ - +void plat_minimize(void) +{ } - -