summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.adoc1
-rw-r--r--doc/de/weechat_scripting.de.adoc1
-rw-r--r--doc/en/weechat_plugin_api.en.adoc46
-rw-r--r--doc/en/weechat_scripting.en.adoc1
-rw-r--r--doc/fr/weechat_plugin_api.fr.adoc49
-rw-r--r--doc/fr/weechat_scripting.fr.adoc1
-rw-r--r--doc/it/weechat_plugin_api.it.adoc50
-rw-r--r--doc/it/weechat_scripting.it.adoc2
-rw-r--r--doc/ja/weechat_plugin_api.ja.adoc47
-rw-r--r--doc/ja/weechat_scripting.ja.adoc1
-rw-r--r--doc/pl/weechat_scripting.pl.adoc1
-rw-r--r--doc/sr/weechat_plugin_api.sr.adoc45
-rw-r--r--doc/sr/weechat_scripting.sr.adoc1
-rw-r--r--src/core/wee-command.c8
-rw-r--r--src/core/wee-upgrade.c5
-rw-r--r--src/gui/curses/gui-curses-chat.c26
-rw-r--r--src/gui/gui-chat.c11
-rw-r--r--src/gui/gui-chat.h8
-rw-r--r--src/gui/gui-line.c50
-rw-r--r--src/gui/gui-line.h7
-rw-r--r--src/plugins/guile/weechat-guile-api.c22
-rw-r--r--src/plugins/javascript/weechat-js-api.cpp24
-rw-r--r--src/plugins/lua/weechat-lua-api.c27
-rw-r--r--src/plugins/perl/weechat-perl-api.c25
-rw-r--r--src/plugins/php/weechat-php-api.c32
-rw-r--r--src/plugins/php/weechat-php-api.h1
-rw-r--r--src/plugins/php/weechat-php.c1
-rw-r--r--src/plugins/php/weechat-php.stub.php1
-rw-r--r--src/plugins/php/weechat-php_arginfo.h2
-rw-r--r--src/plugins/php/weechat-php_legacy_arginfo.h2
-rw-r--r--src/plugins/plugin-script-api.c29
-rw-r--r--src/plugins/plugin-script-api.h6
-rw-r--r--src/plugins/plugin.c2
-rw-r--r--src/plugins/python/weechat-python-api.c26
-rw-r--r--src/plugins/python/weechat.pyi5
-rw-r--r--src/plugins/ruby/weechat-ruby-api.c37
-rw-r--r--src/plugins/tcl/weechat-tcl-api.c38
-rw-r--r--src/plugins/weechat-plugin.h14
-rw-r--r--tests/scripts/python/testapi.py16
-rwxr-xr-xtests/scripts/python/testapigen.py1
-rw-r--r--tests/scripts/test-scripts.cpp5
-rw-r--r--tests/unit/gui/test-gui-chat.cpp116
-rw-r--r--tests/unit/gui/test-gui-line.cpp19
43 files changed, 752 insertions, 60 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc
index 941f960d0..04b955873 100644
--- a/ChangeLog.adoc
+++ b/ChangeLog.adoc
@@ -20,6 +20,7 @@ https://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
New features::
+ * core: add support of date and tags in messages displayed in buffers with free content, add function printf_y_date_tags (issue #1746)
* irc: add IRC message tags in messages displayed (issue #1680)
* relay: add `zstd` (https://facebook.github.io/zstd/[Zstandard]) compression in weechat protocol, remove option `compression` from `init` command, rename option relay.network.compression_level to relay.network.compression
* trigger: add variables `${tg_tag_irc_xxx}` containing IRC message tags (issue #1680)
diff --git a/doc/de/weechat_scripting.de.adoc b/doc/de/weechat_scripting.de.adoc
index b4f1bf245..6202b0af7 100644
--- a/doc/de/weechat_scripting.de.adoc
+++ b/doc/de/weechat_scripting.de.adoc
@@ -660,6 +660,7 @@ Liste der Skript API Funktionen:
print (für Python: prnt) +
print_date_tags (für Python: prnt_date_tags) +
print_y (für Python: prnt_y) +
+ print_y_date_tags (für Python: prnt_y_date_tags) +
log_print
| Hooks |
diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc
index b6ed02676..a42ce5503 100644
--- a/doc/en/weechat_plugin_api.en.adoc
+++ b/doc/en/weechat_plugin_api.en.adoc
@@ -8637,6 +8637,52 @@ weechat.prnt_y("", 2, "My message on third line")
[NOTE]
Function is called "print_y" in scripts ("prnt_y" in Python).
+==== printf_y_date_tags
+
+_WeeChat ≥ 3.5._
+
+Display a message on a line of a buffer with free content, using a custom
+date and tags.
+
+Prototype:
+
+[source,c]
+----
+void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...);
+----
+
+Arguments:
+
+* _buffer_: buffer pointer
+* _y_: line number (first line is 0); a negative value adds a line after last
+ line displayed: absolute value of _y_ is the number of lines after last line
+ (for example -1 is immediately after last line, -2 is 2 lines after last line)
+* _date_: date for message (0 means current date/time)
+* _tags_: comma separated list of tags (NULL means no tags)
+* _message_: message to display
+
+C example:
+
+[source,c]
+----
+weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag");
+----
+
+Script (Python):
+
+[source,python]
+----
+# prototype
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ...
+
+# example
+weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag")
+----
+
+[NOTE]
+Function is called "print_y_date_tags" in scripts ("prnt_y_date_tags" in Python).
+
==== log_printf
Write a message in WeeChat log file (weechat.log).
diff --git a/doc/en/weechat_scripting.en.adoc b/doc/en/weechat_scripting.en.adoc
index 8cea11500..78e1b5d46 100644
--- a/doc/en/weechat_scripting.en.adoc
+++ b/doc/en/weechat_scripting.en.adoc
@@ -644,6 +644,7 @@ List of functions in script API:
print (for python: prnt) +
print_date_tags (for python: prnt_date_tags) +
print_y (for python: prnt_y) +
+ print_y_date_tags (for python: prnt_y_date_tags) +
log_print
| hooks |
diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc
index 9ecce83e6..81d6b9ad6 100644
--- a/doc/fr/weechat_plugin_api.fr.adoc
+++ b/doc/fr/weechat_plugin_api.fr.adoc
@@ -8773,6 +8773,55 @@ weechat.prnt_y("", 2, "Mon message sur la 3ème ligne")
[NOTE]
La fonction s'appelle "print_y" dans les scripts ("prnt_y" en Python).
+==== printf_y_date_tags
+
+_WeeChat ≥ 3.5._
+
+Afficher un message sur une ligne d'un tampon avec contenu libre, en utilisant
+une date et des étiquettes personnalisées.
+
+Prototype :
+
+[source,c]
+----
+void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...);
+----
+
+Paramètres :
+
+* _buffer_ : pointeur vers le tampon
+* _y_ : numéro de ligne (la première ligne est 0); une valeur négative affiche
+ une ligne après la dernière ligne affichée : la valeur absolue de _y_ est le
+ nombre de lignes après la dernière ligne (par exemple -1 est immédiatement
+ après la dernière ligne, -2 est 2 lignes après la dernière ligne)
+* _date_ : date pour le message (0 signifie la date/heure courante)
+* _tags_ : liste d'étiquettes séparées par des virgules (NULL signifie aucune
+ étiquette)
+* _message_ : message à afficher
+
+Exemple en C :
+
+[source,c]
+----
+weechat_printf_y_date_tags (buffer, 2, 0, "mon_etiquette", "Mon message sur la 3ème ligne avec une étiquette");
+----
+
+Script (Python) :
+
+[source,python]
+----
+# prototype
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ...
+
+# exemple
+weechat.prnt_y_date_tags("", 2, 0, "mon_etiquette", "Mon message sur la 3ème ligne avec une étiquette")
+----
+
+[NOTE]
+La fonction s'appelle "print_y_date_tags" dans les scripts ("prnt_y_date_tags"
+en Python).
+
==== log_printf
Écrire un message dans le fichier de log WeeChat (weechat.log).
diff --git a/doc/fr/weechat_scripting.fr.adoc b/doc/fr/weechat_scripting.fr.adoc
index 14f6f1833..c6e436c56 100644
--- a/doc/fr/weechat_scripting.fr.adoc
+++ b/doc/fr/weechat_scripting.fr.adoc
@@ -663,6 +663,7 @@ Liste des fonctions de l'API script :
print (pour python : prnt) +
print_date_tags (pour python : prnt_date_tags) +
print_y (pour python : prnt_y) +
+ print_y_date_tags (pour python : prnt_y_date_tags) +
log_print
| hooks |
diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc
index 1568bf06c..688d408bc 100644
--- a/doc/it/weechat_plugin_api.it.adoc
+++ b/doc/it/weechat_plugin_api.it.adoc
@@ -8910,6 +8910,56 @@ weechat.prnt_y("", 2, "Mio messaggio sulla terza riga")
[NOTE]
La funzione è chiamata "print_y" negli script ("prnt_y in Python).
+==== printf_y_date_tags
+
+_WeeChat ≥ 3.5._
+
+// TRANSLATION MISSING
+Display a message on a line of a buffer with free content, using a custom
+date and tags.
+
+Prototipo:
+
+[source,c]
+----
+void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...);
+----
+
+Argomenti:
+
+* _buffer_: puntatore al buffer
+// TRANSLATION MISSING
+* _y_: numero di riga (la prima riga è 0); a negative value adds a line after
+ last line displayed: absolute value of _y_ is the number of lines after last
+ line (for example -1 is immediately after last line, -2 is 2 lines after last
+ line)
+* _date_: data per il messaggio (0 indica data/ora corrente)
+// TRANSLATION MISSING
+* _tags_: lista di tag separati da virgole (NULL means no tags)
+* _message_: messaggio da visualizzare
+
+Esempio in C:
+
+[source,c]
+----
+weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag");
+----
+
+Script (Python):
+
+[source,python]
+----
+# prototipo
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ...
+
+# esempio
+weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag")
+----
+
+[NOTE]
+La funzione è chiamata "print_y_date_tags" negli script ("prnt_y_date_tags in Python).
+
==== log_printf
Scrive un messaggio nel file di log di WeeChat (weechat.log).
diff --git a/doc/it/weechat_scripting.it.adoc b/doc/it/weechat_scripting.it.adoc
index 68c9976c0..f54dcdaef 100644
--- a/doc/it/weechat_scripting.it.adoc
+++ b/doc/it/weechat_scripting.it.adoc
@@ -676,6 +676,8 @@ Elenco di funzioni nelle API per gli script:
print_date_tags (for python: prnt_date_tags) +
// TRANSLATION MISSING
print_y (for python: prnt_y) +
+// TRANSLATION MISSING
+ print_y_date_tags (for python: prnt_y_date_tags) +
log_print
| hook |
diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc
index 5c455d9d9..b18f938d1 100644
--- a/doc/ja/weechat_plugin_api.ja.adoc
+++ b/doc/ja/weechat_plugin_api.ja.adoc
@@ -8659,6 +8659,53 @@ weechat.prnt_y("", 2, "My message on third line")
[NOTE]
この関数をスクリプトの中で実行するには "print_y" (Python の場合は "prnt_y") と書きます。
+==== printf_y_date_tags
+
+_WeeChat ≥ 3.5._
+
+// TRANSLATION MISSING
+Display a message on a line of a buffer with free content, using a custom
+date and tags.
+
+プロトタイプ:
+
+[source,c]
+----
+void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...);
+----
+
+引数:
+
+* _buffer_: バッファへのポインタ
+* _y_: 行番号 (1 行目は 0); 負数の場合は表示された最後の行の後に行を追加する:
+ _y_ の絶対値で最後の行の後に追加する行数を指定 (例えば
+ -1 は最後の行のすぐ後、-2 は 最後の行の 2 行後)
+* _date_: メッセージの日付 (0 は現在の日付/時間を意味する)
+* _tags_: タグのコンマ区切りリスト (タグを指定しない場合は NULL)
+* _message_: 表示するメッセージ
+
+C 言語での使用例:
+
+[source,c]
+----
+weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag");
+----
+
+スクリプト (Python) での使用例:
+
+[source,python]
+----
+# プロトタイプ
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ...
+
+# 例
+weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag")
+----
+
+[NOTE]
+この関数をスクリプトの中で実行するには "print_y_date_tags" (Python の場合は "prnt_y_date_tags") と書きます。
+
==== log_printf
WeeChat ログファイル (weechat.log) にメッセージを書き込む。
diff --git a/doc/ja/weechat_scripting.ja.adoc b/doc/ja/weechat_scripting.ja.adoc
index bc3987b45..7a0ffcf0c 100644
--- a/doc/ja/weechat_scripting.ja.adoc
+++ b/doc/ja/weechat_scripting.ja.adoc
@@ -665,6 +665,7 @@ link:weechat_plugin_api.ja.html[WeeChat プラグイン API リファレンス]
print (python では prnt) +
print_date_tags (python では prnt_date_tags) +
print_y (python では prnt_y) +
+ print_y_date_tags (python では prnt_y_date_tags) +
log_print
| フック |
diff --git a/doc/pl/weechat_scripting.pl.adoc b/doc/pl/weechat_scripting.pl.adoc
index ec7668082..98b33d4db 100644
--- a/doc/pl/weechat_scripting.pl.adoc
+++ b/doc/pl/weechat_scripting.pl.adoc
@@ -649,6 +649,7 @@ Lista funkcji w API skryptów:
print (dla pythona: prnt) +
print_date_tags (dla pythona: prnt_date_tags) +
print_y (dla pythona: prnt_y) +
+ print_y_date_tags (dla pythona: prnt_y_date_tags) +
log_print
| hooks |
diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc
index 04e144c1b..471eccfe6 100644
--- a/doc/sr/weechat_plugin_api.sr.adoc
+++ b/doc/sr/weechat_plugin_api.sr.adoc
@@ -8377,6 +8377,51 @@ weechat.prnt_y("", 2, "My message on third line")
[NOTE]
У скриптама се функција зове „print_y” („prnt_y” у језику Python).
+==== printf_y_date_tags
+
+_WeeChat ≥ 3.5._
+
+// TRANSLATION MISSING
+Display a message on a line of a buffer with free content, using a custom
+date and tags.
+
+Прототип:
+
+[source,c]
+----
+void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...);
+----
+
+Аргументи:
+
+* _buffer_: показивач на бафер
+* _y_: број линије (прва линија је 0); негативна вредност додаје линију иза последње приказане линије: апсолутна вредност _y_ је број линија након последње линије (на пример -1 је непосредно након последње линије, -2 је 2 линије након последње линије)
+* _date_: датум за поруку (0 значи текући датум/време)
+* _tags_: листа ознака раздвојених запетама (NULL значи да нема ознака)
+* _message_: порука која треба да се прикаже
+
+C пример:
+
+[source,c]
+----
+weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag");
+----
+
+Скрипта (Python):
+
+[source,python]
+----
+# прототип
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ...
+
+# пример
+weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag")
+----
+
+[NOTE]
+У скриптама се функција зове „print_y_date_tags” („prnt_y_date_tags” у језику Python).
+
==== log_printf
Уписује поруку у WeeChat лог фајл (weechat.log).
diff --git a/doc/sr/weechat_scripting.sr.adoc b/doc/sr/weechat_scripting.sr.adoc
index a0a97f744..3f8f4ade0 100644
--- a/doc/sr/weechat_scripting.sr.adoc
+++ b/doc/sr/weechat_scripting.sr.adoc
@@ -602,6 +602,7 @@ weechat_hook_timer(1000, 0, 1, $timer_cb, 'test');
print (за python: prnt) +
print_date_tags (за python: prnt_date_tags) +
print_y (за python: prnt_y) +
+ print_y_date_tags (за python: prnt_y_date_tags) +
log_print
| куке |
diff --git a/src/core/wee-command.c b/src/core/wee-command.c
index 6d916f0a4..219c0400e 100644
--- a/src/core/wee-command.c
+++ b/src/core/wee-command.c
@@ -5170,10 +5170,10 @@ COMMAND_CALLBACK(print)
{
if (free_content)
{
- gui_chat_printf_y (ptr_buffer, y,
- "%s%s",
- (prefix) ? prefix : "",
- text2);
+ gui_chat_printf_y_date_tags (ptr_buffer, y, date, tags,
+ "%s%s",
+ (prefix) ? prefix : "",
+ text2);
}
else
{
diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c
index 090c5be9a..48c859416 100644
--- a/src/core/wee-upgrade.c
+++ b/src/core/wee-upgrade.c
@@ -659,7 +659,10 @@ upgrade_weechat_read_buffer_line (struct t_infolist *infolist)
case GUI_BUFFER_TYPE_FREE:
new_line = gui_line_new (upgrade_current_buffer,
infolist_integer (infolist, "y"),
- 0, 0, NULL, NULL,
+ infolist_time (infolist, "date"),
+ infolist_time (infolist, "date_printed"),
+ infolist_string (infolist, "tags"),
+ NULL,
infolist_string (infolist, "message"));
if (new_line)
gui_line_add_y (new_line);
diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c
index a91fc549b..d05204ab1 100644
--- a/src/gui/curses/gui-curses-chat.c
+++ b/src/gui/curses/gui-curses-chat.c
@@ -1421,7 +1421,9 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line,
if (line->data->message && line->data->message[0])
{
message_with_tags = (gui_chat_display_tags) ?
- gui_line_build_string_message_tags (line) : NULL;
+ gui_line_build_string_message_tags (line->data->message,
+ line->data->tags_count,
+ line->data->tags_array) : NULL;
ptr_data = (message_with_tags) ?
message_with_tags : line->data->message;
message_with_search = NULL;
@@ -1639,7 +1641,10 @@ void
gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
int y)
{
- char *ptr_data, *message_with_search;
+ char *ptr_data, *message_with_search, *message_with_tags;
+
+ message_with_search = NULL;
+ message_with_tags = NULL;
/* reset color & style for a new line */
gui_chat_reset_style (window, line, 0, 1,
@@ -1653,9 +1658,9 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
gui_chat_clrtoeol (window);
- /* emphasize text (if searching text) */
ptr_data = line->data->message;
- message_with_search = NULL;
+
+ /* emphasize text (if searching text) */
if ((window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
&& (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)
&& (!window->buffer->text_search_regex
@@ -1669,6 +1674,17 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
ptr_data = message_with_search;
}
+ /* add tags if debug of tags is enabled */
+ if (gui_chat_display_tags)
+ {
+ message_with_tags = gui_line_build_string_message_tags (
+ ptr_data,
+ line->data->tags_count,
+ line->data->tags_array);
+ if (message_with_tags)
+ ptr_data = message_with_tags;
+ }
+
/* display the line */
if (gui_chat_display_word_raw (window, line, ptr_data,
window->win_chat_width, 0,
@@ -1680,6 +1696,8 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
if (message_with_search)
free (message_with_search);
+ if (message_with_tags)
+ free (message_with_tags);
}
/*
diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c
index fdc4e1363..3d12b51aa 100644
--- a/src/gui/gui-chat.c
+++ b/src/gui/gui-chat.c
@@ -941,9 +941,11 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
*/
void
-gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...)
+gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date,
+ const char *tags, const char *message, ...)
{
struct t_gui_line *ptr_line, *new_line, *new_line_empty;
+ time_t date_printed;
int i, last_y, num_lines_to_add;
if (gui_init_ok && !gui_chat_buffer_valid (buffer, GUI_BUFFER_TYPE_FREE))
@@ -962,7 +964,12 @@ gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...)
utf8_normalize (vbuffer, '?');
- new_line = gui_line_new (buffer, y, 0, 0, NULL, NULL, vbuffer);
+ date_printed = time (NULL);
+ if (date <= 0)
+ date = date_printed;
+
+ new_line = gui_line_new (buffer, y, date, date_printed, tags,
+ NULL, vbuffer);
if (!new_line)
goto end;
diff --git a/src/gui/gui-chat.h b/src/gui/gui-chat.h
index 80903fbab..6a5e7b194 100644
--- a/src/gui/gui-chat.h
+++ b/src/gui/gui-chat.h
@@ -31,6 +31,9 @@ struct t_gui_line;
#define gui_chat_printf(buffer, argz...) \
gui_chat_printf_date_tags(buffer, 0, NULL, ##argz)
+#define gui_chat_printf_y(buffer, y, argz...) \
+ gui_chat_printf_y_date_tags(buffer, y, 0, NULL, ##argz)
+
#define GUI_CHAT_TAG_NO_HIGHLIGHT "no_highlight"
#define GUI_CHAT_PREFIX_ERROR_DEFAULT "=!="
@@ -90,8 +93,9 @@ extern int gui_chat_buffer_valid (struct t_gui_buffer *buffer,
extern void gui_chat_printf_date_tags (struct t_gui_buffer *buffer,
time_t date, const char *tags,
const char *message, ...);
-extern void gui_chat_printf_y (struct t_gui_buffer *buffer, int y,
- const char *message, ...);
+extern void gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y,
+ time_t date, const char *tags,
+ const char *message, ...);
extern void gui_chat_print_lines_waiting_buffer (FILE *f);
extern int gui_chat_hsignal_quote_line_cb (const void *pointer, void *data,
const char *signal,
diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c
index 9f1fad71e..3dafe90eb 100644
--- a/src/gui/gui-line.c
+++ b/src/gui/gui-line.c
@@ -379,7 +379,7 @@ gui_line_get_align (struct t_gui_buffer *buffer, struct t_gui_line *line,
*/
char *
-gui_line_build_string_prefix_message (struct t_gui_line *line)
+gui_line_build_string_prefix_message (const char *prefix, const char *message)
{
char **string, *string_without_colors;
@@ -387,11 +387,11 @@ gui_line_build_string_prefix_message (struct t_gui_line *line)
if (!string)
return NULL;
- if (line->data->prefix)
- string_dyn_concat (string, line->data->prefix, -1);
+ if (prefix)
+ string_dyn_concat (string, prefix, -1);
string_dyn_concat (string, "\t", -1);
- if (line->data->message)
- string_dyn_concat (string, line->data->message, -1);
+ if (message)
+ string_dyn_concat (string, message, -1);
string_without_colors = gui_color_decode (*string, NULL);
@@ -407,24 +407,28 @@ gui_line_build_string_prefix_message (struct t_gui_line *line)
*/
char *
-gui_line_build_string_message_tags (struct t_gui_line *line)
+gui_line_build_string_message_tags (const char *message,
+ int tags_count, char **tags_array)
{
int i;
char **string, *result;
+ if ((tags_count < 0) || ((tags_count > 0) && !tags_array))
+ return NULL;
+
string = string_dyn_alloc (256);
if (!string)
return NULL;
- if (line->data->message)
- string_dyn_concat (string, line->data->message, -1);
+ if (message)
+ string_dyn_concat (string, message, -1);
string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), -1);
string_dyn_concat (string, " [", -1);
string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_TAGS), -1);
- for (i = 0; i < line->data->tags_count; i++)
+ for (i = 0; i < tags_count; i++)
{
- string_dyn_concat (string, line->data->tags_array[i], -1);
- if (i < line->data->tags_count - 1)
+ string_dyn_concat (string, tags_array[i], -1);
+ if (i < tags_count - 1)
string_dyn_concat (string, ",", -1);
}
string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), -1);
@@ -1434,11 +1438,10 @@ gui_line_new (struct t_gui_buffer *buffer, int y, time_t date,
else
{
new_line->data->y = y;
- new_line->data->date = 0;
- new_line->data->date_printed = 0;
+ new_line->data->date = date;
+ new_line->data->date_printed = date_printed;
new_line->data->str_time = NULL;
- new_line->data->tags_count = 0;
- new_line->data->tags_array = NULL;
+ gui_line_tags_alloc (new_line->data, tags);
new_line->data->refresh_needed = 1;
new_line->data->prefix = NULL;
new_line->data->prefix_length = 0;
@@ -1688,7 +1691,8 @@ gui_line_add (struct t_gui_line *line)
GUI_HOTLIST_HIGHLIGHT, NULL);
if (!weechat_upgrading)
{
- message_for_signal = gui_line_build_string_prefix_message (line);
+ message_for_signal = gui_line_build_string_prefix_message (
+ line->data->prefix, line->data->message);
if (message_for_signal)
{
(void) hook_signal_send ("weechat_highlight",
@@ -1703,7 +1707,8 @@ gui_line_add (struct t_gui_line *line)
if (!weechat_upgrading
&& (line->data->notify_level == GUI_HOTLIST_PRIVATE))
{
- message_for_signal = gui_line_build_string_prefix_message (line);
+ message_for_signal = gui_line_build_string_prefix_message (
+ line->data->prefix, line->data->message);
if (message_for_signal)
{
(void) hook_signal_send ("weechat_pv",
@@ -1852,11 +1857,22 @@ gui_line_add_y (struct t_gui_line *line)
void
gui_line_clear (struct t_gui_line *line)
{
+ line->data->date = 0;
+ line->data->date_printed = 0;
+ if (line->data->str_time)
+ {
+ free (line->data->str_time);
+ line->data->str_time = NULL;
+ }
+ gui_line_tags_free (line->data);
if (line->data->prefix)
{
string_shared_free (line->data->prefix);
line->data->prefix = NULL;
}
+ line->data->prefix_length = 0;
+ line->data->notify_level = 0;
+ line->data->highlight = 0;
if (line->data->message)
free (line->data->message);
line->data->message = strdup ("");
diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h
index ffc0a42ee..11c2f18b9 100644
--- a/src/gui/gui-line.h
+++ b/src/gui/gui-line.h
@@ -80,8 +80,11 @@ extern void gui_line_get_prefix_for_display (struct t_gui_line *line,
extern int gui_line_get_align (struct t_gui_buffer *buffer,
struct t_gui_line *line,
int with_suffix, int first_line);
-extern char *gui_line_build_string_prefix_message (struct t_gui_line *line);
-extern char *gui_line_build_string_message_tags (struct t_gui_line *line);
+extern char *gui_line_build_string_prefix_message (const char *prefix,
+ const char *message);
+extern char *gui_line_build_string_message_tags (const char *message,
+ int tags_count,
+ char **tags_array);
extern int gui_line_is_displayed (struct t_gui_line *line);
extern struct t_gui_line *gui_line_get_first_displayed (struct t_gui_buffer *buffer);
extern struct t_gui_line *gui_line_get_last_displayed (struct t_gui_buffer *buffer);
diff --git a/src/plugins/guile/weechat-guile-api.c b/src/plugins/guile/weechat-guile-api.c
index bb3ae7341..a48a37d19 100644
--- a/src/plugins/guile/weechat-guile-api.c
+++ b/src/plugins/guile/weechat-guile-api.c
@@ -1923,6 +1923,27 @@ weechat_guile_api_print_y (SCM buffer, SCM y, SCM message)
}
SCM
+weechat_guile_api_print_y_date_tags (SCM buffer, SCM y, SCM date, SCM tags,
+ SCM message)
+{
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (!scm_is_string (buffer) || !scm_is_integer (y)
+ || !scm_is_integer (date) || !scm_is_string (tags)
+ || !scm_is_string (message))
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ plugin_script_api_printf_y_date_tags (weechat_guile_plugin,
+ guile_current_script,
+ API_STR2PTR(API_SCM_TO_STRING(buffer)),
+ scm_to_int (y),
+ scm_to_int (date),
+ API_SCM_TO_STRING(tags),
+ "%s", API_SCM_TO_STRING(message));
+
+ API_RETURN_OK;
+}
+
+SCM
weechat_guile_api_log_print (SCM message)
{
API_INIT_FUNC(1, "log_print", API_RETURN_ERROR);
@@ -5121,6 +5142,7 @@ weechat_guile_api_module_init (void *data)
API_DEF_FUNC(print, 2);
API_DEF_FUNC(print_date_tags, 4);
API_DEF_FUNC(print_y, 3);
+ API_DEF_FUNC(print_y_date_tags, 5);
API_DEF_FUNC(log_print, 1);
API_DEF_FUNC(hook_command, 7);
API_DEF_FUNC(hook_completion, 4);
diff --git a/src/plugins/javascript/weechat-js-api.cpp b/src/plugins/javascript/weechat-js-api.cpp
index b2e264652..7acf0002a 100644
--- a/src/plugins/javascript/weechat-js-api.cpp
+++ b/src/plugins/javascript/weechat-js-api.cpp
@@ -1812,6 +1812,29 @@ API_FUNC(print_y)
API_RETURN_OK;
}
+API_FUNC(print_y_date_tags)
+{
+ int y, date;
+
+ API_INIT_FUNC(1, "print_y_date_tags", "siiss", API_RETURN_ERROR);
+
+ v8::String::Utf8Value buffer(args[0]);
+ y = args[1]->IntegerValue();
+ date = args[2]->IntegerValue();
+ v8::String::Utf8Value tags(args[3]);
+ v8::String::Utf8Value message(args[4]);
+
+ plugin_script_api_printf_y_date_tags (weechat_js_plugin,
+ js_current_script,
+ (struct t_gui_buffer *)API_STR2PTR(*buffer),
+ y,
+ date,
+ *tags,
+ "%s", *message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
API_INIT_FUNC(1, "log_print", "s", API_RETURN_ERROR);
@@ -5051,6 +5074,7 @@ WeechatJsV8::loadLibs()
API_DEF_FUNC(print);
API_DEF_FUNC(print_date_tags);
API_DEF_FUNC(print_y);
+ API_DEF_FUNC(print_y_date_tags);
API_DEF_FUNC(log_print);
API_DEF_FUNC(hook_command);
API_DEF_FUNC(hook_completion);
diff --git a/src/plugins/lua/weechat-lua-api.c b/src/plugins/lua/weechat-lua-api.c
index 3942d5b66..ee26fbe10 100644
--- a/src/plugins/lua/weechat-lua-api.c
+++ b/src/plugins/lua/weechat-lua-api.c
@@ -2024,6 +2024,32 @@ API_FUNC(print_y)
API_RETURN_OK;
}
+API_FUNC(print_y_date_tags)
+{
+ const char *buffer, *tags, *message;
+ int y, date;
+
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (lua_gettop (L) < 5)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ buffer = lua_tostring (L, -5);
+ y = lua_tonumber (L, -4);
+ date = lua_tonumber (L, -3);
+ tags = lua_tostring (L, -2);
+ message = lua_tostring (L, -1);
+
+ plugin_script_api_printf_y_date_tags (weechat_lua_plugin,
+ lua_current_script,
+ API_STR2PTR(buffer),
+ y,
+ date,
+ tags,
+ "%s", message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
const char *message;
@@ -5415,6 +5441,7 @@ const struct luaL_Reg weechat_lua_api_funcs[] = {
API_DEF_FUNC(print),
API_DEF_FUNC(print_date_tags),
API_DEF_FUNC(print_y),
+ API_DEF_FUNC(print_y_date_tags),
API_DEF_FUNC(log_print),
API_DEF_FUNC(hook_command),
API_DEF_FUNC(hook_completion),
diff --git a/src/plugins/perl/weechat-perl-api.c b/src/plugins/perl/weechat-perl-api.c
index 7b1d8e1db..5112fbc50 100644
--- a/src/plugins/perl/weechat-perl-api.c
+++ b/src/plugins/perl/weechat-perl-api.c
@@ -1937,6 +1937,30 @@ API_FUNC(print_y)
API_RETURN_OK;
}
+API_FUNC(print_y_date_tags)
+{
+ char *buffer, *tags, *message;
+ dXSARGS;
+
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (items < 5)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ buffer = SvPV_nolen (ST (0));
+ tags = SvPV_nolen (ST (3));
+ message = SvPV_nolen (ST (4));
+
+ plugin_script_api_printf_y_date_tags (weechat_perl_plugin,
+ perl_current_script,
+ API_STR2PTR(buffer),
+ SvIV (ST (1)),
+ SvIV (ST (2)),
+ tags,
+ "%s", message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
dXSARGS;
@@ -5370,6 +5394,7 @@ weechat_perl_api_init (pTHX)
API_DEF_FUNC(print);
API_DEF_FUNC(print_date_tags);
API_DEF_FUNC(print_y);
+ API_DEF_FUNC(print_y_date_tags);
API_DEF_FUNC(log_print);
API_DEF_FUNC(hook_command);
API_DEF_FUNC(hook_completion);
diff --git a/src/plugins/php/weechat-php-api.c b/src/plugins/php/weechat-php-api.c
index ccbf9b2d6..c48a6fec1 100644
--- a/src/plugins/php/weechat-php-api.c
+++ b/src/plugins/php/weechat-php-api.c
@@ -2097,6 +2097,38 @@ API_FUNC(print_y)
API_RETURN_OK;
}
+API_FUNC(print_y_date_tags)
+{
+ zend_string *z_buffer, *z_tags, *z_message;
+ zend_long z_y, z_date;
+ struct t_gui_buffer *buffer;
+ int y;
+ time_t date;
+ char *tags, *message;
+
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (zend_parse_parameters (ZEND_NUM_ARGS(), "SllSS", &z_buffer, &z_y,
+ &z_date, &z_tags, &z_message) == FAILURE)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ buffer = (struct t_gui_buffer *)API_STR2PTR(ZSTR_VAL(z_buffer));
+ y = (int)z_y;
+ date = (time_t)z_date;
+ tags = ZSTR_VAL(z_tags);
+ message = ZSTR_VAL(z_message);
+
+ plugin_script_api_printf_y_date_tags (weechat_php_plugin,
+ php_current_script,
+ buffer,
+ y,
+ date,
+ (const char *)tags,
+ "%s",
+ message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
zend_string *z_message;
diff --git a/src/plugins/php/weechat-php-api.h b/src/plugins/php/weechat-php-api.h
index f1ea273d9..283e4baed 100644
--- a/src/plugins/php/weechat-php-api.h
+++ b/src/plugins/php/weechat-php-api.h
@@ -126,6 +126,7 @@ PHP_FUNCTION(weechat_color);
PHP_FUNCTION(weechat_print);
PHP_FUNCTION(weechat_print_date_tags);
PHP_FUNCTION(weechat_print_y);
+PHP_FUNCTION(weechat_print_y_date_tags);
PHP_FUNCTION(weechat_log_print);
PHP_FUNCTION(weechat_hook_command);
PHP_FUNCTION(weechat_hook_completion);
diff --git a/src/plugins/php/weechat-php.c b/src/plugins/php/weechat-php.c
index cbe30deae..092113195 100644
--- a/src/plugins/php/weechat-php.c
+++ b/src/plugins/php/weechat-php.c
@@ -184,6 +184,7 @@ const zend_function_entry weechat_functions[] = {
PHP_FE(weechat_print, arginfo_weechat_print)
PHP_FE(weechat_print_date_tags, arginfo_weechat_print_date_tags)
PHP_FE(weechat_print_y, arginfo_weechat_print_y)
+ PHP_FE(weechat_print_y_date_tags, arginfo_weechat_print_y_date_tags)
PHP_FE(weechat_log_print, arginfo_weechat_log_print)
PHP_FE(weechat_hook_command, arginfo_weechat_hook_command)
PHP_FE(weechat_hook_completion, arginfo_weechat_hook_completion)
diff --git a/src/plugins/php/weechat-php.stub.php b/src/plugins/php/weechat-php.stub.php
index 7ecae6086..b5488d14f 100644
--- a/src/plugins/php/weechat-php.stub.php
+++ b/src/plugins/php/weechat-php.stub.php
@@ -87,6 +87,7 @@ function weechat_color(): mixed {}
function weechat_print(): mixed {}
function weechat_print_date_tags(): mixed {}
function weechat_print_y(): mixed {}
+function weechat_print_y_date_tags(): mixed {}
function weechat_log_print(): mixed {}
function weechat_hook_command(): mixed {}
function weechat_hook_completion(): mixed {}
diff --git a/src/plugins/php/weechat-php_arginfo.h b/src/plugins/php/weechat-php_arginfo.h
index d61320f3e..8067b169b 100644
--- a/src/plugins/php/weechat-php_arginfo.h
+++ b/src/plugins/php/weechat-php_arginfo.h
@@ -164,6 +164,8 @@ ZEND_END_ARG_INFO()
#define arginfo_weechat_print_y arginfo_weechat_register
+#define arginfo_weechat_print_y_date_tags arginfo_weechat_register
+
#define arginfo_weechat_log_print arginfo_weechat_register
#define arginfo_weechat_hook_command arginfo_weechat_register
diff --git a/src/plugins/php/weechat-php_legacy_arginfo.h b/src/plugins/php/weechat-php_legacy_arginfo.h
index da2882aa3..c96907041 100644
--- a/src/plugins/php/weechat-php_legacy_arginfo.h
+++ b/src/plugins/php/weechat-php_legacy_arginfo.h
@@ -164,6 +164,8 @@ ZEND_END_ARG_INFO()
#define arginfo_weechat_print_y arginfo_weechat_register
+#define arginfo_weechat_print_y_date_tags arginfo_weechat_register
+
#define arginfo_weechat_log_print arginfo_weechat_register
#define arginfo_weechat_hook_command arginfo_weechat_register
diff --git a/src/plugins/plugin-script-api.c b/src/plugins/plugin-script-api.c
index 5b4f854c2..157d0b181 100644
--- a/src/plugins/plugin-script-api.c
+++ b/src/plugins/plugin-script-api.c
@@ -326,7 +326,7 @@ plugin_script_api_printf (struct t_weechat_plugin *weechat_plugin,
}
/*
- * Prints a message with optional date and tags.
+ * Prints a message, with optional date and tags.
*/
void
@@ -378,6 +378,33 @@ plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin,
}
/*
+ * Prints a message on a buffer with free content, with optional date and tags.
+ */
+
+void
+plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin,
+ struct t_plugin_script *script,
+ struct t_gui_buffer *buffer, int y,
+ time_t date, const char *tags,
+ const char *format, ...)
+{
+ char *buf2;
+
+ weechat_va_format (format);
+ if (!vbuffer)
+ return;
+
+ buf2 = (script && script->charset && script->charset[0]) ?
+ weechat_iconv_to_internal (script->charset, vbuffer) : NULL;
+ weechat_printf_y_date_tags (buffer, y, date, tags,
+ "%s", (buf2) ? buf2 : vbuffer);
+ if (buf2)
+ free (buf2);
+
+ free (vbuffer);
+}
+
+/*
* Prints a message in WeeChat log file.
*/
diff --git a/src/plugins/plugin-script-api.h b/src/plugins/plugin-script-api.h
index 0707d2eef..0c01db775 100644
--- a/src/plugins/plugin-script-api.h
+++ b/src/plugins/plugin-script-api.h
@@ -119,6 +119,12 @@ extern void plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *script,
struct t_gui_buffer *buffer,
int y, const char *format, ...);
+extern void plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin,
+ struct t_plugin_script *script,
+ struct t_gui_buffer *buffer,
+ int y, time_t date,
+ const char *tags,
+ const char *format, ...);
extern void plugin_script_api_log_printf (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *script,
const char *format, ...);
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index e265102b7..e1c4cde0b 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -772,7 +772,7 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv)
new_plugin->prefix = &plugin_api_prefix;
new_plugin->color = &plugin_api_color;
new_plugin->printf_date_tags = &gui_chat_printf_date_tags;
- new_plugin->printf_y = &gui_chat_printf_y;
+ new_plugin->printf_y_date_tags = &gui_chat_printf_y_date_tags;
new_plugin->log_printf = &log_printf;
new_plugin->hook_command = &hook_command;
diff --git a/src/plugins/python/weechat-python-api.c b/src/plugins/python/weechat-python-api.c
index 14d4984d4..0decc1f80 100644
--- a/src/plugins/python/weechat-python-api.c
+++ b/src/plugins/python/weechat-python-api.c
@@ -1930,6 +1930,31 @@ API_FUNC(prnt_y)
API_RETURN_OK;
}
+API_FUNC(prnt_y_date_tags)
+{
+ char *buffer, *tags, *message;
+ int y, date;
+
+ API_INIT_FUNC(1, "prnt_y_date_tags", API_RETURN_ERROR);
+ buffer = NULL;
+ y = 0;
+ date = 0;
+ tags = NULL;
+ message = NULL;
+ if (!PyArg_ParseTuple (args, "siiss", &buffer, &y, &date, &tags, &message))
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ plugin_script_api_printf_y_date_tags (weechat_python_plugin,
+ python_current_script,
+ API_STR2PTR(buffer),
+ y,
+ date,
+ tags,
+ "%s", message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
char *message;
@@ -5279,6 +5304,7 @@ PyMethodDef weechat_python_funcs[] =
API_DEF_FUNC(prnt),
API_DEF_FUNC(prnt_date_tags),
API_DEF_FUNC(prnt_y),
+ API_DEF_FUNC(prnt_y_date_tags),
API_DEF_FUNC(log_print),
API_DEF_FUNC(hook_command),
API_DEF_FUNC(hook_completion),
diff --git a/src/plugins/python/weechat.pyi b/src/plugins/python/weechat.pyi
index f98b7071c..595a007c4 100644
--- a/src/plugins/python/weechat.pyi
+++ b/src/plugins/python/weechat.pyi
@@ -444,6 +444,11 @@ def prnt_y(buffer: str, y: int, message: str) -> int:
...
+def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int:
+ """`prnt_y_date_tags in WeeChat plugin API reference <https://weechat.org/doc/api#_prnt_y_date_tags>`_"""
+ ...
+
+
def log_print(message: str) -> int:
"""`log_print in WeeChat plugin API reference <https://weechat.org/doc/api#_log_print>`_"""
...
diff --git a/src/plugins/ruby/weechat-ruby-api.c b/src/plugins/ruby/weechat-ruby-api.c
index c1c5cdc00..09aad9968 100644
--- a/src/plugins/ruby/weechat-ruby-api.c
+++ b/src/plugins/ruby/weechat-ruby-api.c
@@ -2388,6 +2388,42 @@ weechat_ruby_api_print_y (VALUE class, VALUE buffer, VALUE y, VALUE message)
}
static VALUE
+weechat_ruby_api_print_y_date_tags (VALUE class, VALUE buffer, VALUE y,
+ VALUE date, VALUE tags, VALUE message)
+{
+ char *c_buffer, *c_tags, *c_message;
+ int c_y;
+ time_t c_date;
+
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (NIL_P (buffer) || NIL_P (y) || NIL_P (date) || NIL_P (tags)
+ || NIL_P (message))
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ Check_Type (buffer, T_STRING);
+ CHECK_INTEGER(y);
+ CHECK_INTEGER(date);
+ Check_Type (tags, T_STRING);
+ Check_Type (message, T_STRING);
+
+ c_buffer = StringValuePtr (buffer);
+ c_y = NUM2INT (y);
+ c_date = NUM2ULONG (date);
+ c_tags = StringValuePtr (tags);
+ c_message = StringValuePtr (message);
+
+ plugin_script_api_printf_y_date_tags (weechat_ruby_plugin,
+ ruby_current_script,
+ API_STR2PTR(c_buffer),
+ c_y,
+ c_date,
+ c_tags,
+ "%s", c_message);
+
+ API_RETURN_OK;
+}
+
+static VALUE
weechat_ruby_api_log_print (VALUE class, VALUE message)
{
char *c_message;
@@ -6540,6 +6576,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat)
API_DEF_FUNC(print, 2);
API_DEF_FUNC(print_date_tags, 4);
API_DEF_FUNC(print_y, 3);
+ API_DEF_FUNC(print_y_date_tags, 5);
API_DEF_FUNC(log_print, 1);
API_DEF_FUNC(hook_command, 7);
API_DEF_FUNC(hook_completion, 4);
diff --git a/src/plugins/tcl/weechat-tcl-api.c b/src/plugins/tcl/weechat-tcl-api.c
index 2e4ca610b..cff12283d 100644
--- a/src/plugins/tcl/weechat-tcl-api.c
+++ b/src/plugins/tcl/weechat-tcl-api.c
@@ -2134,13 +2134,13 @@ API_FUNC(print_date_tags)
{
Tcl_Obj *objp;
char *buffer, *tags, *message;
- int i, tdate;
+ int i, date;
API_INIT_FUNC(1, "print_date_tags", API_RETURN_ERROR);
if (objc < 5)
API_WRONG_ARGS(API_RETURN_ERROR);
- if (Tcl_GetIntFromObj (interp, objv[2], &tdate) != TCL_OK)
+ if (Tcl_GetIntFromObj (interp, objv[2], &date) != TCL_OK)
API_WRONG_ARGS(API_RETURN_ERROR);
buffer = Tcl_GetStringFromObj (objv[1], &i);
@@ -2150,7 +2150,7 @@ API_FUNC(print_date_tags)
plugin_script_api_printf_date_tags (weechat_tcl_plugin,
tcl_current_script,
API_STR2PTR(buffer),
- tdate,
+ date,
tags,
"%s", message);
@@ -2182,6 +2182,37 @@ API_FUNC(print_y)
API_RETURN_OK;
}
+API_FUNC(print_y_date_tags)
+{
+ Tcl_Obj *objp;
+ char *buffer, *tags, *message;
+ int i, y, date;
+
+ API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR);
+ if (objc < 6)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ if (Tcl_GetIntFromObj (interp, objv[2], &y) != TCL_OK)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ if (Tcl_GetIntFromObj (interp, objv[3], &date) != TCL_OK)
+ API_WRONG_ARGS(API_RETURN_ERROR);
+
+ buffer = Tcl_GetStringFromObj (objv[1], &i);
+ tags = Tcl_GetStringFromObj (objv[4], &i);
+ message = Tcl_GetStringFromObj (objv[5], &i);
+
+ plugin_script_api_printf_y_date_tags (weechat_tcl_plugin,
+ tcl_current_script,
+ API_STR2PTR(buffer),
+ y,
+ date,
+ tags,
+ "%s", message);
+
+ API_RETURN_OK;
+}
+
API_FUNC(log_print)
{
Tcl_Obj *objp;
@@ -5843,6 +5874,7 @@ void weechat_tcl_api_init (Tcl_Interp *interp)
API_DEF_FUNC(print);
API_DEF_FUNC(print_date_tags);
API_DEF_FUNC(print_y);
+ API_DEF_FUNC(print_y_date_tags);
API_DEF_FUNC(log_print);
API_DEF_FUNC(hook_command);
API_DEF_FUNC(hook_completion);
diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h
index d84336fbb..c45ad250a 100644
--- a/src/plugins/weechat-plugin.h
+++ b/src/plugins/weechat-plugin.h
@@ -68,7 +68,7 @@ struct timeval;
* please change the date with current one; for a second change at same
* date, increment the 01, otherwise please keep 01.
*/
-#define WEECHAT_PLUGIN_API_VERSION "20211106-01"
+#define WEECHAT_PLUGIN_API_VERSION "20220130-01"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@@ -653,8 +653,9 @@ struct t_weechat_plugin
const char *(*color) (const char *color_name);
void (*printf_date_tags) (struct t_gui_buffer *buffer, time_t date,
const char *tags, const char *message, ...);
- void (*printf_y) (struct t_gui_buffer *buffer, int y,
- const char *message, ...);
+ void (*printf_y_date_tags) (struct t_gui_buffer *buffer, int y,
+ time_t date, const char *tags,
+ const char *message, ...);
void (*log_printf) (const char *message, ...);
/* hooks */
@@ -1689,7 +1690,12 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
(weechat_plugin->printf_date_tags)(__buffer, __date, __tags, \
__message, ##__argz)
#define weechat_printf_y(__buffer, __y, __message, __argz...) \
- (weechat_plugin->printf_y)(__buffer, __y, __message, ##__argz)
+ (weechat_plugin->printf_y_date_tags)(__buffer, __y, 0, NULL, \
+ __message, ##__argz)
+#define weechat_printf_y_date_tags(__buffer, __y, __date, __tags, \
+ __message, __argz...) \
+ (weechat_plugin->printf_y_date_tags)(__buffer, __y, __date, __tags, \
+ __message, ##__argz)
#define weechat_log_printf(__message, __argz...) \
(weechat_plugin->log_printf)(__message, ##__argz)
diff --git a/tests/scripts/python/testapi.py b/tests/scripts/python/testapi.py
index 634370c22..4be516319 100644
--- a/tests/scripts/python/testapi.py
+++ b/tests/scripts/python/testapi.py
@@ -148,6 +148,16 @@ def test_key():
check(weechat.key_unbind('mouse', 'quiet:area:chat(plugin.test)') == 3)
+def buffer_input_cb(data, buffer, input_data):
+ """Buffer input callback."""
+ return weechat.WEECHAT_RC_OK
+
+
+def buffer_close_cb(data, buffer):
+ """Buffer close callback."""
+ return weechat.WEECHAT_RC_OK
+
+
def test_display():
"""Test display functions."""
check(weechat.prefix('action') != '')
@@ -158,6 +168,12 @@ def test_display():
check(weechat.prefix('unknown') == '')
check(weechat.color('green') != '')
check(weechat.color('unknown') == '')
+ weechat.prnt('', '## test prnt')
+ weechat.prnt_date_tags('', 946681200, 'tag1,tag2', '## test prnt_date_tags')
+ buffer = weechat.buffer_new('test_free', 'buffer_input_cb', '', 'buffer_close_cb', '')
+ weechat.prnt_y(buffer, 0, '## test prnt_y')
+ weechat.prnt_y_date_tags(buffer, 0, 946681200, 'tag1,tag2', '## test prnt_y_date_tags')
+ weechat.buffer_close(buffer)
def completion_cb(data, completion_item, buf, completion):
diff --git a/tests/scripts/python/testapigen.py b/tests/scripts/python/testapigen.py
index 4a63c8f1f..3d529ea4c 100755
--- a/tests/scripts/python/testapigen.py
+++ b/tests/scripts/python/testapigen.py
@@ -111,6 +111,7 @@ class WeechatScript(object): # pylint: disable=too-many-instance-attributes
'prnt': 'print',
'prnt_date_tags': 'print_date_tags',
'prnt_y': 'print_y',
+ 'prnt_y_date_tags': 'print_y_date_tags',
}
for node in ast.walk(self.tree):
if isinstance(node, ast.Call) and \
diff --git a/tests/scripts/test-scripts.cpp b/tests/scripts/test-scripts.cpp
index 33eaa3818..1dfc38f71 100644
--- a/tests/scripts/test-scripts.cpp
+++ b/tests/scripts/test-scripts.cpp
@@ -89,8 +89,11 @@ TEST_GROUP(Scripts)
api_tests_errors++;
else if (strstr (message, "TESTS END"))
api_tests_end++;
- else if ((message[0] != '>') && (message[0] != ' '))
+ else if ((message[0] != '>') && (message[0] != ' ')
+ && (strncmp (message, "## ", 3) != 0))
+ {
api_tests_other++;
+ }
}
return WEECHAT_RC_OK;
diff --git a/tests/unit/gui/test-gui-chat.cpp b/tests/unit/gui/test-gui-chat.cpp
index 385c14b91..e359595e3 100644
--- a/tests/unit/gui/test-gui-chat.cpp
+++ b/tests/unit/gui/test-gui-chat.cpp
@@ -520,6 +520,27 @@ TEST(GuiChat, PrintDateTags)
LONGS_EQUAL(4, ptr_data->prefix_length);
STRCMP_EQUAL("this is a test", ptr_data->message);
+ /* message with empty tags */
+ ptr_last_line = gui_buffers->own_lines->last_line;
+ gui_chat_printf_date_tags (gui_buffers, 0, "", "nick\tthis is a test");
+ CHECK(ptr_last_line != gui_buffers->own_lines->last_line);
+ ptr_data = gui_buffers->own_lines->last_line->data;
+ CHECK(ptr_data);
+ POINTERS_EQUAL(gui_buffers, ptr_data->buffer);
+ LONGS_EQUAL(-1, ptr_data->y);
+ CHECK(ptr_data->date > 0);
+ CHECK(ptr_data->date == ptr_data->date_printed);
+ CHECK(ptr_data->str_time && ptr_data->str_time[0]);
+ LONGS_EQUAL(0, ptr_data->tags_count);
+ POINTERS_EQUAL(NULL, ptr_data->tags_array);
+ LONGS_EQUAL(1, ptr_data->displayed);
+ LONGS_EQUAL(0, ptr_data->notify_level);
+ LONGS_EQUAL(0, ptr_data->highlight);
+ LONGS_EQUAL(0, ptr_data->refresh_needed);
+ STRCMP_EQUAL("nick", ptr_data->prefix);
+ LONGS_EQUAL(4, ptr_data->prefix_length);
+ STRCMP_EQUAL("this is a test", ptr_data->message);
+
/* message with 3 tags */
ptr_last_line = gui_buffers->own_lines->last_line;
gui_chat_printf_date_tags (gui_buffers, 0, "tag1,tag2,tag3", "nick\tthis is a test");
@@ -547,10 +568,10 @@ TEST(GuiChat, PrintDateTags)
/*
* Tests functions:
- * gui_chat_printf_y
+ * gui_chat_printf_y_date_tags
*/
-TEST(GuiChat, PrintY)
+TEST(GuiChat, PrintYDateTags)
{
struct t_gui_buffer *buffer;
struct t_gui_line_data *ptr_data;
@@ -560,30 +581,70 @@ TEST(GuiChat, PrintY)
gui_buffer_set (buffer, "type", "free");
/* invalid buffer pointer */
- gui_chat_printf_y ((struct t_gui_buffer *)0x1, 0, "test");
+ gui_chat_printf_y_date_tags ((struct t_gui_buffer *)0x1, 0, 0, NULL, "test");
POINTERS_EQUAL(NULL, buffer->own_lines->last_line);
/* invalid buffer: not with free content */
- gui_chat_printf_y (gui_buffers, 0, "test");
+ gui_chat_printf_y_date_tags (gui_buffers, 0, 0, NULL, "test");
POINTERS_EQUAL(NULL, buffer->own_lines->last_line);
/* NULL message */
- gui_chat_printf_y (buffer, 0, NULL);
+ gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, NULL);
POINTERS_EQUAL(NULL, buffer->own_lines->last_line);
/* empty message */
- gui_chat_printf_y (buffer, 0, "");
+ gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, "");
POINTERS_EQUAL(NULL, buffer->own_lines->last_line);
/* message on first line */
- gui_chat_printf_y (buffer, 0, "this is a test on line 1");
+ gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, "this is a test on line 1");
CHECK(buffer->own_lines->last_line);
ptr_data = buffer->own_lines->last_line->data;
CHECK(ptr_data);
POINTERS_EQUAL(buffer, ptr_data->buffer);
LONGS_EQUAL(0, ptr_data->y);
- LONGS_EQUAL(0, ptr_data->date);
- LONGS_EQUAL(0, ptr_data->date_printed);
+ CHECK(ptr_data->date > 0);
+ CHECK(ptr_data->date == ptr_data->date_printed);
+ POINTERS_EQUAL(NULL, ptr_data->str_time);
+ LONGS_EQUAL(0, ptr_data->tags_count);
+ POINTERS_EQUAL(NULL, ptr_data->tags_array);
+ LONGS_EQUAL(1, ptr_data->displayed);
+ LONGS_EQUAL(0, ptr_data->notify_level);
+ LONGS_EQUAL(0, ptr_data->highlight);
+ LONGS_EQUAL(1, ptr_data->refresh_needed);
+ POINTERS_EQUAL(NULL, ptr_data->prefix);
+ LONGS_EQUAL(0, ptr_data->prefix_length);
+ STRCMP_EQUAL("this is a test on line 1", ptr_data->message);
+
+ /* message on first line with past date */
+ gui_chat_printf_y_date_tags (buffer, 0, 946681200, NULL, "this is a test on line 1");
+ CHECK(buffer->own_lines->last_line);
+ ptr_data = buffer->own_lines->last_line->data;
+ CHECK(ptr_data);
+ POINTERS_EQUAL(buffer, ptr_data->buffer);
+ LONGS_EQUAL(0, ptr_data->y);
+ LONGS_EQUAL(946681200, ptr_data->date);
+ CHECK(ptr_data->date < ptr_data->date_printed);
+ POINTERS_EQUAL(NULL, ptr_data->str_time);
+ LONGS_EQUAL(0, ptr_data->tags_count);
+ POINTERS_EQUAL(NULL, ptr_data->tags_array);
+ LONGS_EQUAL(1, ptr_data->displayed);
+ LONGS_EQUAL(0, ptr_data->notify_level);
+ LONGS_EQUAL(0, ptr_data->highlight);
+ LONGS_EQUAL(1, ptr_data->refresh_needed);
+ POINTERS_EQUAL(NULL, ptr_data->prefix);
+ LONGS_EQUAL(0, ptr_data->prefix_length);
+ STRCMP_EQUAL("this is a test on line 1", ptr_data->message);
+
+ /* message on first line with empty tags */
+ gui_chat_printf_y_date_tags (buffer, 0, 0, "", "this is a test on line 1");
+ CHECK(buffer->own_lines->last_line);
+ ptr_data = buffer->own_lines->last_line->data;
+ CHECK(ptr_data);
+ POINTERS_EQUAL(buffer, ptr_data->buffer);
+ LONGS_EQUAL(0, ptr_data->y);
+ CHECK(ptr_data->date > 0);
+ CHECK(ptr_data->date == ptr_data->date_printed);
POINTERS_EQUAL(NULL, ptr_data->str_time);
LONGS_EQUAL(0, ptr_data->tags_count);
POINTERS_EQUAL(NULL, ptr_data->tags_array);
@@ -595,15 +656,38 @@ TEST(GuiChat, PrintY)
LONGS_EQUAL(0, ptr_data->prefix_length);
STRCMP_EQUAL("this is a test on line 1", ptr_data->message);
+ /* message on first line with 3 tags */
+ gui_chat_printf_y_date_tags (buffer, 0, 0, "tag1,tag2,tag3", "this is a test on line 1");
+ CHECK(buffer->own_lines->last_line);
+ ptr_data = buffer->own_lines->last_line->data;
+ CHECK(ptr_data);
+ POINTERS_EQUAL(buffer, ptr_data->buffer);
+ LONGS_EQUAL(0, ptr_data->y);
+ CHECK(ptr_data->date > 0);
+ CHECK(ptr_data->date == ptr_data->date_printed);
+ POINTERS_EQUAL(NULL, ptr_data->str_time);
+ LONGS_EQUAL(3, ptr_data->tags_count);
+ CHECK(ptr_data->tags_array);
+ STRCMP_EQUAL("tag1", ptr_data->tags_array[0]);
+ STRCMP_EQUAL("tag2", ptr_data->tags_array[1]);
+ STRCMP_EQUAL("tag3", ptr_data->tags_array[2]);
+ LONGS_EQUAL(1, ptr_data->displayed);
+ LONGS_EQUAL(0, ptr_data->notify_level);
+ LONGS_EQUAL(0, ptr_data->highlight);
+ LONGS_EQUAL(1, ptr_data->refresh_needed);
+ POINTERS_EQUAL(NULL, ptr_data->prefix);
+ LONGS_EQUAL(0, ptr_data->prefix_length);
+ STRCMP_EQUAL("this is a test on line 1", ptr_data->message);
+
/* message on third line */
- gui_chat_printf_y (buffer, 2, "this is a test on line 3");
+ gui_chat_printf_y_date_tags (buffer, 2, 0, NULL, "this is a test on line 3");
CHECK(buffer->own_lines->last_line);
ptr_data = buffer->own_lines->last_line->data;
CHECK(ptr_data);
POINTERS_EQUAL(buffer, ptr_data->buffer);
LONGS_EQUAL(2, ptr_data->y);
- LONGS_EQUAL(0, ptr_data->date);
- LONGS_EQUAL(0, ptr_data->date_printed);
+ CHECK(ptr_data->date > 0);
+ CHECK(ptr_data->date == ptr_data->date_printed);
POINTERS_EQUAL(NULL, ptr_data->str_time);
LONGS_EQUAL(0, ptr_data->tags_count);
POINTERS_EQUAL(NULL, ptr_data->tags_array);
@@ -616,7 +700,7 @@ TEST(GuiChat, PrintY)
STRCMP_EQUAL("this is a test on line 3", ptr_data->message);
/* delete first line */
- gui_chat_printf_y (buffer, 0, "");
+ gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, "");
ptr_data = buffer->own_lines->first_line->data;
CHECK(ptr_data);
POINTERS_EQUAL(buffer, ptr_data->buffer);
@@ -635,13 +719,13 @@ TEST(GuiChat, PrintY)
STRCMP_EQUAL("", ptr_data->message);
/* delete third line */
- gui_chat_printf_y (buffer, 2, "");
+ gui_chat_printf_y_date_tags (buffer, 2, 0, NULL, "");
CHECK(buffer->own_lines->first_line);
CHECK(buffer->own_lines->first_line->next_line);
POINTERS_EQUAL(NULL, buffer->own_lines->first_line->next_line->next_line);
- /* delete secondline */
- gui_chat_printf_y (buffer, 1, "");
+ /* delete second line */
+ gui_chat_printf_y_date_tags (buffer, 1, 0, NULL, "");
CHECK(buffer->own_lines->first_line);
POINTERS_EQUAL(NULL, buffer->own_lines->first_line->next_line);
diff --git a/tests/unit/gui/test-gui-line.cpp b/tests/unit/gui/test-gui-line.cpp
index 6032301c1..14e37a03f 100644
--- a/tests/unit/gui/test-gui-line.cpp
+++ b/tests/unit/gui/test-gui-line.cpp
@@ -36,7 +36,8 @@ extern "C"
#define WEE_BUILD_STR_PREFIX_MSG(__result, __prefix, __message) \
line = gui_line_new (gui_buffers, -1, 0, 0, "tag1,tag2", \
__prefix, __message); \
- str = gui_line_build_string_prefix_message (line); \
+ str = gui_line_build_string_prefix_message (line->data->prefix, \
+ line->data->message); \
STRCMP_EQUAL(__result, str); \
free (str); \
gui_line_free_data (line); \
@@ -45,7 +46,9 @@ extern "C"
#define WEE_BUILD_STR_MSG_TAGS(__tags, __message) \
line = gui_line_new (gui_buffers, -1, 0, 0, __tags, \
NULL, __message); \
- str = gui_line_build_string_message_tags (line); \
+ str = gui_line_build_string_message_tags (line->data->message, \
+ line->data->tags_count, \
+ line->data->tags_array); \
STRCMP_EQUAL(str_result, str); \
free (str); \
gui_line_free_data (line); \
@@ -213,6 +216,18 @@ TEST(GuiLine, BuildStringMessageTags)
struct t_gui_line *line;
char *str, str_result[256];
+ line = gui_line_new (gui_buffers, -1, 0, 0, "tag1,tag2", NULL, "test");
+ POINTERS_EQUAL(NULL,
+ gui_line_build_string_message_tags (line->data->message,
+ -1,
+ line->data->tags_array));
+ POINTERS_EQUAL(NULL,
+ gui_line_build_string_message_tags (line->data->message,
+ 1,
+ NULL));
+ gui_line_free_data (line);
+ free (line);
+
snprintf (str_result, sizeof (str_result),
"message%s [%s%s]",
GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS),