Some ownership for history/nav.

This commit is contained in:
2025-04-26 03:25:33 -04:00
parent cbb099700b
commit c64846c02c
3 changed files with 32 additions and 40 deletions

View File

@ -54,7 +54,6 @@ BrowserWindow *a_Bw_new(void)
bws[num_bws++] = bw;
/* Initialize nav_stack */
bw->nav_stack = dList_new(8);
bw->nav_stack_ptr = -1;
/* Init expect */
@ -96,13 +95,6 @@ BrowserWindow::~BrowserWindow()
dList_free(this->ImageClients);
dList_free(this->Docs);
//for (j = 0; j < dList_length(this->PageUrls); ++j)
//delete reinterpret_cast< DilloUrl * >( dList_nth_data(this->PageUrls, j) );
//dList_free(this->PageUrls);
for (j = 0; j < dList_length(this->nav_stack); ++j)
dFree(dList_nth_data(this->nav_stack, j));
dList_free(this->nav_stack);
break;
}

View File

@ -29,6 +29,16 @@ extern "C++"
#define BW_Force (4) /* Stop connection too */
/*
* For back and forward navigation, each bw keeps an url index,
* and its scroll position.
*/
struct nav_stack_item {
int url_idx;
int posx, posy;
};
/** Contains the specific data for a single window */
struct BrowserWindow {
/** Pointer to the UI object this bw belongs to */
@ -56,7 +66,7 @@ struct BrowserWindow {
std::vector< std::unique_ptr< DilloUrl > > PageUrls;
/** The navigation stack (holds indexes to history list) */
Dlist *nav_stack;
std::vector< std::unique_ptr< nav_stack_item > > nav_stack;
/** 'nav_stack_ptr' refers to what's being displayed */
int nav_stack_ptr; /* [0 based; -1 = empty] */
/** When the user clicks a link, the URL isn't pushed directly to history;

View File

@ -24,15 +24,6 @@
#include "capi.hh"
#include "timeout.hh"
/*
* For back and forward navigation, each bw keeps an url index,
* and its scroll position.
*/
typedef struct {
int url_idx;
int posx, posy;
} nav_stack_item;
/*
@ -43,7 +34,7 @@ typedef struct {
void a_Nav_free(BrowserWindow *bw)
{
a_Nav_cancel_expect(bw);
dFree(bw->nav_stack);
bw->nav_stack.clear();
}
@ -62,7 +53,8 @@ int a_Nav_stack_ptr(BrowserWindow *bw)
*/
int a_Nav_get_uidx(BrowserWindow *bw, int i)
{
nav_stack_item *nsi = reinterpret_cast< nav_stack_item * >( dList_nth_data (bw->nav_stack, i) );
if( i < 0 or i >= bw->nav_stack.size() ) return -1;
nav_stack_item *nsi = bw->nav_stack.at( i ).get();
return (nsi) ? nsi->url_idx : -1;
}
@ -71,9 +63,11 @@ int a_Nav_get_uidx(BrowserWindow *bw, int i)
*/
int a_Nav_get_top_uidx(BrowserWindow *bw)
{
nav_stack_item *nsi;
const int top= a_Nav_stack_ptr( bw );
if( top < 0 or top >= bw->nav_stack.size() ) return -1;
nav_stack_item *nsi= bw->nav_stack.at( top ).get();
nsi = reinterpret_cast< nav_stack_item * >( dList_nth_data (bw->nav_stack, a_Nav_stack_ptr(bw)) );
return (nsi) ? nsi->url_idx : -1;
}
@ -97,7 +91,7 @@ static void Nav_stack_move_ptr(BrowserWindow *bw, int offset)
*/
int a_Nav_stack_size(BrowserWindow *bw)
{
return dList_length(bw->nav_stack);
return bw->nav_stack.size();
}
/*
@ -105,14 +99,10 @@ int a_Nav_stack_size(BrowserWindow *bw)
*/
static void Nav_stack_truncate(BrowserWindow *bw, int pos)
{
void *data;
dReturn_if_fail (bw != NULL && pos >= 0);
while (pos < dList_length(bw->nav_stack)) {
data = dList_nth_data(bw->nav_stack, pos);
dList_remove_fast (bw->nav_stack, data);
dFree(data);
while (pos < bw->nav_stack.size()) {
bw->nav_stack.pop_back();
}
}
@ -121,16 +111,14 @@ static void Nav_stack_truncate(BrowserWindow *bw, int pos)
*/
static void Nav_stack_append(BrowserWindow *bw, int url_idx)
{
nav_stack_item *nsi;
dReturn_if_fail (bw != NULL);
/* Insert the new element */
nsi = dNew(nav_stack_item, 1);
auto nsi = std::make_unique< nav_stack_item >(); // TODO: member init?
nsi->url_idx = url_idx;
nsi->posx = 0;
nsi->posy = 0;
dList_append (bw->nav_stack, nsi);
bw->nav_stack.push_back( std::move( nsi ) );
}
/*
@ -138,9 +126,11 @@ static void Nav_stack_append(BrowserWindow *bw, int url_idx)
*/
static void Nav_get_scroll_pos(BrowserWindow *bw, int *posx, int *posy)
{
nav_stack_item *nsi;
nav_stack_item *nsi= nullptr;
const auto where= a_Nav_stack_ptr( bw );
if( where >= 0 and where < bw->nav_stack.size() ) nsi= bw->nav_stack.at( where ).get();
if ((nsi = reinterpret_cast< nav_stack_item * >( dList_nth_data (bw->nav_stack, a_Nav_stack_ptr(bw)) ))) {
if (nsi) {
*posx = nsi->posx;
*posy = nsi->posy;
} else {
@ -153,9 +143,11 @@ static void Nav_get_scroll_pos(BrowserWindow *bw, int *posx, int *posy)
*/
static void Nav_save_scroll_pos(BrowserWindow *bw, int idx, int posx, int posy)
{
nav_stack_item *nsi;
nav_stack_item *nsi= nullptr;
const auto where= a_Nav_stack_ptr( bw );
if( where >= 0 and where < bw->nav_stack.size() ) nsi= bw->nav_stack.at( where ).get();
if ((nsi = reinterpret_cast< nav_stack_item * >( dList_nth_data (bw->nav_stack, idx) ))) {
if (nsi) {
nsi->posx = posx;
nsi->posy = posy;
}
@ -173,9 +165,7 @@ static void Nav_stack_clean(BrowserWindow *bw)
if ((i = a_Nav_stack_size(bw)) >= 2 &&
NAV_UIDX(bw,i - 2) == NAV_UIDX(bw,i - 1)) {
void *data = dList_nth_data (bw->nav_stack, i - 1);
dList_remove_fast (bw->nav_stack, data);
dFree(data);
bw->nav_stack.pop_back();
if (bw->nav_stack_ptr >= a_Nav_stack_size(bw))
bw->nav_stack_ptr = a_Nav_stack_size(bw) - 1;
}