# To subscribers of the xforms list from rob.carpenter@lmco.com :
The following program is a modified version of one
of the example programs. It creates a form with
one input field with a filter, and maximum characters
set to 8.
I've noticed that if the field has the maximum characters (8)
entered, and if part of that field is selected, the next
keystroke causes an incorrect replacement of the selected
region. In fact, it requires two keystrokes to change
the field. It works fine if the field has less than
the maximum characters.
Also, why is the filter called twice for each keystroke.
Am I doing something incorrectly?
Machine: DEC Personal Workstation 433au
OS: DEC Unix 4.0d
Xforms: V0.89
/*---------------------------------------------------------------*/
#include "forms.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/** Callbacks, globals and object handlers **/
extern void input_cb(FL_OBJECT *, long);
extern void done_cb(FL_OBJECT *, long);
FL_INPUTVALIDATOR hex_filter(FL_OBJECT *ob, const char *old, const char
*cur, int c)
{
printf("old (%s) new (%s) (%c) (%x)\n", old, cur, c,
c);fflush(stdout);
if (isxdigit(c))
return((FL_INPUTVALIDATOR)FL_VALID);
else
return((FL_INPUTVALIDATOR)(FL_INVALID|FL_RINGBELL));
}
/**** Forms and Objects ****/
typedef struct {
FL_FORM *input;
void *vdata;
char *cdata;
long ldata;
FL_OBJECT *norminput;
} FD_input;
extern FD_input * create_form_input(void);
/* callbacks for form input */
void done_cb(FL_OBJECT *ob, long data)
{
fl_finish();
exit(0);
}
void input_cb(FL_OBJECT *ob, long data)
{
printf("get_input (%s)\n", fl_get_input(ob));
}
int main(int argc, char *argv[])
{
FD_input *fd_input;
fl_initialize(&argc, argv, 0, 0, 0);
fd_input = create_form_input();
/* fill-in form initialization code */
fl_set_object_return(fd_input->norminput,FL_RETURN_ALWAYS);
fl_set_input_maxchars(fd_input->norminput, 8);
fl_set_input_filter(fd_input->norminput, (FL_INPUTVALIDATOR)hex_filter);
/* show the first form */
fl_show_form(fd_input->input,FL_PLACE_CENTERFREE,FL_FULLBORDER,"input");
while (fl_do_forms()) ;
return 0;
}
/* Form definition file generated with fdesign. */
FD_input *create_form_input(void)
{
FL_OBJECT *obj;
FD_input *fdui = (FD_input *) fl_calloc(1, sizeof(*fdui));
fdui->input = fl_bgn_form(FL_NO_BOX, 440, 440);
obj = fl_add_box(FL_UP_BOX,0,0,440,440,"");
fdui->norminput = obj =
fl_add_input(FL_NORMAL_INPUT,40,40,340,30,"NormalInput");
fl_set_object_lalign(obj,FL_ALIGN_TOP_LEFT);
fl_set_object_callback(obj,input_cb,0);
obj = fl_add_button(FL_NORMAL_BUTTON,330,400,70,30,"Done");
fl_set_object_callback(obj,done_cb,0);
fl_end_form();
fl_adjust_form_size(fdui->input);
fdui->input->fdui = fdui;
return fdui;
}
/*---------------------------------------*/
_________________________________________________
To unsubscribe, send the message "unsubscribe" to
xforms-request@bob.usuhs.mil or see
http://bob.usuhs.mil/mailserv/xforms.html
XForms Home Page: http://world.std.com/~xforms
List Archive: http://bob.usuhs.mil/mailserv/list-archives/
This archive was generated by hypermail 2b29 : Wed Jun 07 2000 - 16:27:11 EDT