diff options
author | Fumitoshi UKAI <ukai@debian.or.jp> | 2001-12-26 18:17:57 +0000 |
---|---|---|
committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2001-12-26 18:17:57 +0000 |
commit | 91f74e09ec828e73037d094b3e4063601ebb7ce2 (patch) | |
tree | 20539d8e870b2525475e49402d0a56feaeb87125 | |
parent | [w3m-dev 02735] (diff) | |
download | w3m-91f74e09ec828e73037d094b3e4063601ebb7ce2.tar.gz w3m-91f74e09ec828e73037d094b3e4063601ebb7ce2.zip |
[w3m-dev 02748] cleanup code for restoring cursor position
From: Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
-rw-r--r-- | ChangeLog | 31 | ||||
-rw-r--r-- | buffer.c | 31 | ||||
-rw-r--r-- | display.c | 30 | ||||
-rw-r--r-- | fm.h | 4 | ||||
-rw-r--r-- | main.c | 133 | ||||
-rw-r--r-- | proto.h | 5 |
6 files changed, 123 insertions, 111 deletions
@@ -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> * [w3m-dev 02735] @@ -1626,4 +1655,4 @@ * release-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 $ @@ -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" #ifdef USE_MOUSE @@ -487,8 +487,7 @@ void reshapeBuffer(Buffer *buf) { URLFile f; - int top, linenum, cursorY, pos, currentColumn; - AnchorList *formitem; + Buffer sbuf; if (buf->sourcefile == NULL) return; @@ -498,24 +497,13 @@ reshapeBuffer(Buffer *buf) if (f.stream == NULL) return; - if (buf->firstLine == NULL) { - top = 1; - linenum = 1; - } - else { - top = buf->topLine->linenumber; - linenum = buf->currentLine->linenumber; - } - cursorY = buf->cursorY; - pos = buf->pos; - currentColumn = buf->currentColumn; + copyBuffer(&sbuf, buf); clearBuffer(buf); while (buf->frameset) { deleteFrameSet(buf->frameset); buf->frameset = popFrameTree(&(buf->frameQ)); } - formitem = buf->formitem; buf->href = NULL; buf->name = NULL; buf->img = NULL; @@ -537,18 +525,15 @@ reshapeBuffer(Buffer *buf) #endif buf->height = LASTLINE + 1; - buf->topLine = lineSkip(buf, buf->topLine, top - 1, FALSE); - gotoLine(buf, linenum); - buf->pos = pos; - buf->currentColumn = currentColumn; - arrangeCursor(buf); + if (buf->firstLine) + restorePosition(buf, &sbuf); if (buf->check_url & CHK_URL) - chkURL(); + chkURLBuffer(buf); #ifdef USE_NNTP if (buf->check_url & CHK_NMID) - chkNMID(); + chkNMIDBuffer(buf); #endif - formResetBuffer(buf, formitem); + formResetBuffer(buf, sbuf.formitem); } /* shallow copy */ @@ -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 "fm.h" @@ -188,8 +188,6 @@ static Linecolor color_mode = 0; static Buffer *save_current_buf = NULL; #endif -int in_check_url = FALSE; - char *delayed_msg = NULL; void @@ -198,8 +196,6 @@ displayBuffer(Buffer *buf, int mode) Str msg; Anchor *aa = NULL; - if (in_check_url) - return; if (buf->topLine == NULL && readBufferCache(buf) == 0) { /* clear_buffer */ mode = B_FORCE_REDRAW; } @@ -209,11 +205,8 @@ displayBuffer(Buffer *buf, int mode) if (buf->height == 0) buf->height = LASTLINE + 1; if (buf->width != INIT_BUFFER_WIDTH && buf->type - && !strcmp(buf->type, "text/html")) { - in_check_url = TRUE; + && !strcmp(buf->type, "text/html")) reshapeBuffer(buf); - in_check_url = FALSE; - } if (showLineNum) { if (buf->lastLine && buf->lastLine->real_linenumber > 0) buf->rootX = (int)(log(buf->lastLine->real_linenumber + 0.1) @@ -327,9 +320,9 @@ displayBuffer(Buffer *buf, int mode) standend(); refresh(); #ifdef USE_BUFINFO - if (Currentbuf != save_current_buf) { + if (buf != save_current_buf) { saveBufferInfo(); - save_current_buf = Currentbuf; + save_current_buf = buf; } #endif } @@ -1056,10 +1049,10 @@ arrangeLine(Buffer *buf) buf->cursorX = cpos; buf->pos = i; } - else if (Currentbuf->currentLine->len > i) { + else if (buf->currentLine->len > i) { int delta = 1; #ifdef JP_CHARSET - if (Currentbuf->currentLine->len > i + 1 && + if (buf->currentLine->len > i + 1 && CharType(buf->currentLine->propBuf[i + 1]) == PC_KANJI2) delta = 2; #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: */ /* c-basic-offset: 4 */ /* tab-width: 8 */ @@ -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 * @@ -391,6 +391,8 @@ typedef struct _Buffer { } #define SAVE_BUFPOSITION(sbufp) COPY_BUFPOSITION(sbufp, Currentbuf) #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) @@ -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 #include "fm.h" #include <signal.h> @@ -2222,9 +2222,10 @@ void editBf(void) { char *fn = Currentbuf->filename; - char *type = Currentbuf->type; - int top, linenum, cursorY, pos, currentColumn; - Buffer *buf, *fbuf = NULL; + Buffer *buf, *fbuf = NULL, sbuf; +#ifdef JP_CHARSET + char old_code; +#endif Str cmd; if (fn == NULL || Currentbuf->pagerSource != NULL || /* Behaving as a pager */ @@ -2236,17 +2237,7 @@ editBf(void) } if (Currentbuf->frameset != NULL) fbuf = Currentbuf->linkBuffer[LB_FRAME]; - if (Currentbuf->firstLine == NULL) { - top = 1; - linenum = 1; - } - else { - top = Currentbuf->topLine->linenumber; - linenum = Currentbuf->currentLine->linenumber; - } - cursorY = Currentbuf->cursorY; - pos = Currentbuf->pos; - currentColumn = Currentbuf->currentColumn; + copyBuffer(&sbuf, Currentbuf); if (Currentbuf->edit) { cmd = unquote_mailcap(Currentbuf->edit, Currentbuf->real_type, @@ -2255,6 +2246,7 @@ editBf(void) } else { char *file = shell_quote(fn); + int linenum = CUR_LINENUMBER(Currentbuf); if (strcasestr(Editor, "%s")) { if (strcasestr(Editor, "%d")) cmd = Sprintf(Editor, linenum, file); @@ -2274,11 +2266,20 @@ editBf(void) fmTerm(); system(cmd->ptr); fmInit(); + +#ifdef JP_CHARSET + old_code = DocumentCode; + DocumentCode = Currentbuf->document_code; +#endif SearchHeader = Currentbuf->search_header; DefaultType = Currentbuf->real_type; buf = loadGeneralFile(file_to_url(fn), NULL, NO_REFERER, 0, NULL); +#ifdef JP_CHARSET + DocumentCode = old_code; +#endif SearchHeader = FALSE; DefaultType = NULL; + if (buf == NULL) { disp_err_message("Re-loading failed", FALSE); buf = nullBuffer(); @@ -2286,29 +2287,21 @@ editBf(void) else if (buf == NO_BUFFER) { buf = nullBuffer(); } - buf->search_header = Currentbuf->search_header; if (fbuf != NULL) Firstbuf = deleteBuffer(Firstbuf, fbuf); repBuffer(Currentbuf, buf); - if ((type != NULL) && (buf->type != NULL) && + if ((buf->type != NULL) && (sbuf.type != NULL) && ((!strcasecmp(buf->type, "text/plain") && - !strcasecmp(type, "text/html")) || + !strcasecmp(sbuf.type, "text/html")) || (!strcasecmp(buf->type, "text/html") && - !strcasecmp(type, "text/plain")))) { + !strcasecmp(sbuf.type, "text/plain")))) { vwSrc(); if (Currentbuf != buf) Firstbuf = deleteBuffer(Firstbuf, buf); } - if (Currentbuf->firstLine == NULL) { - displayBuffer(Currentbuf, B_FORCE_REDRAW); - return; - } - Currentbuf->topLine = - lineSkip(Currentbuf, Currentbuf->topLine, top - 1, FALSE); - gotoLine(Currentbuf, linenum); - Currentbuf->pos = pos; - Currentbuf->currentColumn = currentColumn; - arrangeCursor(Currentbuf); + Currentbuf->search_header = sbuf.search_header; + if (Currentbuf->firstLine) + restorePosition(Currentbuf, &sbuf); displayBuffer(Currentbuf, B_FORCE_REDRAW); } @@ -4101,10 +4094,11 @@ vwSrc(void) void reload(void) { - Buffer *buf, *fbuf = NULL; - char *type = Currentbuf->type; + Buffer *buf, *fbuf = NULL, sbuf; +#ifdef JP_CHARSET + char old_code; +#endif Str url; - int top, linenum, cursorY, pos, currentColumn; FormList *request; int multipart; @@ -4118,17 +4112,7 @@ reload(void) disp_err_message("Can't reload stdin", TRUE); return; } - if (Currentbuf->firstLine == NULL) { - top = 1; - linenum = 1; - } - else { - top = Currentbuf->topLine->linenumber; - linenum = Currentbuf->currentLine->linenumber; - } - cursorY = Currentbuf->cursorY; - pos = Currentbuf->pos; - currentColumn = Currentbuf->currentColumn; + copyBuffer(&sbuf, Currentbuf); if (Currentbuf->bufferprop & BP_FRAME && (fbuf = Currentbuf->linkBuffer[LB_N_FRAME])) { if (fmInitialized) { @@ -4149,14 +4133,8 @@ reload(void) buf->linkBuffer[LB_N_FRAME] = fbuf; pushBuffer(buf); Currentbuf = buf; - if (Currentbuf->firstLine == NULL) { - displayBuffer(Currentbuf, B_FORCE_REDRAW); - return; - } - gotoLine(Currentbuf, linenum); - Currentbuf->pos = pos; - Currentbuf->currentColumn = currentColumn; - arrangeCursor(Currentbuf); + if (Currentbuf->firstLine) + restorePosition(Currentbuf, &sbuf); displayBuffer(Currentbuf, B_FORCE_REDRAW); return; } @@ -4181,11 +4159,20 @@ reload(void) url = parsedURL2Str(&Currentbuf->currentURL); message("Reloading...", 0, 0); refresh(); + +#ifdef JP_CHARSET + old_code = DocumentCode; + DocumentCode = Currentbuf->document_code; +#endif SearchHeader = Currentbuf->search_header; DefaultType = Currentbuf->real_type; buf = loadGeneralFile(url->ptr, NULL, NO_REFERER, RG_NOCACHE, request); +#ifdef JP_CHARSET + DocumentCode = old_code; +#endif SearchHeader = FALSE; DefaultType = NULL; + if (multipart) unlink(request->body); if (buf == NULL) { @@ -4195,36 +4182,28 @@ reload(void) else if (buf == NO_BUFFER) { return; } - buf->search_header = Currentbuf->search_header; - buf->form_submit = Currentbuf->form_submit; if (fbuf != NULL) Firstbuf = deleteBuffer(Firstbuf, fbuf); repBuffer(Currentbuf, buf); - if ((type != NULL) && (buf->type != NULL) && + if ((buf->type != NULL) && (sbuf.type != NULL) && ((!strcasecmp(buf->type, "text/plain") && - !strcasecmp(type, "text/html")) || + !strcasecmp(sbuf.type, "text/html")) || (!strcasecmp(buf->type, "text/html") && - !strcasecmp(type, "text/plain")))) { + !strcasecmp(sbuf.type, "text/plain")))) { vwSrc(); if (Currentbuf != buf) Firstbuf = deleteBuffer(Firstbuf, buf); } - if (Currentbuf->firstLine == NULL) { - displayBuffer(Currentbuf, B_FORCE_REDRAW); - return; - } - Currentbuf->topLine = - lineSkip(Currentbuf, Currentbuf->firstLine, top - 1, FALSE); - gotoLine(Currentbuf, linenum); - Currentbuf->pos = pos; - Currentbuf->currentColumn = currentColumn; - arrangeCursor(Currentbuf); + Currentbuf->search_header = sbuf.search_header; + Currentbuf->form_submit = sbuf.form_submit; + if (Currentbuf->firstLine) + restorePosition(Currentbuf, &sbuf); displayBuffer(Currentbuf, B_FORCE_REDRAW); } /* mark URL-like patterns as anchors */ void -chkURL(void) +chkURLBuffer(Buffer *buf) { static char *url_like_pat[] = { "http://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$]*[a-zA-Z0-9_/=]", @@ -4251,17 +4230,22 @@ chkURL(void) }; int 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); } #ifdef USE_NNTP /* mark Message-ID-like patterns as NEWS anchors */ void -chkNMID(void) +chkNMIDBuffer(Buffer *buf) { static char *url_like_pat[] = { "<[^<> ][^<> ]*@[A-z0-9\\.\\-_][A-z0-9\\.\\-_]*>", @@ -4269,10 +4253,15 @@ chkNMID(void) }; int 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); } #endif /* USE_NNTP */ @@ -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. * Manual editing not recommended. @@ -90,8 +90,10 @@ extern void curURL(void); extern void vwSrc(void); extern void reload(void); extern void chkURL(void); +extern void chkURLBuffer(Buffer *buf); #ifdef USE_NNTP extern void chkNMID(void); +extern void chkNMIDBuffer(Buffer *buf); #else #define chkNMID nulcmd #endif @@ -230,6 +232,7 @@ extern void cursorHome(Buffer *buf); extern void arrangeCursor(Buffer *buf); extern void arrangeLine(Buffer *buf); 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 columnPos(Line *line, int column); extern Line *lineSkip(Buffer *buf, Line *line, int offset, int last); |