diff --git a/ChangeLog.adoc b/ChangeLog.adoc index d91d8d52d..081a36528 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -15,6 +15,7 @@ For a list of important changes that require manual actions, please look at rele New features:: + * core: add buffer property "input_prompt" * core: send signal "buffer_line_added" on buffers with free content * core: add support of XDG "state" directory (issue #2106, issue #1747) * core: use nick offline color for nick in action message diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index f98065fa3..e193a6add 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -12220,6 +12220,10 @@ List of signals sent by WeeChat and plugins: | Pointer: buffer. | Text search in buffer. +| weechat | [[hook_signal_input_prompt_changed]] input_prompt_changed | +| Pointer: buffer. +| Input prompt changed. + | weechat | [[hook_signal_input_text_changed]] input_text_changed | | Pointer: buffer. | Input text changed. @@ -14704,6 +14708,7 @@ Arguments: ** _type_: type of buffer: "formatted" or "free" _(WeeChat ≥ 4.2.0)_ ** _title_: title of buffer ** _nicklist_last_id_assigned_: last unique identifier used in this buffer for a group or nick _(WeeChat ≥ 4.3.0)_ +** _input_prompt_: input prompt _(WeeChat ≥ 4.3.0)_ ** _input_: input text ** _text_search_input_: input saved before text search ** _highlight_words_: list of words to highlight @@ -14939,6 +14944,9 @@ Properties: | key_unbind_xxx | | - | Unbind key _xxx_ for this buffer. +| input_prompt | 4.3.0 | any string +| Set new value for input prompt. + | input | | any string | Set new value for buffer input. diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index d2536abfe..4e4cef99f 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -12473,6 +12473,10 @@ Liste des signaux envoyés par WeeChat et les extensions : | Pointeur : tampon. | Recherche de texte dans le tampon. +| weechat | [[hook_signal_input_prompt_changed]] input_prompt_changed | +| Pointer: buffer. +| Invite de la zone de saisie modifiée. + | weechat | [[hook_signal_input_text_changed]] input_text_changed | | Pointeur : tampon. | Texte modifié dans la barre "input". @@ -15021,6 +15025,8 @@ Paramètres : ** _type_ : type de tampon : "formatted" (formaté) ou "free" (contenu libre) _(WeeChat ≥ 4.2.0)_ ** _title_ : titre du tampon ** _nicklist_last_id_assigned_ : dernier identifiant unique utilisé dans ce tampon pour un groupe ou un pseudo _(WeeChat ≥ 4.3.0)_ +// TRANSLATION MISSING +** _input_prompt_ : input prompt _(WeeChat ≥ 4.3.0)_ ** _input_ : texte saisi ** _text_search_input_ : texte saisi sauvegardé avant la recherche de texte ** _highlight_words_ : liste des mots pour le highlight @@ -15265,6 +15271,9 @@ Propriétés : | key_unbind_xxx | | - | Supprime la touche _xxx_ pour ce tampon. +| input_prompt | 4.3.0 | toute chaîne +| Change le contenu de l'invite dans la zone de saisie. + | input | | toute chaîne | Change le contenu de la zone de saisie. diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 37423b72b..856ac1930 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -12729,6 +12729,11 @@ List of signals sent by WeeChat and plugins: | Puntatore: buffer. | Ricerca testo nel buffer. +// TRANSLATION MISSING +| weechat | [[hook_signal_input_prompt_changed]] input_prompt_changed | +| Pointer: buffer. +| Input prompt changed. + | weechat | [[hook_signal_input_text_changed]] input_text_changed | | Puntatore: buffer. | Testo in input modificato. @@ -15404,6 +15409,8 @@ Argomenti: ** _title_: titolo del buffer // TRANSLATION MISSING ** _nicklist_last_id_assigned_: last unique identifier used in this buffer for a group or nick _(WeeChat ≥ 4.3.0)_ +// TRANSLATION MISSING +** _input_prompt_: input prompt _(WeeChat ≥ 4.3.0)_ ** _input_: testo in ingresso ** _text_search_input_: input salvato prima della ricerca nel testo ** _highlight_words_: elenco di parole da evidenziare @@ -15672,6 +15679,10 @@ Properties: | key_unbind_xxx | | - | Rimuove l'assegnazione del tasto _xxx_ per questo buffer. +// TRANSLATION MISSING +| input_prompt | 4.3.0 | any string +| Set new value for input prompt. + | input | | qualsiasi stringa | Imposta un nuovo valore per l'input del buffer. diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index e14364379..351edef8e 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -12386,6 +12386,11 @@ WeeChat とプラグインが送信するシグナルのリスト: | Pointer: バッファ | バッファテキストの検索 +// TRANSLATION MISSING +| weechat | [[hook_signal_input_prompt_changed]] input_prompt_changed | +| Pointer: buffer. +| Input prompt changed. + | weechat | [[hook_signal_input_text_changed]] input_text_changed | | Pointer: バッファ | 入力テキストが変更された @@ -14939,6 +14944,8 @@ const char *weechat_buffer_get_string (struct t_gui_buffer *buffer, ** _title_: バッファのタイトル // TRANSLATION MISSING ** _nicklist_last_id_assigned_: last unique identifier used in this buffer for a group or nick _(WeeChat ≥ 4.3.0)_ +// TRANSLATION MISSING +** _input_prompt_: input prompt _(WeeChat ≥ 4.3.0)_ ** _input_: 入力テキスト ** _text_search_input_: テキスト検索前に保存した入力テキスト ** _highlight_words_: ハイライトする単語のリスト @@ -15179,6 +15186,10 @@ void weechat_buffer_set (struct t_gui_buffer *buffer, const char *property, | key_unbind_xxx | | - | 指定したバッファに対してキー _xxx_ の割り当てを解除する +// TRANSLATION MISSING +| input_prompt | 4.3.0 | any string +| Set new value for input prompt. + | input | | 任意の文字列 | バッファ入力に新しい値を設定 diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index 0c0f2003b..4f43f357c 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -11895,6 +11895,11 @@ struct t_hook *weechat_hook_signal (const char *signal, | Показивач: бафер. | Претрага текста у баферу. +// TRANSLATION MISSING +| weechat | [[hook_signal_input_prompt_changed]] input_prompt_changed | +| Pointer: buffer. +| Input prompt changed. + | weechat | [[hook_signal_input_text_changed]] input_text_changed | | Показивач: бафер. | Променио се текст уноса. @@ -14281,6 +14286,8 @@ const char *weechat_buffer_get_string (struct t_gui_buffer *buffer, ** _type_: тип бафера: „formatted” или „free” _(WeeChat ≥ 4.2.0)_ ** _title_: наслов бафера ** _nicklist_last_id_assigned_: последњи јединствени идентификатор употребљен у овом баферу за групу или надимак _(WeeChat ≥ 4.3.0)_ +// TRANSLATION MISSING +** _input_prompt_: input prompt _(WeeChat ≥ 4.3.0)_ ** _input_: текст уноса ** _text_search_input_: сачувани унос пре претраге текста ** _highlight_words_: листа речи које се истичу @@ -14517,6 +14524,10 @@ void weechat_buffer_set (struct t_gui_buffer *buffer, const char *property, | key_unbind_xxx | | - | Уклања тастерску пречицу _xxx_ за овај бафер. +// TRANSLATION MISSING +| input_prompt | 4.3.0 | any string +| Set new value for input prompt. + | input | | било који стринг | Поставља нову вредност за унос у бафер. diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c index 3e6db5e7f..670ef3362 100644 --- a/src/gui/gui-bar-item.c +++ b/src/gui/gui-bar-item.c @@ -815,8 +815,6 @@ gui_bar_item_input_prompt_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, struct t_hashtable *extra_info) { - const char *nick; - /* make C compiler happy */ (void) pointer; (void) data; @@ -827,9 +825,7 @@ gui_bar_item_input_prompt_cb (const void *pointer, void *data, if (!buffer) return NULL; - nick = (const char *)hashtable_get (buffer->local_variables, "nick"); - - return (nick) ? strdup (nick) : NULL; + return (buffer->input_prompt) ? strdup (buffer->input_prompt) : NULL; } /* @@ -2312,7 +2308,8 @@ gui_bar_item_init () gui_bar_item_new (NULL, gui_bar_item_names[GUI_BAR_ITEM_INPUT_PROMPT], &gui_bar_item_input_prompt_cb, NULL, NULL); - gui_bar_item_hook_signal ("window_switch;buffer_switch;buffer_localvar_*", + gui_bar_item_hook_signal ("window_switch;buffer_switch;input_prompt_changed;" + "buffer_localvar_*", gui_bar_item_names[GUI_BAR_ITEM_INPUT_PROMPT]); /* input search */ diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 5cfa8eb89..d33c703a4 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -110,9 +110,9 @@ char *gui_buffer_properties_get_integer[] = }; char *gui_buffer_properties_get_string[] = { "id", "plugin", "name", "full_name", "old_full_name", "short_name", "title", - "nicklist_last_id_assigned", "input", "text_search_input", "highlight_words", - "highlight_disable_regex", "highlight_regex", "highlight_tags_restrict", - "highlight_tags", "hotlist_max_level_nicks", + "nicklist_last_id_assigned", "input_prompt", "input", "text_search_input", + "highlight_words", "highlight_disable_regex", "highlight_regex", + "highlight_tags_restrict", "highlight_tags", "hotlist_max_level_nicks", NULL }; char *gui_buffer_properties_get_pointer[] = @@ -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_any_user_data", "input_get_unknown_commands", - "input_get_empty", "input_multiline", + "input_prompt", "input", "input_pos", "input_get_any_user_data", + "input_get_unknown_commands", "input_get_empty", "input_multiline", NULL }; @@ -902,6 +902,7 @@ gui_buffer_new_props_with_id (long long id, new_buffer->input_get_unknown_commands = 0; new_buffer->input_get_empty = 0; new_buffer->input_multiline = 0; + new_buffer->input_prompt = NULL; gui_buffer_input_buffer_init (new_buffer); /* undo for input */ @@ -1543,6 +1544,8 @@ gui_buffer_get_string (struct t_gui_buffer *buffer, const char *property) "%lld", buffer->nicklist_last_id_assigned); return str_value; } + else if (strcmp (property, "input_prompt") == 0) + return buffer->input_prompt; else if (strcmp (property, "input") == 0) return buffer->input_buffer; else if (strcmp (property, "text_search_input") == 0) @@ -2295,6 +2298,26 @@ gui_buffer_remove_hotlist_max_level_nicks (struct t_gui_buffer *buffer, } } +/* + * Sets buffer input prompt. + */ + +void +gui_buffer_set_input_prompt (struct t_gui_buffer *buffer, + const char *input_prompt) +{ + if (!buffer || (string_strcmp (buffer->input_prompt, input_prompt) == 0)) + return; + + free (buffer->input_prompt); + buffer->input_prompt = (input_prompt && input_prompt[0]) ? + strdup (input_prompt) : NULL; + + (void) gui_buffer_send_signal (buffer, + "input_prompt_changed", + WEECHAT_HOOK_SIGNAL_POINTER, buffer); +} + /* * Sets buffer input. */ @@ -2711,6 +2734,10 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property, gui_key_unbind (buffer, -1, property + 11); } } + else if (strcmp (property, "input_prompt") == 0) + { + gui_buffer_set_input_prompt (buffer, value); + } else if (strcmp (property, "input") == 0) { gui_buffer_set_input (buffer, value); @@ -3750,6 +3777,7 @@ gui_buffer_close (struct t_gui_buffer *buffer) free (buffer->old_full_name); free (buffer->short_name); free (buffer->title); + free (buffer->input_prompt); free (buffer->input_buffer); free (buffer->input_undo_snap); free (buffer->text_search_input); @@ -5203,6 +5231,7 @@ gui_buffer_hdata_buffer_cb (const void *pointer, void *data, 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); + HDATA_VAR(struct t_gui_buffer, input_prompt, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_buffer, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_buffer_alloc, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, input_buffer_size, INTEGER, 0, NULL, NULL); @@ -5426,6 +5455,8 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_integer (ptr_item, "input_multiline", buffer->input_multiline)) return 0; + if (!infolist_new_var_string (ptr_item, "input_prompt", buffer->input_prompt)) + return 0; if (!infolist_new_var_string (ptr_item, "input_buffer", buffer->input_buffer)) return 0; if (!infolist_new_var_integer (ptr_item, "input_buffer_alloc", buffer->input_buffer_alloc)) @@ -5659,6 +5690,7 @@ gui_buffer_print_log () 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); + log_printf (" input_prompt. . . . . . : '%s'", ptr_buffer->input_prompt); log_printf (" input_buffer. . . . . . : '%s'", ptr_buffer->input_buffer); log_printf (" input_buffer_alloc. . . : %d", ptr_buffer->input_buffer_alloc); log_printf (" input_buffer_size . . . : %d", ptr_buffer->input_buffer_size); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 09373e9be..ed0974b7b 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -194,6 +194,7 @@ struct t_gui_buffer /* input_callback */ int input_multiline; /* 1 if multiple lines are sent as */ /* one message to input_callback */ + char *input_prompt; /* input prompt */ char *input_buffer; /* input buffer */ int input_buffer_alloc; /* input buffer: allocated size */ int input_buffer_size; /* buffer size in bytes */ diff --git a/tests/unit/gui/test-gui-buffer.cpp b/tests/unit/gui/test-gui-buffer.cpp index 1391b82c4..b33711143 100644 --- a/tests/unit/gui/test-gui-buffer.cpp +++ b/tests/unit/gui/test-gui-buffer.cpp @@ -42,6 +42,8 @@ extern int gui_buffer_user_input_cb (const void *pointer, void *data, const char *input_data); extern int gui_buffer_user_close_cb (const void *pointer, void *data, struct t_gui_buffer *buffer); +extern void gui_buffer_set_input_prompt (struct t_gui_buffer *buffer, + const char *input_prompt); extern void gui_buffer_set_short_name (struct t_gui_buffer *buffer, const char *short_name); extern void gui_buffer_set_highlight_words_list (struct t_gui_buffer *buffer, @@ -581,6 +583,7 @@ TEST(GuiBuffer, NewProps) LONGS_EQUAL(0, buffer->input_get_unknown_commands); LONGS_EQUAL(0, buffer->input_get_empty); LONGS_EQUAL(0, buffer->input_multiline); + POINTERS_EQUAL(NULL, buffer->input_prompt); STRCMP_EQUAL("", buffer->input_buffer); CHECK(buffer->input_buffer_alloc > 0); LONGS_EQUAL(0, buffer->input_buffer_size); @@ -933,6 +936,7 @@ TEST(GuiBuffer, GetString) STRCMP_EQUAL("weechat", gui_buffer_get_string (gui_buffers, "short_name")); STRCMP_EQUAL("formatted", gui_buffer_get_string (gui_buffers, "type")); STRNCMP_EQUAL("WeeChat ", gui_buffer_get_string (gui_buffers, "title"), 8); + POINTERS_EQUAL(NULL, gui_buffer_get_string (gui_buffers, "input_prompt")); STRCMP_EQUAL("", gui_buffer_get_string (gui_buffers, "input")); POINTERS_EQUAL(NULL, gui_buffer_get_string (gui_buffers, "text_search_input")); POINTERS_EQUAL(NULL, gui_buffer_get_string (gui_buffers, "highlight_words")); @@ -1217,6 +1221,22 @@ TEST(GuiBuffer, RemoveHotlistMaxLevelNicks) /* TODO: write tests */ } +/* + * Tests functions: + * gui_buffer_set_input_prompt + */ + +TEST(GuiBuffer, SetInputPrompt) +{ + POINTERS_EQUAL(NULL, gui_buffers->input_prompt); + + gui_buffer_set_input_prompt (gui_buffers, "test"); + STRCMP_EQUAL("test", gui_buffers->input_prompt); + + gui_buffer_set_input_prompt (gui_buffers, ""); + POINTERS_EQUAL(NULL, gui_buffers->input_prompt); +} + /* * Tests functions: * gui_buffer_set_input