static void redraw(void) { desktops(5); memory(90); loadaverage(400); procs(550); cpubar(650); showfile(750); datetime(); }
void draw_juggler(int show_loadavg, aa_context *c, JMLib *j) { int color; int i; struct aajm_loadavg load; arm* ap = &(j->ap); ball* rhand = &(j->rhand); ball* lhand = &(j->lhand); hand* handp = &(j->handpoly); color = 64; // draw head aa_drawcircle(c,ap->hx, ap->hy, ap->hr, color, -1); // draw juggler for (i=0;i<5;i++) { aa_drawline(c, ap->rx[i], ap->ry[i], ap->rx[i+1], ap->ry[i+1], color); aa_drawline(c, ap->lx[i], ap->ly[i], ap->lx[i+1], ap->ly[i+1], color); } // hands for (i=0; i <= 8; i++) { aa_drawline(c, rhand->gx + handp->rx[i], rhand->gy + handp->ry[i], rhand->gx + handp->rx[i+1], rhand->gy + handp->ry[i+1], color); aa_drawline(c, lhand->gx + handp->lx[i], lhand->gy + handp->ly[i], lhand->gx + handp->lx[i+1], lhand->gy + handp->ly[i+1], color); } aa_drawline(c, rhand->gx + handp->rx[9], rhand->gy + handp->ry[9], rhand->gx + handp->rx[0], rhand->gy + handp->ry[0], color); aa_drawline(c, lhand->gx + handp->lx[9], lhand->gy + handp->ly[9], lhand->gx + handp->lx[0], lhand->gy + handp->ly[0], color); color = 255; // draw balls int diam = (11*j->dpm/DW); for(i=j->numBalls()-1;i>=0;i--) { aa_drawcircle(c, j->b[i].gx + diam, j->b[i].gy + diam, diam, color, color); } aa_render(c, params, 0, 0, aa_imgwidth(c), aa_imgheight(c)); aa_printf(c, 0, 0, AA_SPECIAL, gettext("Site: %s Style: %s Balls: %i"), j->getSite(), j->getStyle(), j->numBalls()); if(show_loadavg) { loadaverage(&load); aa_printf(c, 0, 1, AA_SPECIAL, "LoadAvg: %2.2f %2.2f %2.2f", load.one, load.five, load.fifteen); } if(j->getStatus() == ST_PAUSE) { aa_puts(c, 1, 3, AA_SPECIAL, gettext("Paused")); } aa_flush(c); memset(c->imagebuffer,0,aa_imgwidth(c)*aa_imgheight(c)); }
void main_loop(int max_iterations, int delay, int loadavg_flag, int normal_load, int socket_fd, float randomizestyletime, float randomizesitetime) { struct timeval starttime, endtime, selecttime; struct timeval lastrandomizestyletime={0,0}; struct timeval lastrandomizesitetime ={0,0}; struct aajm_loadavg load; long speed = DEFSPEED; /* microseconds between frames */ long load_speed = 0; /* Speed adjustment, based on load */ int loop_forever = 0; char c; int i; int tmp; char newsite[JML_MAX_SITELEN]; char newstyle[2]; int accepted_sock = 0; /* FD for accept()ed socket */ int amount_read = 0; /* Amount read into buffer so far */ int r; /* Num bytes read in last read() */ char socket_buffer[MAX_SOCKET_BUFFER]; /* Buffer */ char command[MAX_SOCKET_BUFFER]; char data[MAX_SOCKET_BUFFER]; fd_set socket_set; /* Used for select() */ socklen_t sin_size; /* Used by accept() */ struct sockaddr their_addr; /* Used by accept() */ JML_CHAR **possible_styles; int newstyle_index; possible_styles = jmlib->getStyles(); load.one = -1; load.five = -1; load.fifteen = -1; if(delay > 0) { speed = delay * 1000; } if(max_iterations <= 0) { loop_forever = 1; } memset((void *)socket_buffer,0,MAX_SOCKET_BUFFER); memset((void *)command,0,MAX_SOCKET_BUFFER); memset((void *)data,0,MAX_SOCKET_BUFFER); while (1) { gettimeofday(&starttime,NULL); if (randomizesitetime > 0 && (starttime.tv_sec -lastrandomizesitetime.tv_sec ) + (float)(starttime.tv_usec-lastrandomizesitetime.tv_usec)/1000000 >= randomizesitetime) { randompattern(); lastrandomizesitetime.tv_sec = starttime.tv_sec; lastrandomizesitetime.tv_usec = starttime.tv_usec; } if (randomizestyletime > 0 && (starttime.tv_sec -lastrandomizestyletime.tv_sec ) + (float)(starttime.tv_usec-lastrandomizestyletime.tv_usec)/1000000 >= randomizestyletime) { jmlib->setStyle("Random"); lastrandomizestyletime.tv_sec = starttime.tv_sec; lastrandomizestyletime.tv_usec = starttime.tv_usec; } jmlib->doJuggle(); draw_juggler(loadavg_flag, context, jmlib); if(loadavg_flag) { loadaverage(&load); if(load.one != -1) { tmp = (int)(load.one*100 - normal_load); load_speed = 5000 * tmp; } } c=aa_getkey(context,0); if(c=='s' || c=='S') { /* Change SiteSwap */ memset(newsite,0,JML_MAX_SITELEN); strncpy(newsite, jmlib->getSite(), JML_MAX_SITELEN); aa_puts(context, 1, 4, AA_SPECIAL, gettext("Enter New SiteSwap...")); aa_edit(context, 1, 5, 20, newsite, JML_MAX_SITELEN); if(newsite[0]!=0) { jmlib->setPattern(newsite,newsite, HR_DEF, DR_DEF); jmlib->setStyleDefault(); jmlib->startJuggle(); } } else if(c=='r' || c=='R') { randompattern(); } else if(c=='q' || c=='Q' || c==27) { /* Quit */ /* 27 == Escape Don't complain. This was a hack before it started */ return; } else if(c==' ' || c=='p' || c=='P') { /* Toggle Pause */ jmlib->togglePause(); } else if(c=='t' || c=='T') { /* Change Style */ aa_puts(context, 3, 4, AA_SPECIAL, gettext("Choose New Style...")); for (i=0;i<jmlib->numStyles();i++) { aa_printf(context, 3, 5+i, AA_SPECIAL, "%i: %s",i+1,possible_styles[i]); } aa_flush(context); memset(newstyle,0,JML_MAX_SITELEN); aa_edit(context, 3, 5+i, 2, newstyle, 2); if(newstyle[0]!=0) { newstyle_index=atoi(newstyle)-1; if(newstyle_index>=0 && newstyle_index<jmlib->numStyles()) { jmlib->setStyle(possible_styles[newstyle_index]); } } } else if(c=='h' || c=='H') { /* Help */ int curr_height = 4; aa_puts(context, 3, curr_height, AA_SPECIAL, gettext("Key Help")); ++curr_height; aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("h - This screen")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("s - Change Siteswap")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("r - Random Pattern")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("t - Change Style")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("l - Toggle Load Monitoring")); #ifdef HAVE_AVCODEC_H aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("m - Dump MPEG")); #endif aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("q - Quit")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("space - Pause")); aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("+, -, enter - Speed up, down, reset")); ++curr_height; aa_puts(context, 3, ++curr_height, AA_SPECIAL, gettext("Press any key to remove this menu")); aa_flush(context); aa_getkey(context, 1); } else if(c=='+' || c=='=' || c=='k') { /* Speed Up */ speed -= 1500; if(speed < 0) { speed = 0; } } else if(c=='-' || c=='j') { /* Speed Down */ speed += 1500; #ifdef HAVE_AVCODEC_H } else if(c=='m') { /* Dump MPEG */ char mpegname[20]; memset(mpegname,0,20); aa_puts(context, 1, 4, AA_SPECIAL, gettext("Enter MPEG Name...")); aa_edit(context, 1, 5, 20, mpegname, JML_MAX_SITELEN); if(mpegname[0]!=0) { creatempeg(jmlib, mpegname); } #endif } else if(c=='l') { /* Toggle Load Monitoring */ if(loadavg_flag == 1) { loadavg_flag = 0; load_speed = 0; } else { loadavg_flag = 1; } } else if(c==13) { /* Speed Reset */ /* 13 == Enter */ speed = DEFSPEED; } gettimeofday(&endtime,NULL); selecttime.tv_sec = endtime.tv_sec - starttime.tv_sec; if (selecttime.tv_sec != 0) { endtime.tv_usec += 1000000*selecttime.tv_sec; selecttime.tv_sec = 0; } selecttime.tv_usec = (speed + load_speed) - (endtime.tv_usec - starttime.tv_usec); if(selecttime.tv_usec < 0) { selecttime.tv_usec = 1; } /* IPC Code begins here */ if(socket_fd <= 0) { select(0,NULL,NULL,NULL,&selecttime); } else { FD_ZERO(&socket_set); FD_SET(socket_fd,&socket_set); /* accepted_sock is the fd we get from accept()ing the socket */ if(accepted_sock > 0) { /* read just one byte */ r = read(accepted_sock, (void *)&socket_buffer[amount_read],1); if(r == -1 && errno != EAGAIN) { /* EAGAIN means we need to try reading again, there wasn't an error, the descriptor just had nothing waiting in it Else, close the handle reset the other data stuff */ memset((void *)socket_buffer,0,MAX_SOCKET_BUFFER-amount_read-1); close(accepted_sock); amount_read = 0; accepted_sock = 0; memset((void *)data,0,MAX_SOCKET_BUFFER); memset((void *)command,0,MAX_SOCKET_BUFFER); } else if(r > 0) { /* transfer stuff: command=data; If we see an '=', everything before it was a command. If we see a ';', the stuff before it was data */ amount_read+=r; if(socket_buffer[amount_read-1] == '=') { memset((void *)command,0,MAX_SOCKET_BUFFER); memcpy((void *)command,(void *)socket_buffer, amount_read-1); memset((void *)socket_buffer,0,MAX_SOCKET_BUFFER); amount_read = 0; } else if(socket_buffer[amount_read-1] == ';') { memset((void *)data,0,MAX_SOCKET_BUFFER); memcpy((void *)data,(void *)socket_buffer, amount_read-1); memset((void *)socket_buffer,0,MAX_SOCKET_BUFFER); close(accepted_sock); amount_read = 0; accepted_sock = 0; } } if(amount_read >= MAX_SOCKET_BUFFER-1) { /* Too late, F**k 'em, they're trying to overflow us anyway */ write(accepted_sock,OVERFLOW_ERROR,strlen(OVERFLOW_ERROR)); memset((void *)socket_buffer,0,MAX_SOCKET_BUFFER); close(accepted_sock); amount_read = 0; accepted_sock = 0; } } if(command[0] != '\0' && data[0] != '\0') { if(!strcmp(command,"Style")) { jmlib->setStyle(data); } else if(!strcmp(command,"Site")) { jmlib->setPattern("Something",data, HR_DEF, DR_DEF); jmlib->setStyleDefault(); jmlib->startJuggle(); } else if(!strcmp(command,"Speed")) { if(!strcmp(data,"Up")) { speed -= 1500; if(speed < 0) speed = 0; } else if(!strcmp(data,"Down")) { speed += 1500; } else if(!strcmp(data,"Reset")) { speed = DEFSPEED; } } memset((void *)data,0,MAX_SOCKET_BUFFER); memset((void *)command,0,MAX_SOCKET_BUFFER); } if(!strcmp(command,"Quit")) { return; } if(select(socket_fd+1, &socket_set, NULL, NULL, &selecttime) > 0) { if(FD_ISSET(socket_fd,&socket_set) && accepted_sock) { /* Just close any subsequent conenctions until this one's done */ close(accept(socket_fd,&their_addr,&sin_size)); } else if(FD_ISSET(socket_fd,&socket_set) && !accepted_sock) { /* Else accept() the socket, and set it to not block */ sin_size = sizeof(sockaddr); accepted_sock = accept(socket_fd,&their_addr, &sin_size); fcntl(accepted_sock, F_SETFL, O_NONBLOCK); } } } if(!loop_forever && max_iterations-- <= 0) { break; } } }