[ Previous | Next | Contents | Glossary | Home | Search ]
GL3.2 for AIX: Graphics Library (GL) Technical Reference

prompt.c Example C Language Program

/*
prompt.c:
This program demonstrates a standard GL prompt and a user-defined
prompt. If you choose the user-defined prompt, mouse events are
ignored until you press the Enter key.
Peter Broadwell & dave ratcliffe 1989
*/
#include <stdio.h>
#include <gl/gl.h>
#include <gl/device.h>
#define PROMPT        1
#define EXIT          2
long menu;                /* The user-defined prompt's identifier */
char aString[40];
main()
{
  Device dev;
  short val;
  long menuval;
  init();                 /* process events forever */
  while(TRUE) {
    dev=qread(&val);
    switch(dev) {
    case ESCKEY:
      exit();
      break;
    case REDRAW:
      reshapeviewport();
      color(BLUE);
      clear();
      break;
    case RIGHTMOUSE:
      if(val) {
        menuval = dopup(menu);
        switch (menuval) {
        case PROMPT:
                          /* prompt to get file name */
          getUserString("File: ", aString, 
              sizeof(aString));
          printf("The user entered \"%s\"\n",
              aString);
          break;
        case EXIT:
          exit();
          break;
        default:
          break;
        }
      }
      break;
    default:
      break;
    }
  }
}
init()                    /* do all the basic graphics setup */
{
  long sx, sy;
  ginit();                /* Open a full size window */
  overlay(2);
  drawmode(OVERDRAW);
  mapcolor(BLACK,0,0,0);
  mapcolor(RED,255,0,0);
  drawmode(NORMALDRAW);
  gconfig();
  qdevice(ESCKEY);
  qdevice(RIGHTMOUSE);
  qenter(REDRAW, 1);
  menu = defpup("GL-style prompt %t|My Prompt|Exit");
}
/*
Clear prompt, move to start of prompt box, and output requested 
prompt
*/
getUserString(prompt,userStr,maxlen)  /* get name of file */
char *prompt, *userStr;
int maxlen;
{
                                      /* lower left corner of prompt box */
  #define FILEX 5
  #define FILEY 15
  #define FILEYHI (30+FILEY)          /* 30 pixels hi */
  #define TEXTX (FILEX+5)
  #define TEXTY (FILEY+10)
  #define clearprompt(aprmpt)                \
    color(RED); clear(); color(BLACK); linewidth(2);\
    recti(FILEX+2, FILEY+2, wxsize-8, FILEYHI-1);\
    linewidth(1); cmov2i(TEXTX, TEXTY); charstr(aprmpt);
  int cur_str_len;
  short c;
  Device dev;
  long maxwidth, maxxval;             /* max length of window's width 
                                         in pixels */
  char *str;
  char *prmpt = prompt, keyBoardWasQueued;
  long oldmode, xorig, yorig, wxsize, wysize;
  Screencoord mask1, mask2, mask3, mask4; /* Save old state to restore latter */
  pushmatrix();
  oldmode = getdrawmode();
  getscrmask(&mask1, &mask2, &mask3, &mask4);
  keyBoardWasQueued = isqueued(KEYBD);
  drawmode(OVERDRAW);                        /* Enable overlay */
                                             /* Set viewport to fill window */
  getorigin(&xorig,&yorig);
  getsize(&wxsize,&wysize);
  ortho2(-0.5,(float)wxsize, -0.5, (float)wysize);
  maxxval = wxsize + xorig;
  userStr[0] = '\0';
  maxwidth = (wxsize-11) - (FILEX + strwidth(prompt));
  scrmask(FILEX, (Screencoord)(wxsize-6), FILEY, FILEYHI);
  cur_str_len = strlen(userStr);
  clearprompt(prmpt);                        /* Display my prompt */
  qdevice(KEYBD);
                                             /* read till eof ('\n' or '\r') */
  while(dev = qread(&c)) {
    if(dev != KEYBD)
      continue;         /* don't care */
    switch(c) {
    case '\027':        /* ^W sets cursor back to start */
      cur_str_len = 0;
      clearprompt(prmpt);
      break;
    case '\n':
    case '\r':
      goto done;
    case '\b':
      if(cur_str_len) {
        userStr[--cur_str_len] = '\0';
        clearprompt(prmpt);
        /* display rightmost portion */
        for(str=userStr; *str && strwidth(str) > 
            maxwidth; str++);
        charstr(str);
      }
      break;
    default:
      if(cur_str_len < (maxlen -1)) {
        str = &userStr[cur_str_len];
        userStr[cur_str_len++] = c;
        userStr[cur_str_len] = '\0';
        charstr(str);
      }
      else {
        ringbell();
      }
      break;
    }
  }
done:
  if(!keyBoardWasQueued) unqdevice(KEYBD);
  scrmask(mask1, mask2, mask3, mask4);       /* restore old */
  drawmode(OVERDRAW);
  color(0);
  clear();
  drawmode(oldmode);
  popmatrix();
  userStr[maxlen] = '\0';
}

Related Information

The drawmode subroutine, getdrawmode subroutine, getscrmask subroutine, ginit subroutine, isqueued subroutine, linewidth subroutine, scrmask subroutine, strwidth subroutine, unqdevice subroutine.


[ Previous | Next | Contents | Glossary | Home | Search ]