+static void key_press(GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer data){
+
+ int valid_key = FALSE;
+ const char *key;
+
+ switch (event->keyval) {
+ case 'q':
+ case 'w':
+ case 'e':
+ case 'r':
+ button_up = TRUE;
+ valid_key = TRUE;
+ key = "up";
+ break;
+ case 'z':
+ case 'x':
+ case 'c':
+ case 'v':
+ case 'b':
+ button_down = TRUE;
+ valid_key = TRUE;
+ key = "down";
+ break;
+ case 'a':
+ case 's':
+ button_left = TRUE;
+ valid_key = TRUE;
+ key = "left";
+ break;
+ case 'd':
+ case 'f':
+ button_right = TRUE;
+ valid_key = TRUE;
+ key = "right";
+ break;
+ case 'l':
+ case ';':
+ button_B = TRUE;
+ valid_key = TRUE;
+ key = "B";
+ break;
+ case ':':
+ case ']':
+ button_A = TRUE;
+ valid_key = TRUE;
+ key = "A";
+ break;
+ case 65289: //tab key
+ button_select = TRUE;
+ valid_key = TRUE;
+ key = "select";
+ break;
+ case 65293: //enter key
+ button_start = TRUE;
+ valid_key = TRUE;
+ key = "start";
+ break;
+ }
+ if (valid_key)
+ dprint("%s key pressed\n", key);
+ //dprint("press, key code: %d key: %s\n", event->keyval, event->string);
+}
+
+static void key_release(GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer data){
+
+ int valid_key = FALSE;
+ const char *key;
+
+ switch (event->keyval) {
+ case 'q':
+ case 'w':
+ case 'e':
+ case 'r':
+ button_up = FALSE;
+ valid_key = TRUE;
+ key = "up";
+ break;
+ case 'z':
+ case 'x':
+ case 'c':
+ case 'v':
+ case 'b':
+ button_down = FALSE;
+ valid_key = TRUE;
+ key = "down";
+ break;
+ case 'a':
+ case 's':
+ button_left = FALSE;
+ valid_key = TRUE;
+ key = "left";
+ break;
+ case 'd':
+ case 'f':
+ button_right = FALSE;
+ valid_key = TRUE;
+ key = "right";
+ break;
+ case 'l':
+ case ';':
+ button_B = FALSE;
+ valid_key = TRUE;
+ key = "B";
+ break;
+ case ':':
+ case ']':
+ button_A = FALSE;
+ valid_key = TRUE;
+ key = "A";
+ break;
+ case 65289: //tab key
+ button_select = FALSE;
+ valid_key = TRUE;
+ key = "select";
+ break;
+ case 65293: //enter key
+ button_start = FALSE;
+ valid_key = TRUE;
+ key = "start";
+ break;
+ }
+ if (valid_key)
+ dprint("%s key released\n", key);
+ //dprint("release, key code: %d key: %s\n", event->keyval, event->string);
+}
+
+int window_start(int argc, char** argv)
+{
+ GtkWidget *window;
+ GtkWidget *drawing_area;
+ GdkPixbuf *pixbuf;
+ GError *err = NULL;
+ int width, height;
+
+ //get thread lock
+ gdk_threads_enter();
+
+ //init.
+ gtk_init(&argc, &argv);
+
+ pixbuf = gdk_pixbuf_new_from_file(JOYPAD_IMG_PATH, &err);
+ if (pixbuf == NULL) {
+ fprintf(stderr, "error reading image file[%s].\n", JOYPAD_IMG_PATH);
+ g_error_free (err);
+ return -1;
+ }
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ //dprint("w:%d, h:%d\n", width, height);
+ //
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
+
+ drawing_area = gtk_drawing_area_new();
+ gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), width, height);
+ gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_container_add (GTK_CONTAINER (window), drawing_area);
+
+ //draw event
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
+ GTK_SIGNAL_FUNC(expose_event), pixbuf);
+ //key board event
+ gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
+ GTK_SIGNAL_FUNC(key_press), NULL);
+ gtk_signal_connect(GTK_OBJECT(window), "key_release_event",
+ GTK_SIGNAL_FUNC(key_release), NULL);
+/*
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "configure_event",
+ GTK_SIGNAL_FUNC(configure_event), NULL);
+*/
+
+ gtk_widget_show_all(window);
+ gtk_main();
+ gdk_threads_leave();
+
+ return 0;
+}
+
+int init_jp(void) {
+ //init thread
+ g_thread_init (NULL);
+ gdk_threads_init ();
+
+ printf("joypad key entry:\n");
+ printf(" select button: <Tab>\n");
+ printf(" start button: <Enter>\n");
+ printf(" up key: Q, W, E, R\n");
+ printf(" down key: Z, X, C, V, B\n");
+ printf(" left key: A, S\n");
+ printf(" right key: D, F\n");
+ printf(" A button: <:>, <]>\n");
+ printf(" B button: L, <;>\n");
+
+ button_up = FALSE;
+ button_down = FALSE;
+ button_left = FALSE;
+ button_right = FALSE;
+ button_A = FALSE;
+ button_B = FALSE;
+ button_select = FALSE;
+ button_start = FALSE;
+
+ return TRUE;