Some ownership for history/nav.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
12
src/bw.hh
12
src/bw.hh
@ -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;
|
||||
|
52
src/nav.cc
52
src/nav.cc
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user