|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4268 (0x10ac)
Types: TextFile
Names: »prompted.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xmille/control/prompted.c«
/*
* prompted.c
*
* get a string of text
*/
# include <X11/Xlib.h>
# include "control.h"
# include "co_class.h"
# include <sys/time.h>
# include <assert.h>
/*
* prompted window on screen
*/
# define PROMPTED_Y 350
# define PROMPTED_HP 50 /* padding */
# define MIN_PROMPTED_W (TEXTBOX_X + TEXTBOX_W + 20)
# define TEXTBOX_X (10)
# define TEXTBOX_Y (PROMPTED_HP)
# define TEXTBOX_W 150
# define TEXTBOX_VP (10)
# define LABEL_Y 25
# define OK_X (10)
# define OK_Y (PROMPTED_HP * 2)
# define TEXT_OFF 5
extern int co_inited;
extern GC co_fore_gc, co_back_gc;
static char *label;
static int prompted_h, prompted_w, label_x;
static Window prompted, textbox, ok;
static char returnbuffer[256];
static char *retpointer;
static int prompted_done;
char *
co_prompted(title, parent)
char *title;
Window parent;
{
XAnyEvent rep;
int state, prompted_x;
int label_w;
int co_OKstate (), co_promptedEvent (), CmanageButton (), textbox_event ();
int mask;
int height;
if (!co_inited)
co_init();
label = title;
label_w = XTextWidth(co_font, label, strlen(label));
height = co_font->ascent;/* + co_font->descent;*/
if (MIN_PROMPTED_W+10 >= label_w)
prompted_w = MIN_PROMPTED_W+10;
else
prompted_w = label_w + 10;
label_x = prompted_w / 2 - label_w / 2;
prompted_h = OK_Y + 60;
prompted_x = 512 - prompted_w/2;
prompted = XCreateSimpleWindow (dpy, parent,
prompted_x, PROMPTED_Y,
prompted_w, prompted_h, 1, co_border,
co_background);
ok = CmapButton (prompted, OK_X, OK_Y, co_OK, co_OKstate);
textbox = XCreateSimpleWindow (dpy, prompted, TEXTBOX_X, TEXTBOX_Y,
TEXTBOX_W, height + TEXTBOX_VP * 2,
1, co_border, co_background);
bindEvent (prompted, ExposureMask, co_promptedEvent);
bindEvent (ok, ExposureMask|ButtonPressMask|ButtonReleaseMask|
Button1MotionMask|Button2MotionMask|Button3MotionMask|LeaveWindowMask,
CmanageButton);
bindEvent (textbox, ExposureMask|KeyPressMask, textbox_event);
bindEvent (prompted, KeyPressMask, textbox_event);
XMapWindow (dpy, textbox);
XMapWindow (dpy, prompted);
prompted_done = 0;
retpointer = returnbuffer;
*retpointer = '\0';
while (!prompted_done) {
dispatch ();
}
unbindEvent (prompted, ExposureMask);
unbindEvent (textbox, ExposureMask|KeyPressMask);
unbindEvent (prompted, KeyPressMask);
unbindEvent (ok, ExposureMask|ButtonPressMask|ButtonReleaseMask|
Button1MotionMask|Button2MotionMask|Button3MotionMask|LeaveWindowMask);
XUnmapWindow (dpy, prompted);
CunmapButton (ok);
XDestroyWindow (dpy, textbox);
XDestroyWindow (dpy, prompted);
*retpointer = '\0';
return returnbuffer;
}
static
co_promptedEvent (rep)
XAnyEvent *rep;
{
switch (rep->type) {
case Expose:
redisplayLabel ();
}
}
static
co_OKstate (n)
{
prompted_done = 1;
}
static
redisplayLabel ()
{
XDrawImageString (dpy, prompted, co_fore_gc, label_x, LABEL_Y, label, strlen (label));
XFlush (dpy);
}
static
textbox_event (rep)
XAnyEvent *rep;
{
char buffer[20], *pbuf;
int count ;
pbuf = buffer;
switch (rep->type) {
case Expose:
redisplayText ();
break;
case KeyPress:
count = XLookupString (rep, pbuf, 20, 0, 0);
while (!prompted_done && count--) {
handle_char (*pbuf++);
}
break;
}
}
static
handle_char (c)
{
switch (c) {
case '\n':
case '\r':
*retpointer = '\0';
prompted_done = 1;
break;
case '\b':
case '\0177':
if (retpointer > returnbuffer) {
c = *--retpointer;
*retpointer = '\0';
draw_char (compute_width (returnbuffer), c, 0);
}
break;
case '\030':
case '\025':
draw_string (returnbuffer, 0);
retpointer = returnbuffer;
*retpointer = '\0';
break;
default:
*retpointer = '\0';
draw_char (compute_width (returnbuffer), c, 1);
*retpointer++ = c;
*retpointer = '\0';
break;
}
}
static
compute_width (string)
char *string;
{
return XTextWidth (co_font, string, strlen(string));
}
static
draw_char (pos, ch, on)
{
GC my;
my = on ? co_fore_gc : co_back_gc;
XDrawImageString (dpy, textbox, my, pos, TEXTBOX_VP, &ch, 1);
}
static
draw_string (string, on)
char *string;
{
GC my;
my = on ? co_fore_gc : co_back_gc;
XDrawImageString (dpy, textbox, my, 0, TEXTBOX_VP, string, strlen(string));
}
static
redisplayText ()
{
draw_string (returnbuffer, 1);
}