/****************************************************/ /* Fall98: Systems Programming */ /* Assignment 2 */ /* Programmed by : Hesham F. Anan */ /****************************************************/ #include "GoPizza.h" /***********************************************************/ Display *display; /* The main uutility window */ XEvent event; /* Incoming event */ int screen; /* Display screen number */ /* A Graphics Context to use */ XGCValues values; XFontStruct *font_info; XSetWindowAttributes setwinattr; XColor apparent,exact; unsigned int foreground,background; int N ; /* Total number of displays */ int respond=0 ; int CountDown ; struct CDisp disp [MAXUSERS]; struct CDisp confirm_disp [MAXUSERS]; /***********************************************************/ MakeCheckBox (struct CDisp *disp,int x, int y , int id) { Cursor tempcursor; disp->Topping [id].flag = 0; disp->Topping[id].window = XCreateSimpleWindow( disp->display, disp->window, x, y, CB_WIDTH, CB_HEIGHT, 1, BlackPixel(disp->display,screen), WhitePixel(disp->display,screen) ); XSelectInput( disp->display, disp->Topping[id].window, CB_INPUTMASK ); tempcursor = XCreateFontCursor( disp->display, CB_CURSOR ); XDefineCursor( disp->display, disp->Topping[id].window, tempcursor ); setwinattr.backing_store = Always; XChangeWindowAttributes(disp->display, disp->Topping[id].window, CWBackingStore, &setwinattr); XMapWindow( disp->display, disp->Topping[id].window ); } ExposeCheckBox(struct CDisp disp,int id ) { int width, center; XClearWindow( disp.display, disp.Topping[id].window ); if (disp.Topping[id].flag) { XDrawLine ( disp.display, disp.Topping[id].window, disp.gc, 0,0, CB_WIDTH,CB_HEIGHT ); XDrawLine ( disp.display, disp.Topping[id].window, disp.gc, CB_WIDTH,0,0,CB_HEIGHT ); } XFlush(disp.display); } int HandleCheckBox(struct CDisp *disp,int id, XEvent *event ) { switch( event->type ) { case Expose: ExposeCheckBox(*disp, id ); break; case ButtonPress: if ( event->xbutton.button == Button1 ) { if (disp->Topping [id].flag==1) disp->Topping[id].flag=0; else disp->Topping[id].flag=1; ExposeCheckBox (*disp,id); } break; default: break; } } MakeCounter (struct CDisp *disp,int x, int y , int id,int val) { Cursor tempcursor; disp->count [id].val = val; XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen), "blue",&apparent,&exact); foreground = apparent.pixel; XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen), "yellow",&apparent,&exact); background = apparent.pixel; disp->count[id].window = XCreateSimpleWindow( disp->display, disp->window, x, y, C_WIDTH, C_HEIGHT, 1,foreground,background); XSelectInput( disp->display, disp->count[id].window, C_INPUTMASK ); /*tempcursor = XCreateFontCursor( disp->display, C_CURSOR ); XDefineCursor( disp->display, disp->count[id].window, tempcursor );*/ setwinattr.backing_store = Always; XChangeWindowAttributes(disp->display, disp->count[id].window, CWBackingStore, &setwinattr); XMapWindow( disp->display, disp->count[id].window ); } ExposeCounter(struct CDisp disp,int id ) { int width, center; char num [10]; XClearWindow( disp.display, disp.count[id].window ); num [0] = disp.count[id].val+'0'; num [1] = 0; width = XTextWidth( font_info, num,strlen(num) ); center = MAX((C_WIDTH-width)/2,4); XDrawString( disp.display, disp.count[id].window, disp.gc, center, font_info->ascent+5,num, strlen(num) ); XFlush(disp.display); } int HandleCounter(struct CDisp *disp,int id, XEvent *event ) { switch( event->type ) { case Expose: ExposeCounter(*disp, id ); break; default: break; } } load_font(struct CDisp disp) { char *fontname = "-*-Courier-bold-o-normal-*-14-*-*-*-*-*-*-*"; if ((font_info = XLoadQueryFont(disp.display, fontname)) == NULL) { (void) fprintf(stderr,"Could not get font\n"); exit( -1 ); } XSetFont(disp.display, disp.gc, font_info->fid); } ExposeButton(struct CDisp disp,int id ) { int width,height, centerx,centery; XClearWindow( disp.display, disp.MenuButton[id].window ); width = XTextWidth( font_info, disp.MenuButton[id].label, strlen(disp.MenuButton[id].label) ); height = font_info->ascent+font_info->descent; centerx = MAX((SB_WIDTH-width)/2,4); centery = font_info->ascent+MAX((SB_HEIGHT-height)/2,4); XFillRectangle (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].gray_gc, 1,1, SB_WIDTH-2, SB_HEIGHT-2); if (disp.MenuButton[id].pressed) { XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].white_gc, 1,SB_HEIGHT-1, SB_WIDTH-1, SB_HEIGHT-1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].white_gc, SB_WIDTH-2,1, SB_WIDTH-1, SB_HEIGHT-1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].darkgray_gc, 1,1, SB_WIDTH-2, 1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].darkgray_gc, 1,1,1, SB_HEIGHT-1); XDrawString( disp.display, disp.MenuButton[id].window, disp.gc, centerx+2, centery+2, disp.MenuButton[id].label, strlen(disp.MenuButton[id].label) ); } else { XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].darkgray_gc, 1,SB_HEIGHT-1, SB_WIDTH-1, SB_HEIGHT-1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].darkgray_gc, SB_WIDTH-2,1, SB_WIDTH-1, SB_HEIGHT-1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].white_gc, 1,1, SB_WIDTH-2, 1); XDrawLine (disp.display, disp.MenuButton[id].window, disp.MenuButton[id].white_gc, 1,1,1, SB_HEIGHT-1); XDrawString( disp.display, disp.MenuButton[id].window, disp.gc, centerx, centery, disp.MenuButton[id].label, strlen(disp.MenuButton[id].label) ); } XFlush(disp.display); } MakeButton(struct CDisp *disp,int x, int y, char *label, void (*fun)(int), int id) { Cursor tempcursor; disp->MenuButton [id].pressed = 0; strncpy( disp->MenuButton[id].label, label, SB_LONGLABEL ); disp->MenuButton[id].func = fun; disp->MenuButton[id].window = XCreateSimpleWindow( disp->display, disp->window, x, y, SB_WIDTH, SB_HEIGHT, 1, BlackPixel(disp->display,screen), WhitePixel(disp->display,screen) ); XSelectInput( disp->display, disp->MenuButton[id].window, SB_INPUTMASK ); tempcursor = XCreateFontCursor( disp->display, SB_CURSOR ); XDefineCursor( disp->display, disp->MenuButton[id].window, tempcursor ); setwinattr.backing_store = Always; XChangeWindowAttributes(disp->display, disp->MenuButton[id].window, CWBackingStore, &setwinattr); XMapWindow( disp->display, disp->MenuButton[id].window ); XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen),"gray",&apparent,&exact); foreground = apparent.pixel; XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen),"gray",&apparent,&exact); background = apparent.pixel; values.foreground = foreground; values.background = background; values.fill_style = FillSolid; disp->MenuButton[id].gray_gc = XCreateGC(disp->display, disp->window,GCForeground|GCBackground|GCFillStyle, &values); XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen),"darkgray",&apparent,&exact); values.foreground = apparent.pixel; values.line_width = 2; disp->MenuButton[id].darkgray_gc = XCreateGC(disp->display, disp->window,GCForeground|GCLineWidth, &values); XAllocNamedColor (disp->display,DefaultColormap (disp->display,screen),"white",&apparent,&exact); values.foreground = apparent.pixel; values.line_width = 2; disp->MenuButton[id].white_gc = XCreateGC(disp->display, disp->window,GCForeground|GCLineWidth, &values); } int HandleButton(struct CDisp disp,int index,int id, XEvent *event ) { int x,y; switch( event->type ) { case Expose: ExposeButton(disp, id ); break; /* case EnterNotify: XDrawRectangle(disp.display, disp.MenuButton[id].window, disp.gc, 1,1, SB_WIDTH-3, SB_HEIGHT-3 ); break; case LeaveNotify: ExposeButton(disp,id );*/ break; case ButtonPress: if ( event->xbutton.button == Button1 ) { disp.MenuButton [id].pressed = 1; ExposeButton (disp,id); } break; case ButtonRelease: x = event->xmotion.x; y = event->xmotion.y; disp.MenuButton[id].pressed = 0; /* Execute the function if the mouse is released within the button */ if (x>0 && y>0 && xroot = disp->root; confirm_disp->display = disp->display; confirm_disp->gc = disp->gc; screen = DefaultScreen(disp->display); strcpy (confirm_disp->message,message); XAllocNamedColor (confirm_disp->display,DefaultColormap (confirm_disp->display,screen), "black",&apparent,&exact); foreground = apparent.pixel; XAllocNamedColor (confirm_disp->display,DefaultColormap (confirm_disp->display,screen), "gray",&apparent,&exact); background = apparent.pixel; confirm_disp->window = XCreateSimpleWindow(confirm_disp->display,confirm_disp->root, 0,0,300,150, 2, foreground,background); setwinattr.backing_store = Always; XChangeWindowAttributes(confirm_disp->display, confirm_disp->window, CWBackingStore, &setwinattr); XDrawString(disp->display,confirm_disp->window,disp->gc,20,60,message, strlen(message)); MakeButton(confirm_disp,80, 100, "Yes",Exit, 0 ); MakeButton(confirm_disp,180, 100, "No",HideConfirm, 1 ); XStoreName (confirm_disp->display,confirm_disp->window,"GoPizza: Confirm"); XSelectInput(confirm_disp->display,confirm_disp->window, ExposureMask ); } void DrawMainFrame (int i) { GC gc; XAllocNamedColor (disp[i].display,DefaultColormap (disp[i].display,screen),"white",&apparent,&exact); foreground = apparent.pixel; XAllocNamedColor (disp[i].display,DefaultColormap (disp[i].display,screen),"gray",&apparent,&exact); background = apparent.pixel; values.foreground = foreground; values.background = background; gc = XCreateGC(disp[i].display, disp[i].window,GCForeground|GCBackground, &values); XDrawLine (disp[i].display,disp[i].window,disp[i].gc,0,100,400,100); XDrawLine (disp[i].display,disp[i].window,disp[i].gc,0,400,400,400); XDrawLine (disp[i].display,disp[i].window,gc,0,101,400,101); XDrawLine (disp[i].display,disp[i].window,gc,0,401,400,401); XDrawRectangle (disp[i].display,disp[i].window,disp[i].gc,40,150,200,200); XDrawRectangle (disp[i].display,disp[i].window,gc,41,151,200,200); /*XDrawString( disp[i].display,disp[i].window,disp[i].gc,180,20,"GoPizza", strlen("GoPizza"));*/ XDrawString( disp[i].display,disp[i].window,disp[i].gc,80,50,"Count Down", strlen("Count Down")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,50,140,"Choose Toppings", strlen("Choose Toppings")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,300,140,"Total", strlen("Total")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,50,190,"Mushrooms", strlen("Mushrooms")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,50,230,"Onions", strlen("Onions")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,50,270,"Black Olives", strlen("Black Olives")); XDrawString( disp[i].display,disp[i].window,disp[i].gc,50,310,"Green Peppers", strlen("Green Peppers")); } /********************************************************************/ main(int argc, char **argv) { int i,j; int err_num=0 ; struct CDisp t; if (argc<3) { printf ("usage: GoPizza d1 d2 [d3 ... dn]\n"); exit (1); } if (argc-1>MAXUSERS) { printf ("Too many users. Max allowed number of users is %d\n",MAXUSERS); exit (1); } N = argc -1 ; /* Connect to the X Server */ err_num = 0; for (i=0; i