/* Assignment #2 Class: CS 576 Last Modified: Oct. 5, 1997 File: survey.c Program by: Kenneth J. Hubert */ #include #include #include #include #include #include #define MAXUSERS 6 #define BUFFERSIZE 128 #define MAXLINES 6 #define MAX(A,B) ((A) > (B) ? (A) : (B)) #define SQ_WIDTH 60 /* senquitButton Width */ #define SQ_HEIGHT 25 /* senquitButton Height */ #define SY_WIDHIG 22 /* yesnoButton Width&HEIGTH */ #define SB_LONGLABEL 50 /* Longest MenuButton label */ #define SQ_CURSOR XC_target /* Cursor for inside senquitButton */ #define SY_CURSOR XC_question_arrow /* Cursor for inside yesnoButton */ #define SB_INPUTMASK ExposureMask | EnterWindowMask | LeaveWindowMask | \ ButtonPressMask | ButtonReleaseMask #define eventmask KeyPressMask|KeyReleaseMask|ExposureMask XEvent event, button_event; #define TRUE 1 #define FALSE 0 #define FORE "black" #define BACK "gray" #define QB "red" #define SB "green" #define sendquit "12x24" #define std "9x15" #define winx 400 XFontStruct *font_info1; XFontStruct *font_info2; XFontStruct *tempfont; long fgcolor, bgcolor, qcolor, scolor; Display *display[MAXUSERS]; Window window[MAXUSERS]; GC draw[MAXUSERS]; GC qdraw[MAXUSERS]; GC sdraw[MAXUSERS]; GC draw2[MAXUSERS]; GC erase[MAXUSERS]; GC erase2[MAXUSERS]; int closed[MAXUSERS]; int sent[MAXUSERS]; int ync[MAXUSERS]; char buffer[BUFFERSIZE]; struct{ char string[BUFFERSIZE]; int winy; int curx; int scount; }Question[MAXLINES]; int cur_lines = 0; char *null = '\0'; char temp; XSetWindowAttributes setwinattr; KeySym keysym; int bufsize=BUFFERSIZE; int charcount; int charwidth; int charascent; int chardescent; int ques = FALSE; int NC; int errorcount = 0; int numstud, numyes, numno; char voteleft[3]; char yess[3]; char noss[3]; struct { Window window; char label[SB_LONGLABEL]; int (*func)(int u); } MenuButton[MAXUSERS][4]; int send(int u), checky(int u), checkn(int u), Exit(int u); main(argc,argv) int argc; char **argv; { int i,j,c; Window root[MAXUSERS]; int screen[MAXUSERS]; int pointx, pointy; long statinout; XGCValues gcval; XColor exact, apparant; if (argc == 1 || argc == 2) { perror("When conducting a survey you MUST have at least ONE participant"); exit(1); } else NC = argc-1; for (i=0; i< NC; i++) { if (!(display[i - errorcount] = XOpenDisplay(argv[i+1]))) { if (i==0) { perror("XOpenDisplay"); exit(1); } else { errorcount = errorcount + 1; printf("ERROR : XOpenDisplay %s\n", argv[i+1]); } } } NC = NC - errorcount; numyes = 0; numno = 0; numstud = NC-1; sprintf(voteleft, "%d",numstud); sprintf(yess, "%d",numyes); sprintf(noss, "%d",numno); for (i=0; i< NC; i++) { sent[i] = FALSE; closed[i] = FALSE; screen[i] = DefaultScreen(display[i]); root[i] = RootWindow(display[i], screen[i]); if( i == 0) { XAllocNamedColor(display[i], DefaultColormap(display[i], screen[i]), FORE,&apparant,&exact); fgcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), BACK,&apparant,&exact); bgcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), QB,&apparant,&exact); qcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), SB,&apparant,&exact); scolor = apparant.pixel; font_info1 = XLoadQueryFont(display[i], sendquit); font_info2 = XLoadQueryFont(display[i], std); window[i] = XCreateSimpleWindow(display[i], root[i],0,0, 400,600,2, fgcolor,bgcolor); XStoreName(display[i], window[i],"PROFESSOR"); strcpy(Question[0].string,"?"); charwidth = font_info2 -> max_bounds.width; charascent = font_info2 -> max_bounds.ascent; chardescent = font_info2 -> max_bounds.descent; Question[0].curx = XTextWidth(font_info1 ,Question[0].string , strlen(Question[0].string) ); Question[0].curx = (winx - Question[0].curx)/2; Question[0].scount = 1; Question[0].winy = 60; gcval.foreground = fgcolor; gcval.background = bgcolor; gcval.font = font_info1->fid; /* i =0*/ draw[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], draw[i], 0); gcval.foreground = fgcolor; gcval.background = qcolor; gcval.font = font_info1->fid; qdraw[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], qdraw[i], 0); gcval.foreground = fgcolor; gcval.background = scolor; gcval.font = font_info1->fid; sdraw[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], sdraw[i], 0); gcval.foreground = bgcolor; gcval.background = fgcolor; gcval.font = font_info1->fid; erase[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], erase[i], 0); gcval.foreground = fgcolor; gcval.background = bgcolor; gcval.font = font_info2->fid; draw2[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], draw2[i], 0); gcval.foreground = bgcolor; gcval.background = fgcolor; gcval.font = font_info2->fid; erase2[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], erase2[i], 0); MakeButton( 170, 255, SQ_WIDTH, SQ_HEIGHT, "Send", send, i, 0); MakeButton( 170, 555, SQ_WIDTH, SQ_HEIGHT, "Quit", Exit, i, 1); XMapWindow(display[i],window[i]); XFlush(display[i]); XSelectInput(display[i],window[i],eventmask); } else { XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), FORE,&apparant,&exact); fgcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), BACK,&apparant,&exact); bgcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), QB,&apparant,&exact); qcolor = apparant.pixel; XAllocNamedColor(display[i], DefaultColormap(display[i],screen[i]), SB,&apparant,&exact); scolor = apparant.pixel; font_info1 = XLoadQueryFont(display[i], sendquit); font_info2 = XLoadQueryFont(display[i], std); window[i] = XCreateSimpleWindow(display[i], root[i],0,0, 400,600,2,fgcolor,bgcolor); XStoreName(display[i], window[i],"STUDENT"); gcval.foreground = fgcolor; gcval.background = bgcolor; gcval.font = font_info1->fid; draw[i] = XCreateGC(display[i], window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], draw[i], 0); gcval.foreground = fgcolor; gcval.background = qcolor; gcval.font = font_info1->fid; qdraw[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], qdraw[i], 0); gcval.foreground = fgcolor; gcval.background = scolor; gcval.font = font_info1->fid; sdraw[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], sdraw[i], 0); gcval.foreground = bgcolor; gcval.background = fgcolor; gcval.font = font_info1->fid; erase[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], erase[i], 0); gcval.foreground = fgcolor; gcval.background = bgcolor; gcval.font = font_info2->fid; draw2[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], draw2[i], 0); gcval.foreground = bgcolor; gcval.background = fgcolor; gcval.font = font_info2->fid; erase2[i] = XCreateGC(display[i],window[i], GCForeground|GCBackground|GCFont,&gcval); XSetGraphicsExposures(display[i], erase2[i], 0); MakeButton( 170, 255, SQ_WIDTH, SQ_HEIGHT, "Send", send, i, 0); MakeButton( 170, 555, SQ_WIDTH, SQ_HEIGHT, "Quit", Exit, i, 1); MakeButton( 70, 185, SY_WIDHIG, SY_WIDHIG, " ", checky, i, 2); MakeButton( 310, 185, SY_WIDHIG, SY_WIDHIG, " ", checkn, i, 3); } } XDrawString(display[0],window[0],draw[0],Question[0].curx,Question[0].winy, Question[0].string,strlen(Question[0].string)); XDrawLine(display[0], window[0], draw[0], 0,300,400,300); XDrawString(display[0], window[0], draw2[0], 10, 355, "Number of Uncast Votes : ", strlen("Number of Uncast Votes : ")); XDrawRectangle( display[0], window[0], draw[0], 230,340, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[0], window[0], draw2[0], 60, 447, "Yes", strlen("Yes")); XDrawRectangle( display[0], window[0], draw[0], 100,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0],106 , 447, yess, strlen(yess)); XDrawString(display[0], window[0], draw2[0],320 , 447, "No", strlen("No")); XDrawRectangle( display[0], window[0], draw[0], 288,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0],294 , 447, noss, strlen(noss)); while(!sent[0]) { for(i=0; i<=1;i++) if (XCheckWindowEvent(display[0], MenuButton[0][i].window, SB_INPUTMASK, &button_event )) HandleButton( 0, i, &button_event ); if (XCheckWindowEvent(display[0],window[0],eventmask,&event)){ switch (event.type) { case Expose: if (ques == FALSE) XDrawString(display[0],window[0],draw[0], Question[0].curx,Question[0].winy, Question[0].string,strlen(Question[0].string)); else{ for(c=0; c <= cur_lines; c++) XDrawString(display[0],window[0],draw2[0], Question[c].curx,Question[c].winy, Question[c].string,strlen(Question[c].string)); } XDrawLine(display[0], window[0], draw[0], 0,300,400,300); XDrawString(display[0], window[0], draw2[0], 10, 355, "Number of Uncast Votes : ", strlen("Number of Uncast Votes : ")); XDrawRectangle( display[0], window[0], draw[0], 230,340, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[0], window[0], draw2[0], 60, 447, "Yes", strlen("Yes")); XDrawRectangle( display[0], window[0], draw[0], 100,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0],106 , 447, yess, strlen(yess)); XDrawString(display[0], window[0], draw2[0],320 , 447, "No", strlen("No")); XDrawRectangle( display[0], window[0], draw[0], 288,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[0], window[0], draw2[0],294 , 447, noss, strlen(noss)); break; case KeyPress: ques = TRUE; charcount = XLookupString(&event,buffer,bufsize, &keysym, &statinout); buffer[charcount] = '\0'; if (charcount == 1) { charcount = 0; if (keysym >= XK_space && keysym <= XK_asciitilde) { PutChar (); break; } else if (keysym == XK_BackSpace || keysym ==XK_Delete) { DelChar(); break; } else if (keysym == XK_Return || keysym ==XK_KP_Enter) { ReturnPress(); break; } else break; } break; case KeyRelease: break; } } } for (;;) { for(i=0; i< NC ;i++) { if (closed[i] == FALSE) { if (i == 0) c = 2; else c = 4; for (j= 0; j < c; j++) { if (XCheckWindowEvent(display[i], MenuButton[i][j].window, SB_INPUTMASK, &button_event )) HandleButton( i,j, &button_event ); } if(XCheckWindowEvent(display[i],window[i],eventmask,&event)){ switch (event.type) { case Expose: if (closed[i] == FALSE) { if(i > 0) { XDrawString(display[i], window[i], draw2[i], 28, 202, "Yes", strlen("Yes")); XDrawString(display[i], window[i], draw2[i],352 , 202, "No", strlen("No")); } for(c=0; c <= cur_lines; c++) XDrawString(display[i],window[i],draw2[i], Question[c].curx,Question[c].winy, Question[c].string, strlen(Question[c].string)); XDrawLine(display[i], window[i], draw[i], 0,300,400,300); XDrawString(display[i], window[i], draw2[i], 10, 355, "Number of Uncast Votes : ", strlen("Number of Uncast Votes : ")); XDrawRectangle( display[i], window[i], draw[i], 230,340, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[i], window[i], draw2[i], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[i], window[i], draw2[i], 60, 447, "Yes", strlen("Yes")); XDrawRectangle( display[i], window[i], draw[i], 100,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[i], window[i], draw2[i],106 , 447, yess, strlen(yess)); XDrawString(display[i], window[i], draw2[i],320 , 447 , "No", strlen("No")); XDrawRectangle( display[i], window[i], draw[i], 288,430, SY_WIDHIG,SY_WIDHIG ); XDrawString(display[i], window[i], draw2[i],294 , 447, noss, strlen(noss)); } break; case KeyPress: break; case KeyRelease: break; } } } } } } PutChar() { if (strlen(buffer) != 0) ques = TRUE; if ((strcmp(Question[cur_lines].string,"?") == 0) && (cur_lines == 0)) { XDrawString(display[0],window[0],erase[0],Question[cur_lines].curx, Question[cur_lines].winy,Question[cur_lines].string, strlen(Question[cur_lines].string)); Question[cur_lines].string[0] = '\0'; } else XDrawString(display[0],window[0],erase2[0],Question[cur_lines].curx, Question[cur_lines].winy,Question[cur_lines].string, strlen(Question[cur_lines].string)); strcat(Question[cur_lines].string,buffer); Question[cur_lines].scount = strlen(Question[cur_lines].string); buffer[0] = '\0'; Question[cur_lines].curx = XTextWidth(font_info2 , Question[cur_lines].string , strlen(Question[cur_lines].string) ); Question[cur_lines].curx = (winx - Question[cur_lines].curx)/2; if (Question[cur_lines].curx <= (3 * charwidth)) XBell(display[0],100); if (Question[cur_lines].curx <= charwidth) { XBell(display[0],100); Question[cur_lines].scount = Question[cur_lines].scount - 1; Question[cur_lines].string[Question[cur_lines].scount] = '\0'; } Question[cur_lines].curx = XTextWidth(font_info2 , Question[cur_lines].string, strlen(Question[cur_lines].string) ); Question[cur_lines].curx = (winx - Question[cur_lines].curx)/2; XDrawString(display[0],window[0],draw2[0],Question[cur_lines].curx, Question[cur_lines].winy,Question[cur_lines].string, strlen(Question[cur_lines].string)); } DelChar() { if (ques == TRUE) { Question[cur_lines].curx = XTextWidth(font_info2 , Question[cur_lines].string, strlen(Question[cur_lines].string) ); Question[cur_lines].curx = (winx - Question[cur_lines].curx)/2; XDrawString(display[0],window[0],erase2[0], Question[cur_lines].curx,Question[cur_lines].winy, Question[cur_lines].string, strlen(Question[cur_lines].string)); Question[cur_lines].scount = Question[cur_lines].scount - 1; Question[cur_lines].string[Question[cur_lines].scount] = '\0'; Question[cur_lines].curx = XTextWidth(font_info2 , Question[cur_lines].string, strlen(Question[cur_lines].string) ); Question[cur_lines].curx = (winx - Question[cur_lines].curx)/2; XDrawString(display[0],window[0],draw2[0],Question[cur_lines].curx, Question[cur_lines].winy,Question[cur_lines].string, strlen(Question[cur_lines].string)); if (strlen(Question[cur_lines].string) == 0) { if (cur_lines == 0){ strcpy(Question[cur_lines].string,"?"); Question[cur_lines].curx = XTextWidth(font_info1 , Question[cur_lines].string , strlen(Question[cur_lines].string)); Question[cur_lines].curx = (winx - Question[cur_lines].curx)/2; XDrawString(display[0],window[0],draw[0],Question[cur_lines].curx, Question[cur_lines].winy,Question[cur_lines].string, strlen(Question[cur_lines].string)); ques = FALSE; } else cur_lines = cur_lines - 1; } } else XBell(display[0],100); } ReturnPress() { if(cur_lines < MAXLINES - 1) { cur_lines = cur_lines + 1; Question[cur_lines].string[0] = '\0'; Question[cur_lines].scount = 0; Question[cur_lines].curx = 100; Question[cur_lines].winy = Question[cur_lines - 1].winy + charascent + chardescent + 3; } else { XBell(display[0],100); XBell(display[0],100); } } MakeButton( x, y, w, h, label, fun, i,d) int i,d; int w,h; int x,y; /* Where to put it */ char *label; /* What to put in it */ int (*fun)(int i); { Cursor tempcursor; strncpy( MenuButton[i][d].label, label, SB_LONGLABEL ); MenuButton[i][d].func = fun; if (d == 0) MenuButton[i][d].window = XCreateSimpleWindow( display[i], window[i], x, y, w, h, 1, fgcolor, scolor); else if (d == 1) MenuButton[i][d].window = XCreateSimpleWindow( display[i], window[i], x, y, w, h, 1, fgcolor, qcolor); else MenuButton[i][d].window = XCreateSimpleWindow( display[i], window[i], x, y, w, h, 1, fgcolor, bgcolor); XSelectInput( display[i], MenuButton[i][d].window, SB_INPUTMASK ); if (d < 2) tempcursor = XCreateFontCursor( display[i], SQ_CURSOR ); else tempcursor = XCreateFontCursor( display[i], SY_CURSOR ); XDefineCursor( display[i], MenuButton[i][d].window, tempcursor ); setwinattr.backing_store = Always; XChangeWindowAttributes(display[i], MenuButton[i][d].window, CWBackingStore, &setwinattr); XMapWindow( display[i], MenuButton[i][d].window ); } int HandleButton( i, d, event ) int i; int d; XEvent *event; { switch( event->type ) { case Expose: ExposeButton( i,d ); break; case EnterNotify: if (closed[i] == FALSE) { if(d <= 1) XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 1,1, SQ_WIDTH-3, SQ_HEIGHT-3 ); else XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 1,1, SY_WIDHIG-3, SY_WIDHIG-3 ); break; case LeaveNotify: ExposeButton( i,d ); break; case ButtonPress: if (d <= 1) XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 0,0, SQ_WIDTH-1,SQ_HEIGHT-1 ); else XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 0,0, SY_WIDHIG-1,SY_WIDHIG-1 ); } break; case ButtonRelease: if (closed[i] == FALSE) { if (event->xmotion.window == MenuButton[i][d].window) { MenuButton[i][d].func(i); if ( closed[i] == FALSE) { ExposeButton(i,d); if(d < 2) XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 1,1, SQ_WIDTH-3, SQ_HEIGHT-3 ); else XDrawRectangle( display[i], MenuButton[i][d].window, draw[i], 1,1, SY_WIDHIG-3, SY_WIDHIG-3 ); } } } break; default: break; } } ExposeButton( i,d ) int i; int d; { int width, center; if (closed[i] == FALSE) { XClearWindow( display[i], MenuButton[i][d].window ); width = XTextWidth( font_info1, MenuButton[i][d].label, strlen(MenuButton[i][d].label) ); center = MAX((SY_WIDHIG-width)/2,6); XDrawString(display[i], MenuButton[i][d].window, draw[i], center, font_info1->ascent, MenuButton[i][d].label, strlen(MenuButton[i][d].label) ); XFlush(display[i]); } } checkn(int u) { int width, center; ync[u] = 2; strncpy( MenuButton[u][3].label, "X", SB_LONGLABEL ); strncpy( MenuButton[u][2].label, " ", SB_LONGLABEL ); width = XTextWidth( font_info1, MenuButton[u][3].label, strlen(MenuButton[u][3].label) ); center = MAX((SY_WIDHIG-width)/2,6); XDrawString(display[u], MenuButton[u][3].window, draw[u], center, font_info1->ascent, MenuButton[u][3].label, strlen(MenuButton[u][3].label)); width = XTextWidth( font_info1, "X", strlen("X" )); center = MAX((SY_WIDHIG-width)/2,6); XDrawString(display[u], MenuButton[u][2].window, erase[u], center, font_info1->ascent, "X", strlen("X")); } checky(int u) { int width, center; ync[u] = 1; strncpy( MenuButton[u][2].label, "X", SB_LONGLABEL ); strncpy( MenuButton[u][3].label, " ", SB_LONGLABEL ); width = XTextWidth( font_info1, MenuButton[u][2].label, strlen(MenuButton[u][2].label) ); center = MAX((SY_WIDHIG-width)/2,6); XDrawString(display[u], MenuButton[u][2].window, draw[u], center, font_info1->ascent, MenuButton[u][2].label, strlen(MenuButton[u][2].label) ); width = XTextWidth( font_info1, "X", strlen("X") ); center = MAX((SY_WIDHIG-width)/2,6); XDrawString(display[u], MenuButton[u][3].window, erase[u], center, font_info1->ascent, "X", strlen("X") ); } send(int u) { int i; if (sent[u] == TRUE) { XBell(display[u],100); XBell(display[u],100); } else if (u != 0) { if(ync[u] == 1) { sent[u] = TRUE; for(i=0; i < NC; i++) { if(closed[i] == FALSE) { XDrawString(display[i], window[i], erase2[i], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[i], window[i], erase2[i],106 , 447, yess, strlen(yess)); } } numyes = numyes + 1; sprintf(yess, "%d",numyes); numstud = numstud - 1; sprintf(voteleft, "%d",numstud); for(i=0; i < NC; i++) { if(closed[i] == FALSE) { XDrawString(display[i], window[i], draw2[i], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[i], window[i], draw2[i],106 , 447, yess, strlen(yess)); } } } else if(ync[u] == 2) { sent[u] = TRUE; for(i=0; i < NC; i++) { if(closed[i] == FALSE) { XDrawString(display[i], window[i], erase2[i], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[i], window[i], erase2[i],294 , 447, noss, strlen(noss)); } } numno = numno + 1; sprintf(noss, "%d",numno); numstud = numstud - 1; sprintf(voteleft, "%d",numstud); for(i=0; i < NC; i++) { if(closed[i] == FALSE) { XDrawString(display[i], window[i], draw2[i], 236, 356, voteleft, strlen(voteleft)); XDrawString(display[i], window[i], draw2[i],294 , 447, noss, strlen(noss)); } } } else { XBell(display[u],100); XBell(display[u],100); } } else { if(sent[u] == FALSE && ques == TRUE) { sent[u] = TRUE; for(i=1; i < NC; i++) { XMapWindow(display[i],window[i]); XSelectInput(display[i],window[i],eventmask); XFlush(display[i]); } } else { XBell(display[u],100); XBell(display[u],100); } } } Exit(int u) { int y; if (u == 0) { printf("Hope the survey proved successful.\n"); for (y = 0; y < NC - errorcount; y++) { XDestroyWindow(display[y],window[y]); exit(0); } } else { closed[u] = TRUE; XDestroyWindow(display[u],window[u]); if (!sent[u]) { for(y=0; y < NC; y++) { if(closed[y] == FALSE) { XDrawString(display[y], window[y], erase2[y], 236, 356, voteleft, strlen(voteleft)); } } numstud = numstud - 1; sprintf(voteleft, "%d",numstud); for(y=0; y < NC; y++) { if(closed[y] == FALSE) { XDrawString(display[y], window[y], draw2[y], 236, 356, voteleft, strlen(voteleft)); } } } } }