+void CustomizeKeyboard( /* int player_nr */ )
+{
+ int player_nr = 0;
+
+ int i;
+ boolean finished = FALSE;
+ static struct SetupKeyboardInfo custom_key;
+ static struct
+ {
+ KeySym *keysym;
+ char *text;
+ } customize_step[] =
+ {
+ { &custom_key.left, "Move Left" },
+ { &custom_key.right, "Move Right" },
+ { &custom_key.up, "Move Up" },
+ { &custom_key.down, "Move Down" },
+ { &custom_key.snap, "Snap Field" },
+ { &custom_key.bomb, "Place Bomb" }
+ };
+
+ custom_key = setup.key_input[player_nr];
+
+ ClearWindow();
+ DrawText(SX+16, SY+16, "Keyboard Input", FS_BIG, FC_YELLOW);
+
+ BackToFront();
+ InitAnimation();
+
+ i = 0;
+ DrawText(SX, SY+(2+2*i)*32, customize_step[i].text, FS_BIG, FC_GREEN);
+ DrawText(SX, SY+(2+2*i+1)*32, "Key:", FS_BIG, FC_GREEN);
+ DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+ getKeySymName(*customize_step[i].keysym), FS_BIG, FC_BLUE);
+
+ while(!finished)
+ {
+ if (XPending(display)) /* got event from X server */
+ {
+ XEvent event;
+
+ XNextEvent(display, &event);
+ switch(event.type)
+ {
+ case Expose:
+ HandleExposeEvent((XExposeEvent *) &event);
+ break;
+ case UnmapNotify:
+ SleepWhileUnmapped();
+ break;
+ case KeyPress:
+ {
+ KeySym key = XLookupKeysym((XKeyEvent *)&event,
+ ((XKeyEvent *)&event)->state);
+
+ if (key == XK_Escape || (key == XK_Return && i == 6))
+ {
+ finished = TRUE;
+ break;
+ }
+
+ if (key == XK_Return || i == 6)
+ break;
+
+ /* got new key binding */
+ *customize_step[i].keysym = key;
+ DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+ " ", FS_BIG, FC_YELLOW);
+ DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+ getKeySymName(key), FS_BIG, FC_YELLOW);
+
+ i++;
+
+ if (i == 6)
+ {
+ DrawText(SX+16, SY+15*32+16, "Press Enter", FS_BIG, FC_YELLOW);
+ break;
+ }
+
+ /* ask for next key binding */
+ DrawText(SX, SY+(2+2*i)*32,
+ customize_step[i].text, FS_BIG, FC_GREEN);
+ DrawText(SX, SY+(2+2*i+1)*32, "Key:", FS_BIG, FC_GREEN);
+ DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+ getKeySymName(*customize_step[i].keysym),
+ FS_BIG, FC_BLUE);
+ }
+ break;
+ case KeyRelease:
+ key_joystick_mapping = 0;
+ break;
+ case FocusIn:
+ case FocusOut:
+ HandleFocusEvent((XFocusChangeEvent *) &event);
+ break;
+ case ClientMessage:
+ HandleClientMessageEvent((XClientMessageEvent *) &event);
+ break;
+ default:
+ break;
+ }
+ }
+
+ BackToFront();
+ DoAnimation();
+
+ /* don't eat all CPU time */
+ Delay(10);
+ }
+
+ StopAnimation();
+ DrawSetupScreen();
+}
+