diff options
| -rw-r--r-- | src/graphics_cs_x11.c | 322 | 
1 files changed, 194 insertions, 128 deletions
diff --git a/src/graphics_cs_x11.c b/src/graphics_cs_x11.c index fea54a5..38b2eed 100644 --- a/src/graphics_cs_x11.c +++ b/src/graphics_cs_x11.c @@ -60,12 +60,12 @@ void calculate_shape_color(c3_s_t s,real d) {   }  }  */ -void set_color_based_on_distance(real d) { -  int i=100-((int)((d+100.0) * 16.0) % 100); -  //XSetForeground(x11_global.dpy,x11_global.backgc,x11_global.colors[i].pixel); -  XSetForeground(x11_global.dpy,x11_global.backgc,x11_global.colors[99].pixel); + +void set_luminosity_color(int lum) { +  XSetForeground(x11_global.dpy,x11_global.backgc,x11_global.colors[lum%100].pixel);  } +  void draw_cs_line(cs_t p1,cs_t p2) {    XDrawLine(x11_global.dpy,x11_global.backbuffer,x11_global.backgc,p1.x,p1.y,p2.x,p2.y);  } @@ -159,16 +159,36 @@ void set_clipping_rectangle(int x,int y,int width,int height) {    XSetClipRectangles(x11_global.dpy,x11_global.backgc,x,y,&cliprect,1,Unsorted);  } -void red_and_blue_magic() { +void draw_mode_copy() { +  XGCValues gcval; +  gcval.function=GXcopy; +  XChangeGC(x11_global.dpy,x11_global.backgc,GCFunction,&gcval); +} + +void draw_mode_and() { +  XGCValues gcval; +  gcval.function=GXand; +  XChangeGC(x11_global.dpy,x11_global.backgc,GCFunction,&gcval); +} + +void draw_mode_or() {    XGCValues gcval;    gcval.function=GXor;    XChangeGC(x11_global.dpy,x11_global.backgc,GCFunction,&gcval);  } +void red_and_blue_magic() { +  draw_mode_or(); +} +  //void draw_sky() {  //  XCopyArea(x11_global.dpy,skypixmap,x11_global.backbuffer,x11_global.backgc,((global.camera.yr.d*5)+SKYW)%SKYW,0,WIDTH,gra_global.height/2,0,0);  //} +void set_ansi_color(int i) { +  XSetForeground(x11_global.dpy,x11_global.backgc,x11_global.ansi_color[i].pixel); +} +  void set_color() {    XSetForeground(x11_global.dpy,x11_global.backgc,x11_global.green.pixel);  } @@ -186,153 +206,194 @@ void flipscreen() {  }  void set_aspect_ratio() { + long supplied_return;   XSizeHints *hints=XAllocSizeHints();   hints->min_aspect.x=AR_W*(gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen : 1));   hints->min_aspect.y=AR_H;   hints->max_aspect.x=AR_W*(gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen : 1));   hints->max_aspect.y=AR_H; - hints->flags=PAspect; + hints->flags |= PAspect;   XSetWMNormalHints(x11_global.dpy,x11_global.w,hints); + XFree(hints); +} + +void set_demands_attention() { + XWMHints *hints=XGetWMHints(x11_global.dpy,x11_global.w); + if(!hints) hints=XAllocWMHints(); + hints->flags |= XUrgencyHint; + XSetWMHints(x11_global.dpy,x11_global.w,hints); + XFree(hints);  } -void x11_keypress_handler(int sym,int x,int y) { +void x11_keypress_handler(XKeyEvent *xkey,int x,int y) {    char line[1024];    radians tmprad;    radians tmprad2;    real tmpx; -//  real tmpy; //unused atm +  int sym=XLookupKeysym(xkey,0);    real tmpz; -  switch(sym) { -   case XK_Return: -    snprintf(line,sizeof(line)-1,"%s action %s\n",global.user,global.selected_object); -    selfcommand(line); -    break; -   case XK_Up: -    tmprad=d2r((degrees){global.camera.r.y.d+90}); -    tmprad2=d2r((degrees){global.camera.r.y.d+90}); -    tmpx=WALK_SPEED*cosl(tmprad.r); -    tmpz=WALK_SPEED*sinl(tmprad2.r); -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); -    selfcommand(line); -    break; -   case XK_Down: -    tmprad=d2r((degrees){global.camera.r.y.d+270}); -    tmprad2=d2r((degrees){global.camera.r.y.d+270}); -    tmpx=WALK_SPEED*cosl(tmprad.r); -    tmpz=WALK_SPEED*sinl(tmprad2.r); -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); -    selfcommand(line); -    break; -   case XK_Left: -    tmprad=d2r((degrees){global.camera.r.y.d+180}); -    tmprad2=d2r((degrees){global.camera.r.y.d+180}); -    tmpx=WALK_SPEED*cosl(tmprad.r); -    tmpz=WALK_SPEED*sinl(tmprad2.r); -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); -    selfcommand(line); -    break; -   case XK_Right: -    tmprad=d2r((degrees){global.camera.r.y.d+0}); -    tmprad2=d2r((degrees){global.camera.r.y.d+0}); -    tmpx=WALK_SPEED*cosl(tmprad.r); -    tmpz=WALK_SPEED*sinl(tmprad2.r); -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); -    selfcommand(line); -    break; -   case XK_w: -    snprintf(line,sizeof(line)-1,"%s move 0 1 0\n",global.user); -    selfcommand(line); -    break; -   case XK_s: -    snprintf(line,sizeof(line)-1,"%s move 0 -1 0\n",global.user); -    selfcommand(line); -    break; -   case XK_r: -    snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d+ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_y: -    snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d-ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_q: -    snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d+ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_e: -    snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d-ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_u: -    snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d+ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_o: -    snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d-ROTATE_STEP); -    selfcommand(line); -    break; -   case XK_p: -    gra_global.split+=.1; -    break; -   case XK_l: -    gra_global.split-=.1; -    break; -   case XK_z: global.zoom+=1; break; -   case XK_x: -    global.zoom-=1; -    if(global.zoom < 1) global.zoom=1; -    break; -   case XK_c: global.mmz*=1.1; break; -   case XK_v: global.mmz/=1.1; break; -   case XK_h: global.split+=1; break; -   case XK_j: global.split-=1; break; -   case XK_6: gra_global.maxshapes+=10; break; -   case XK_7: gra_global.maxshapes-=10; break; -   case XK_d: -    global.debug ^= 1; -    break; -   case XK_f: -    global.derp ^= 1; -    break; -   case XK_m: -    gra_global.drawminimap += 1; -    gra_global.drawminimap %= 4; -    break; -   case XK_a: -    gra_global.drawsky ^= 1; -    break; -   case XK_3: -    gra_global.draw3d += 1; -    gra_global.draw3d %= 4; +  switch(gra_global.input_mode) { +   case 0: +    switch(sym) { +     case XK_Return: +      snprintf(line,sizeof(line)-1,"%s action %s\n",global.user,global.selected_object); +      selfcommand(line); +      break; +     case XK_Up: +      tmprad=d2r((degrees){global.camera.r.y.d});//if the angle is 0... +      tmprad2=d2r((degrees){global.camera.r.y.d}); +      tmpx=WALK_SPEED*sinl(tmprad.r);//cos(0)==1 +      tmpz=WALK_SPEED*cosl(tmprad2.r);//sin(0)==0 +      snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); +      selfcommand(line); +      break; +     case XK_Down: +      tmprad=d2r((degrees){global.camera.r.y.d+180}); +      tmprad2=d2r((degrees){global.camera.r.y.d+180}); +      tmpx=WALK_SPEED*sinl(tmprad.r); +      tmpz=WALK_SPEED*cosl(tmprad2.r); +      snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); +      selfcommand(line); +      break; +     case XK_Left: +      tmprad=d2r((degrees){global.camera.r.y.d+90}); +      tmprad2=d2r((degrees){global.camera.r.y.d+90}); +      tmpx=WALK_SPEED*sinl(tmprad.r); +      tmpz=WALK_SPEED*cosl(tmprad2.r); +      snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); +      selfcommand(line); +      break; +     case XK_Right: +      tmprad=d2r((degrees){global.camera.r.y.d+270}); +      tmprad2=d2r((degrees){global.camera.r.y.d+270}); +      tmpx=WALK_SPEED*sinl(tmprad.r); +      tmpz=WALK_SPEED*cosl(tmprad2.r); +      snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf\n",global.user,tmpx,tmpz); +      selfcommand(line); +      break; +     case XK_w: +      snprintf(line,sizeof(line)-1,"%s move 0 1 0\n",global.user); +      selfcommand(line); +      break; +     case XK_s: +      snprintf(line,sizeof(line)-1,"%s move 0 -1 0\n",global.user); +      selfcommand(line); +      break; +     case XK_r: +      snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d+ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_y: +      snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d-ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_q: +      snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d+ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_e: +      snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d-ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_u: +      snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d+ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_o: +      snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d-ROTATE_STEP); +      selfcommand(line); +      break; +     case XK_p: +      gra_global.split+=.1; +      break; +     case XK_l: +      gra_global.split-=.1; +      break; +     case XK_z: global.zoom+=1; break; +     case XK_x: +      global.zoom-=1; +      if(global.zoom < 1) global.zoom=1; +      break; +     case XK_c: global.mmz*=1.1; break; +     case XK_v: global.mmz/=1.1; break; +     case XK_h: global.split+=1; break; +     case XK_j: global.split-=1; break; +     case XK_6: gra_global.maxshapes+=10; break; +     case XK_7: gra_global.maxshapes-=10; break; +     case XK_d: +      global.debug ^= 1; +      break; +     case XK_f: +      global.derp ^= 1; +      break; +     case XK_m: +      gra_global.drawminimap += 1; +      gra_global.drawminimap %= 4; +      break; +     case XK_a: +      gra_global.drawsky ^= 1; +      break; +     case XK_3: +      gra_global.draw3d += 1; +      gra_global.draw3d %= 4; +      break; +     case XK_Escape: +      exit(0); +     default: +      break; +    }      break; -   case XK_Escape: -    exit(0);     default: +    switch(sym) { +     case XK_Return: +      printf("\n"); +      break; +     case XK_Left://hack. probably just replace this with printf()s +      printf("\x1b[D"); +      break; +     case XK_Right: +      printf("\x1b[C"); +      break; +     case XK_Down: +      printf("\x1b[B"); +      break; +     case XK_Up: +      printf("\x1b[A"); +      break; +     default: +      XLookupString(xkey,line,1023,NULL,NULL); +      printf("%s",line); +      break; +    }      break;   }  }  #endif  int graphics_sub_init() { + char *ansi_color[]={"black","red","green","yellow","blue","magenta","cyan","white",0};   int i;   char tmp[64];   Cursor cursor;   XSetWindowAttributes attributes;  // Window root,child;//why do I have this?  //  XColor toss; - printf("# Opening X Display... (%s)\n",getenv("DISPLAY")); + fprintf(stderr,"# Opening X Display... (%s)\n",getenv("DISPLAY"));   if((x11_global.dpy = XOpenDisplay(0)) == NULL) { -  printf("# failure.\n"); +  fprintf(stderr,"# failure.\n");    exit(1);   } - else printf("# done.\n"); + else fprintf(stderr,"# done.\n");   x11_global.color_map=DefaultColormap(x11_global.dpy, DefaultScreen(x11_global.dpy)); - printf("# generating grays...\n"); + for(i=0;ansi_color[i];i++) { +  XAllocNamedColor(x11_global.dpy,x11_global.color_map,ansi_color[i],&x11_global.ansi_color[i],&x11_global.ansi_color[i]); + } + fprintf(stderr,"# generating grays...\n");   for(i=0;i<=100;i++) {    snprintf(tmp,sizeof(tmp),"gray%d",i);    XAllocNamedColor(x11_global.dpy,x11_global.color_map,tmp,&x11_global.colors[i],&x11_global.colors[i]);   } - printf("# done.\n"); + fprintf(stderr,"# done.\n");   assert(x11_global.dpy);   x11_global.root_window=0;   //global.colors[0]=BlackPixel(x11_global.dpy,DefaultScreen(x11_global.dpy)); @@ -378,7 +439,7 @@ int graphics_sub_init() {  //  XSetForeground(x11_global.dpy, gc, whiteColor);  // this was taking a "long" time.  /* - printf("# generating sky... "); + fprintf(stderr,"# generating sky... ");   skypixmap=XCreatePixmap(x11_global.dpy,x11_global.w,SKYW,SKYH,DefaultDepth(x11_global.dpy,DefaultScreen(x11_global.dpy)));   for(i=0;i<SKYH;i++) {    for(j=0;j<SKYW;j++) { @@ -391,7 +452,7 @@ int graphics_sub_init() {     }    }   } - printf("done.\n"); + fprintf(stderr,"# done.\n");  */   return 0;//we're fine  } @@ -403,35 +464,40 @@ int graphics_event_handler(int world_changed) { //should calling draw_screen be   //what sets mask?   char motionnotify=0;   unsigned int mask; + if(global.beep) { +  global.beep=0; +  XBell(x11_global.dpy,1000); +  set_demands_attention(); + }   while(XPending(x11_global.dpy)) {//these are taking too long?    XNextEvent(x11_global.dpy, &e); -//     printf("# handling event with type: %d\n",e.type); +//     fprintf(stderr,"# handling event with type: %d\n",e.type);    switch(e.type) {  //       case Expose:  //         if(e.xexpose.count == 0) redraw=1;  //         break;      case MotionNotify: -      if(global.debug >= 2) printf("# MotionNotify\n"); +      if(global.debug >= 2) fprintf(stderr,"# MotionNotify\n");        motionnotify=1;        break;      case ButtonPress: -      if(global.debug >= 2) printf("# ButtonPress\n"); +      if(global.debug >= 2) fprintf(stderr,"# ButtonPress\n");        redraw=1;        gra_global.buttonpressed=e.xbutton.button;//what's this for? mouse?        break;      case ButtonRelease: -      if(global.debug >= 2) printf("# ButtonRelease\n"); +      if(global.debug >= 2) fprintf(stderr,"# ButtonRelease\n");        redraw=1;        gra_global.buttonpressed=0;//what's this for???        break;      case ConfigureNotify: -      if(global.debug >= 2) printf("# ConfigureNotify\n"); +      if(global.debug >= 2) fprintf(stderr,"# ConfigureNotify\n");        redraw=1;        XGetGeometry(x11_global.dpy,x11_global.w,&root,&global.x,&global.y,&gra_global.width,&gra_global.height,&gra_global.border_width,&gra_global.depth);        if(gra_global.height * AR_W / AR_H != gra_global.width / (gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen : 1))) {         // height / AR_H * AR_W = width / (ss / (rab ? ss : 1))         if(global.debug >= 2) { -        printf("# %d != %d for some reason. probably your WM not respecting aspect ratio hints or calculating based on them differently. (would cause an off-by-one or so)\n",gra_global.height * AR_W / AR_H , gra_global.width / (gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen : 1))); +        fprintf(stderr,"# %d != %d for some reason. probably your WM not respecting aspect ratio hints or calculating based on them differently. (would cause an off-by-one or so)\n",gra_global.height * AR_W / AR_H , gra_global.width / (gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen : 1)));         }         if(gra_global.width / (gra_global.red_and_blue ? 1 : gra_global.split_screen) * AR_H / AR_W < gra_global.height) {          gra_global.height=gra_global.width / (gra_global.red_and_blue ? 1 : gra_global.split_screen) * AR_H / AR_W; @@ -443,12 +509,12 @@ int graphics_event_handler(int world_changed) { //should calling draw_screen be        gra_global.mapyoff=gra_global.height/2;        break;      case KeyPress: -      if(global.debug >= 2) printf("# KeyPress\n"); +      if(global.debug >= 2) fprintf(stderr,"# KeyPress\n");        redraw=1; -      x11_keypress_handler(XLookupKeysym(&e.xkey,0),gra_global.mousex,gra_global.mousey); +      x11_keypress_handler(&e.xkey,gra_global.mousex,gra_global.mousey);        break;      default: -//      printf("# received unknown event with type: %d\n",e.type); +//      fprintf(stderr,"# received unknown event with type: %d\n",e.type);        break;    }   }  | 
