diff --git a/ChangeLog b/ChangeLog index d6898c4b..adfe6b26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,7 @@ dillo-3.2.0 [Not released yet] - Set focus_new_tab=NO and show_quit_dialog=NO by default. - Fix GET requests over HTTPS via a proxy. - Improve image resize logic to always try to preserve the aspect ratio. + - Reload current page on SIGUSR1 signal Patches: Rodrigo Arias Mallo +- Add primitive support for SVG using the nanosvg.h library. - Add support for ch, rem, vw, vh, vmin and vmax CSS units. diff --git a/src/dillo.cc b/src/dillo.cc index e9fbfdd7..e49dc1a3 100644 --- a/src/dillo.cc +++ b/src/dillo.cc @@ -2,6 +2,7 @@ * Dillo web browser * * Copyright 1999-2007 Jorge Arellano Cid + * Copyright 2024 Rodrigo Arias Mallo * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -65,6 +66,8 @@ #include "dw/textblock.hh" #include "dw/table.hh" +static volatile sig_atomic_t sig_reload = 0; + /** * Command line options structure */ @@ -145,6 +148,11 @@ static void raw_sigchld2(int signum) } } +static void handler_usr1(int signum) +{ + sig_reload = 1; +} + /** * Establish SIGCHLD handler */ @@ -161,6 +169,11 @@ static void est_sigchld(void) perror("sigaction"); exit(1); } + + if (signal(SIGUSR1, handler_usr1) == SIG_ERR) { + perror("signal failed"); + exit(1); + } } //---------------------------------------------------------------------------- @@ -580,7 +593,15 @@ int main(int argc, char **argv) } } - Fl::run(); + /* Don't use, as it can be free()'d */ + bw = NULL; + + while (Fl::wait() > 0) { + if (sig_reload) { + sig_reload = 0; + a_UIcmd_reload_all_active(); + } + } /* * Memory deallocating routines diff --git a/src/uicmd.cc b/src/uicmd.cc index 5cd0d887..e2aa7e0a 100644 --- a/src/uicmd.cc +++ b/src/uicmd.cc @@ -69,6 +69,15 @@ using namespace dw::fltk; */ static const char *save_dir = ""; +struct Tabgroup { + CustTabs *tabs; + struct Tabgroup *next; +}; + +/* An stack of CustTabs groups, each maps to one FLTK window. Points to + * the last one created. */ +static struct Tabgroup *tabgroups = NULL; + /* * Forward declarations */ @@ -570,6 +579,13 @@ BrowserWindow *a_UIcmd_browser_window_new(int ww, int wh, win->box(FL_NO_BOX); CustTabs *DilloTabs = new CustTabs(ww, wh, prefs.ui_tab_height); + + struct Tabgroup *tg = new Tabgroup; + tg->tabs = DilloTabs; + tg->next = tabgroups; + tabgroups = tg; + _MSG("new: tabgroups=%p\n", (void *) tg); + win->end(); win->resizable(DilloTabs->wizard()); @@ -668,8 +684,27 @@ void a_UIcmd_close_bw(void *vbw) delete(layout); if (tabs) { tabs->remove_tab(ui); - if (tabs->num_tabs() == 0) + if (tabs->num_tabs() == 0) { + /* No more tabs, remove tabgroup */ + struct Tabgroup *tmp = tabgroups; + struct Tabgroup *prev = NULL; + for (tmp = tabgroups; tmp; tmp = tmp->next) { + if (tmp->tabs == tabs) { + if (prev) + prev->next = tmp->next; + else + tabgroups = tmp->next; + break; + } + prev = tmp; + } + if (tmp) { + _MSG("gone: tmp=%p tabgroups=%p\n", (void *) tmp, (void *) tabgroups); + free(tmp); + } + delete tabs->window(); + } } a_Bw_free(bw); } @@ -873,6 +908,19 @@ void a_UIcmd_reload(void *vbw) a_Nav_reload((BrowserWindow*)vbw); } +/* + * Reload all active tabs + */ +void a_UIcmd_reload_all_active() +{ + struct Tabgroup *tg = tabgroups; + for (tg = tabgroups; tg; tg = tg->next) { + BrowserWindow *bw = a_UIcmd_get_bw_by_widget(tg->tabs->wizard()->value()); + if (bw) + a_UIcmd_reload(bw); + } +} + /* * Repush current URL */ diff --git a/src/uicmd.hh b/src/uicmd.hh index 0a5c8fb5..f75d9a48 100644 --- a/src/uicmd.hh +++ b/src/uicmd.hh @@ -37,6 +37,7 @@ void a_UIcmd_zoom_in(void *vbw); void a_UIcmd_zoom_out(void *vbw); void a_UIcmd_zoom_reset(void *vbw); void a_UIcmd_reload(void *vbw); +void a_UIcmd_reload_all_active(); void a_UIcmd_repush(void *vbw); void a_UIcmd_redirection0(void *vbw, const DilloUrl *url); void a_UIcmd_save(void *vbw);