// For help on X11 give command: "man X Interface" // Event masks and event definitions are in /usr/X11R6/include/X11/X.h #include #include #include #include #include #include #include #include #include #include #include "thrdef.h" #include "globdef.h" #include "uidef.h" #include "screendef.h" #include "vernr.h" #include "options.h" #include "keyboard_def.h" #include "lconf.h" #include "xdef.h" #include "ldef.h" extern GC xgc; extern XImage *ximage; extern Display *xdis; extern Window xwin; extern Colormap lir_colormap; typedef struct { unsigned short int red; unsigned short int green; unsigned short int blue; unsigned int pixel; short int flag; float total; }PIXINFO; int saved_euid=-1; int main(int argc, char **argv) { int id,il,kd,kl; int bitmap_pad; float t1,t2; PIXINFO *defpix, *lirpix; float *pixdiff; PIXINFO tmppix; Colormap default_colormap; char *hostname; Visual *visual; int i, k, m, screen_num; Cursor cross_cursor; char *window_name=PROGRAM_NAME; XTextProperty window_title_property; unsigned short int *ipalette; XColor xco; saved_euid=geteuid(); setuid(getuid()); /* XXX drop perms! */ for(i=0; iclass!=TrueColor && color_depth != 8) { printf("Unknown color type\n"); exit(1); } bitmap_pad=color_depth; switch (color_depth) { case 24: bitmap_pad=32; mempix_char=(unsigned char *)malloc((screen_totpix+1)*4); for(i=0; i<(screen_totpix+1)*4;i++)mempix_char[i]=0; // ****************************************************************** // Rearrange the palette. It was designed for svgalib under Linux for(i=0; i<3*256; i++) { svga_palette[i]<<=2; if(svga_palette[i] != 0) svga_palette[i]|=3; } break; case 16: mempix_shi=(unsigned short int*)malloc((screen_totpix+1)*sizeof(unsigned short int)); mempix_char=(void*)mempix_shi; for(i=0; i>=1; ipalette[i]=k; } break; case 8: mempix_char=(unsigned char*)malloc((screen_totpix+1)+256); defpix=(PIXINFO*)malloc(sizeof(PIXINFO)*256); lirpix=(PIXINFO*)malloc(sizeof(PIXINFO)*256); pixdiff=(float*)malloc(256*256*sizeof(float)); xpalette=&mempix_char[screen_totpix+1]; for(i=0; i<(screen_totpix+1)+256; i++)mempix_char[i]=0; lir_colormap=XCreateColormap(xdis, xwin, visual, AllocAll); default_colormap = DefaultColormap(xdis, screen_num); // Store the default colormap in defpix for(id=0; id<256; id++) { xco.pixel=id; k=XQueryColor (xdis,default_colormap,&xco); defpix[id].red=xco.red; defpix[id].green=xco.green; defpix[id].blue=xco.blue; defpix[id].flag=0; defpix[id].pixel=id; defpix[id].total= ( (float)((unsigned int)defpix[id].red)* (unsigned int)defpix[id].red+ (float)((unsigned int)defpix[id].green)* (unsigned int)defpix[id].green+ (float)((unsigned int)defpix[id].blue)* (unsigned int)defpix[id].blue); } // svga_palette uses the six lowest bits for the colour intensities. // shift left by 10 to move our data to occupy the six highest bits. // Store the svgalib palette. for(il=0; il t1) { t1=lirpix[kl].total; m=kl; } } tmppix=lirpix[il]; lirpix[il]=lirpix[m]; lirpix[m]=tmppix; } // Compute the similarity between lirpix and defpix and store in a matrix. for(il=0; il30)m=30; } if ( (ev.xbutton.button == Button4) != 0) { m=bg.wheel_stepn; m--; if(m<-30)m=-30; if(genparm[AFC_ENABLE]==0 && m<0)m=0; } bg.wheel_stepn=m; show_wheel_stepmult(); make_modepar_file(GRAPHTYPE_BG); } break; case ButtonRelease: if ( (ev.xbutton.button == Button1) != 0) { new_lbutton_state=0; goto mousepost; } if ( (ev.xbutton.button == Button3) != 0) { new_rbutton_state=0; goto mousepost; } if ( (ev.xbutton.button == Button2) != 0) { mbutton_state=0; } break; case MotionNotify: new_mouse_x= ev.xbutton.x; if(new_mouse_x < 0)new_mouse_x=0; if(new_mouse_x >= screen_width)new_mouse_x=screen_width-1; new_mouse_y= ev.xbutton.y; if(new_mouse_y < 0)new_mouse_y=0; if(new_mouse_y >= screen_height)new_mouse_y=screen_height-1; mousepost:; lir_sem_post(SEM_MOUSE); break; case KeyPress: chr = XKeycodeToKeysym(xdis, ev.xkey.keycode, 0); if(chr == X_ESC_SYM) { // The ESC key was pressed. Exit from Linrad NOW! sem_post(&sem_kill_all); store_in_kbdbuf(0); return; } if(chr == X_SHIFT_SYM_L || chr == X_SHIFT_SYM_R) { shift_key_status=1; break; } // Get ASCII codes from Dec 32 to Dec 127 count = XLookupString((XKeyEvent *)&ev, key_buff, 2, &ks,NULL); if ((count == 1) && ((int)key_buff[0]>31) ) { store_in_kbdbuf((int)key_buff[0]); break; } cc=0; if(chr >= X_F1_SYM && chr <= X_F12_SYM) { if(chr <= X_F10_SYM) { if(shift_key_status == 0) { cc=F1_KEY+chr-X_F1_SYM; } else { cc=SHIFT_F1_KEY+chr-X_F1_SYM; if(chr > X_F2_SYM)cc++; if(chr >= X_F9_SYM)cc=0; } } else { if(shift_key_status == 0) { cc=F11_KEY+chr-X_F11_SYM; } } if(cc != 0)store_in_kbdbuf(cc); break; } switch (chr) { case X_UP_SYM: cc=ARROW_UP_KEY; break; case X_DWN_SYM: cc=ARROW_DOWN_KEY; break; case X_RIGHT_SYM: cc=ARROW_RIGHT_KEY; break; case X_BACKDEL_SYM: case X_LEFT_SYM: cc=ARROW_LEFT_KEY; break; case X_HOME_SYM: cc=HOME_KEY; break; case X_INSERT_SYM: cc=INSERT_KEY; break; case X_DELETE_SYM: cc=DELETE_KEY; break; case X_END_SYM: cc=END_KEY; break; case X_PGUP_SYM: cc=PAGE_UP_KEY; break; case X_PGDN_SYM: cc=PAGE_DOWN_KEY; break; case X_PAUSE_SYM: cc=PAUSE_KEY; break; case X_ENTER_SYM: cc=10; break; } if(cc != 0)store_in_kbdbuf(cc); break; case KeyRelease: chr=XKeycodeToKeysym(xdis, ev.xkey.keycode, 0); if(chr == X_SHIFT_SYM_L || chr == X_SHIFT_SYM_R) { shift_key_status=0; } break; } } } void ui_setup(void) { FILE *file; int i, j, k; char s[10]; char chr; int *uiparm; char *parinfo; uiparm=(int*)(&ui); parinfo=NULL; file = fopen(userint_filename, "rb"); if (file == NULL) { printf("\nSetup file %s missing.",userint_filename); full_setup:; for(i=0; i"); fgets(s,8,stdin); chr=toupper(s[0]); if(chr != 'S') exit(0); x_global_uiparms(0); ui.rx_input_mode=-1; ui.tx_dadev_no=-1; uiparm_change_flag=TRUE; } else { if(parinfo==NULL) { parinfo=malloc(4096); if(parinfo==NULL) { lirerr(1078); return; } } for(i=0; i<4096; i++) parinfo[i]=0; i=fread(parinfo,1,4095,file); fclose(file); file=NULL; if(i >= 4095) { goto full_setup; } k=0; for(i=0; i5) { printf("\nIllegal paramerer value in setup file %s",userint_filename); goto full_setup; } if(ui.check != UI_VERNR) { printf("\nWrong version for setup file %s",userint_filename); goto full_setup; } if(ui.screen_width_factor < 33 || ui.screen_width_factor > 100 || ui.screen_height_factor <33 || ui.screen_height_factor > 100) { printf("\nIllegal screen scale factors."); goto full_setup; } uiparm_change_flag=FALSE; free(parinfo); } }