Merge pull request #1937 from H3rnand3zzz/fix/db-edge-scrolling
Fix scrolling state at windows edge
This commit is contained in:
@@ -146,9 +146,16 @@ typedef enum {
|
|||||||
WIN_VCARD
|
WIN_VCARD
|
||||||
} win_type_t;
|
} win_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WIN_SCROLL_INNER,
|
||||||
|
WIN_SCROLL_REACHED_TOP,
|
||||||
|
WIN_SCROLL_REACHED_BOTTOM
|
||||||
|
} win_scroll_state_t;
|
||||||
|
|
||||||
typedef struct prof_win_t
|
typedef struct prof_win_t
|
||||||
{
|
{
|
||||||
win_type_t type;
|
win_type_t type;
|
||||||
|
win_scroll_state_t scroll_state;
|
||||||
ProfLayout* layout;
|
ProfLayout* layout;
|
||||||
Autocomplete urls_ac;
|
Autocomplete urls_ac;
|
||||||
Autocomplete quotes_ac;
|
Autocomplete quotes_ac;
|
||||||
|
|||||||
@@ -75,9 +75,6 @@ static void _win_print_internal(ProfWin* window, const char* show_char, int pad_
|
|||||||
int flags, theme_item_t theme_item, const char* const from, const char* const message, DeliveryReceipt* receipt);
|
int flags, theme_item_t theme_item, const char* const from, const char* const message, DeliveryReceipt* receipt);
|
||||||
static void _win_print_wrapped(WINDOW* win, const char* const message, size_t indent, int pad_indent);
|
static void _win_print_wrapped(WINDOW* win, const char* const message, size_t indent, int pad_indent);
|
||||||
|
|
||||||
static gboolean _reached_top_of_database = FALSE;
|
|
||||||
static gboolean _reached_bottom_of_database = FALSE;
|
|
||||||
|
|
||||||
int
|
int
|
||||||
win_roster_cols(void)
|
win_roster_cols(void)
|
||||||
{
|
{
|
||||||
@@ -136,6 +133,7 @@ win_create_console(void)
|
|||||||
{
|
{
|
||||||
ProfConsoleWin* new_win = malloc(sizeof(ProfConsoleWin));
|
ProfConsoleWin* new_win = malloc(sizeof(ProfConsoleWin));
|
||||||
new_win->window.type = WIN_CONSOLE;
|
new_win->window.type = WIN_CONSOLE;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_split_layout();
|
new_win->window.layout = _win_create_split_layout();
|
||||||
|
|
||||||
return &new_win->window;
|
return &new_win->window;
|
||||||
@@ -146,6 +144,7 @@ win_create_chat(const char* const barejid)
|
|||||||
{
|
{
|
||||||
ProfChatWin* new_win = malloc(sizeof(ProfChatWin));
|
ProfChatWin* new_win = malloc(sizeof(ProfChatWin));
|
||||||
new_win->window.type = WIN_CHAT;
|
new_win->window.type = WIN_CHAT;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
|
|
||||||
new_win->barejid = strdup(barejid);
|
new_win->barejid = strdup(barejid);
|
||||||
@@ -177,6 +176,7 @@ win_create_muc(const char* const roomjid)
|
|||||||
int cols = getmaxx(stdscr);
|
int cols = getmaxx(stdscr);
|
||||||
|
|
||||||
new_win->window.type = WIN_MUC;
|
new_win->window.type = WIN_MUC;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
ProfLayoutSplit* layout = malloc(sizeof(ProfLayoutSplit));
|
ProfLayoutSplit* layout = malloc(sizeof(ProfLayoutSplit));
|
||||||
layout->base.type = LAYOUT_SPLIT;
|
layout->base.type = LAYOUT_SPLIT;
|
||||||
|
|
||||||
@@ -231,6 +231,7 @@ win_create_config(const char* const roomjid, DataForm* form, ProfConfWinCallback
|
|||||||
{
|
{
|
||||||
ProfConfWin* new_win = malloc(sizeof(ProfConfWin));
|
ProfConfWin* new_win = malloc(sizeof(ProfConfWin));
|
||||||
new_win->window.type = WIN_CONFIG;
|
new_win->window.type = WIN_CONFIG;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
new_win->roomjid = strdup(roomjid);
|
new_win->roomjid = strdup(roomjid);
|
||||||
new_win->form = form;
|
new_win->form = form;
|
||||||
@@ -248,6 +249,7 @@ win_create_private(const char* const fulljid)
|
|||||||
{
|
{
|
||||||
ProfPrivateWin* new_win = malloc(sizeof(ProfPrivateWin));
|
ProfPrivateWin* new_win = malloc(sizeof(ProfPrivateWin));
|
||||||
new_win->window.type = WIN_PRIVATE;
|
new_win->window.type = WIN_PRIVATE;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
new_win->fulljid = strdup(fulljid);
|
new_win->fulljid = strdup(fulljid);
|
||||||
new_win->unread = 0;
|
new_win->unread = 0;
|
||||||
@@ -264,6 +266,7 @@ win_create_xmlconsole(void)
|
|||||||
{
|
{
|
||||||
ProfXMLWin* new_win = malloc(sizeof(ProfXMLWin));
|
ProfXMLWin* new_win = malloc(sizeof(ProfXMLWin));
|
||||||
new_win->window.type = WIN_XML;
|
new_win->window.type = WIN_XML;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
|
|
||||||
new_win->memcheck = PROFXMLWIN_MEMCHECK;
|
new_win->memcheck = PROFXMLWIN_MEMCHECK;
|
||||||
@@ -276,6 +279,7 @@ win_create_plugin(const char* const plugin_name, const char* const tag)
|
|||||||
{
|
{
|
||||||
ProfPluginWin* new_win = malloc(sizeof(ProfPluginWin));
|
ProfPluginWin* new_win = malloc(sizeof(ProfPluginWin));
|
||||||
new_win->window.type = WIN_PLUGIN;
|
new_win->window.type = WIN_PLUGIN;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
|
|
||||||
new_win->tag = strdup(tag);
|
new_win->tag = strdup(tag);
|
||||||
@@ -291,6 +295,7 @@ win_create_vcard(vCard* vcard)
|
|||||||
{
|
{
|
||||||
ProfVcardWin* new_win = malloc(sizeof(ProfVcardWin));
|
ProfVcardWin* new_win = malloc(sizeof(ProfVcardWin));
|
||||||
new_win->window.type = WIN_VCARD;
|
new_win->window.type = WIN_VCARD;
|
||||||
|
new_win->window.scroll_state = WIN_SCROLL_INNER;
|
||||||
new_win->window.layout = _win_create_simple_layout();
|
new_win->window.layout = _win_create_simple_layout();
|
||||||
|
|
||||||
new_win->vcard = vcard;
|
new_win->vcard = vcard;
|
||||||
@@ -625,7 +630,6 @@ win_free(ProfWin* window)
|
|||||||
void
|
void
|
||||||
win_page_up(ProfWin* window, int scroll_size)
|
win_page_up(ProfWin* window, int scroll_size)
|
||||||
{
|
{
|
||||||
_reached_bottom_of_database = FALSE;
|
|
||||||
int rows = getmaxy(stdscr);
|
int rows = getmaxy(stdscr);
|
||||||
int total_rows = getcury(window->layout->win);
|
int total_rows = getcury(window->layout->win);
|
||||||
int page_space = rows - 4;
|
int page_space = rows - 4;
|
||||||
@@ -633,6 +637,8 @@ win_page_up(ProfWin* window, int scroll_size)
|
|||||||
int page_start_initial = *page_start;
|
int page_start_initial = *page_start;
|
||||||
if (scroll_size == 0)
|
if (scroll_size == 0)
|
||||||
scroll_size = page_space;
|
scroll_size = page_space;
|
||||||
|
win_scroll_state_t* scroll_state = &window->scroll_state;
|
||||||
|
*scroll_state = (*scroll_state == WIN_SCROLL_REACHED_BOTTOM) ? WIN_SCROLL_INNER : *scroll_state;
|
||||||
|
|
||||||
*page_start -= scroll_size;
|
*page_start -= scroll_size;
|
||||||
|
|
||||||
@@ -642,11 +648,11 @@ win_page_up(ProfWin* window, int scroll_size)
|
|||||||
|
|
||||||
// Don't do anything if still fetching mam messages
|
// Don't do anything if still fetching mam messages
|
||||||
if (first_entry && !(first_entry->theme_item == THEME_ROOMINFO && g_strcmp0(first_entry->message, LOADING_MESSAGE) == 0)) {
|
if (first_entry && !(first_entry->theme_item == THEME_ROOMINFO && g_strcmp0(first_entry->message, LOADING_MESSAGE) == 0)) {
|
||||||
if (!_reached_top_of_database) {
|
if (*scroll_state != WIN_SCROLL_REACHED_TOP) {
|
||||||
_reached_top_of_database = !chatwin_db_history(chatwin, NULL, NULL, TRUE);
|
*scroll_state = !chatwin_db_history(chatwin, NULL, NULL, TRUE) ? WIN_SCROLL_REACHED_TOP : WIN_SCROLL_INNER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_reached_top_of_database && prefs_get_boolean(PREF_MAM)) {
|
if (*scroll_state == WIN_SCROLL_REACHED_TOP && prefs_get_boolean(PREF_MAM)) {
|
||||||
win_print_loading_history(window);
|
win_print_loading_history(window);
|
||||||
iq_mam_request_older(chatwin);
|
iq_mam_request_older(chatwin);
|
||||||
}
|
}
|
||||||
@@ -672,7 +678,6 @@ win_page_up(ProfWin* window, int scroll_size)
|
|||||||
void
|
void
|
||||||
win_page_down(ProfWin* window, int scroll_size)
|
win_page_down(ProfWin* window, int scroll_size)
|
||||||
{
|
{
|
||||||
_reached_top_of_database = FALSE;
|
|
||||||
int rows = getmaxy(stdscr);
|
int rows = getmaxy(stdscr);
|
||||||
int* page_start = &(window->layout->y_pos);
|
int* page_start = &(window->layout->y_pos);
|
||||||
int total_rows = getcury(window->layout->win);
|
int total_rows = getcury(window->layout->win);
|
||||||
@@ -680,6 +685,8 @@ win_page_down(ProfWin* window, int scroll_size)
|
|||||||
int page_start_initial = *page_start;
|
int page_start_initial = *page_start;
|
||||||
if (scroll_size == 0)
|
if (scroll_size == 0)
|
||||||
scroll_size = page_space;
|
scroll_size = page_space;
|
||||||
|
win_scroll_state_t* scroll_state = &window->scroll_state;
|
||||||
|
*scroll_state = (*scroll_state == WIN_SCROLL_REACHED_TOP) ? WIN_SCROLL_INNER : *scroll_state;
|
||||||
|
|
||||||
*page_start += scroll_size;
|
*page_start += scroll_size;
|
||||||
|
|
||||||
@@ -691,8 +698,8 @@ win_page_down(ProfWin* window, int scroll_size)
|
|||||||
GDateTime* now = g_date_time_new_now_local();
|
GDateTime* now = g_date_time_new_now_local();
|
||||||
gchar* end = g_date_time_format_iso8601(now);
|
gchar* end = g_date_time_format_iso8601(now);
|
||||||
// end is free'd inside
|
// end is free'd inside
|
||||||
if (!_reached_bottom_of_database && !chatwin_db_history((ProfChatWin*)window, start, end, FALSE)) {
|
if (*scroll_state != WIN_SCROLL_REACHED_BOTTOM && !chatwin_db_history((ProfChatWin*)window, start, end, FALSE)) {
|
||||||
_reached_bottom_of_database = TRUE;
|
*scroll_state = WIN_SCROLL_REACHED_BOTTOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_date_time_unref(now);
|
g_date_time_unref(now);
|
||||||
|
|||||||
Reference in New Issue
Block a user