From 9f55ce237070cd250fe4930ccbe19918ce893ab3 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Fri, 25 Oct 2024 18:47:07 +0200 Subject: [PATCH] Reload the current page on SIGUSR1 signal Reloads the current page on all windows when the SIGUSR1 is received. This is useful to update the page when it is being edited. Fixes: https://github.com/dillo-browser/dillo/issues/255 --- ChangeLog | 1 + src/dillo.cc | 23 ++++++++++++++++++++++- src/uicmd.cc | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- src/uicmd.hh | 1 + 4 files changed, 73 insertions(+), 2 deletions(-) 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..7f543fcb 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); + delete 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);