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