From 4adb64284bf5d78c4ca4034b722b936d14ca9bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Tue, 2 Apr 2024 19:12:44 +0200 Subject: [PATCH] buffer: add property `input_get_any_user_data` in buffer (issue #2066) This allows buffers to get any user input, including commands, that are sent to the buffer callback instead of being executed on the buffer. --- doc/en/weechat_plugin_api.en.adoc | 5 + doc/en/weechat_relay_protocol.en.adoc | 1 + doc/fr/weechat_plugin_api.fr.adoc | 5 + doc/fr/weechat_relay_protocol.fr.adoc | 1 + doc/it/weechat_plugin_api.it.adoc | 7 ++ doc/ja/weechat_plugin_api.ja.adoc | 7 ++ doc/ja/weechat_relay_protocol.ja.adoc | 1 + doc/sr/weechat_plugin_api.sr.adoc | 7 ++ doc/sr/weechat_relay_protocol.sr.adoc | 1 + src/core/core-command.c | 106 ++++++++++++++++--- src/core/core-input.c | 23 +++- src/core/core-input.h | 3 +- src/core/core-signal.c | 2 +- src/core/core-upgrade.c | 2 + src/gui/gui-buffer.c | 36 ++++++- src/gui/gui-buffer.h | 1 + src/gui/gui-input.c | 2 +- src/gui/gui-key.c | 4 +- tests/tests.cpp | 4 +- tests/unit/core/test-core-command.cpp | 2 +- tests/unit/gui/test-gui-buffer.cpp | 6 +- tests/unit/gui/test-gui-key.cpp | 12 +-- tests/unit/plugins/irc/test-irc-protocol.cpp | 2 +- tests/unit/plugins/test-plugin-api-info.cpp | 2 +- 24 files changed, 197 insertions(+), 45 deletions(-) diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index 80912d774..3c72ae974 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -14574,6 +14574,7 @@ Arguments: ** _nicklist_nicks_count_: number of nicks in nicklist ** _nicklist_nicks_visible_count_: number of nicks displayed ** _input_: 1 if input is enabled, otherwise 0 +** _input_get_any_user_data_: 1 if any user data, including commands, are sent to input callback, otherwise 0 ** _input_get_unknown_commands_: 1 if unknown commands are sent to input callback, otherwise 0 ** _input_get_empty_: 1 if empty input is sent to input callback, otherwise 0 ** _input_multiline_: 1 if multiple lines are sent as one message to input callback, otherwise 0 @@ -14890,6 +14891,10 @@ Properties: | input_pos | | position | Set cursor position in buffer input. +| input_get_any_user_data | 4.3.0 | "0" or "1" +| "0" to get only user messages (default behavior), "1" to get everything, + including commands. + | input_get_unknown_commands | | "0" or "1" | "0" to disable unknown commands on this buffer (default behavior), "1" to get unknown commands, for example if user type "/unknowncmd", buffer will diff --git a/doc/en/weechat_relay_protocol.en.adoc b/doc/en/weechat_relay_protocol.en.adoc index 4a85c5517..b84cdbe92 100644 --- a/doc/en/weechat_relay_protocol.en.adoc +++ b/doc/en/weechat_relay_protocol.en.adoc @@ -707,6 +707,7 @@ inl: nicklist_visible_count: 0 title: 'WeeChat 2.9-dev (C) 2003-2020 - https://weechat.org/' input: 1 + input_get_any_user_data: 0 input_get_unknown_commands: 0 input_get_empty: 0 input_multiline: 0 diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index 0015f1aec..5bd729dff 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -14890,6 +14890,7 @@ Paramètres : ** _nicklist_nicks_count_ : nombre de pseudos dans la liste de pseudos ** _nicklist_nicks_visible_count_ : nombre de pseudos affichés ** _input_ : 1 si la zone de saisie est activée, sinon 0 +** _input_get_any_user_data_ : 1 si toutes les données utilisateur, y compris les commandes, sont envoyées à la fonction de rappel "input", sinon 0 ** _input_get_unknown_commands_ : 1 si les commandes inconnues sont envoyées à la fonction de rappel "input", sinon 0 ** _input_get_empty_ : 1 si une entrée vide est envoyée à la fonction de rappel "input", sinon 0 ** _input_multiline_ : 1 si plusieurs lignes sont envoyées comme un seul message à la fonction de rappel "input", sinon 0 @@ -15215,6 +15216,10 @@ Propriétés : | input_pos | | position | Change la position du curseur dans la zone de saisie. +| input_get_any_user_data | 4.3.0 | "0" or "1" +| "0" pour recevoir seulement les messages utilisateur (comportement par défaut), + "1" pour tout recevoir, y compris les commandes. + | input_get_unknown_commands | | "0" ou "1" | "0" pour désactiver les commandes inconnues sur ce tampon (comportement par défaut), "1" pour recevoir les commandes inconnues, par exemple si diff --git a/doc/fr/weechat_relay_protocol.fr.adoc b/doc/fr/weechat_relay_protocol.fr.adoc index 208bac06c..af3af91c6 100644 --- a/doc/fr/weechat_relay_protocol.fr.adoc +++ b/doc/fr/weechat_relay_protocol.fr.adoc @@ -723,6 +723,7 @@ inl: nicklist_visible_count: 0 title: 'WeeChat 2.9-dev (C) 2003-2020 - https://weechat.org/' input: 1 + input_get_any_user_data: 0 input_get_unknown_commands: 0 input_get_empty: 0 input_multiline: 0 diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 082fc9449..7ee9cc055 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -15251,6 +15251,8 @@ Argomenti: // TRANSLATION MISSING ** _nicklist_nicks_visible_count_: number of nicks displayed ** _input_: 1 se l'input è abilitato, altrimenti 0 +// TRANSLATION MISSING +** _input_get_any_user_data_: 1 if any user data, including commands, are sent to input callback, otherwise 0 ** _input_get_unknown_commands_: 1 se i comandi sconosciuti vengono inviati alla callback di input, altrimenti 0 // TRANSLATION MISSING ** _input_get_empty_: 1 if empty input is sent to input callback, otherwise 0 @@ -15616,6 +15618,11 @@ Properties: | input_pos | | posizione | Imposta la posizione del cursore per l'input del buffer. +// TRANSLATION MISSING +| input_get_any_user_data | 4.3.0 | "0" or "1" +| "0" to get only user messages (default behavior), "1" to get everything, + including commands. + | input_get_unknown_commands | | "0" oppure "1" | "0" per disabilitare i comandi sconosciuti per questo buffer (comportamento predefinito), "1" per ricevere i comandi sconosciuti, ad esempio se l'utente diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index 2f29ca7ce..9bc90793f 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -14787,6 +14787,8 @@ int weechat_buffer_get_integer (struct t_gui_buffer *buffer, // TRANSLATION MISSING ** _nicklist_nicks_visible_count_: number of nicks displayed ** _input_: 入力可能な場合は 1、そうでない場合は 0 +// TRANSLATION MISSING +** _input_get_any_user_data_: 1 if any user data, including commands, are sent to input callback, otherwise 0 ** _input_get_unknown_commands_: 未定義のコマンドを入力コールバックに送信する場合は 1、そうでない場合は 0 ** _input_get_empty_: 入力コールバックに何も送信されなかった場合は 1、そうでない場合は 0 // TRANSLATION MISSING @@ -15123,6 +15125,11 @@ void weechat_buffer_set (struct t_gui_buffer *buffer, const char *property, | input_pos | | 位置 | バッファ入力のカーソル位置を設定 +// TRANSLATION MISSING +| input_get_any_user_data | 4.3.0 | "0" or "1" +| "0" to get only user messages (default behavior), "1" to get everything, + including commands. + | input_get_unknown_commands | | "0" または "1" | 指定したバッファに対する未定義のコマンドを無効にする場合は "0" (デフォルト)、未定義のコマンドを受け入れる場合は "1"、例えばユーザが "/unknowncmd" diff --git a/doc/ja/weechat_relay_protocol.ja.adoc b/doc/ja/weechat_relay_protocol.ja.adoc index 6203376d2..537319d9a 100644 --- a/doc/ja/weechat_relay_protocol.ja.adoc +++ b/doc/ja/weechat_relay_protocol.ja.adoc @@ -728,6 +728,7 @@ inl: nicklist_visible_count: 0 title: 'WeeChat 2.9-dev (C) 2003-2020 - https://weechat.org/' input: 1 + input_get_any_user_data: 0 input_get_unknown_commands: 0 input_get_empty: 0 input_multiline: 0 diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index fc3889435..bcde00a9e 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -14160,6 +14160,8 @@ int weechat_buffer_get_integer (struct t_gui_buffer *buffer, ** _nicklist_nicks_count_: број надимака у листи надимака ** _nicklist_nicks_visible_count_: број приказаних надимака ** _input_: 1 ако је укључен унос, у супротном 0 +// TRANSLATION MISSING +** _input_get_any_user_data_: 1 if any user data, including commands, are sent to input callback, otherwise 0 ** _input_get_unknown_commands_: 1 ако се непознате команде шаљу функцији повратног позива уноса, у супротном 0 ** _input_get_empty_: 1 ако се функцији повратног позива уноса шаље празан унос, у супротном 0 ** _input_multiline_: 1 ако се више линија шаље као једна порука функцији повратног позива уноса, у супротном 0 @@ -14478,6 +14480,11 @@ void weechat_buffer_set (struct t_gui_buffer *buffer, const char *property, | input_pos | | позиција | Поставља позицију курсора у уносу бафера. +// TRANSLATION MISSING +| input_get_any_user_data | 4.3.0 | "0" or "1" +| "0" to get only user messages (default behavior), "1" to get everything, + including commands. + | input_get_unknown_commands | | "0" или "1" | "0" да се за овај бафер искључе непознате команде (подразумевано понашање), "1" да се прихвате непознате команде, на пример ако корисник откуца „/unknowncmd”, бафер ће diff --git a/doc/sr/weechat_relay_protocol.sr.adoc b/doc/sr/weechat_relay_protocol.sr.adoc index 2d92dfb85..9dac7f80f 100644 --- a/doc/sr/weechat_relay_protocol.sr.adoc +++ b/doc/sr/weechat_relay_protocol.sr.adoc @@ -656,6 +656,7 @@ inl: nicklist_visible_count: 0 title: 'WeeChat 2.9-dev (C) 2003-2020 - https://weechat.org/' input: 1 + input_get_any_user_data: 0 input_get_unknown_commands: 0 input_get_empty: 0 input_multiline: 0 diff --git a/src/core/core-command.c b/src/core/core-command.c index f17abd01f..bfd38b1a9 100644 --- a/src/core/core-command.c +++ b/src/core/core-command.c @@ -131,7 +131,13 @@ COMMAND_CALLBACK(allbuf) { ptr_buffer = (struct t_gui_buffer *)arraylist_get (all_buffers, i); if (gui_buffer_valid (ptr_buffer)) - (void) input_data (ptr_buffer, argv_eol[1], NULL, 0); + { + (void) input_data (ptr_buffer, + argv_eol[1], + NULL, + 0, /* split_newline */ + 0); /* user_data */ + } } arraylist_free (all_buffers); @@ -1642,7 +1648,11 @@ COMMAND_CALLBACK(color) if (string_strcmp (argv[1], "-o") == 0) { gui_color_info_term_colors (str_color, sizeof (str_color)); - (void) input_data (buffer, str_color, NULL, 0); + (void) input_data (buffer, + str_color, + NULL, + 0, /* split_newline */ + 0); /* user_data */ return WEECHAT_RC_OK; } @@ -1837,7 +1847,11 @@ COMMAND_CALLBACK(command) { for (i = 0; commands[i]; i++) { - (void) input_data (buffer, commands[i], NULL, 0); + (void) input_data (buffer, + commands[i], + NULL, + 0, /* split_newline */ + 0); /* user_data */ } string_free_split_command (commands); } @@ -2221,7 +2235,11 @@ COMMAND_CALLBACK(debug) { COMMAND_MIN_ARGS(3, "time"); gettimeofday (&time_start, NULL); - (void) input_data (buffer, argv_eol[2], NULL, 0); + (void) input_data (buffer, + argv_eol[2], + NULL, + 0, /* split_newline */ + 0); /* user_data */ gettimeofday (&time_end, NULL); debug_display_time_elapsed (&time_start, &time_end, argv_eol[2], 1); return WEECHAT_RC_OK; @@ -2418,7 +2436,11 @@ COMMAND_CALLBACK(eval) options); if (result) { - (void) input_data (buffer, result, NULL, 0); + (void) input_data (buffer, + result, + NULL, + 0, /* split_newline */ + 0); /* user_data */ free (result); } else @@ -2441,7 +2463,11 @@ COMMAND_CALLBACK(eval) result = eval_expression (ptr_args, pointers, NULL, options); if (result) { - (void) input_data (buffer, result, NULL, 0); + (void) input_data (buffer, + result, + NULL, + 0, /* split_newline */ + 0); /* user_data */ free (result); } else @@ -3638,7 +3664,13 @@ COMMAND_CALLBACK(input) gui_input_insert (buffer, argv_eol[2]); } else if (string_strcmp (argv[1], "send") == 0) - (void) input_data (buffer, argv_eol[2], NULL, 0); + { + (void) input_data (buffer, + argv_eol[2], + NULL, + 0, /* split_newline */ + 0); /* user_data */ + } else if (string_strcmp (argv[1], "undo") == 0) gui_input_undo (buffer); else if (string_strcmp (argv[1], "redo") == 0) @@ -3679,10 +3711,22 @@ COMMAND_CALLBACK(input) gui_hotlist_restore_all_buffers (); /* since WeeChat 3.8: "/buffer set unread" */ else if (string_strcmp (argv[1], "set_unread_current_buffer") == 0) - (void) input_data (buffer, "/buffer set unread", NULL, 0); + { + (void) input_data (buffer, + "/buffer set unread", + NULL, + 0, /* split_newline */ + 0); /* user_data */ + } /* since WeeChat 3.8: "/allbuf /buffer set unread" */ else if (string_strcmp (argv[1], "set_unread") == 0) - (void) input_data (buffer, "/allbuf /buffer set unread", NULL, 0); + { + (void) input_data (buffer, + "/allbuf /buffer set unread", + NULL, + 0, /* split_newline */ + 0); /* user_data */ + } /* since WeeChat 3.8: "/buffer switch" */ else if (string_strcmp (argv[1], "switch_active_buffer") == 0) gui_buffer_switch_active_buffer (buffer); @@ -5019,7 +5063,11 @@ command_plugin_list_input (struct t_gui_buffer *buffer, if (send_to_buffer) { - (void) input_data (buffer, *buf, NULL, 0); + (void) input_data (buffer, + *buf, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } else { @@ -5775,7 +5823,8 @@ command_repeat_exec (struct t_command_repeat *command_repeat) (void) input_data (ptr_buffer, cmd_eval, command_repeat->commands_allowed, - 0); /* split_newline */ + 0, /* split_newline */ + 0); /* user_data */ free (cmd_eval); } @@ -7078,7 +7127,11 @@ command_upgrade_display (struct t_gui_buffer *buffer, } } - (void) input_data (buffer, string, NULL, 0); + (void) input_data (buffer, + string, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } /* @@ -7327,7 +7380,11 @@ COMMAND_CALLBACK(uptime) minutes, seconds, str_first_start); - (void) input_data (buffer, string, NULL, 0); + (void) input_data (buffer, + string, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } else if ((argc >= 2) && (string_strcmp (argv[1], "-ol") == 0)) { @@ -7340,7 +7397,11 @@ COMMAND_CALLBACK(uptime) minutes, seconds, util_get_time_string (&weechat_first_start_time)); - (void) input_data (buffer, string, NULL, 0); + (void) input_data (buffer, + string, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } else { @@ -7391,7 +7452,11 @@ command_version_display (struct t_gui_buffer *buffer, _("compiled on"), version_get_compilation_date (), version_get_compilation_time ()); - (void) input_data (buffer, string, NULL, 0); + (void) input_data (buffer, + string, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } else { @@ -7401,7 +7466,11 @@ command_version_display (struct t_gui_buffer *buffer, "compiled on", version_get_compilation_date (), version_get_compilation_time ()); - (void) input_data (buffer, string, NULL, 0); + (void) input_data (buffer, + string, + NULL, + 0, /* split_newline */ + 0); /* user_data */ } } else @@ -9605,7 +9674,10 @@ command_exec_list (const char *command_list) if (command_eval) { (void) input_data (gui_buffer_search_main (), - command_eval, NULL, 0); + command_eval, + NULL, + 0, /* split_newline */ + 0); /* user_data */ free (command_eval); } } diff --git a/src/core/core-input.c b/src/core/core-input.c index d09f0aad8..8781a049c 100644 --- a/src/core/core-input.c +++ b/src/core/core-input.c @@ -246,7 +246,7 @@ end: int input_data (struct t_gui_buffer *buffer, const char *data, - const char *commands_allowed, int split_newline) + const char *commands_allowed, int split_newline, int user_data) { char *pos, *buf, str_buffer[128], *new_data, *buffer_full_name; const char *ptr_data, *ptr_data_for_buffer; @@ -331,8 +331,20 @@ input_data (struct t_gui_buffer *buffer, const char *data, else { /* input string is a command */ - rc = input_exec_command (buffer, 1, buffer->plugin, ptr_data, - commands_allowed); + if (user_data && buffer->input_get_any_user_data) + { + /* + * if data is sent from user and buffer catches any user data: + * send it to callback + */ + input_exec_data (buffer, ptr_data); + } + else + { + /* execute command on buffer */ + rc = input_exec_command (buffer, 1, buffer->plugin, ptr_data, + commands_allowed); + } } if (pos) @@ -384,7 +396,8 @@ input_data_timer_cb (const void *pointer, void *data, int remaining_calls) ptr_buffer, timer_args[1], timer_args[2], - (string_strcmp (timer_args[3], "1") == 0) ? 1 : 0); + (string_strcmp (timer_args[3], "1") == 0) ? 1 : 0, + 0); /* user_data */ } } @@ -417,7 +430,7 @@ input_data_delayed (struct t_gui_buffer *buffer, const char *data, char **timer_args, *new_commands_allowed; if (delay < 1) - return input_data (buffer, data, commands_allowed, split_newline); + return input_data (buffer, data, commands_allowed, split_newline, 0); timer_args = malloc (4 * sizeof (*timer_args)); if (!timer_args) diff --git a/src/core/core-input.h b/src/core/core-input.h index 57ab5d10e..3302983c2 100644 --- a/src/core/core-input.h +++ b/src/core/core-input.h @@ -31,7 +31,8 @@ extern int input_exec_command (struct t_gui_buffer *buffer, const char *string, const char *commands_allowed); extern int input_data (struct t_gui_buffer *buffer, const char *data, - const char *commands_allowed, int split_newline); + const char *commands_allowed, int split_newline, + int user_data); extern int input_data_delayed (struct t_gui_buffer *buffer, const char *data, const char *commands_allowed, int split_newline, long delay); diff --git a/src/core/core-signal.c b/src/core/core-signal.c index 3f28fe8e8..dbc48d926 100644 --- a/src/core/core-signal.c +++ b/src/core/core-signal.c @@ -228,7 +228,7 @@ signal_exec_command (int signal_index, const char *command) if (signal_upper) free (signal_upper); (void) input_data (gui_buffer_search_main (), - command_eval, NULL, 0); + command_eval, NULL, 0, 0); free (command_eval); } } diff --git a/src/core/core-upgrade.c b/src/core/core-upgrade.c index bca288aea..b5c6f2ca7 100644 --- a/src/core/core-upgrade.c +++ b/src/core/core-upgrade.c @@ -540,6 +540,8 @@ upgrade_weechat_read_buffer (struct t_infolist *infolist) /* input */ ptr_buffer->input = infolist_integer (infolist, "input"); + ptr_buffer->input_get_any_user_data = + infolist_integer (infolist, "input_get_any_user_data"); ptr_buffer->input_get_unknown_commands = infolist_integer (infolist, "input_get_unknown_commands"); ptr_buffer->input_get_empty = diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index a5d60d1e6..8941affea 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -101,7 +101,7 @@ char *gui_buffer_properties_get_integer[] = "nicklist_display_groups", "nicklist_count", "nicklist_visible_count", "nicklist_groups_count", "nicklist_groups_visible_count", "nicklist_nicks_count", "nicklist_nicks_visible_count", - "input", "input_get_unknown_commands", + "input", "input_get_any_user_data", "input_get_unknown_commands", "input_get_empty", "input_multiline", "input_size", "input_length", "input_pos", "input_1st_display", "num_history", "text_search", "text_search_direction", "text_search_exact", "text_search_regex", @@ -128,8 +128,8 @@ char *gui_buffer_properties_set[] = "highlight_words_del", "highlight_disable_regex", "highlight_regex", "highlight_tags_restrict", "highlight_tags", "hotlist_max_level_nicks", "hotlist_max_level_nicks_add", "hotlist_max_level_nicks_del", - "input", "input_pos", "input_get_unknown_commands", "input_get_empty", - "input_multiline", + "input", "input_pos", "input_get_any_user_data", "input_get_unknown_commands", + "input_get_empty", "input_multiline", NULL }; @@ -898,6 +898,7 @@ gui_buffer_new_props_with_id (long long id, new_buffer->input_callback = input_callback; new_buffer->input_callback_pointer = input_callback_pointer; new_buffer->input_callback_data = input_callback_data; + new_buffer->input_get_any_user_data = 0; new_buffer->input_get_unknown_commands = 0; new_buffer->input_get_empty = 0; new_buffer->input_multiline = 0; @@ -1470,6 +1471,8 @@ gui_buffer_get_integer (struct t_gui_buffer *buffer, const char *property) return buffer->nicklist_nicks_visible_count; else if (strcmp (property, "input") == 0) return buffer->input; + else if (strcmp (property, "input_get_any_user_data") == 0) + return buffer->input_get_any_user_data; else if (strcmp (property, "input_get_unknown_commands") == 0) return buffer->input_get_unknown_commands; else if (strcmp (property, "input_get_empty") == 0) @@ -2246,6 +2249,20 @@ gui_buffer_remove_hotlist_max_level_nicks (struct t_gui_buffer *buffer, } } +/* + * Sets flag "input_get_any_user_data" for a buffer. + */ + +void +gui_buffer_set_input_get_any_user_data (struct t_gui_buffer *buffer, + int input_get_any_user_data) +{ + if (!buffer) + return; + + buffer->input_get_any_user_data = (input_get_any_user_data) ? 1 : 0; +} + /* * Sets flag "input_get_unknown_commands" for a buffer. */ @@ -2258,8 +2275,8 @@ gui_buffer_set_input_get_unknown_commands (struct t_gui_buffer *buffer, return; buffer->input_get_unknown_commands = (input_get_unknown_commands) ? 1 : 0; -} +} /* * Sets flag "input_get_empty" for a buffer. */ @@ -2676,6 +2693,13 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property, if (error && !error[0]) gui_input_set_pos (buffer, number); } + else if (strcmp (property, "input_get_any_user_data") == 0) + { + error = NULL; + number = strtol (value, &error, 10); + if (error && !error[0]) + gui_buffer_set_input_get_any_user_data (buffer, number); + } else if (strcmp (property, "input_get_unknown_commands") == 0) { error = NULL; @@ -5171,6 +5195,7 @@ gui_buffer_hdata_buffer_cb (const void *pointer, void *data, HDATA_VAR(struct t_gui_buffer, input_callback, POINTER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_callback_pointer, POINTER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_callback_data, POINTER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_buffer, input_get_any_user_data, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_get_unknown_commands, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_get_empty, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_multiline, INTEGER, 0, NULL, NULL); @@ -5386,6 +5411,8 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_integer (ptr_item, "input", buffer->input)) return 0; + if (!infolist_new_var_integer (ptr_item, "input_get_any_user_data", buffer->input_get_any_user_data)) + return 0; if (!infolist_new_var_integer (ptr_item, "input_get_unknown_commands", buffer->input_get_unknown_commands)) return 0; if (!infolist_new_var_integer (ptr_item, "input_get_empty", buffer->input_get_empty)) @@ -5623,6 +5650,7 @@ gui_buffer_print_log () log_printf (" input_callback. . . . . : %p", ptr_buffer->input_callback); log_printf (" input_callback_pointer. : %p", ptr_buffer->input_callback_pointer); log_printf (" input_callback_data . . : %p", ptr_buffer->input_callback_data); + log_printf (" input_get_any_user_data : %d", ptr_buffer->input_get_any_user_data); log_printf (" input_get_unknown_cmd . : %d", ptr_buffer->input_get_unknown_commands); log_printf (" input_get_empty . . . . : %d", ptr_buffer->input_get_empty); log_printf (" input_multiline . . . . : %d", ptr_buffer->input_multiline); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 643f5ec85..f3de457b6 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -186,6 +186,7 @@ struct t_gui_buffer const void *input_callback_pointer; /* pointer for callback */ void *input_callback_data; /* data for callback */ /* to this buffer */ + int input_get_any_user_data; /* get any user data, including cmds */ int input_get_unknown_commands; /* 1 if unknown commands are sent to */ /* input_callback */ int input_get_empty; /* 1 if empty input is sent to */ diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 72c9cd937..6a6607c0d 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -333,7 +333,7 @@ gui_input_send_data_to_buffer (struct t_gui_buffer *buffer, char *data) gui_input_text_changed_modifier_and_signal (buffer, 0, /* save undo */ 1); /* stop completion */ - (void) input_data (buffer, data, NULL, 1); + (void) input_data (buffer, data, NULL, 1, 1); } /* diff --git a/src/gui/gui-key.c b/src/gui/gui-key.c index 6340566ee..d1a450cb9 100644 --- a/src/gui/gui-key.c +++ b/src/gui/gui-key.c @@ -2161,7 +2161,7 @@ gui_key_focus_command (const char *key, int context, command, ptr_buffer->full_name); } - (void) input_data (ptr_buffer, command, NULL, 0); + (void) input_data (ptr_buffer, command, NULL, 0, 0); free (command); } } @@ -2537,7 +2537,7 @@ gui_key_pressed (const char *key_str) for (i = 0; commands[i]; i++) { (void) input_data (gui_current_window->buffer, - commands[i], NULL, 0); + commands[i], NULL, 0, 0); } string_free_split (commands); } diff --git a/tests/tests.cpp b/tests/tests.cpp index 6060c0871..93703896a 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -183,7 +183,7 @@ void run_cmd (const char *command) { printf (">>> Running command: %s\n", command); - input_data (ptr_core_buffer, command, NULL, 0); + input_data (ptr_core_buffer, command, NULL, 0, 0); } /* @@ -193,7 +193,7 @@ run_cmd (const char *command) void run_cmd_quiet (const char *command) { - input_data (ptr_core_buffer, command, NULL, 0); + input_data (ptr_core_buffer, command, NULL, 0, 0); } /* diff --git a/tests/unit/core/test-core-command.cpp b/tests/unit/core/test-core-command.cpp index 89c565e8a..0e11cc2ea 100644 --- a/tests/unit/core/test-core-command.cpp +++ b/tests/unit/core/test-core-command.cpp @@ -67,7 +67,7 @@ TEST_GROUP(CoreCommand) FAIL("Buffer not found"); } record_start (); - input_data (buffer, command, NULL, 0); + input_data (buffer, command, NULL, 0, 0); record_stop (); } diff --git a/tests/unit/gui/test-gui-buffer.cpp b/tests/unit/gui/test-gui-buffer.cpp index 26d8b23b9..b6f14cdcb 100644 --- a/tests/unit/gui/test-gui-buffer.cpp +++ b/tests/unit/gui/test-gui-buffer.cpp @@ -723,7 +723,7 @@ TEST(GuiBuffer, NewUser) /* test signal "buffer_user_input_test" */ signal_buffer_user_input[0] = '\0'; - input_data (buffer, "something", NULL, 0); + input_data (buffer, "something", NULL, 0, 0); STRCMP_EQUAL("something", signal_buffer_user_input); /* test signal "buffer_user_closing_test" */ @@ -738,7 +738,7 @@ TEST(GuiBuffer, NewUser) /* close the buffer by sending "q" */ signal_buffer_user_input[0] = '\0'; signal_buffer_user_closing = 0; - input_data (buffer, "q", NULL, 0); + input_data (buffer, "q", NULL, 0, 0); STRCMP_EQUAL("q", signal_buffer_user_input); LONGS_EQUAL(1, signal_buffer_user_closing); @@ -758,7 +758,7 @@ TEST(GuiBuffer, NewUser) */ signal_buffer_user_input[0] = '\0'; signal_buffer_user_closing = 0; - input_data (buffer, "q", NULL, 0); + input_data (buffer, "q", NULL, 0, 0); STRCMP_EQUAL("q", signal_buffer_user_input); LONGS_EQUAL(0, signal_buffer_user_closing); diff --git a/tests/unit/gui/test-gui-key.cpp b/tests/unit/gui/test-gui-key.cpp index 1deeae9d6..d882ba7b3 100644 --- a/tests/unit/gui/test-gui-key.cpp +++ b/tests/unit/gui/test-gui-key.cpp @@ -114,22 +114,22 @@ TEST(GuiKey, GetCurrentContext) { LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ()); - input_data (gui_buffers, "/cursor", NULL, 0); + input_data (gui_buffers, "/cursor", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_CURSOR, gui_key_get_current_context ()); - input_data (gui_buffers, "/cursor stop", NULL, 0); + input_data (gui_buffers, "/cursor stop", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ()); - input_data (gui_buffers, "/input search_text_here", NULL, 0); + input_data (gui_buffers, "/input search_text_here", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_SEARCH, gui_key_get_current_context ()); - input_data (gui_buffers, "/input search_stop", NULL, 0); + input_data (gui_buffers, "/input search_stop", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ()); - input_data (gui_buffers, "/input search_history", NULL, 0); + input_data (gui_buffers, "/input search_history", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_HISTSEARCH, gui_key_get_current_context ()); - input_data (gui_buffers, "/input search_stop", NULL, 0); + input_data (gui_buffers, "/input search_stop", NULL, 0, 0); LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ()); gui_buffers->text_search_where = 0; diff --git a/tests/unit/plugins/irc/test-irc-protocol.cpp b/tests/unit/plugins/irc/test-irc-protocol.cpp index aa0ea10dd..115e078fb 100644 --- a/tests/unit/plugins/irc/test-irc-protocol.cpp +++ b/tests/unit/plugins/irc/test-irc-protocol.cpp @@ -334,7 +334,7 @@ TEST_GROUP(IrcProtocolWithServer) ptr_buffer = gui_buffer_search_by_full_name (buffer); if (ptr_buffer) - input_data (ptr_buffer, data, NULL, 0); + input_data (ptr_buffer, data, NULL, 0, 0); record_stop (); } diff --git a/tests/unit/plugins/test-plugin-api-info.cpp b/tests/unit/plugins/test-plugin-api-info.cpp index 914d5c1c7..07a31f9b0 100644 --- a/tests/unit/plugins/test-plugin-api-info.cpp +++ b/tests/unit/plugins/test-plugin-api-info.cpp @@ -961,7 +961,7 @@ TEST(PluginApiInfo, InfolistHistoryCb) infolist_free (infolist); /* history of core buffer */ - input_data (gui_buffers, "abc", NULL, 1); + input_data (gui_buffers, "abc", NULL, 1, 0); infolist = hook_infolist_get (NULL, "history", gui_buffers, NULL); CHECK(infolist); CHECK(infolist_next (infolist));