X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=1866e7ae79d00373ecab208209ad6cd5765c596b;hb=eae2f3467caaaf64a9370c1acd8cecf11fd58328;hp=9d4e3837bc7c9ff0cf3c80baad7d4ee68c32f891;hpb=3dc317d10b44cc6b75db10ac194966ad8114d390;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 9d4e3837..1866e7ae 100644 --- a/src/events.c +++ b/src/events.c @@ -20,8 +20,14 @@ #include "misc.h" #include "tape.h" #include "joystick.h" +#include "buttons.h" #include "network.h" +/* values for key_status */ +#define KEY_NOT_PRESSED FALSE +#define KEY_RELEASED FALSE +#define KEY_PRESSED TRUE + void EventLoop(void) { while(1) @@ -62,9 +68,13 @@ void EventLoop(void) 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 */ + BackToFront(); + if (game_status == EXITGAME) return; } @@ -160,7 +170,7 @@ void SleepWhileUnmapped() } } - if (game_status==PLAYING) + if (game_status == PLAYING) XAutoRepeatOff(display); } @@ -207,7 +217,7 @@ void HandleButtonEvent(XButtonEvent *event) { motion_status = FALSE; - if (event->type==ButtonPress) + if (event->type == ButtonPress) button_status = event->button; else button_status = MB_RELEASED; @@ -217,16 +227,44 @@ void HandleButtonEvent(XButtonEvent *event) 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); } @@ -237,15 +275,40 @@ void HandleFocusEvent(XFocusChangeEvent *event) 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; itype == 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; } @@ -253,30 +316,31 @@ void HandleFocusEvent(XFocusChangeEvent *event) void HandleClientMessageEvent(XClientMessageEvent *event) { +#ifndef MSDOS if ((event->window == window) && (event->data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", FALSE))) CloseAllAndExit(0); +#endif } void HandleButton(int mx, int my, int button) { static int old_mx = 0, old_my = 0; - if (mx<0 || my<0) + if (button < 0) { mx = old_mx; my = old_my; + button = -button; } else { old_mx = mx; old_my = my; - - HandleVideoButtons(mx,my, button); - HandleSoundButtons(mx,my, button); - HandleGameButtons(mx,my, button); } + HandleGadgets(mx, my, button); + switch(game_status) { case MAINMENU: @@ -292,11 +356,10 @@ void HandleButton(int mx, int my, int button) break; case HALLOFFAME: - HandleHallOfFame(button); + HandleHallOfFame(0,0, 0,0, button); break; case LEVELED: - LevelEd(mx,my, button); break; case HELPSCREEN: @@ -323,7 +386,12 @@ void HandleButton(int mx, int my, int button) 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]); @@ -409,7 +477,8 @@ void HandleKey(KeySym key, int key_status) 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; @@ -420,7 +489,7 @@ void HandleKey(KeySym key, int key_status) /* allow quick escape to the main menu with the Escape key */ if (key == XK_Escape && game_status != MAINMENU) { - CloseDoor(DOOR_CLOSE_1 | DOOR_NO_DELAY); + CloseDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY); game_status = MAINMENU; DrawMainMenu(); return; @@ -437,6 +506,8 @@ void HandleKey(KeySym key, int key_status) + HandleGadgetsKeyInput(key); + switch(game_status) { case TYPENAME: @@ -450,6 +521,7 @@ void HandleKey(KeySym key, int key_status) 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) @@ -460,6 +532,16 @@ void HandleKey(KeySym key, int key_status) 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; } @@ -473,18 +555,27 @@ void HandleKey(KeySym key, int key_status) 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; } break; case LEVELED: - LevelNameTyping(key); + HandleLevelEditorKeyInput(key); break; case PLAYING: @@ -527,6 +618,22 @@ void HandleKey(KeySym key, int key_status) break; #endif +#if 0 + case XK_m: + if (MoveSpeed == 8) + { + MoveSpeed = 4; + ScrollStepSize = TILEX/4; + } + else + { + MoveSpeed = 8; + ScrollStepSize = TILEX/8; + } + printf("MoveSpeed == %d\n", MoveSpeed); + break; +#endif + case XK_f: ScrollStepSize = TILEX/8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); @@ -591,12 +698,14 @@ void HandleNoXEvent() { if (button_status && game_status != PLAYING) { - HandleButton(-1,-1, button_status); + HandleButton(0, 0, -button_status); return; } +#ifndef MSDOS if (options.network) HandleNetworking(); +#endif HandleJoystick(); @@ -613,12 +722,19 @@ static int HandleJoystickForAllPlayers() { byte joy_action = 0; + /* if (!setup.input[i].use_joystick) continue; + */ joy_action = Joystick(i); result |= joy_action; + + if (!setup.input[i].use_joystick) + continue; + + stored_player[i].action = joy_action; } @@ -646,9 +762,10 @@ void HandleJoystick() case SETUP: case SETUPINPUT: { - static long joystickmove_delay = 0; + static unsigned long joystickmove_delay = 0; - if (joystick && !button && !DelayReached(&joystickmove_delay,150)) + if (joystick && !button && + !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) newbutton = dx = dy = 0; if (game_status==MAINMENU) @@ -664,7 +781,7 @@ void HandleJoystick() } case HALLOFFAME: - HandleHallOfFame(!newbutton); + HandleHallOfFame(0,0, dx,dy, !newbutton); break; case HELPSCREEN: