In the following example there are two input elements: a text field into
which a value can be typed and a gauge with a logarithmic representation
of the value in the text field. If the user changes the text field, the
gauge should be updated and if the gauge is manipulated, the text field
must follow. In order to achieve this, the handlers of each of the
keywords call wkeyf with an appropriate value for the other keyword.
But it must be prevented that the handler for the other keyword will call
wkeyf for the first keyword again, as this would lead to a continuous
stream of unnecessary events. In a simple example like this, this could be
done by maintaining a flag which would tell the handlers when it should
not update the other element. But it is easier to call
SuppressKeyevent().
Certainly when a program is more complicated, it would become quite
cumbersome to administrate things.
/* example6.c -XT */ #include "stddef.h" #include "math.h" #include "gipsyc.h" #include "cmain.h" #include "init.h" #include "userfio.h" #include "ggi.h" static void logvalue(ident id, char *key, int code, void *arg); static void realvalue(ident id, char *key, int code, void *arg); /* * Keyword handler converting logarithmic to real value. */ static void realvalue(ident id, char *key, int code, void *arg) { float value; (void)userfreal(&value, 1, 2, key, " "); SuppressKeyevent(logvalue, (char*)arg); wkeyf("%s%.1f", (char*)arg, exp(value)); } /* * Keyword handler converting real to logarithmic value. */ static void logvalue(ident id, char *key, int code, void *arg) { float value; (void)userfreal(&value, 1, 2, key, " "); if (value>0.0) { SuppressKeyevent(realvalue, (char*)arg); wkeyf("%s%.1f", (char*)arg, log(value)); } } /* * Main program */ MAIN_PROGRAM_ENTRY { ident text, gauge; init_c(); GgiAutoLayout(FALSE); GgiPostponeRealize(TRUE); text = GgiSetLabel(GgiTextField("VALUE=", NULL, 4), "Value", 0); gauge = GgiGauge("LOGVAL=", NULL, 150, log(1.0), log(10.0)); (void)GgiSetLabel(gauge, " ", 1); GgiSetPosition(text, 0, NULL, 0, NULL); GgiSetPosition(gauge, 0, text, 0, NULL); GgiRealize(); ScheduleKeyevent(logvalue, "VALUE=", KEYCHANGE, "LOGVAL="); ScheduleKeyevent(realvalue, "LOGVAL=", KEYCHANGE, "VALUE="); wkeyf("VALUE=2.0"); MainLoop(); }
![]() ![]() |
Maintained by J. P. Terlouw |