fix(ui): keep messages visible after scrolling in non-chat windows #123

Manually merged
jabber.developer merged 5 commits from fix/scroll-non-chat-windows into master 2026-05-16 15:48:09 +00:00
5 changed files with 36 additions and 8 deletions

View File

@@ -61,6 +61,22 @@ integrity_issue_free(integrity_issue_t* issue)
} }
} }
gboolean
log_database_can_recover_messages(void)
{
if (!active_db_backend) {
return FALSE;
}
auto_gchar gchar* pref_dblog = prefs_get_string(PREF_DBLOG);
if (g_strcmp0(pref_dblog, "off") == 0) {
return FALSE;
}
if (g_strcmp0(pref_dblog, "redact") == 0) {
return FALSE;
}
return TRUE;
}
gboolean gboolean
log_database_init(ProfAccount* account) log_database_init(ProfAccount* account)
{ {

View File

@@ -109,6 +109,9 @@ ProfMessage* log_database_get_limits_info(const gchar* const contact_barejid, gb
void log_database_close(void); void log_database_close(void);
GSList* log_database_verify_integrity(const gchar* const contact_barejid); GSList* log_database_verify_integrity(const gchar* const contact_barejid);
// FALSE if no backend, or PREF_DBLOG is "off" / "redact".
gboolean log_database_can_recover_messages(void);
// Cross-backend export/import (requires HAVE_SQLITE) // Cross-backend export/import (requires HAVE_SQLITE)
#ifdef HAVE_SQLITE #ifdef HAVE_SQLITE
int log_database_export_to_flatfile(const gchar* const contact_jid); int log_database_export_to_flatfile(const gchar* const contact_jid);

View File

@@ -301,12 +301,6 @@ cl_ev_send_ai_msg(ProfAiWin* aiwin, const char* const message, const char* const
return; return;
} }
/* Reset paged flag before printing user message.
* If the user scrolled up to view history, paged=1 would suppress
* the message in _win_printf(). Reset it here so the message displays. */
aiwin->window.layout->paged = 0;
aiwin->window.layout->unread_msg = 0;
// Display user message in AI window. // Display user message in AI window.
win_print_outgoing(&aiwin->window, ">>", id, NULL, message); win_print_outgoing(&aiwin->window, ">>", id, NULL, message);

View File

@@ -46,6 +46,7 @@
#include "ui/ui.h" #include "ui/ui.h"
#include "ui/titlebar.h" #include "ui/titlebar.h"
#include "ui/inputwin.h" #include "ui/inputwin.h"
#include "ui/win_types.h"
#include "ui/window_list.h" #include "ui/window_list.h"
#include "ui/window.h" #include "ui/window.h"
#include "ui/screen.h" #include "ui/screen.h"
@@ -252,6 +253,10 @@ _title_bar_draw(void)
_show_muc_privacy(mucwin); _show_muc_privacy(mucwin);
_show_attention(current, mucwin->has_attention); _show_attention(current, mucwin->has_attention);
_show_scrolled(current); _show_scrolled(current);
} else if (current && current->type == WIN_AI) {
ProfAiWin* aiwin = (ProfAiWin*)current;
assert(aiwin->memcheck == PROFAIWIN_MEMCHECK);
_show_scrolled(current);
} }
_show_self_presence(); _show_self_presence();

View File

@@ -848,6 +848,14 @@ win_page_down(ProfWin* window, int scroll_size)
window->layout->paged = 0; window->layout->paged = 0;
window->layout->unread_msg = 0; window->layout->unread_msg = 0;
} }
// Non-chat windows have no DB to fetch from, so WIN_SCROLL_REACHED_BOTTOM
// never fires; reset paged once the buffer's last line is on screen.
if (window->type != WIN_CHAT
&& (total_rows - *page_start) <= page_space + 1) {
window->layout->paged = 0;
window->layout->unread_msg = 0;
}
} }
void void
@@ -1801,10 +1809,12 @@ static void
_win_printf(ProfWin* window, const char* show_char, int pad_indent, GDateTime* timestamp, int flags, theme_item_t theme_item, const char* const display_from, const char* const from_jid, const char* const message_id, const char* const message, ...) _win_printf(ProfWin* window, const char* show_char, int pad_indent, GDateTime* timestamp, int flags, theme_item_t theme_item, const char* const display_from, const char* const from_jid, const char* const message_id, const char* const message, ...)
{ {
/* Prevent printing and buffer update when user is viewing message history [SCROLLING]*/
if (window->layout->paged && wins_is_current(window)) { if (window->layout->paged && wins_is_current(window)) {
window->layout->unread_msg++; window->layout->unread_msg++;
return; // Skip buffer only when DB can replay the message on scroll-down.
if (window->type == WIN_CHAT && log_database_can_recover_messages()) {
return;
}
} }
if (timestamp == NULL) { if (timestamp == NULL) {