Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reload the current page on SIGUSR1 signal #290

Merged
merged 1 commit into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
23 changes: 22 additions & 1 deletion src/dillo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Dillo web browser
*
* Copyright 1999-2007 Jorge Arellano Cid <[email protected]>
* Copyright 2024 Rodrigo Arias Mallo <[email protected]>
*
* 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
Expand Down Expand Up @@ -65,6 +66,8 @@
#include "dw/textblock.hh"
#include "dw/table.hh"

static volatile sig_atomic_t sig_reload = 0;

/**
* Command line options structure
*/
Expand Down Expand Up @@ -145,6 +148,11 @@ static void raw_sigchld2(int signum)
}
}

static void handler_usr1(int signum)
{
sig_reload = 1;
}

/**
* Establish SIGCHLD handler
*/
Expand All @@ -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);
}
}

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -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
Expand Down
49 changes: 48 additions & 1 deletion src/uicmd.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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());

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -873,6 +907,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
*/
Expand Down
1 change: 1 addition & 0 deletions src/uicmd.hh
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading