diff --git a/src/bw.cc b/src/bw.cc index ac0efcf..2c831ed 100644 --- a/src/bw.cc +++ b/src/bw.cc @@ -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; } diff --git a/src/bw.hh b/src/bw.hh index 078540d..b502799 100644 --- a/src/bw.hh +++ b/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; diff --git a/src/nav.cc b/src/nav.cc index d8088b0..264b4fd 100644 --- a/src/nav.cc +++ b/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; }