[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
lynx-dev [-dev.12] experimental text entry fields patch (updated)
From: |
Kim DeVaughn |
Subject: |
lynx-dev [-dev.12] experimental text entry fields patch (updated) |
Date: |
Tue, 5 Jan 1999 13:21:03 -0800 |
| I made a patch for [1]Lynx the textual web browser. The patch allows
| you to put the contents of a textarea (found in forms in html
| documents) into a file for easier composition.
| The version of the patch itself is 0.1.2 (19 nov 1998). It is an alpha
| release. It made it relative to Lynx2.8.1rel.1, other versions might
| work.
OK ... I have this patch working with 2.8.2-dev.12 ... the rejects caused
by the rev change were pretty trivial to fix.
I've attached the patch fixed for -dev.12 below, just to save anyone else
the hassle of doing the fixups themselves, if they want to play around with
this feature. No other changes have been made, at this time.
Before it gets included in any distrubution, I think it would be polite to
get the author's permission to use it, even though there were no restrict-
ions placed on the code, and feedback was explicitly asked for.
A few comments ...
1. After returning from the editor, the screen needs a full refresh
performed (manually, ^V ^L, if your cursor was still positioned in
the text area when ^V % was issued). This may be dependent on the
lib or platform being used; I'm using slang 1.2.2 on a FreeBSD
2.2.8-STABLE box.
2. The edited text is *not* displayed in the text area after returning
from the editor. When the ^V & command is issued, the word CONVERTED
is placed at the start of that text area.
3. On entry to the editor, the file has the same number of blank lines
as the field had, though there is no visual indication of this
(which may well be editor dependent) other than issuing the editor
cmd that moves the cursor to the EOF.
There's also no indication of allowable/maximum line length. I'm
not sure how this could be provided, in any clean way.
4. As the author says in the notes on his web-page, backup~ files are
not cleaned up.
5. The author seems to imply that one can "mark" (^V &) several text
fields, then edit them all at once using the "edit" command (^V %).
I dunno how that would work, and indeed haven't been able to come
close to doing anything like that in my limited testing. I am
probably misinterpreting what the author meant, where he said:
"* The number of files is limited. Size of files is limited."
6. The author says: "After the textarea is in a file you can't put it
back; you can't revert."
Again, I don't quite understand this. Multiple invocations of the
editor (^V %) on the same text field work. Subsequent changes made,
to the text, *do* get picked up.
Perhaps he means that you can't totally "undo" a textfield entry
(but you can always ^V % again, and erase the lines in the editor).
7. In text areas that are "preloaded" with some text, that text *does*
get transfered to the editor (though when ^V & is entered, it is
cleared from the textarea on the rendered page itself).
Anyway ... it seems like this is a good start to getting this kind of a
feature working in lynx. It has a few rough edges, but even in its
current state, I think I'll be including it in my lynx builds.
Very useful ...!
BTW, all my testing was done with text entry fields on submission pages
at the Internet Movie DataBase (http://www.imdb.com/>. Other pages may
or may not work as well as these seem to ...
/kim
Against 2.8.2-dev.12:
##----- snip -----##
This is an update to the 0.1.2 version of the patch, so let's call it
0.1.3 (05 Jan 99).
The only things changed were to fix it to apply to the 2.8.2-dev.12
version of lynx, and to delete trailing whitespace in a few places.
Only minor tweaks were needed.
/kim (address@hidden)
-------------------------------------------------------------------------------
This is patch version 0.1.2 (19 Nov 98) for textarea + file editing
It is made versus lynx2.8.1rel1
To use it put lines like these in lynx.cfg:
KEYMAP:%:CONVERTEDIT
KEYMAP:&:CONVERT
DEFAULT_EDITOR:joe
Your default editor may need to be set in your ~/.lynxrc
Improvements in this patch from 0.1.0
are warning when the file is too big, warning when
the filename array is full, and a statusline message indcating
when your in a converted area.
From 0.1.1:
Fixed status line message.
diff -uNr lynx-2.8.2-dev.12.orig/src/GridText.c
lynx-2.8.2-dev.12+kd/src/GridText.c
--- lynx-2.8.2-dev.12.orig/src/GridText.c Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/GridText.c Tue Jan 5 10:40:09 1999
@@ -2,6 +2,7 @@
** ===============================
*/
+#include <myfile.h>
#include <HTUtils.h>
#include <HTString.h>
#include <HTFont.h>
@@ -6796,6 +6797,7 @@
a->input_field = f;
+ f->filename = NULL;
f->select_list = 0;
f->number = HTFormNumber;
f->disabled = (HTFormDisabled ? TRUE : I->disabled);
@@ -7306,6 +7308,82 @@
return (-1);
}
+/* ARGSx, how compatible
+ * perhaps m4 should be used, it's turing equivalent
+ */
+/* Puts a textarea into a file
+*/
+/* TODO: add disabled form handling, ...
+ */
+PUBLIC void HText_FileForm ARGS1(
+ struct link *, form_link) /* like in change_form_link */
+{
+ struct stat B;
+ FormInfo *form = form_link->form;
+ TextAnchor *anchor_ptr;
+ int form_number = form->number;
+ const char * const textareaname = form_link->form->name;
+ /* This identfies which textarea if more than one*/
+ FILE *fp;
+ BOOLEAN firstanchor = TRUE;
+ /* the first line of the textarea wll have a message
+ * use this flag to tell which is first
+ */
+
+ if (g_mytmp_i == g_mytmp_i_max)
+ {
+ HTInfoMsg("Can't convert, file holder full.");
+ } else {
+
+ g_mytmp_i++; /* starts out as -1 */
+
+ /* FIXME how much to malloc? No objects or garbage collector is
annoying*/
+ fp = LYOpenTemp(g_mytmp[g_mytmp_i] = malloc(200), ".txt", "w");
+ if (strlen(g_mytmp[g_mytmp_i]) == 200)
+ HTAlert("Memory Violation :8q29");
+
+ /*
+ * Reset anchor->ptr.
+ */
+ anchor_ptr = HTMainText->first_anchor;
+ /*
+ * Go through list of anchors and make file.
+ */
+ while (anchor_ptr) {
+ /* find the right anchors to work with */
+ if (anchor_ptr->link_type == INPUT_ANCHOR &&
+ anchor_ptr->input_field->number == form_number &&
+ !strcmp( anchor_ptr->input_field->name, textareaname) )
+ {
+ /* Record file name in TextAnchor data */
+ anchor_ptr->input_field->filename = g_mytmp[g_mytmp_i];
+
+ /*write to file*/
+ fputs (anchor_ptr->input_field->value, fp);
+ fputc ('\n', fp);
+ if (firstanchor) {
+ firstanchor = FALSE;
+ /* put message into first line
+ * StrAllocCopy, blecch no GC
+ */
+ StrAllocCopy (anchor_ptr->input_field->value,
"CONVERTED");
+ } else {
+ /* clear line */
+ StrAllocCopy (anchor_ptr->input_field->value,
"");
+ }
+ }
+ anchor_ptr = anchor_ptr->next;
+ }
+
+ fclose (fp);
+ stat (g_mytmp[g_mytmp_i], &B);
+ if (B.st_size > g_maxfile_size) { /* too big */
+ HTAlert("File too big, won't be submit correctly");
+ }
+
+ }/* unindented g_mytmp_i_max branch */
+}
+
PUBLIC void HText_SubmitForm ARGS4(
FormInfo *, submit_item,
document *, doc,
@@ -7339,6 +7417,10 @@
char *val_used = "";
char *copied_val_used = NULL;
char *copied_name_used = NULL;
+ BOOLEAN freeval = FALSE;
+ BOOLEAN skiparea = FALSE;
+ FILE *fp = NULL; /* used for reading textarea file */
+ char *areaname = ""; /* name of textarea (do all textarea have a name?) */
CTRACE(tfp, "FIXME:SubmitForm\n");
if (!HTMainText)
@@ -7453,15 +7535,49 @@
while (anchor_ptr) {
if (anchor_ptr->link_type == INPUT_ANCHOR) {
if (anchor_ptr->input_field->number == form_number) {
-
char *p;
char * val;
+
+ if (skiparea) {
+ /* Can two textareas in the same form have the same
name */
+ /* Are textarea's always made of consecutive
textanchors? */
+ if (!strcmp(anchor_ptr->input_field->name, areaname) ) {
+ /* from bottom of while: */
+ if (anchor_ptr == HTMainText->last_anchor)
+ break;
+
+ anchor_ptr = anchor_ptr->next;
+ continue;
+ } else {
+ skiparea = FALSE;
+ }
+ }
+
form_ptr = anchor_ptr->input_field;
val = form_ptr->cp_submit_value != NULL ?
form_ptr->cp_submit_value : form_ptr->value;
field_has_8bit = NO;
field_has_special = NO;
+ /* handle textarea file
+ * only textareas have filenames
+ */
+ if (anchor_ptr->input_field->filename != NULL) {
+ struct stat B;
+ areaname = anchor_ptr->input_field->name;
+ stat (anchor_ptr->input_field->filename, &B);
+ if (B.st_size > g_maxfile_size) { /* too big */
+ HTAlert("File too big"); /*FIXME better
message*/
+ } else {
+ fp = fopen (anchor_ptr->input_field->filename,
"r");
+ val = malloc (B.st_size * (sizeof (char)));
+ fread (val, 1, B.st_size, fp);
+ fclose (fp);
+ freeval = TRUE;
+ }
+ skiparea = TRUE;
+ }
+
for (p = val;
p && *p && !(field_has_8bit && field_has_special);
p++)
@@ -7526,12 +7642,17 @@
} else {
target_cs = -1; /* don't know what to do */
}
+ if (freeval) {
+ free (val);
+ freeval = FALSE;
+ }
} else if (anchor_ptr->input_field->number > form_number) {
break;
}
}
+
if (anchor_ptr == HTMainText->last_anchor)
break;
@@ -7626,6 +7747,11 @@
out_csname = target_csname;
+ skiparea = FALSE;
+ fp = NULL;
+ areaname = "";
+
+
/*
* Reset anchor->ptr.
*/
@@ -7638,6 +7764,21 @@
if (anchor_ptr->input_field->number == form_number) {
char *p;
int out_cs;
+
+ if (skiparea) {
+ /* Can two textareas in the same form have the same
name */
+ if (! strcmp(anchor_ptr->input_field->name, areaname) )
{
+ /* from bottom of while: */
+ if (anchor_ptr == HTMainText->last_anchor)
+ break;
+
+ anchor_ptr = anchor_ptr->next;
+ continue;
+ } else {
+ skiparea = FALSE;
+ }
+ }
+
form_ptr = anchor_ptr->input_field;
if (form_ptr->type != F_TEXTAREA_TYPE)
@@ -7691,6 +7832,27 @@
val_used = form_ptr->value;
}
+ /* handle textarea file
+ * only textareas have filenames
+ */
+ if (anchor_ptr->input_field->filename != NULL) {
+ struct stat B;
+ areaname = anchor_ptr->input_field->name;
+ stat (anchor_ptr->input_field->filename, &B);
+ if (B.st_size > g_maxfile_size) { /* too big */
+ /* FIXME */
+ } else {
+ /* I could change the strings in this code
+ * to streams.
+ */
+ fp = fopen (anchor_ptr->input_field->filename,
"r");
+ val_used = malloc (B.st_size * (sizeof (char)));
+ freeval = TRUE;
+ fread (val_used, 1, B.st_size, fp);
+ fclose (fp);
+ }
+ skiparea = TRUE;
+ }
/*
* Charset-translate value now, because we need
* to know the charset parameter for multipart
@@ -7869,6 +8031,9 @@
form_ptr->type);
}
+ /* Add to query, see vars- name_used val_used
+ * escaped1 escaped2
+ */
switch(form_ptr->type) {
case F_RESET_TYPE:
@@ -8194,6 +8359,11 @@
} else if (anchor_ptr->input_field->number > form_number) {
break;
}
+ }
+
+ if (freeval) {
+ free (val_used);
+ freeval = FALSE;
}
if (anchor_ptr == HTMainText->last_anchor)
diff -uNr lynx-2.8.2-dev.12.orig/src/GridText.h
lynx-2.8.2-dev.12+kd/src/GridText.h
--- lynx-2.8.2-dev.12.orig/src/GridText.h Thu Dec 3 10:28:20 1998
+++ lynx-2.8.2-dev.12+kd/src/GridText.h Tue Jan 5 08:38:34 1999
@@ -203,6 +203,8 @@
extern void HText_trimHightext PARAMS((
HText * text,
BOOLEAN final));
+extern PUBLIC void HText_FileForm PARAMS((
+ struct link * form_link));
extern void HText_SubmitForm PARAMS((
FormInfo * submit_item,
document * doc,
diff -uNr lynx-2.8.2-dev.12.orig/src/HTForms.h
lynx-2.8.2-dev.12+kd/src/HTForms.h
--- lynx-2.8.2-dev.12.orig/src/HTForms.h Fri Jul 24 20:01:03 1998
+++ lynx-2.8.2-dev.12+kd/src/HTForms.h Tue Jan 5 10:40:10 1999
@@ -1,4 +1,3 @@
-
#ifndef HTFORMS_H
#define HTFORMS_H
@@ -53,9 +52,11 @@
* A pointer to this structure is in the TextAnchor struct.
*/
typedef struct _FormInfo {
+ char * filename; /* if textarea converted to file,
+ * NULL if not. Does this go here? */
char * name; /* the name of the link */
int number; /* which form is the link within */
- int type; /* string, int, etc. */
+ int type; /* string, int, etc. Huh? */
char * value; /* user entered string data */
char * orig_value;/* the original value */
int size; /* width on the screen */
diff -uNr lynx-2.8.2-dev.12.orig/src/LYKeymap.c
lynx-2.8.2-dev.12+kd/src/LYKeymap.c
--- lynx-2.8.2-dev.12.orig/src/LYKeymap.c Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/LYKeymap.c Tue Jan 5 09:11:23 1999
@@ -41,6 +41,9 @@
/* the character gets 1 added to it before lookup,
* so that EOF maps to 0
*/
+/* The values here are defaults and are changed by a
+ * KEYMAP command in lynx.cfg
+ */
unsigned short keymap[KEYMAP_SIZE] = {
0,
@@ -531,6 +534,10 @@
CONST char *name;
CONST char *doc;
};
+
+/* these entries correspond to #defined vars in LYKeyMap.h (LYK_*),
+ * those values are used in e.g. a switch statement in LYMainLoop.c
+ */
PRIVATE struct rmap revmap[] = {
{ "UNMAPPED", NULL },
{ "1", NULL },
@@ -607,6 +614,8 @@
{ "SWITCH_DTD", "switch between two ways of parsing HTML" },
{ "ELGOTO", "edit the current link's URL or ACTION and go to it" },
{ "CHANGE_LINK", "force reset of the current link on the page" },
+{ "CONVERT", "Puts a set of textarea fields into a file to edit"},
+{ "CONVERTEDIT", "Edits file generated by CONVERTion"},
#ifdef USE_EXTERNALS
{ "EXTERN", "run external program with url" },
#endif
diff -uNr lynx-2.8.2-dev.12.orig/src/LYKeymap.h
lynx-2.8.2-dev.12+kd/src/LYKeymap.h
--- lynx-2.8.2-dev.12.orig/src/LYKeymap.h Thu Dec 24 03:27:23 1998
+++ lynx-2.8.2-dev.12+kd/src/LYKeymap.h Tue Jan 5 08:57:20 1999
@@ -105,15 +105,25 @@
#define LYK_SWITCH_DTD 72
#define LYK_ELGOTO 73
#define LYK_CHANGE_LINK 74
+#define LYK_CONVERT 75 /* convert textarea to file.
+ * (no revert available).
+ * FIXME what number should this be anyway?
+ * #defines are a waste of time to use.
+ * This method of synchronizing the #defines
+ * and the order of entries in revmap is
+ * crappy, at least enum should be used;
+ * imagine using a preprocessor in other
+ * programming languages */
+#define LYK_EDITCONVERT 76
#ifdef USE_EXTERNALS
-#define LYK_EXTERN 75
+#define LYK_EXTERN 77
#if defined(VMS) || defined(DIRED_SUPPORT)
-#define LYK_DIRED_MENU 76
+#define LYK_DIRED_MENU 78
#endif /* VMS || DIRED_SUPPORT */
#else /* USE_EXTERNALS */
#if defined(VMS) || defined(DIRED_SUPPORT)
-#define LYK_DIRED_MENU 75
+#define LYK_DIRED_MENU 77
#endif /* VMS || DIRED_SUPPORT */
#endif /* !defined(USE_EXTERNALS) */
diff -uNr lynx-2.8.2-dev.12.orig/src/LYMain.c lynx-2.8.2-dev.12+kd/src/LYMain.c
--- lynx-2.8.2-dev.12.orig/src/LYMain.c Sat Dec 26 12:50:01 1998
+++ lynx-2.8.2-dev.12+kd/src/LYMain.c Tue Jan 5 10:40:10 1999
@@ -1,3 +1,4 @@
+#include <myfile.h>
#include <HTUtils.h>
#include <HTTP.h>
#include <HTParse.h>
@@ -504,6 +505,12 @@
FREE(links[i].lname);
}
nlinks = 0;
+
+ /* g_mytmp_i starts program as -1 */
+ for (i = 0; i <= g_mytmp_i ; i++) {
+ free (g_mytmp[i]);
+ }
+ g_mytmp_i = -1;
return;
}
diff -uNr lynx-2.8.2-dev.12.orig/src/LYMainLoop.c
lynx-2.8.2-dev.12+kd/src/LYMainLoop.c
--- lynx-2.8.2-dev.12.orig/src/LYMainLoop.c Sat Dec 26 12:50:01 1998
+++ lynx-2.8.2-dev.12+kd/src/LYMainLoop.c Tue Jan 5 10:40:10 1999
@@ -1,3 +1,4 @@
+#include <myfile.h>
#include <HTUtils.h>
#include <HTAccess.h>
#include <HTParse.h>
@@ -1418,7 +1419,10 @@
break;
case F_TEXT_TYPE:
case F_TEXTAREA_TYPE:
- if (links[curdoc.link].form->disabled == YES)
+ if (links[curdoc.link].form->type == F_TEXTAREA_TYPE &&
+ links[curdoc.link].form->filename != NULL)
+ statusline("This textarea is a file.");
+ else if (links[curdoc.link].form->disabled == YES)
statusline(FORM_LINK_TEXT_UNM_MSG);
else
statusline(FORM_LINK_TEXT_MESSAGE);
@@ -4263,6 +4267,62 @@
goto new_cmd;
}
break;
+
+ case LYK_CONVERT: /* put textarea text into file */
+ /*if curent link is part of a textarea*/
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].form->type == F_TEXTAREA_TYPE)
+ {
+ /* Check to see if already a file */
+ if (links[curdoc.link].form->filename == NULL) {
+ {
+ /* I guess I have to call a function in
GridText.c to access
+ * the objects I need, is this supposed to be a
module?
+ */
+ HText_FileForm( &links[curdoc.link] );
+ cmd = LYK_REFRESH;
+ goto new_cmd;
+ }
+ } else {
+ HTInfoMsg("This textarea is already file");
+ }
+ } else { /* not a textarea */
+ HTInfoMsg("CONVERT: Not in a textarea");
+ }
+ break;
+
+ case LYK_EDITCONVERT: /* edit file of a textarea*/
+ /*if curent link is part of a textarea*/
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].form->type == F_TEXTAREA_TYPE)
+ {
+ char com[200]; /* groan */
+ /* Check to see if in a file */
+ if (links[curdoc.link].form->filename != NULL) {
+ struct stat B;
+ /* stop screen */
+ stop_curses();
+ /* editor should be lynx.cfg option */
+ /* StrAllocCopy? */
+ snprintf(com, 200, "%s %s", editor,
links[curdoc.link].form->filename);
+ system(com);
+ /* start screen */
+ start_curses();
+
+ stat (links[curdoc.link].form->filename, &B);
+ if (B.st_size > g_maxfile_size) { /* too big */
+ HTAlert("File too big, won't be submit
correctly");
+ }
+
+
+ } else {
+ /*FIXME: put strings definitions into constant
area*/
+ HTInfoMsg("This textarea not in a file");
+ }
+ } else { /* not a textarea */
+ HTInfoMsg("CONVERT: Not in a textarea");
+ }
+ break;
case LYK_PRINT: /* print the file */
if (LYValidate) {
diff -uNr lynx-2.8.2-dev.12.orig/src/LYUtils.c
lynx-2.8.2-dev.12+kd/src/LYUtils.c
--- lynx-2.8.2-dev.12.orig/src/LYUtils.c Thu Dec 24 03:27:23 1998
+++ lynx-2.8.2-dev.12+kd/src/LYUtils.c Tue Jan 5 10:40:11 1999
@@ -5764,8 +5764,12 @@
CTRACE(tfp, "...LYRemoveTemp done(%d)%s\n", code,
(p->file != 0) ? ", closed" : "");
CTRACE_FLUSH(tfp);
- if (p->file != 0)
- fclose(p->file);
+ if (p->file != 0) {
+ struct stat B;
+ stat(p->name, &B);
+ if (!ENOENT)
+ fclose(p->file);
+ }
free(p->name);
free(p);
break;
diff -uNr lynx-2.8.2-dev.12.orig/src/makefile.in
lynx-2.8.2-dev.12+kd/src/makefile.in
--- lynx-2.8.2-dev.12.orig/src/makefile.in Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/makefile.in Tue Jan 5 10:40:11 1999
@@ -57,7 +57,7 @@
COMPRESS_EXT address@hidden@
CHARTRANS_OBJS=UCdomap.o UCAux.o UCAuto.o
-OBJS= LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
+OBJS= myfile.o LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
LYMail.o HTAlert.o GridText.o LYGetFile.o \
LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \
LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \
diff -uNr lynx-2.8.2-dev.12.orig/src/myfile.c lynx-2.8.2-dev.12+kd/src/myfile.c
--- lynx-2.8.2-dev.12.orig/src/myfile.c Wed Dec 31 16:00:00 1969
+++ lynx-2.8.2-dev.12+kd/src/myfile.c Tue Jan 5 10:40:11 1999
@@ -0,0 +1,7 @@
+
+int g_mytmp_i = -1;
+char *g_mytmp[100];
+const int g_mytmp_i_max = 99;
+const int g_maxfile_size = 20000;
+
+/* g_mytmp is freed in free_lynx_globals */
diff -uNr lynx-2.8.2-dev.12.orig/src/myfile.h lynx-2.8.2-dev.12+kd/src/myfile.h
--- lynx-2.8.2-dev.12.orig/src/myfile.h Wed Dec 31 16:00:00 1969
+++ lynx-2.8.2-dev.12+kd/src/myfile.h Tue Jan 5 10:40:11 1999
@@ -0,0 +1,8 @@
+#ifndef MYFILE_H
+#define MYFILE_H
+
+extern int g_mytmp_i;
+extern char *g_mytmp[100];
+extern const int g_mytmp_i_max;
+extern const int g_maxfile_size;
+#endif /* MYFILE_H */
##----- snip -----##
- lynx-dev Any word on status of extended text entry fields?, Larry W. Virden, 1999/01/01
- lynx-dev Any word on status of extended text entry fields?, David Combs, 1999/01/01
- Re: lynx-dev Any word on status of extended text entry fields?, Larry W. Virden, 1999/01/05
- lynx-dev [-dev.12] experimental text entry fields patch (updated),
Kim DeVaughn <=
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/06
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/07
- Re: lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Philip Webb, 1999/01/07
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/07
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/08
- Re: lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Michael Warner, 1999/01/09
- Re: lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Larry W. Virden, 1999/01/09
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/09
- Re: lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Bela Lubkin, 1999/01/09
- lynx-dev Re: [-dev.12] experimental text entry fields patch (updated), Kim DeVaughn, 1999/01/09