[w3m-dev 02748] cleanup code for restoring cursor position

From: Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
This commit is contained in:
Fumitoshi UKAI
2001-12-26 18:17:57 +00:00
parent e8865ad8a0
commit 91f74e09ec
6 changed files with 123 additions and 111 deletions
+30 -1
View File
@@ -1,3 +1,32 @@
2001-12-27 Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
* [w3m-dev 02748] cleanup code for restoring cursor position
* buffer.c (reshapeBuffer): delete top, linenum, cursorY, pos,
currentColumn, formitem
* buffer.c (reshapeBuffer): add sbuf and
use copyBuffer(), restorePosition()
* buffer.c (reshapeBuffer): use chkURLBuffer(), chkNMIDBuffer()
* display.c (in_check_url): deleted
* display.c (displayBuffer): ditto
* display.c (displayBuffer): s/Currentbuf/buf/
* display.c (arrangeLine): ditto
* display.c (restorePosition): added
* fm.h (TOP_LINENUMBER): added
* fm.h (CUR_LINENUMBER): added
* main.c (editBf): delete type, top, linenum, cursorY, pos,
currentColumn
* main.c (editBf): add sbuf and use copyBuffer(), restorePosition()
* main.c (reload): delete type, top, linenum, cursorY, pos,
currentColumn
* main.c (reload): add sbuf and use copyBuffer(), restorePosition()
* main.c (chkURLBuffer): added
* main.c (chkURL): chkRULBuffer on Currentbuf
* main.c (chkNMIDBuffer): added
* main.c (chkNMID): chkNMIDBuffer on Currentbuf
* proto.h (chkURLBuffer): added
* proto.h (chkNMIDBuffer): added
* proto.h (restorePosition): added
2001-12-27 "OMAE, jun" <jun-o@dai.meta.ne.jp> 2001-12-27 "OMAE, jun" <jun-o@dai.meta.ne.jp>
* [w3m-dev 02735] * [w3m-dev 02735]
@@ -1626,4 +1655,4 @@
* release-0-2-1 * release-0-2-1
* import w3m-0.2.1 * import w3m-0.2.1
$Id: ChangeLog,v 1.182 2001/12/26 17:57:57 ukai Exp $ $Id: ChangeLog,v 1.183 2001/12/26 18:17:57 ukai Exp $
+8 -23
View File
@@ -1,4 +1,4 @@
/* $Id: buffer.c,v 1.8 2001/12/04 16:33:08 ukai Exp $ */ /* $Id: buffer.c,v 1.9 2001/12/26 18:17:57 ukai Exp $ */
#include "fm.h" #include "fm.h"
#ifdef USE_MOUSE #ifdef USE_MOUSE
@@ -487,8 +487,7 @@ void
reshapeBuffer(Buffer *buf) reshapeBuffer(Buffer *buf)
{ {
URLFile f; URLFile f;
int top, linenum, cursorY, pos, currentColumn; Buffer sbuf;
AnchorList *formitem;
if (buf->sourcefile == NULL) if (buf->sourcefile == NULL)
return; return;
@@ -498,24 +497,13 @@ reshapeBuffer(Buffer *buf)
if (f.stream == NULL) if (f.stream == NULL)
return; return;
if (buf->firstLine == NULL) { copyBuffer(&sbuf, buf);
top = 1;
linenum = 1;
}
else {
top = buf->topLine->linenumber;
linenum = buf->currentLine->linenumber;
}
cursorY = buf->cursorY;
pos = buf->pos;
currentColumn = buf->currentColumn;
clearBuffer(buf); clearBuffer(buf);
while (buf->frameset) { while (buf->frameset) {
deleteFrameSet(buf->frameset); deleteFrameSet(buf->frameset);
buf->frameset = popFrameTree(&(buf->frameQ)); buf->frameset = popFrameTree(&(buf->frameQ));
} }
formitem = buf->formitem;
buf->href = NULL; buf->href = NULL;
buf->name = NULL; buf->name = NULL;
buf->img = NULL; buf->img = NULL;
@@ -537,18 +525,15 @@ reshapeBuffer(Buffer *buf)
#endif #endif
buf->height = LASTLINE + 1; buf->height = LASTLINE + 1;
buf->topLine = lineSkip(buf, buf->topLine, top - 1, FALSE); if (buf->firstLine)
gotoLine(buf, linenum); restorePosition(buf, &sbuf);
buf->pos = pos;
buf->currentColumn = currentColumn;
arrangeCursor(buf);
if (buf->check_url & CHK_URL) if (buf->check_url & CHK_URL)
chkURL(); chkURLBuffer(buf);
#ifdef USE_NNTP #ifdef USE_NNTP
if (buf->check_url & CHK_NMID) if (buf->check_url & CHK_NMID)
chkNMID(); chkNMIDBuffer(buf);
#endif #endif
formResetBuffer(buf, formitem); formResetBuffer(buf, sbuf.formitem);
} }
/* shallow copy */ /* shallow copy */
+17 -13
View File
@@ -1,4 +1,4 @@
/* $Id: display.c,v 1.12 2001/12/04 16:33:08 ukai Exp $ */ /* $Id: display.c,v 1.13 2001/12/26 18:17:57 ukai Exp $ */
#include <signal.h> #include <signal.h>
#include "fm.h" #include "fm.h"
@@ -188,8 +188,6 @@ static Linecolor color_mode = 0;
static Buffer *save_current_buf = NULL; static Buffer *save_current_buf = NULL;
#endif #endif
int in_check_url = FALSE;
char *delayed_msg = NULL; char *delayed_msg = NULL;
void void
@@ -198,8 +196,6 @@ displayBuffer(Buffer *buf, int mode)
Str msg; Str msg;
Anchor *aa = NULL; Anchor *aa = NULL;
if (in_check_url)
return;
if (buf->topLine == NULL && readBufferCache(buf) == 0) { /* clear_buffer */ if (buf->topLine == NULL && readBufferCache(buf) == 0) { /* clear_buffer */
mode = B_FORCE_REDRAW; mode = B_FORCE_REDRAW;
} }
@@ -209,11 +205,8 @@ displayBuffer(Buffer *buf, int mode)
if (buf->height == 0) if (buf->height == 0)
buf->height = LASTLINE + 1; buf->height = LASTLINE + 1;
if (buf->width != INIT_BUFFER_WIDTH && buf->type if (buf->width != INIT_BUFFER_WIDTH && buf->type
&& !strcmp(buf->type, "text/html")) { && !strcmp(buf->type, "text/html"))
in_check_url = TRUE;
reshapeBuffer(buf); reshapeBuffer(buf);
in_check_url = FALSE;
}
if (showLineNum) { if (showLineNum) {
if (buf->lastLine && buf->lastLine->real_linenumber > 0) if (buf->lastLine && buf->lastLine->real_linenumber > 0)
buf->rootX = (int)(log(buf->lastLine->real_linenumber + 0.1) buf->rootX = (int)(log(buf->lastLine->real_linenumber + 0.1)
@@ -327,9 +320,9 @@ displayBuffer(Buffer *buf, int mode)
standend(); standend();
refresh(); refresh();
#ifdef USE_BUFINFO #ifdef USE_BUFINFO
if (Currentbuf != save_current_buf) { if (buf != save_current_buf) {
saveBufferInfo(); saveBufferInfo();
save_current_buf = Currentbuf; save_current_buf = buf;
} }
#endif #endif
} }
@@ -1056,10 +1049,10 @@ arrangeLine(Buffer *buf)
buf->cursorX = cpos; buf->cursorX = cpos;
buf->pos = i; buf->pos = i;
} }
else if (Currentbuf->currentLine->len > i) { else if (buf->currentLine->len > i) {
int delta = 1; int delta = 1;
#ifdef JP_CHARSET #ifdef JP_CHARSET
if (Currentbuf->currentLine->len > i + 1 && if (buf->currentLine->len > i + 1 &&
CharType(buf->currentLine->propBuf[i + 1]) == PC_KANJI2) CharType(buf->currentLine->propBuf[i + 1]) == PC_KANJI2)
delta = 2; delta = 2;
#endif #endif
@@ -1105,6 +1098,17 @@ cursorXY(Buffer *buf, int x, int y)
} }
} }
void
restorePosition(Buffer *buf, Buffer *orig)
{
buf->topLine = lineSkip(buf, buf->firstLine, TOP_LINENUMBER(orig) - 1,
FALSE);
gotoLine(buf, CUR_LINENUMBER(orig));
buf->pos = orig->pos;
buf->currentColumn = orig->currentColumn;
arrangeCursor(buf);
}
/* Local Variables: */ /* Local Variables: */
/* c-basic-offset: 4 */ /* c-basic-offset: 4 */
/* tab-width: 8 */ /* tab-width: 8 */
+3 -1
View File
@@ -1,4 +1,4 @@
/* $Id: fm.h,v 1.33 2001/12/25 18:15:00 ukai Exp $ */ /* $Id: fm.h,v 1.34 2001/12/26 18:17:57 ukai Exp $ */
/* /*
* w3m: WWW wo Miru utility * w3m: WWW wo Miru utility
* *
@@ -391,6 +391,8 @@ typedef struct _Buffer {
} }
#define SAVE_BUFPOSITION(sbufp) COPY_BUFPOSITION(sbufp, Currentbuf) #define SAVE_BUFPOSITION(sbufp) COPY_BUFPOSITION(sbufp, Currentbuf)
#define RESTORE_BUFPOSITION(sbufp) COPY_BUFPOSITION(Currentbuf, sbufp) #define RESTORE_BUFPOSITION(sbufp) COPY_BUFPOSITION(Currentbuf, sbufp)
#define TOP_LINENUMBER(buf) ((buf)->topLine ? (buf)->topLine->linenumber : 1)
#define CUR_LINENUMBER(buf) ((buf)->currentLine ? (buf)->currentLine->linenumber : 1)
#define NO_BUFFER ((Buffer*)1) #define NO_BUFFER ((Buffer*)1)
+61 -72
View File
@@ -1,4 +1,4 @@
/* $Id: main.c,v 1.48 2001/12/25 16:49:42 ukai Exp $ */ /* $Id: main.c,v 1.49 2001/12/26 18:17:57 ukai Exp $ */
#define MAINPROGRAM #define MAINPROGRAM
#include "fm.h" #include "fm.h"
#include <signal.h> #include <signal.h>
@@ -2222,9 +2222,10 @@ void
editBf(void) editBf(void)
{ {
char *fn = Currentbuf->filename; char *fn = Currentbuf->filename;
char *type = Currentbuf->type; Buffer *buf, *fbuf = NULL, sbuf;
int top, linenum, cursorY, pos, currentColumn; #ifdef JP_CHARSET
Buffer *buf, *fbuf = NULL; char old_code;
#endif
Str cmd; Str cmd;
if (fn == NULL || Currentbuf->pagerSource != NULL || /* Behaving as a pager */ if (fn == NULL || Currentbuf->pagerSource != NULL || /* Behaving as a pager */
@@ -2236,17 +2237,7 @@ editBf(void)
} }
if (Currentbuf->frameset != NULL) if (Currentbuf->frameset != NULL)
fbuf = Currentbuf->linkBuffer[LB_FRAME]; fbuf = Currentbuf->linkBuffer[LB_FRAME];
if (Currentbuf->firstLine == NULL) { copyBuffer(&sbuf, Currentbuf);
top = 1;
linenum = 1;
}
else {
top = Currentbuf->topLine->linenumber;
linenum = Currentbuf->currentLine->linenumber;
}
cursorY = Currentbuf->cursorY;
pos = Currentbuf->pos;
currentColumn = Currentbuf->currentColumn;
if (Currentbuf->edit) { if (Currentbuf->edit) {
cmd = unquote_mailcap(Currentbuf->edit, cmd = unquote_mailcap(Currentbuf->edit,
Currentbuf->real_type, Currentbuf->real_type,
@@ -2255,6 +2246,7 @@ editBf(void)
} }
else { else {
char *file = shell_quote(fn); char *file = shell_quote(fn);
int linenum = CUR_LINENUMBER(Currentbuf);
if (strcasestr(Editor, "%s")) { if (strcasestr(Editor, "%s")) {
if (strcasestr(Editor, "%d")) if (strcasestr(Editor, "%d"))
cmd = Sprintf(Editor, linenum, file); cmd = Sprintf(Editor, linenum, file);
@@ -2274,11 +2266,20 @@ editBf(void)
fmTerm(); fmTerm();
system(cmd->ptr); system(cmd->ptr);
fmInit(); fmInit();
#ifdef JP_CHARSET
old_code = DocumentCode;
DocumentCode = Currentbuf->document_code;
#endif
SearchHeader = Currentbuf->search_header; SearchHeader = Currentbuf->search_header;
DefaultType = Currentbuf->real_type; DefaultType = Currentbuf->real_type;
buf = loadGeneralFile(file_to_url(fn), NULL, NO_REFERER, 0, NULL); buf = loadGeneralFile(file_to_url(fn), NULL, NO_REFERER, 0, NULL);
#ifdef JP_CHARSET
DocumentCode = old_code;
#endif
SearchHeader = FALSE; SearchHeader = FALSE;
DefaultType = NULL; DefaultType = NULL;
if (buf == NULL) { if (buf == NULL) {
disp_err_message("Re-loading failed", FALSE); disp_err_message("Re-loading failed", FALSE);
buf = nullBuffer(); buf = nullBuffer();
@@ -2286,29 +2287,21 @@ editBf(void)
else if (buf == NO_BUFFER) { else if (buf == NO_BUFFER) {
buf = nullBuffer(); buf = nullBuffer();
} }
buf->search_header = Currentbuf->search_header;
if (fbuf != NULL) if (fbuf != NULL)
Firstbuf = deleteBuffer(Firstbuf, fbuf); Firstbuf = deleteBuffer(Firstbuf, fbuf);
repBuffer(Currentbuf, buf); repBuffer(Currentbuf, buf);
if ((type != NULL) && (buf->type != NULL) && if ((buf->type != NULL) && (sbuf.type != NULL) &&
((!strcasecmp(buf->type, "text/plain") && ((!strcasecmp(buf->type, "text/plain") &&
!strcasecmp(type, "text/html")) || !strcasecmp(sbuf.type, "text/html")) ||
(!strcasecmp(buf->type, "text/html") && (!strcasecmp(buf->type, "text/html") &&
!strcasecmp(type, "text/plain")))) { !strcasecmp(sbuf.type, "text/plain")))) {
vwSrc(); vwSrc();
if (Currentbuf != buf) if (Currentbuf != buf)
Firstbuf = deleteBuffer(Firstbuf, buf); Firstbuf = deleteBuffer(Firstbuf, buf);
} }
if (Currentbuf->firstLine == NULL) { Currentbuf->search_header = sbuf.search_header;
displayBuffer(Currentbuf, B_FORCE_REDRAW); if (Currentbuf->firstLine)
return; restorePosition(Currentbuf, &sbuf);
}
Currentbuf->topLine =
lineSkip(Currentbuf, Currentbuf->topLine, top - 1, FALSE);
gotoLine(Currentbuf, linenum);
Currentbuf->pos = pos;
Currentbuf->currentColumn = currentColumn;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
} }
@@ -4101,10 +4094,11 @@ vwSrc(void)
void void
reload(void) reload(void)
{ {
Buffer *buf, *fbuf = NULL; Buffer *buf, *fbuf = NULL, sbuf;
char *type = Currentbuf->type; #ifdef JP_CHARSET
char old_code;
#endif
Str url; Str url;
int top, linenum, cursorY, pos, currentColumn;
FormList *request; FormList *request;
int multipart; int multipart;
@@ -4118,17 +4112,7 @@ reload(void)
disp_err_message("Can't reload stdin", TRUE); disp_err_message("Can't reload stdin", TRUE);
return; return;
} }
if (Currentbuf->firstLine == NULL) { copyBuffer(&sbuf, Currentbuf);
top = 1;
linenum = 1;
}
else {
top = Currentbuf->topLine->linenumber;
linenum = Currentbuf->currentLine->linenumber;
}
cursorY = Currentbuf->cursorY;
pos = Currentbuf->pos;
currentColumn = Currentbuf->currentColumn;
if (Currentbuf->bufferprop & BP_FRAME && if (Currentbuf->bufferprop & BP_FRAME &&
(fbuf = Currentbuf->linkBuffer[LB_N_FRAME])) { (fbuf = Currentbuf->linkBuffer[LB_N_FRAME])) {
if (fmInitialized) { if (fmInitialized) {
@@ -4149,14 +4133,8 @@ reload(void)
buf->linkBuffer[LB_N_FRAME] = fbuf; buf->linkBuffer[LB_N_FRAME] = fbuf;
pushBuffer(buf); pushBuffer(buf);
Currentbuf = buf; Currentbuf = buf;
if (Currentbuf->firstLine == NULL) { if (Currentbuf->firstLine)
displayBuffer(Currentbuf, B_FORCE_REDRAW); restorePosition(Currentbuf, &sbuf);
return;
}
gotoLine(Currentbuf, linenum);
Currentbuf->pos = pos;
Currentbuf->currentColumn = currentColumn;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
return; return;
} }
@@ -4181,11 +4159,20 @@ reload(void)
url = parsedURL2Str(&Currentbuf->currentURL); url = parsedURL2Str(&Currentbuf->currentURL);
message("Reloading...", 0, 0); message("Reloading...", 0, 0);
refresh(); refresh();
#ifdef JP_CHARSET
old_code = DocumentCode;
DocumentCode = Currentbuf->document_code;
#endif
SearchHeader = Currentbuf->search_header; SearchHeader = Currentbuf->search_header;
DefaultType = Currentbuf->real_type; DefaultType = Currentbuf->real_type;
buf = loadGeneralFile(url->ptr, NULL, NO_REFERER, RG_NOCACHE, request); buf = loadGeneralFile(url->ptr, NULL, NO_REFERER, RG_NOCACHE, request);
#ifdef JP_CHARSET
DocumentCode = old_code;
#endif
SearchHeader = FALSE; SearchHeader = FALSE;
DefaultType = NULL; DefaultType = NULL;
if (multipart) if (multipart)
unlink(request->body); unlink(request->body);
if (buf == NULL) { if (buf == NULL) {
@@ -4195,36 +4182,28 @@ reload(void)
else if (buf == NO_BUFFER) { else if (buf == NO_BUFFER) {
return; return;
} }
buf->search_header = Currentbuf->search_header;
buf->form_submit = Currentbuf->form_submit;
if (fbuf != NULL) if (fbuf != NULL)
Firstbuf = deleteBuffer(Firstbuf, fbuf); Firstbuf = deleteBuffer(Firstbuf, fbuf);
repBuffer(Currentbuf, buf); repBuffer(Currentbuf, buf);
if ((type != NULL) && (buf->type != NULL) && if ((buf->type != NULL) && (sbuf.type != NULL) &&
((!strcasecmp(buf->type, "text/plain") && ((!strcasecmp(buf->type, "text/plain") &&
!strcasecmp(type, "text/html")) || !strcasecmp(sbuf.type, "text/html")) ||
(!strcasecmp(buf->type, "text/html") && (!strcasecmp(buf->type, "text/html") &&
!strcasecmp(type, "text/plain")))) { !strcasecmp(sbuf.type, "text/plain")))) {
vwSrc(); vwSrc();
if (Currentbuf != buf) if (Currentbuf != buf)
Firstbuf = deleteBuffer(Firstbuf, buf); Firstbuf = deleteBuffer(Firstbuf, buf);
} }
if (Currentbuf->firstLine == NULL) { Currentbuf->search_header = sbuf.search_header;
displayBuffer(Currentbuf, B_FORCE_REDRAW); Currentbuf->form_submit = sbuf.form_submit;
return; if (Currentbuf->firstLine)
} restorePosition(Currentbuf, &sbuf);
Currentbuf->topLine =
lineSkip(Currentbuf, Currentbuf->firstLine, top - 1, FALSE);
gotoLine(Currentbuf, linenum);
Currentbuf->pos = pos;
Currentbuf->currentColumn = currentColumn;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
} }
/* mark URL-like patterns as anchors */ /* mark URL-like patterns as anchors */
void void
chkURL(void) chkURLBuffer(Buffer *buf)
{ {
static char *url_like_pat[] = { static char *url_like_pat[] = {
"http://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$]*[a-zA-Z0-9_/=]", "http://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$]*[a-zA-Z0-9_/=]",
@@ -4251,17 +4230,22 @@ chkURL(void)
}; };
int i; int i;
for (i = 0; url_like_pat[i]; i++) { for (i = 0; url_like_pat[i]; i++) {
reAnchor(Currentbuf, url_like_pat[i]); reAnchor(buf, url_like_pat[i]);
} }
Currentbuf->check_url |= CHK_URL; buf->check_url |= CHK_URL;
}
void
chkURL(void)
{
chkURLBuffer(Currentbuf);
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
} }
#ifdef USE_NNTP #ifdef USE_NNTP
/* mark Message-ID-like patterns as NEWS anchors */ /* mark Message-ID-like patterns as NEWS anchors */
void void
chkNMID(void) chkNMIDBuffer(Buffer *buf)
{ {
static char *url_like_pat[] = { static char *url_like_pat[] = {
"<[^<> ][^<> ]*@[A-z0-9\\.\\-_][A-z0-9\\.\\-_]*>", "<[^<> ][^<> ]*@[A-z0-9\\.\\-_][A-z0-9\\.\\-_]*>",
@@ -4269,10 +4253,15 @@ chkNMID(void)
}; };
int i; int i;
for (i = 0; url_like_pat[i]; i++) { for (i = 0; url_like_pat[i]; i++) {
reAnchorNews(Currentbuf, url_like_pat[i]); reAnchorNews(buf, url_like_pat[i]);
} }
Currentbuf->check_url |= CHK_NMID; buf->check_url |= CHK_NMID;
}
void
chkNMID(void)
{
chkNMIDBuffer(Currentbuf);
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
} }
#endif /* USE_NNTP */ #endif /* USE_NNTP */
+4 -1
View File
@@ -1,4 +1,4 @@
/* $Id: proto.h,v 1.20 2001/12/25 18:15:00 ukai Exp $ */ /* $Id: proto.h,v 1.21 2001/12/26 18:17:57 ukai Exp $ */
/* /*
* This file was automatically generated by version 1.7 of cextract. * This file was automatically generated by version 1.7 of cextract.
* Manual editing not recommended. * Manual editing not recommended.
@@ -90,8 +90,10 @@ extern void curURL(void);
extern void vwSrc(void); extern void vwSrc(void);
extern void reload(void); extern void reload(void);
extern void chkURL(void); extern void chkURL(void);
extern void chkURLBuffer(Buffer *buf);
#ifdef USE_NNTP #ifdef USE_NNTP
extern void chkNMID(void); extern void chkNMID(void);
extern void chkNMIDBuffer(Buffer *buf);
#else #else
#define chkNMID nulcmd #define chkNMID nulcmd
#endif #endif
@@ -230,6 +232,7 @@ extern void cursorHome(Buffer *buf);
extern void arrangeCursor(Buffer *buf); extern void arrangeCursor(Buffer *buf);
extern void arrangeLine(Buffer *buf); extern void arrangeLine(Buffer *buf);
extern void cursorXY(Buffer *buf, int x, int y); extern void cursorXY(Buffer *buf, int x, int y);
extern void restorePosition(Buffer *buf, Buffer *orig);
extern int columnSkip(Buffer *buf, int offset); extern int columnSkip(Buffer *buf, int offset);
extern int columnPos(Line *line, int column); extern int columnPos(Line *line, int column);
extern Line *lineSkip(Buffer *buf, Line *line, int offset, int last); extern Line *lineSkip(Buffer *buf, Line *line, int offset, int last);