diff options
| -rw-r--r-- | ChangeLog | 19 | ||||
| -rw-r--r-- | fm.h | 3 | ||||
| -rw-r--r-- | main.c | 92 | 
3 files changed, 82 insertions, 32 deletions
@@ -1,5 +1,22 @@  2002-11-16  Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> +	* [w3m-dev 03439] restore alarm event +	* fm.h (AL_RESTORE): added +	* main.c (alarm_sec): deleted +		(alarm_status): deleted +		(alarm_buffer): deleted +		(alarm_event): deleted +		(AlarmEvent): added +		(CurrentAlarm): added +		(PrevAlarm): added +		(main): rewrite with CurrentAlarm +		(SigAlarm): rewrite with CurrentAlarm +		(copyAlarmEvent): added +		(setAlarm): if AL_RESTORE, copy back from PrevAlarm +			rewrite with CurrentAlarm + +2002-11-16  Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> +  	* [w3m-dev 03438] Re: segmentation fault by large complex table.  	* table.c (check_table_height): check MAXROWCELL  	* table.h (MAXROWCELL): added @@ -4785,4 +4802,4 @@ a	* [w3m-dev 03276] compile error on EWS4800  	* release-0-2-1  	* import w3m-0.2.1 -$Id: ChangeLog,v 1.522 2002/11/15 16:00:33 ukai Exp $ +$Id: ChangeLog,v 1.523 2002/11/15 16:05:13 ukai Exp $ @@ -1,4 +1,4 @@ -/* $Id: fm.h,v 1.80 2002/11/15 15:58:27 ukai Exp $ */ +/* $Id: fm.h,v 1.81 2002/11/15 16:05:15 ukai Exp $ */  /*    * w3m: WWW wo Miru utility   *  @@ -1070,6 +1070,7 @@ void w3m_exit(int i);  #define AL_IMPLICIT_DONE 4  #define AL_ONCE          8  #define AL_IMPLICIT_ONCE (AL_IMPLICIT|AL_ONCE) +#define AL_RESTORE       16  #endif  /*  @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.135 2002/11/15 15:51:24 ukai Exp $ */ +/* $Id: main.c,v 1.136 2002/11/15 16:05:15 ukai Exp $ */  #define MAINPROGRAM  #include "fm.h"  #include <signal.h> @@ -42,10 +42,19 @@ static Event eventQueue[N_EVENT_QUEUE];  static int n_event_queue;  #ifdef USE_ALARM -static int alarm_sec = 0; -static short alarm_status = AL_UNSET; -static Buffer *alarm_buffer; -static Event alarm_event; +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 MySignalHandler SigAlarm(SIGNAL_ARG);  #endif @@ -977,16 +986,18 @@ main(int argc, char **argv, char **envp)  	    mouse_active();  #endif				/* USE_MOUSE */  #ifdef USE_ALARM -	if (alarm_status & AL_IMPLICIT) { -	    alarm_buffer = Currentbuf; -	    alarm_status = AL_IMPLICIT_DONE | (alarm_status & AL_ONCE); +	if (CurrentAlarm.status & AL_IMPLICIT) { +	    CurrentAlarm.buffer = Currentbuf; +	    CurrentAlarm.status = AL_IMPLICIT_DONE +				  | (CurrentAlarm.status & AL_ONCE);  	} -	else if (alarm_status & AL_IMPLICIT_DONE && alarm_buffer != Currentbuf) { -	    setAlarmEvent(0, AL_UNSET, FUNCNAME_nulcmd, NULL); +	else if (CurrentAlarm.status & AL_IMPLICIT_DONE && +		 CurrentAlarm.buffer != Currentbuf) { +	    setAlarmEvent(0, AL_RESTORE, FUNCNAME_nulcmd, NULL);  	} -	if (alarm_sec > 0) { +	if (CurrentAlarm.sec > 0) {  	    signal(SIGALRM, SigAlarm); -	    alarm(alarm_sec); +	    alarm(CurrentAlarm.sec);  	}  #endif  #ifdef SIGWINCH @@ -1009,7 +1020,7 @@ main(int argc, char **argv, char **envp)  	signal(SIGWINCH, resize_hook);  #endif  #ifdef USE_ALARM -	if (alarm_sec > 0) { +	if (CurrentAlarm.sec > 0) {  	    alarm(0);  	}  #endif @@ -5237,37 +5248,51 @@ SigAlarm(SIGNAL_ARG)  {      char *data; -    if (alarm_sec > 0) { +    if (CurrentAlarm.sec > 0) {  	CurrentKey = -1;  	CurrentKeyData = NULL; -	CurrentCmdData = data = (char *)alarm_event.user_data; +	CurrentCmdData = data = (char *)CurrentAlarm.data;  #ifdef USE_MOUSE  	if (use_mouse)  	    mouse_inactive();  #endif -	w3mFuncList[alarm_event.cmd].func(); +	w3mFuncList[CurrentAlarm.cmd].func();  #ifdef USE_MOUSE  	if (use_mouse)  	    mouse_active();  #endif  	CurrentCmdData = NULL;  	onA(); -	if (alarm_status & AL_IMPLICIT) { -	    alarm_buffer = Currentbuf; -	    alarm_status = AL_IMPLICIT_DONE | (alarm_status & AL_ONCE); +	if (CurrentAlarm.status & AL_IMPLICIT) { +	    CurrentAlarm.buffer = Currentbuf; +	    CurrentAlarm.status = AL_IMPLICIT_DONE +				 | (CurrentAlarm.status & AL_ONCE);  	} -	else if (alarm_status & AL_IMPLICIT_DONE -		 && (alarm_buffer != Currentbuf || alarm_status & AL_ONCE)) { -	    setAlarmEvent(0, AL_UNSET, FUNCNAME_nulcmd, NULL); +	else if (CurrentAlarm.status & AL_IMPLICIT_DONE +		 && (CurrentAlarm.buffer != Currentbuf || +		     CurrentAlarm.status & AL_ONCE)) { +	    setAlarmEvent(0, AL_RESTORE, FUNCNAME_nulcmd, NULL);  	} -	if (alarm_sec > 0) { +	if (CurrentAlarm.sec > 0) {  	    signal(SIGALRM, SigAlarm); -	    alarm(alarm_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)  { @@ -5303,13 +5328,20 @@ setAlarm(void)  void  setAlarmEvent(int sec, short status, int cmd, void *data)  { -    if (status == AL_UNSET || status == AL_EXPLICIT -	|| (status & AL_IMPLICIT && alarm_status != AL_EXPLICIT)) { -	alarm_sec = sec; -	alarm_status = status; -	alarm_event.cmd = cmd; -	alarm_event.user_data = 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;  }  #endif  | 
