if (game_status != PLAYING)
{
XSync(display, FALSE);
- Delay(10);
+ if (!XPending(display)) /* delay only if no pending events */
+ Delay(10);
}
/* refresh window contents from drawing buffer, if needed */
}
}
- if (game_status==PLAYING)
+ if (game_status == PLAYING)
XAutoRepeatOff(display);
}
{
motion_status = FALSE;
- if (event->type==ButtonPress)
+ if (event->type == ButtonPress)
button_status = event->button;
else
button_status = MB_RELEASED;
void HandleMotionEvent(XMotionEvent *event)
{
+ Window root, child;
+ int root_x, root_y;
+ int win_x, win_y;
+ unsigned int mask;
+
+ if (!XQueryPointer(display, window, &root, &child, &root_x, &root_y,
+ &win_x, &win_y, &mask))
+ return;
+
+ if (!button_status && game_status != LEVELED)
+ return;
+
motion_status = TRUE;
- HandleButton(event->x, event->y, button_status);
+ HandleButton(win_x, win_y, button_status);
}
void HandleKeyEvent(XKeyEvent *event)
{
int key_status = (event->type == KeyPress ? KEY_PRESSED : KEY_RELEASED);
- unsigned int event_state = (game_status != PLAYING ? event->state : 0);
- KeySym key = XLookupKeysym(event, event_state);
+ KeySym key;
+
+ if (game_status == PLAYING)
+ {
+ /* use '0' instead of 'event->state' to get the key without modifiers */
+ key = XLookupKeysym(event, 0);
+ }
+ else
+ {
+ /* get the key with all modifiers */
+ char buffer[10];
+ int buffer_size = 10;
+ XComposeStatus compose;
+ int char_count;
+
+ char_count = XLookupString(event, buffer, buffer_size, &key, &compose);
+ buffer[char_count] = '\0';
+ }
HandleKey(key, key_status);
}
if (event->type == FocusOut)
{
+ int i;
+
XAutoRepeatOn(display);
old_joystick_status = joystick_status;
joystick_status = JOYSTICK_OFF;
+
+ /* simulate key release events for still pressed keys */
key_joystick_mapping = 0;
+ for (i=0; i<MAX_PLAYERS; i++)
+ stored_player[i].action = 0;
}
else if (event->type == FocusIn)
{
+ /* When there are two Rocks'n'Diamonds windows which overlap and
+ the player moves the pointer from one game window to the other,
+ a 'FocusOut' event is generated for the window the pointer is
+ leaving and a 'FocusIn' event is generated for the window the
+ pointer is entering. In some cases, it can happen that the
+ 'FocusIn' event is handled by the one game process before the
+ 'FocusOut' event by the other game process. In this case the
+ X11 environment would end up with activated keyboard auto repeat,
+ because unfortunately this is a global setting and not (which
+ would be far better) set for each X11 window individually.
+ The effect would be keyboard auto repeat while playing the game
+ (game_status == PLAYING), which is not desired.
+ To avoid this special case, we just wait 1/10 second before
+ processing the 'FocusIn' event.
+ */
+
if (game_status == PLAYING)
+ {
+ Delay(100);
XAutoRepeatOff(display);
+ }
if (old_joystick_status != -1)
joystick_status = old_joystick_status;
}
{
old_mx = mx;
old_my = my;
-
- HandleVideoButtons(mx,my, button);
- HandleSoundButtons(mx,my, button);
- HandleGameButtons(mx,my, button);
}
HandleGadgets(mx, my, button);
break;
case HALLOFFAME:
- HandleHallOfFame(button);
+ HandleHallOfFame(0,0, 0,0, button);
break;
case LEVELED:
- LevelEd(mx,my, button);
break;
case HELPSCREEN:
int x = LEVELX(sx);
int y = LEVELY(sy);
- printf("INFO: Feld[%d][%d] == %d\n", x,y, Feld[x][y]);
+ printf("INFO: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
+
+ if (!IN_LEV_FIELD(x, y))
+ break;
+
+ printf(" Feld[%d][%d] == %d\n", x,y, Feld[x][y]);
printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]);
printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]);
printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]);
if (key_status == KEY_RELEASED)
return;
- if (key == XK_Return && game_status == PLAYING && AllPlayersGone)
+ if ((key == XK_Return || key == XK_space) &&
+ game_status == PLAYING && AllPlayersGone)
{
CloseDoor(DOOR_CLOSE_1);
game_status = MAINMENU;
/* allow quick escape to the main menu with the Escape key */
if (key == XK_Escape && game_status != MAINMENU)
{
- if (game_status == LEVELED)
- {
- /* draw smaller door */
- XCopyArea(display, pix[PIX_DOOR], drawto, gc,
- DOOR_GFX_PAGEX7, 64,
- 108, 64,
- EX - 4, EY - 12);
- redraw_mask |= REDRAW_ALL;
- }
-
CloseDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
game_status = MAINMENU;
DrawMainMenu();
switch(key)
{
case XK_Return:
+ case XK_space:
if (game_status == MAINMENU)
HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
else if (game_status == CHOOSELEVEL)
HandleSetupInputScreen(0,0, 0,0, MB_MENU_CHOICE);
break;
+ case XK_Page_Up:
+ if (game_status == CHOOSELEVEL)
+ HandleChooseLevel(0,0, 0,-SCR_FIELDY, MB_MENU_MARK);
+ break;
+
+ case XK_Page_Down:
+ if (game_status == CHOOSELEVEL)
+ HandleChooseLevel(0,0, 0,SCR_FIELDY, MB_MENU_MARK);
+ break;
+
default:
break;
}
switch(key)
{
case XK_Return:
+ case XK_space:
game_status = MAINMENU;
DrawMainMenu();
BackToFront();
break;
+ case XK_Page_Up:
+ HandleHallOfFame(0,0, 0,-SCR_FIELDY, MB_MENU_MARK);
+ break;
+
+ case XK_Page_Down:
+ HandleHallOfFame(0,0, 0,SCR_FIELDY, MB_MENU_MARK);
+ break;
+
default:
break;
}
case LEVELED:
HandleLevelEditorKeyInput(key);
- LevelNameTyping(key);
break;
case PLAYING:
break;
#endif
-#if 1
+#if 0
case XK_m:
if (MoveSpeed == 8)
{
}
case HALLOFFAME:
- HandleHallOfFame(!newbutton);
+ HandleHallOfFame(0,0, dx,dy, !newbutton);
break;
case HELPSCREEN: