w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit 2d61cf0b54e1b11af9b89a5d34a2691846e2a292
parent 7a0cd97b05dd08a2c56766355ff551836bc4bb68
Author: ukai <ukai>
Date:   Wed, 18 Dec 2002 16:20:49 +0000

[w3m-dev 03578] meta refresh
* file.c (getMetaRefreshParam): do nothing if refresh_interval < 0
	(HTMLtagproc1): rewrite refresh
	(HTMLlineproc2body): add HTML_META
* fm.h (BP_RELOAD): deleted
	(Buffer): add event
	(AL_IMPLICIT_DONE): deleted
	(AL_ONCE): deleted
	(AL_RESTORE): deleted
	(AlarmEvent): added
* main.c (AlarmEvent): deleted
	(PrevAlarm): deleted
	(DefaultAlarm): added
	(CurrentAlarm): point to DefaultAlarm
	(main): CurrentKeyData, CurrentCmdData
		handle Currentbuf->event
	(SigAlarm): CurrentAlarm is pointer
	(copyAlarmEvent): deleted
	(setAlarm): setAlarmEvent pass &DefaultAlarm
	(setAlarmEvent): arg event
	(ldDL): no BP_RELOAD
* proto.h (setAlarmEvent): arg event
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>

Diffstat:
MChangeLog | 25+++++++++++++++++++++++++
Mfile.c | 83++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mfm.h | 16+++++++++++-----
Mmain.c | 130+++++++++++++++++++++++++++++++------------------------------------------------
Mproto.h | 3++-
5 files changed, 140 insertions(+), 117 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,28 @@ +2002-12-19 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> + + * [w3m-dev 03578] meta refresh + * file.c (getMetaRefreshParam): do nothing if refresh_interval < 0 + (HTMLtagproc1): rewrite refresh + (HTMLlineproc2body): add HTML_META + * fm.h (BP_RELOAD): deleted + (Buffer): add event + (AL_IMPLICIT_DONE): deleted + (AL_ONCE): deleted + (AL_RESTORE): deleted + (AlarmEvent): added + * main.c (AlarmEvent): deleted + (PrevAlarm): deleted + (DefaultAlarm): added + (CurrentAlarm): point to DefaultAlarm + (main): CurrentKeyData, CurrentCmdData + handle Currentbuf->event + (SigAlarm): CurrentAlarm is pointer + (copyAlarmEvent): deleted + (setAlarm): setAlarmEvent pass &DefaultAlarm + (setAlarmEvent): arg event + (ldDL): no BP_RELOAD + * proto.h (setAlarmEvent): arg event + 2002-12-18 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> * [w3m-dev 03577] incorrect table width diff --git a/file.c b/file.c @@ -3999,6 +3999,8 @@ getMetaRefreshParam(char *q, Str *refresh_uri) return 0; refresh_interval = atoi(q); + if (refresh_interval < 0) + return 0; while (*q) { if (!strncasecmp(q, "url=", 4)) { @@ -4726,41 +4728,26 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env) else #endif if (p && q && !strcasecmp(p, "refresh")) { - Str s_tmp = NULL; - int refresh_interval = getMetaRefreshParam(q, &s_tmp); - if (s_tmp) { - q = html_quote(s_tmp->ptr); - tmp = - Sprintf - ("Refresh (%d sec) <a hseq=\"%d\" href=\"%s\">%s</a>", - refresh_interval, cur_hseq++, q, q); - push_str(obuf, s_tmp->length, tmp, PC_ASCII); - flushline(h_env, obuf, envs[h_env->envc].indent, 0, - h_env->limit); - if (!is_redisplay && refresh_interval == 0 && MetaRefresh && - !((obuf->flag & RB_NOFRAMES) && RenderFrame)) { - pushEvent(FUNCNAME_gorURL, s_tmp->ptr); - /* pushEvent(deletePrevBuf,NULL); */ - } -#ifdef USE_ALARM - else if (!is_redisplay && refresh_interval > 0 && MetaRefresh - && !((obuf->flag & RB_NOFRAMES) && RenderFrame)) { - setAlarmEvent(refresh_interval, AL_IMPLICIT_ONCE, - FUNCNAME_gorURL, s_tmp->ptr); - } -#endif + int refresh_interval; + tmp = NULL; + refresh_interval = getMetaRefreshParam(q, &tmp); + if (tmp) { + q = html_quote(tmp->ptr); + tmp = Sprintf("Refresh (%d sec) <a href=\"%s\">%s</a>", + refresh_interval, q, q); } -#ifdef USE_ALARM - else if (!is_redisplay && refresh_interval > 0 && MetaRefresh && - !((obuf->flag & RB_NOFRAMES) && RenderFrame)) { + else if (refresh_interval > 0) tmp = Sprintf("Refresh (%d sec)", refresh_interval); - push_str(obuf, 0, tmp, PC_ASCII); - flushline(h_env, obuf, envs[h_env->envc].indent, 0, - h_env->limit); - setAlarmEvent(refresh_interval, AL_IMPLICIT, FUNCNAME_reload, - NULL); + if (tmp) { + HTMLlineproc1(tmp->ptr, h_env); + do_blankline(h_env, obuf, envs[h_env->envc].indent, 0, + h_env->limit); + if (!is_redisplay && + !((obuf->flag & RB_NOFRAMES) && RenderFrame)) { + tag->need_reconstruct = TRUE; + return 0; + } } -#endif } return 1; case HTML_BASE: @@ -5315,6 +5302,38 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit) buf->baseTarget = url_quote_conv(p, buf->document_code); break; + case HTML_META: + p = q = NULL; + parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p); + parsedtag_get_value(tag, ATTR_CONTENT, &q); + if (p && q && !strcasecmp(p, "refresh") && MetaRefresh) { + Str tmp = NULL; + int refresh_interval = getMetaRefreshParam(q, &tmp); +#ifdef USE_ALARM + if (tmp) { + p = url_quote_conv(remove_space(tmp->ptr), + buf->document_code); + buf->event = setAlarmEvent(buf->event, + refresh_interval, + AL_IMPLICIT_ONCE, + FUNCNAME_gorURL, + p); + } + else if (refresh_interval > 0) + buf->event = setAlarmEvent(buf->event, + refresh_interval, + AL_IMPLICIT, + FUNCNAME_reload, + NULL); +#else + if (tmp && refresh_interval == 0) { + p = url_quote_conv(remove_space(tmp->ptr), + buf->document_code); + pushEvent(FUNCNAME_gorURL, p); + } +#endif + } + break; case HTML_INTERNAL: internal = HTML_INTERNAL; break; diff --git a/fm.h b/fm.h @@ -177,7 +177,6 @@ void bzero(void *, int); #define BP_NO_URL 0x10 #define BP_REDIRECTED 0x20 #define BP_CLOSE 0x40 -#define BP_RELOAD 0x80 /* Link Buffer */ #define LB_NOLINK -1 @@ -462,6 +461,9 @@ typedef struct _Buffer { char need_reshape; Anchor *submit; struct _BufferPos *undo; +#ifdef USE_ALARM + struct _AlarmEvent *event; +#endif } Buffer; typedef struct _BufferPos { @@ -1116,10 +1118,14 @@ void w3m_exit(int i); #define AL_UNSET 0 #define AL_EXPLICIT 1 #define AL_IMPLICIT 2 -#define AL_IMPLICIT_DONE 4 -#define AL_ONCE 8 -#define AL_IMPLICIT_ONCE (AL_IMPLICIT|AL_ONCE) -#define AL_RESTORE 16 +#define AL_IMPLICIT_ONCE 3 + +typedef struct _AlarmEvent { + int sec; + short status; + int cmd; + void *data; +} AlarmEvent; #endif /* diff --git a/main.c b/main.c @@ -42,19 +42,10 @@ static Event eventQueue[N_EVENT_QUEUE]; static int n_event_queue; #ifdef USE_ALARM -typedef struct { - int sec; - int cmd; - void *data; - short status; - Buffer *buffer; -} AlarmEvent; -static AlarmEvent CurrentAlarm = { - 0, FUNCNAME_nulcmd, NULL, AL_UNSET, NULL -}; -static AlarmEvent PrevAlarm = { - 0, FUNCNAME_nulcmd, NULL, AL_UNSET, NULL +static AlarmEvent DefaultAlarm = { + 0, FUNCNAME_nulcmd, NULL, AL_UNSET, }; +static AlarmEvent *CurrentAlarm = &DefaultAlarm; static MySignalHandler SigAlarm(SIGNAL_ARG); #endif @@ -1000,34 +991,42 @@ main(int argc, char **argv, char **envp) if (n_event_queue > 0) { for (i = 0; i < n_event_queue; i++) { CurrentKey = -1; - CurrentKeyData = eventQueue[i].user_data; - CurrentCmdData = NULL; + CurrentKeyData = NULL; + CurrentCmdData = (char *)eventQueue[i].user_data; w3mFuncList[eventQueue[i].cmd].func(); } + CurrentCmdData = NULL; n_event_queue = 0; } - CurrentKeyData = NULL; /* get keypress event */ +#ifdef USE_ALARM + if (Currentbuf->event) { + if (Currentbuf->event->status != AL_UNSET) { + CurrentAlarm = Currentbuf->event; + if (CurrentAlarm->sec == 0) { /* refresh (0sec) */ + Currentbuf->event = NULL; + CurrentKey = -1; + CurrentKeyData = NULL; + CurrentCmdData = (char *)CurrentAlarm->data; + w3mFuncList[CurrentAlarm->cmd].func(); + CurrentCmdData = NULL; + } + } + else + Currentbuf->event = NULL; + } + if (!Currentbuf->event) + CurrentAlarm = &DefaultAlarm; +#endif #ifdef USE_MOUSE mouse_action.in_action = FALSE; if (use_mouse) mouse_active(); #endif /* USE_MOUSE */ #ifdef USE_ALARM - if (Currentbuf->bufferprop & BP_RELOAD) - setAlarmEvent(1, AL_IMPLICIT, FUNCNAME_reload, NULL); - if (CurrentAlarm.status & AL_IMPLICIT) { - CurrentAlarm.buffer = Currentbuf; - CurrentAlarm.status = AL_IMPLICIT_DONE - | (CurrentAlarm.status & AL_ONCE); - } - else if (CurrentAlarm.status & AL_IMPLICIT_DONE && - CurrentAlarm.buffer != Currentbuf) { - setAlarmEvent(0, AL_RESTORE, FUNCNAME_nulcmd, NULL); - } - if (CurrentAlarm.sec > 0) { + if (CurrentAlarm->sec > 0) { signal(SIGALRM, SigAlarm); - alarm(CurrentAlarm.sec); + alarm(CurrentAlarm->sec); } #endif #ifdef SIGWINCH @@ -1050,7 +1049,7 @@ main(int argc, char **argv, char **envp) signal(SIGWINCH, resize_hook); #endif #ifdef USE_ALARM - if (CurrentAlarm.sec > 0) { + if (CurrentAlarm->sec > 0) { alarm(0); } #endif @@ -1077,6 +1076,7 @@ main(int argc, char **argv, char **envp) } prev_key = CurrentKey; CurrentKey = -1; + CurrentKeyData = NULL; } } @@ -5496,51 +5496,32 @@ SigAlarm(SIGNAL_ARG) { char *data; - if (CurrentAlarm.sec > 0) { + if (CurrentAlarm->sec > 0) { CurrentKey = -1; CurrentKeyData = NULL; - CurrentCmdData = data = (char *)CurrentAlarm.data; + CurrentCmdData = data = (char *)CurrentAlarm->data; #ifdef USE_MOUSE if (use_mouse) mouse_inactive(); #endif - w3mFuncList[CurrentAlarm.cmd].func(); - displayBuffer(Currentbuf, B_NORMAL); + w3mFuncList[CurrentAlarm->cmd].func(); #ifdef USE_MOUSE if (use_mouse) mouse_active(); #endif CurrentCmdData = NULL; - if (CurrentAlarm.status & AL_IMPLICIT) { - CurrentAlarm.buffer = Currentbuf; - CurrentAlarm.status = AL_IMPLICIT_DONE - | (CurrentAlarm.status & AL_ONCE); - } - else if (CurrentAlarm.status & AL_IMPLICIT_DONE - && (CurrentAlarm.buffer != Currentbuf || - CurrentAlarm.status & AL_ONCE)) { - setAlarmEvent(0, AL_RESTORE, FUNCNAME_nulcmd, NULL); + if (CurrentAlarm->status == AL_IMPLICIT_ONCE) { + CurrentAlarm->sec = 0; + CurrentAlarm->status = AL_UNSET; } - if (CurrentAlarm.sec > 0) { + if (CurrentAlarm->sec > 0) { signal(SIGALRM, SigAlarm); - alarm(CurrentAlarm.sec); + alarm(CurrentAlarm->sec); } } SIGNAL_RETURN; } -static void -copyAlarmEvent(AlarmEvent * src, AlarmEvent * dst) -{ - if (!src || !dst) - return; - dst->sec = src->sec; - dst->cmd = src->cmd; - dst->data = src->data; - dst->status = src->status; - dst->buffer = src->buffer; -} - void setAlarm(void) { @@ -5563,33 +5544,26 @@ setAlarm(void) } if (cmd >= 0) { data = getQWord(&data); - setAlarmEvent(sec, AL_EXPLICIT, cmd, data); + setAlarmEvent(&DefaultAlarm, sec, AL_EXPLICIT, cmd, data); disp_message_nsec(Sprintf("%dsec %s %s", sec, w3mFuncList[cmd].id, data)->ptr, FALSE, 1, FALSE, TRUE); } else { - setAlarmEvent(0, AL_UNSET, FUNCNAME_nulcmd, NULL); + setAlarmEvent(&DefaultAlarm, 0, AL_UNSET, FUNCNAME_nulcmd, NULL); } displayBuffer(Currentbuf, B_NORMAL); } -void -setAlarmEvent(int sec, short status, int cmd, void *data) +AlarmEvent * +setAlarmEvent(AlarmEvent *event, int sec, short status, int cmd, void *data) { - if (status == AL_RESTORE) { - copyAlarmEvent(&PrevAlarm, &CurrentAlarm); - PrevAlarm.sec = 0; - PrevAlarm.status = AL_UNSET; - return; - } - if (CurrentAlarm.status == AL_EXPLICIT && - (status == AL_IMPLICIT || status == AL_IMPLICIT_ONCE)) - copyAlarmEvent(&CurrentAlarm, &PrevAlarm); - CurrentAlarm.sec = sec; - CurrentAlarm.cmd = cmd; - CurrentAlarm.data = data; - CurrentAlarm.status = status; - CurrentAlarm.buffer = NULL; + if (event == NULL) + event = New(AlarmEvent); + event->sec = sec; + event->status = status; + event->cmd = cmd; + event->data = data; + return event; } #endif @@ -6257,7 +6231,6 @@ ldDL(void) delete = TRUE; if (!FirstDL) { if (delete) { - Currentbuf->bufferprop &= ~BP_RELOAD; if (Currentbuf == Firstbuf && Currentbuf->nextBuffer == NULL) { if (nTab > 1) deleteTab(CurrentTab); @@ -6287,10 +6260,9 @@ ldDL(void) if (delete) deletePrevBuf(); #ifdef USE_ALARM - if (reload) { - Currentbuf->bufferprop |= BP_RELOAD; - setAlarmEvent(1, AL_IMPLICIT, FUNCNAME_reload, NULL); - } + if (reload) + Currentbuf->event = setAlarmEvent(Currentbuf->event, 1, AL_IMPLICIT, + FUNCNAME_reload, NULL); #endif } diff --git a/proto.h b/proto.h @@ -115,7 +115,8 @@ extern void stopI(void); #endif #ifdef USE_ALARM extern void setAlarm(void); -extern void setAlarmEvent(int sec, short status, int cmd, void *data); +extern AlarmEvent *setAlarmEvent(AlarmEvent *event, int sec, short status, + int cmd, void *data); #else #define setAlarm nulcmd #endif