adding preference option for dynamic input blocking

/inpblock is now having subcommands 'timeout' and 'dynamic'
with:

/inpblock timeout <milliseconds>

and

/inpblock dynamic <on|off>

Defaults are:

/inpblock timeout 500
/inpblock dynamic on

To get the old behavior specify:

/inpblock timeout 20
/inpblock dynamic off

The dynamic mode will block incrementally after something
should be written to the window or after a key was pressed. So pressing
a key would set the timeout to 0ms and after 10 timeouts to the next
bigger one.

Example (with dynamic mode on):

"/inpblock timeout 50"

timeout series:

10x 0ms
10x 10ms (0ms + 10 times since last keypress)
10x 30ms (10ms + 20 times since last keypress)
*x50ms until next key was pressed or
This commit is contained in:
Simon Effenberg
2015-01-12 11:32:32 +01:00
parent c7ff3255b8
commit 34148e2101
6 changed files with 62 additions and 14 deletions

View File

@@ -623,14 +623,20 @@ static struct cmd_t command_defs[] =
NULL } } }, NULL } } },
{ "/inpblock", { "/inpblock",
cmd_inpblock, parse_args, 1, 1, &cons_inpblock_setting, cmd_inpblock, parse_args, 2, 2, &cons_inpblock_setting,
{ "/inpblock millis", "Input blocking delay.", { "/inpblock [timeout|dynamic] [millis|on|off]", "Input blocking delay (dynamic or static).",
{ "/inpblock millis", { "/inpblock [timeout|dynamic] [millis|on|off]",
"----------------", "----------------",
"Time to wait in milliseconds before reading input from the terminal buffer, defaults to 20.", "Setting for how long to wait for input before checking for new messages or checking for state",
"Valid values are 1-1000.", "changes like 'idle'.",
"A higher value will result in less CPU usage, but a noticable delay for response to input.", "timeout : Time to wait in milliseconds before reading input from the terminal buffer, defaults to 500.",
"A lower value will result in higher CPU usage, but faster response to input.", " : Valid values are 1-1000.",
"dynamic : Either use the timeout statically or use a dynamic variant which is responsive after an input",
" : and blocks longer (up to the specified 'timeout').",
" : on|off",
"A higher value will result in less CPU usage (irrespective if dynamic is on or off), but a noticable",
"delay for response to input if dynamic is off.",
"A lower value will result in higher CPU usage, but faster response to input if dynamic is off.",
NULL } } }, NULL } } },
{ "/notify", { "/notify",

View File

@@ -3450,13 +3450,40 @@ cmd_notify(gchar **args, struct cmd_help_t help)
gboolean gboolean
cmd_inpblock(gchar **args, struct cmd_help_t help) cmd_inpblock(gchar **args, struct cmd_help_t help)
{ {
char *value = args[0]; char *subcmd = args[0];
char *value = args[1];
int intval; int intval;
if (_strtoi(value, &intval, 1, 1000) == 0) { if (strcmp(subcmd, "timeout") == 0) {
cons_show("Input blocking set to %d milliseconds.", intval); if (value == NULL) {
prefs_set_inpblock(intval); cons_show("Usage: %s", help.usage);
ui_input_nonblocking(FALSE); return TRUE;
}
if (_strtoi(value, &intval, 1, 1000) == 0) {
cons_show("Input blocking set to %d milliseconds.", intval);
prefs_set_inpblock(intval);
ui_input_nonblocking(FALSE);
}
return TRUE;
} }
if (strcmp(subcmd, "dynamic") == 0) {
if (value == NULL) {
cons_show("Usage: %s", help.usage);
return TRUE;
}
if (strcmp(value, "on") != 0 && strcmp(value, "off") != 0) {
cons_show("Dynamic must be one of 'on' or 'off'");
return TRUE;
}
return _cmd_set_boolean_preference(value, help, "Dynamic input blocking", PREF_INPBLOCK_DYNAMIC);
}
cons_show("Usage: %s", help.usage);
return TRUE; return TRUE;
} }

View File

@@ -531,6 +531,7 @@ _get_group(preference_t pref)
case PREF_ROSTER_BY: case PREF_ROSTER_BY:
case PREF_RESOURCE_TITLE: case PREF_RESOURCE_TITLE:
case PREF_RESOURCE_MESSAGE: case PREF_RESOURCE_MESSAGE:
case PREF_INPBLOCK_DYNAMIC:
return PREF_GROUP_UI; return PREF_GROUP_UI;
case PREF_STATES: case PREF_STATES:
case PREF_OUTTYPE: case PREF_OUTTYPE:
@@ -672,6 +673,8 @@ _get_key(preference_t pref)
return "resource.title"; return "resource.title";
case PREF_RESOURCE_MESSAGE: case PREF_RESOURCE_MESSAGE:
return "resource.message"; return "resource.message";
case PREF_INPBLOCK_DYNAMIC:
return "inpblock.dynamic";
default: default:
return NULL; return NULL;
} }
@@ -696,6 +699,7 @@ _get_default_boolean(preference_t pref)
case PREF_MUC_PRIVILEGES: case PREF_MUC_PRIVILEGES:
case PREF_PRESENCE: case PREF_PRESENCE:
case PREF_WRAP: case PREF_WRAP:
case PREF_INPBLOCK_DYNAMIC:
return TRUE; return TRUE;
default: default:
return FALSE; return FALSE;

View File

@@ -100,7 +100,8 @@ typedef enum {
PREF_OTR_WARN, PREF_OTR_WARN,
PREF_OTR_POLICY, PREF_OTR_POLICY,
PREF_RESOURCE_TITLE, PREF_RESOURCE_TITLE,
PREF_RESOURCE_MESSAGE PREF_RESOURCE_MESSAGE,
PREF_INPBLOCK_DYNAMIC
} preference_t; } preference_t;
typedef struct prof_alias_t { typedef struct prof_alias_t {

View File

@@ -1182,7 +1182,12 @@ cons_show_chat_prefs(void)
void void
cons_inpblock_setting(void) cons_inpblock_setting(void)
{ {
cons_show("Input block (/inpblock) : %d milliseconds", prefs_get_inpblock()); cons_show("Input timeout (/inpblock) : %d milliseconds", prefs_get_inpblock());
if (prefs_get_boolean(PREF_INPBLOCK_DYNAMIC)) {
cons_show("Input dynamic (/inpblock) : ON");
} else {
cons_show("Input dynamic (/inpblock) : OFF");
}
} }
void void

View File

@@ -206,6 +206,11 @@ ui_input_nonblocking(gboolean reset)
static gint timeout = 0; static gint timeout = 0;
static gint no_input_count = 0; static gint no_input_count = 0;
if (! prefs_get_boolean(PREF_INPBLOCK_DYNAMIC)) {
inp_non_block(prefs_get_inpblock());
return;
}
if (reset) { if (reset) {
timeout = 0; timeout = 0;
no_input_count = 0; no_input_count = 0;