/* AntiRight (c) 2003-2005 Jeffrey Bedard antiright@gmail.com This file is part of AntiRight. AntiRight is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. AntiRight is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AntiRight; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "pongr.h" Window help, quit, dialog, dismiss, pane, text, score_label, menubar; Window file_button, file_menu, help_button, help_menu; Window about_button, dialog_button, copyright_button, license_button; Window about_dialog, about_dismiss, about_text; int menu_visible=0; int info_visible=0; int about_visible=0; void create_widgets() { pane=create_window(real_win, 0, 236, 255, 20); score_label=create_window(pane, 2, 2, 250, 16); menubar=create_window(real_win, 0, 0, 255, 24); game_win=create_window(real_win, 0, 24, 255, 212); about_dialog=create_window(real_win, 56, 56, 144, 144); XSetWindowBorderWidth(display, about_dialog, 2); about_dismiss=create_window(about_dialog, 40, 124, 64, 16); dialog=create_window(real_win,56, 56, 144, 144); XUnmapWindow(display, dialog); XSetWindowBorderWidth(display, dialog, 2); about_visible=1; dismiss=create_window(dialog, 40, 124, 64, 16); text=create_window(dialog, 3, 4, 136, 116); about_text=create_window(about_dialog, 3, 4, 136, 116); XSetWindowBorderWidth(display, about_text, 1); XSetWindowBorderWidth(display, text, 1); file_button=create_window(menubar, 4, 4, 64, 16); help_button=create_window(menubar, 188, 4, 64, 16); help_menu=create_window(real_win, 188, 24, 68, 76); XUnmapWindow(display, help_menu); about_button=create_window(help_menu, 2, 2, 64, 16); dialog_button=create_window(help_menu, 2, 20, 64, 16); copyright_button=create_window(help_menu, 2, 38, 64, 16); license_button=create_window(help_menu, 2, 56, 68, 16); file_menu=create_window(real_win, 4, 24, 68, 20); XUnmapWindow(display, file_menu); quit=create_window(file_menu,2, 2, 64, 16); } void refresh_shadows() { if(info_visible) { draw_shadow(dialog, 144, 144); release(dismiss); } if(about_visible) { char *string; draw_shadow(about_dialog, 144, 144); release(about_dismiss); set_foreground(215, 100, 100); set_font("-*-times-*-r-*-*-16-*-*-*-*-*-*-*"); string="AntiRight's"; XDrawString(display, about_text, gc, 4, 24, string, strlen(string)); set_font("-*-times-*-r-*-*-34-*-*-*-*-*-*-*"); string="PONGr"; XDrawString(display, about_text, gc, 4, 64, string, strlen(string)); set_font("variable"); string="Version 1.0 GNU GPL"; XDrawString(display, about_text, gc, 4, 84, string,strlen(string)); set_foreground(0,0,0); string="Copyright 2004-2004"; XDrawString(display, about_text, gc, 4, 96, string,strlen(string)); string="Jeffrey Bedard"; XDrawString(display, about_text, gc, 4, 108, string,strlen(string)); } draw_shadow(pane, 255, 20); draw_sunken(score_label, 250, 16); draw_shadow(menubar, 255, 24); draw_shadow(file_menu, 68, 20); draw_shadow(help_menu, 68, 76); draw_grey(file_button, 64, 16); draw_grey(help_button, 64, 16); if(menu_visible) { draw_grey(quit, 64, 16); draw_grey(about_button, 64, 16); draw_grey(copyright_button, 64, 16); draw_grey(dialog_button, 64, 16); draw_grey(license_button, 64, 16); } } void label(Window button, char *string) { XDrawString(display, button, gc, 4, 12, string, strlen(string)); } void exit_app() { XFreeGC(display, gc); XCloseDisplay(display); exit(0); } void draw_score() { char *string; asprintf(&string,"%d",score); set_foreground(0,0,0); draw_sunken(score_label, 250, 16); label(score_label, string); free(string); } void refresh_labels() { char *string; set_foreground(0,0,0); set_font("variable"); draw_score(); label(file_button, "File"); label(help_button, "Help"); if(menu_visible) { label(quit, "Quit"); label(about_button, "About"); label(dialog_button, "Info"); label(license_button, "License"); label(copyright_button, "Copyright"); } if(info_visible) { label(dismiss, "Dismiss"); } if(about_visible) { label(about_dismiss, "Dismiss"); } } void refresh_buffer() { set_foreground(255,255,255); XFillRectangle(XPS,0,0,255,212); refresh_text(); draw_paddle(); draw_ball(ball_x,ball_y); XCopyArea(display,win,game_win,gc,0,0,255,212,0,0); XFlush(display); } void expose() { refresh_buffer(); refresh_shadows(); refresh_labels(); } /* FIXME: Add some command line arg handling. */ int main(int argc,char **argv) { int last_event=0; const char *display_string=getenv("DISPLAY"); KeySym key; XComposeStatus cstat; char keyName[SIZE]; XEvent event; display = XOpenDisplay(display_string); if(display == NULL) { puts("Error Connecting to X server"); exit(1); } ball_direction=RIGHT; real_win =create_window(DefaultRootWindow(display),0,0,255,255); XStoreName(display,real_win,PROGRAMNAME); win=XCreatePixmap(display,real_win,255,212, DefaultDepth(display,DefaultScreen(display))); ball_direction=RIGHT; gc = XCreateGC(display,win,0,NULL); create_widgets(); { score=0; ball_y=128; ball_x=128; keyName[0] = 0; draw_paddle(); compute_ball(); } /*Event Loop*/ while(True) { XNextEvent(display,&event); switch(event.type) { case Expose: if(((last_event != 0)&&(last_event != Expose)) &&(last_event!=ConfigureNotify)) expose(); break; case KeyPress: XLookupString(&event.xkey,keyName,SIZE,&key,&cstat); if(key == XK_q) { exit_app(); break; } if(key == XK_Up && !game_over) { paddle_up(); compute_ball(); expose(); break; } if(key == XK_Down && !game_over) { paddle_down(); compute_ball(); refresh_buffer(); expose(); break; } break; case ConfigureNotify: if((last_event != Expose)&&(last_event!=ConfigureNotify)) expose(); break; case KeyRelease: break; case ButtonPress: if(event.xbutton.window==quit) press(quit); else if(event.xbutton.window==dismiss) press(dismiss); else if(event.xbutton.window==help) press(help); else if(event.xbutton.window==help_menu) press(help_menu); else if(event.xbutton.window==file_menu) press(file_menu); else if(event.xbutton.window==dialog_button) press(dialog_button); else if(event.xbutton.window==about_button) press(about_button); else if((event.xbutton.window==game_win && event.xbutton.button==5) \ && !game_over) { paddle_down(); compute_ball(); refresh_buffer(); draw_score(); } else if((event.xbutton.window==game_win && event.xbutton.button==4)\ && !game_over) { paddle_up(); compute_ball(); refresh_buffer(); draw_score(); } else { menu_visible=0; XUnmapWindow(display, help_menu); XUnmapWindow(display, file_menu); } if((event.xbutton.button!=4)&&(event.xbutton.button!=5)) refresh_labels(); break; case ButtonRelease: if(event.xbutton.window==quit) { exit_app(); } if(event.xbutton.window==dismiss) { info_visible=0; XUnmapWindow(display, dialog); } if(event.xbutton.window==about_dismiss) { about_visible=0; XUnmapWindow(display, about_dialog); } if(event.xbutton.window==help_button) { menu_visible=1; XMapWindow(display, help_menu); } if(event.xbutton.window==file_button) { menu_visible=1; XMapWindow(display, file_menu); } if(event.xbutton.window==dialog_button) { info_visible=1; release(dialog_button); refresh_labels(); XMapWindow(display, dialog); XUnmapWindow(display, help_menu); } if(event.xbutton.window==about_button) { about_visible=1; release(about_button); refresh_labels(); XMapWindow(display, about_dialog); XUnmapWindow(display, help_menu); } break; }; last_event=event.type; }; exit_app(); }