From 2b514e7114696bca61891f4a6d6576d002f47c0b Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sun, 7 Dec 2014 22:18:56 +0100 Subject: [PATCH] Client: More flexible server polling, shrink alertness on inactivity. --- src/client/io.c | 13 ++++++++----- src/client/keybindings.c | 5 +++-- src/client/world.h | 1 - 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/client/io.c b/src/client/io.c index 77fade6..694ebfb 100644 --- a/src/client/io.c +++ b/src/client/io.c @@ -8,7 +8,7 @@ #define _POSIX_C_SOURCE 1 /* PIPE_BUF */ #include "io.h" #include /* PIPE_BUF */ -#include /* halfdelay(), getch() */ +#include /* timeout(), getch() */ #include /* NULL */ #include /* uint8_t, uint16_t, uint32_t, UINT32_MAX */ #include /* FILE, sprintf(), fseek(), fflush() */ @@ -211,12 +211,12 @@ static void test_and_poll_server() return; } time_t now = time(0); - if (ping_sent && last_server_answer_time > now - 3) /* Re-set if last */ + if (ping_sent && last_server_answer_time > now - 5) /* Re-set if last */ { /* ping was answered */ ping_sent = 0; /* with server */ return; /* activity. */ } - if (!ping_sent && last_server_answer_time < now - 3) + if (!ping_sent && last_server_answer_time < now - 5) { send("PING"); ping_sent = 1; @@ -315,11 +315,12 @@ extern void send(char * msg) extern char * io_loop() { - world.halfdelay = 1; /* Ensure server is polled only 10 times */ - halfdelay(world.halfdelay); /* a second during user inactivity. */ + uint16_t delay = 1; /* Greater delay: less redundant server files reading.*/ uint8_t change_in_client = 0; while (1) { + timeout(delay); + delay = delay < 1000 ? delay * 2 : delay; test_and_poll_server(); if (world.winch) { @@ -329,6 +330,7 @@ extern char * io_loop() } if (change_in_client || read_worldstate() || read_queue()) { + delay = 1; /* Keep client alert even if it's not getch()'d. */ struct Win * win_map = get_win_by_id('m'); if (0 == win_map->view) /* So the map window's winconfig views */ { /* don't get confused by the centering. */ @@ -342,6 +344,7 @@ extern char * io_loop() int key = getch(); if (ERR != key) { + delay = 1; /* Alert client if it's getch()'d. */ change_in_client = try_key((uint16_t) key); if (2 == change_in_client) { diff --git a/src/client/keybindings.c b/src/client/keybindings.c index ebe5cec..fc371e8 100644 --- a/src/client/keybindings.c +++ b/src/client/keybindings.c @@ -6,7 +6,7 @@ */ #include "keybindings.h" -#include /* keycode defines, cbreak(), halfdelay(), getch() */ +#include /* keycode defines, cbreak(), getch(), timeout() */ #include /* NULL */ #include /* uint8_t, uint16_t, uint32_t */ #include /* FILE, sprintf() */ @@ -127,8 +127,9 @@ extern void mod_selected_keyb(char kb_c) kbdb->edit = 1; draw_all_wins(); cbreak(); + timeout(-1); int keycode = getch(); - halfdelay(world.halfdelay); + timeout(0); if (keycode < 1000) { kbdb->kbs[kbdb->select].keycode = keycode; diff --git a/src/client/world.h b/src/client/world.h index c8b8580..a161325 100644 --- a/src/client/world.h +++ b/src/client/world.h @@ -42,7 +42,6 @@ struct World struct yx_uint8 player_pos; /* coordinates of player on map */ struct yx_uint8 look_pos; /* coordinates of look cursor */ uint16_t turn; /* world/game turn */ - uint8_t halfdelay; /* how long to wait for getch() input in io_loop() */ uint8_t player_inventory_select; /* index of selected item in inventory */ uint8_t player_lifepoints; /* how alive the player is */ uint8_t winch; /* if set, SIGWINCH was registered; trigger reset_windows()*/ -- 2.30.2