📄 multislice.c
字号:
*/ Nvisible = 0.5 + w->core.height/((float)h); LastLine = w->slicetext.top + Nvisible; if (LastLine > w->slicetext.slicesrc.n_lines){ LastLine = w->slicetext.slicesrc.n_lines; FirstLine = w->slicetext.slicesrc.n_lines - Nvisible + 1; } else FirstLine = w->slicetext.top; if (FirstLine < 1) FirstLine = 1; if (FirstLine != w->slicetext.top) w->slicetext.top = FirstLine; if(DEBUG) printf ("Expose %d lines %d - %d\n",Nvisible,FirstLine,LastLine); sprintf (format," %%%dd ",w->slicetext.log); lineoffset = (w->slicetext.log + 3)* w->slicetext.font->max_bounds.width; for (line = FirstLine; line <= LastLine; line++){ /* if (DEBUG)printf ("Expose %d\n",turn); if (DEBUG)fflush(stdout); if (DEBUG)printf ("Line %d\n",line); fflush(stdout); */ sprintf (line_no,format,adjust_line(w,line)); if (w->slicetext.slicesrc.line[line].n_highlight) gc_to_use = w->slicetext.alt_gc; else gc_to_use = w->slicetext.gc; XClearArea (e->display,e->window, 0,base-ascent,0,h,False); XDrawImageString (e->display,e->window,gc_to_use, w->slicetext.font->max_bounds.width, base,line_no, w->slicetext.log + 2 );/*static void buildline (buff,line,n,tabstop) XDrawImageString (e->display,e->window,gc_to_use, lineoffset,base,w->slicetext.slicesrc.line[line].text, w->slicetext.slicesrc.line[line].length );*/ buildline (line_buff,w->slicetext.slicesrc.line[line].text, w->slicetext.slicesrc.line[line].length, w->slicetext.tabstop,linemap); drawline (e->display,e->window, w, line_buff, lineoffset,base,line,linemap ); /* ********************************* XDrawImageString (e->display,e->window,gc_to_use, lineoffset,base,line_buff, strlen(line_buff) ); *********************************** */ base += h; } XClearArea (e->display,e->window, 0,base-ascent,0,0,False); XCopyArea (e->display,w->slicetext.sidebar,e->window, w->slicetext.side_gc,0,0, w->slicetext.side_width,w->core.height, w->core.width-w->slicetext.side_width,0);}side_set (w,line_from) int line_from; MultiSliceWidget w;{ int ix,at,h; h = (w->core.height)/(w->slicetext.slicesrc.n_lines) - 1; h = h < 1? 1 : h; at = ((line_from-1)*w->core.height)/(w->slicetext.slicesrc.n_lines); for (ix = 0; ix < h; ix++,at++) XDrawLine(XtDisplay(w),w->slicetext.sidebar, w->slicetext.side_gc,0,at,100,at);}static void SliceResize (w) MultiSliceWidget w;{ float top,shown; int win,line; if (!w->slicetext.slicesrc.n_lines) return; win = (0.5) + ((float) w->core.height)/ ( w->slicetext.font->ascent + w->slicetext.font->descent); shown = ((float)win)/((float) w->slicetext.slicesrc.n_lines); top = (w->slicetext.top - 1)/((float)w->slicetext.slicesrc.n_lines); if(DEBUG) printf ("h %d a %d d %d ", w->core.height, w->slicetext.font->ascent,w->slicetext.font->descent); if(DEBUG) printf ("win %d file %d shown %f\n", win,w->slicetext.slicesrc.n_lines,shown); if (w->slicetext.scrollbar == NULL) return; XawScrollbarSetThumb (w->slicetext.scrollbar,top,shown); /* w->slicetext.top = 1; w->slicetext.slicesrc.line[line].n_highlight = 0; */ XFillRectangle (XtDisplay(w),w->slicetext.sidebar, w->slicetext.side_clear_gc,0,0,w->slicetext.side_width, DisplayHeight(XtDisplay(w), DefaultScreen(XtDisplay(w)))); for (line = 1; line <=w->slicetext.slicesrc.n_lines;line++) if (w->slicetext.slicesrc.line[line].n_highlight) side_set (w,line);}SliceSetTop (w,pc) float pc; MultiSliceWidget w;{ int line; int old_top; old_top = w->slicetext.top; if(DEBUG) printf ("Setting Top line %f\n",pc); w->slicetext.top = (int)( w->slicetext.slicesrc.n_lines*pc); if ((pc < 0.0) || (pc > 1.0))w->slicetext.top = 1; if (w->slicetext.top != old_top){ XawScrollbarSetThumb (w->slicetext.scrollbar,pc,-1.0); fakeexpose (w); }}SliceRedraw (w) MultiSliceWidget w;{ fakeexpose (w);}SliceSet (w,line_from,col_from,line_to,col_to,redraw) int line_from,col_from,line_to,col_to,redraw; MultiSliceWidget w;{ int line,ix,at,h; ix = w->slicetext.slicesrc.line[line_from].n_highlight; if (ix+5 > MAXHL) return; ix = w->slicetext.slicesrc.line[line_to].n_highlight; if (ix+5 > MAXHL) return; if(DEBUG) printf ("Setting line %d\n",line); if (DEBUG)printf ("Set (%d,%d)--(%d,%d) <%d>", line_from,col_from,line_to,col_to, w->slicetext.slicesrc.line[line_from].length); if (line_from != line_to){ for (line = line_from; line <= line_to; line++) if ((line <= w->slicetext.slicesrc.n_lines) && (line > 0)){ ix = w->slicetext.slicesrc.line[line].n_highlight; if (ix+5 < MAXHL) w->slicetext.slicesrc.line[line].n_highlight++; w->slicetext.slicesrc.line[line].start[ix] = 0; w->slicetext.slicesrc.line[line].stop[ix] = 0; } line = line_from; ix = w->slicetext.slicesrc.line[line].n_highlight - 1; w->slicetext.slicesrc.line[line].start[ix] = col_from; line = line_to; ix = w->slicetext.slicesrc.line[line].n_highlight - 1; w->slicetext.slicesrc.line[line].stop[ix] = col_to; } else { line = line_from; ix = w->slicetext.slicesrc.line[line].n_highlight; if (ix < MAXHL) w->slicetext.slicesrc.line[line].n_highlight++; w->slicetext.slicesrc.line[line].start[ix] = col_from; w->slicetext.slicesrc.line[line].stop[ix] = col_to; if (DEBUG)printf (" Same line"); } if (DEBUG)printf ("\n"); side_set (w,line_from); if(redraw)fakeexpose (w);}SliceClearAll(w) MultiSliceWidget w;{ int line; if(DEBUG) printf ("Clear %d lines\n",w->slicetext.slicesrc.n_lines); for (line = 1; line <= w->slicetext.slicesrc.n_lines; line++){ if(DEBUG) printf ("Clear Line %d\n",line); fflush(stdout); w->slicetext.slicesrc.line[line].n_highlight = 0; } XFillRectangle (XtDisplay(w),w->slicetext.sidebar, w->slicetext.side_clear_gc,0,0,w->slicetext.side_width, DisplayHeight(XtDisplay(w), DefaultScreen(XtDisplay(w)))); fakeexpose (w);}void MultiSliceSetHook(w,h) void (*h)(); MultiSliceWidget w;{ w->slicetext.hook = h;}find_line_and_file (w,line,fid,line_in_file) int line,*fid,*line_in_file; MultiSliceWidget w;{ int *off,i; off = w->slicetext.slicesrc.offset; if (line > off[w->slicetext.slicesrc.n_files]) line = off[w->slicetext.slicesrc.n_files]; for (i = 1; i < w->slicetext.slicesrc.n_files ; i++){ if (off[i] >= line){ *fid = i - 1; *line_in_file = line - off[i-1]; return; } } *fid = w->slicetext.slicesrc.n_files-1; *line_in_file = line - off[w->slicetext.slicesrc.n_files - 1]; return;}static void MultiSliceHook( w,event,parm,n) MultiSliceWidget w; XEvent* event; String* parm; Cardinal* n;{ static int line = 0; int y; int fid,f_line,nf; if(DEBUG)printf ("event %d buttonrelease (%d) kdn/up(%d %d)\n", event->type, ButtonRelease,KeyPress,KeyRelease); if (event->type == ButtonRelease) y = event->xbutton.y; else if ((event->type == KeyRelease) || (event->type == KeyPress)) y = event->xkey.y; else return; line = w->slicetext.top + y/(w->slicetext.font->ascent + w->slicetext.font->descent); if(DEBUG)printf ("y (%d) line (%d)\n",y,line); find_line_and_file (w,line,&fid,&f_line); printf ("Click on line %d of display (%d of fid %d)\n", line,f_line,fid); if (w->slicetext.hook){ (*w->slicetext.hook)(fid,f_line); }}static void MultiSliceSelect( w,event,parm,n) MultiSliceWidget w; XEvent* event; String* parm; Cardinal* n;{ static int line = 0; static MultiSliceReturn r; int y; if (event->type == ButtonRelease) y = event->xbutton.y; else if ((event->type == KeyRelease) || (event->type == KeyPress)) y = event->xkey.y; else y = 1; line = w->slicetext.top + y/(w->slicetext.font->ascent + w->slicetext.font->descent); if(DEBUG)printf ("y (%d) line (%d)\n",y,line); r.line = line; if (*n == 0) r.message = NULL; else r.message = parm[0]; if (event->xbutton.x >= (w->core.width - w->slicetext.side_width)){ SliceSetTop (w, ((float)y)/((float)(w->core.height?w->core.height:1))); } else XtCallCallbacks((Widget)w,XtNcallback,(XtPointer)&r);}static void MultiSliceAction( w,event,parm,n) MultiSliceWidget w; XEvent* event; String* parm; Cardinal* n;{ static int line = 0; int y; if(DEBUG)printf ("event %d buttonrelease (%d) kdn/up(%d %d)\n", event->type, ButtonRelease,KeyPress,KeyRelease); if (event->type == ButtonRelease) y = event->xbutton.y; else if ((event->type == KeyRelease) || (event->type == KeyPress)) y = event->xkey.y; else return; line = w->slicetext.top + y/(w->slicetext.font->ascent + w->slicetext.font->descent); if(DEBUG)printf ("y (%d) line (%d)\n",y,line); SliceSet (w,line,0,line,0,True);}static XtActionsRec actions[] ={ {"slicetexthook", MultiSliceHook}, {"setslicetext", MultiSliceAction}, {"selectslicetext", MultiSliceSelect},};static char translations[] ="<Btn3Up>: setslicetext() \n\ <Btn2Up>: selectslicetext(\"dice\") \n\ None<Btn1Up>: selectslicetext() \n\ Shift<Btn1Up>: slicetexthook() \n\";MultiSliceClassRec multisliceClassRec = { { /* core fields */ /* superclass */ (WidgetClass) &widgetClassRec, /* class_name */ "MultiSlice", /* widget_size */ sizeof(MultiSliceRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ doinit, /* initialize_hook */ NULL, /* realize */ XtInheritRealize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ SliceResize, /* expose */ doexpose, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ translations, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /* slicetext fields */ /* empty */ 0 }};WidgetClass multisliceWidgetClass = (WidgetClass)&multisliceClassRec;BuildSliceSrc (w,n,f,nlines) MultiSliceWidget w; MultiSliceFilesPtr f; int n; int nlines;{ char *string; int at_line = 1; char *old,*at; int longest_line = 0,lines; SliceSrc *src; int i; if(DEBUG) printf ("Build %d lines\n",nlines); src = &w->slicetext.slicesrc; src->n_lines = 0; src->line = (Line *) malloc ((nlines+2)*sizeof(Line)); if (src->line == NULL){ fprintf (stderr,"Not enough memory for %d lines\n",nlines); exit (1); } src->n_files = n; src->offset = (int *) malloc((n+1)*sizeof(int)); if (src->offset == NULL){ fprintf (stderr,"Not enough memory for %d lines\n",nlines); exit (1); } src->n_files = n; for (i = 0; i < n; i++){ at = f[i].text; src->offset[i] = at_line - 1; if (!at) return; while (*at){ src->line[at_line].text = at; src->line[at_line].n_highlight = 0; old = at; while ((*at != '\0') && (*at != '\n'))at++; src->line[at_line].length = at-old; if (src->line[at_line].length > longest_line) longest_line = src->line[at_line].length; src->n_lines++; at_line++; if(*at)at++; } } src->offset[n] = at_line - 1; src->longest = longest_line; lines = src->n_lines; w->slicetext.log = 0; while (lines > 0){ lines = lines/10; w->slicetext.log++; } SliceResize (w); if(DEBUG) printf (" %d lines, longest %d\n",src->n_lines,longest_line); if (longest_line >= Max_line_length){ fprintf (stderr,"Longest line %d is too long (limit %d)\n", longest_line,Max_line_length); exit(1); }}PrintSliceSrc (w) MultiSliceWidget w;{ int i,l; char *at; SliceSrc *src; src = &w->slicetext.slicesrc; if(DEBUG)printf ("%d lines, longest is %d\n", src->n_lines,src->longest); for ( i = 1; i <= src->n_lines; i++){ at = src->line[i].text; for (l = 0; l < src->line[i].length; l++) if (DEBUG)printf ("%c",*at++); if(DEBUG)printf ("\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -