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; bws[num_bws++] = bw;
/* Initialize nav_stack */ /* Initialize nav_stack */
bw->nav_stack = dList_new(8);
bw->nav_stack_ptr = -1; bw->nav_stack_ptr = -1;
/* Init expect */ /* Init expect */
@ -96,13 +95,6 @@ BrowserWindow::~BrowserWindow()
dList_free(this->ImageClients); dList_free(this->ImageClients);
dList_free(this->Docs); 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; break;
} }

View File

@ -29,6 +29,16 @@ extern "C++"
#define BW_Force (4) /* Stop connection too */ #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 */ /** Contains the specific data for a single window */
struct BrowserWindow { struct BrowserWindow {
/** Pointer to the UI object this bw belongs to */ /** Pointer to the UI object this bw belongs to */
@ -56,7 +66,7 @@ struct BrowserWindow {
std::vector< std::unique_ptr< DilloUrl > > PageUrls; std::vector< std::unique_ptr< DilloUrl > > PageUrls;
/** The navigation stack (holds indexes to history list) */ /** 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 */ /** 'nav_stack_ptr' refers to what's being displayed */
int nav_stack_ptr; /* [0 based; -1 = empty] */ int nav_stack_ptr; /* [0 based; -1 = empty] */
/** When the user clicks a link, the URL isn't pushed directly to history; /** When the user clicks a link, the URL isn't pushed directly to history;

View File

@ -24,15 +24,6 @@
#include "capi.hh" #include "capi.hh"
#include "timeout.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) void a_Nav_free(BrowserWindow *bw)
{ {
a_Nav_cancel_expect(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) 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; 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) 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; 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) 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) static void Nav_stack_truncate(BrowserWindow *bw, int pos)
{ {
void *data;
dReturn_if_fail (bw != NULL && pos >= 0); dReturn_if_fail (bw != NULL && pos >= 0);
while (pos < dList_length(bw->nav_stack)) { while (pos < bw->nav_stack.size()) {
data = dList_nth_data(bw->nav_stack, pos); bw->nav_stack.pop_back();
dList_remove_fast (bw->nav_stack, data);
dFree(data);
} }
} }
@ -121,16 +111,14 @@ static void Nav_stack_truncate(BrowserWindow *bw, int pos)
*/ */
static void Nav_stack_append(BrowserWindow *bw, int url_idx) static void Nav_stack_append(BrowserWindow *bw, int url_idx)
{ {
nav_stack_item *nsi;
dReturn_if_fail (bw != NULL); dReturn_if_fail (bw != NULL);
/* Insert the new element */ /* 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->url_idx = url_idx;
nsi->posx = 0; nsi->posx = 0;
nsi->posy = 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) 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; *posx = nsi->posx;
*posy = nsi->posy; *posy = nsi->posy;
} else { } 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) 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->posx = posx;
nsi->posy = posy; nsi->posy = posy;
} }
@ -173,9 +165,7 @@ static void Nav_stack_clean(BrowserWindow *bw)
if ((i = a_Nav_stack_size(bw)) >= 2 && if ((i = a_Nav_stack_size(bw)) >= 2 &&
NAV_UIDX(bw,i - 2) == NAV_UIDX(bw,i - 1)) { NAV_UIDX(bw,i - 2) == NAV_UIDX(bw,i - 1)) {
void *data = dList_nth_data (bw->nav_stack, i - 1); bw->nav_stack.pop_back();
dList_remove_fast (bw->nav_stack, data);
dFree(data);
if (bw->nav_stack_ptr >= a_Nav_stack_size(bw)) if (bw->nav_stack_ptr >= a_Nav_stack_size(bw))
bw->nav_stack_ptr = a_Nav_stack_size(bw) - 1; bw->nav_stack_ptr = a_Nav_stack_size(bw) - 1;
} }