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:
M | ChangeLog | | | 25 | +++++++++++++++++++++++++ |
M | file.c | | | 83 | ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- |
M | fm.h | | | 16 | +++++++++++----- |
M | main.c | | | 130 | +++++++++++++++++++++++++++++++------------------------------------------------ |
M | proto.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