aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--src/dillo.cc23
-rw-r--r--src/uicmd.cc49
-rw-r--r--src/uicmd.hh1
4 files changed, 72 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 <jcid@dillo.org>
+ * Copyright 2024 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* 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..18ac2ff1 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,26 @@ 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);
}
@@ -874,6 +908,19 @@ void a_UIcmd_reload(void *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
*/
void a_UIcmd_repush(void *vbw)
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);