⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button.c

📁 源码,标准c++用力
💻 C
📖 第 1 页 / 共 3 页
字号:
	TrackText(startSRow, startSCol, endSRow, endSCol);	return;}TrackText(frow, fcol, trow, tcol)    register int frow, fcol, trow, tcol;    /* Guaranteed (frow, fcol) <= (trow, tcol) */{	register int from, to;	register TScreen *screen = &term->screen;	int old_startrow, old_startcol, old_endrow, old_endcol;	old_startrow = screen->startHRow;	old_startcol = screen->startHCol;	old_endrow = screen->endHRow;	old_endcol = screen->endHCol;	if (frow == old_startrow && fcol == old_startcol &&	    trow == old_endrow   && tcol == old_endcol) return;	screen->startHRow = frow;	screen->startHCol = fcol;	screen->endHRow   = trow;	screen->endHCol   = tcol;	from = Coordinate(frow, fcol);	to = Coordinate(trow, tcol);	if (to <= screen->startHCoord || from > screen->endHCoord) {	    /* No overlap whatsoever between old and new hilite */	    ReHiliteText(old_startrow, old_startcol, old_endrow, old_endcol);	    ReHiliteText(frow, fcol, trow, tcol);	} else {	    if (from < screen->startHCoord) {		    /* Extend left end */		    ReHiliteText(frow, fcol, old_startrow, old_startcol);	    } else if (from > screen->startHCoord) {		    /* Shorten left end */		    ReHiliteText(old_startrow, old_startcol, frow, fcol);	    }	    if (to > screen->endHCoord) {		    /* Extend right end */		    ReHiliteText(old_endrow, old_endcol, trow, tcol);	    } else if (to < screen->endHCoord) {		    /* Shorten right end */		    ReHiliteText(trow, tcol, old_endrow, old_endcol);	    }	}	screen->startHCoord = from;	screen->endHCoord = to;}static voidReHiliteText(frow, fcol, trow, tcol)    register int frow, fcol, trow, tcol;    /* Guaranteed that (frow, fcol) <= (trow, tcol) */{	register TScreen *screen = &term->screen;	register int i;	if (frow < 0)	    frow = fcol = 0;	else if (frow > screen->max_row)	    return;		/* nothing to do, since trow >= frow */	if (trow < 0)	    return;		/* nothing to do, since frow <= trow */	else if (trow > screen->max_row) {	    trow = screen->max_row;	    tcol = screen->max_col+1;	}	if (frow == trow && fcol == tcol)		return;	if(frow != trow) {	/* do multiple rows */		if((i = screen->max_col - fcol + 1) > 0) {     /* first row */		    ScrnRefresh(screen, frow, fcol, 1, i, True);		}		if((i = trow - frow - 1) > 0) {		       /* middle rows*/		    ScrnRefresh(screen, frow+1, 0,i, screen->max_col+1, True);		}		if(tcol > 0 && trow <= screen->max_row) {      /* last row */		    ScrnRefresh(screen, trow, 0, 1, tcol, True);		}	} else {		/* do single row */		ScrnRefresh(screen, frow, fcol, 1, tcol - fcol, True);	}}static _OwnSelection();static voidSaltTextAway(crow, ccol, row, col, params, num_params)    /*register*/ int crow, ccol, row, col;    String *params;			/* selections */    Cardinal num_params;    /* Guaranteed that (crow, ccol) <= (row, col), and that both points are valid       (may have row = screen->max_row+1, col = 0) */{	register TScreen *screen = &term->screen;	register int i, j = 0;	int eol;	char *line, *lp;	if (crow == row && ccol > col) {	    int tmp = ccol;	    ccol = col;	    col = tmp;	}	--col;	/* first we need to know how long the string is before we can save it*/	if ( row == crow ) j = Length(screen, crow, ccol, col);	else {	/* two cases, cut is on same line, cut spans multiple lines */		j += Length(screen, crow, ccol, screen->max_col) + 1;		for(i = crow + 1; i < row; i++) 			j += Length(screen, i, 0, screen->max_col) + 1;		if (col >= 0)			j += Length(screen, row, 0, col);	}		/* now get some memory to save it in */	if (screen->selection_size <= j) {	    if((line = malloc((unsigned) j + 1)) == (char *)NULL)		SysError(ERROR_BMALLOC2);	    XtFree(screen->selection);	    screen->selection = line;	    screen->selection_size = j + 1;	} else line = screen->selection;	if (!line || j < 0) return;	line[j] = '\0';		/* make sure it is null terminated */	lp = line;		/* lp points to where to save the text */	if ( row == crow ) lp = SaveText(screen, row, ccol, col, lp, &eol);	else {		lp = SaveText(screen, crow, ccol, screen->max_col, lp, &eol);		if (eol)			*lp ++ = '\n';	/* put in newline at end of line */		for(i = crow +1; i < row; i++) {			lp = SaveText(screen, i, 0, screen->max_col, lp, &eol);			if (eol)				*lp ++ = '\n';			}		if (col >= 0)			lp = SaveText(screen, row, 0, col, lp, &eol);	}	*lp = '\0';		/* make sure we have end marked */		screen->selection_length = (lp - line);	_OwnSelection(term, params, num_params);}static Boolean ConvertSelection(w, selection, target,				type, value, length, format)Widget w;Atom *selection, *target, *type;XtPointer *value;unsigned long *length;int *format;{    Display* d = XtDisplay(w);    XtermWidget xterm = (XtermWidget)w;    if (xterm->screen.selection == NULL) return False; /* can this happen? */    if (*target == XA_TARGETS(d)) {	Atom* targetP;	Atom* std_targets;	unsigned long std_length;	XmuConvertStandardSelection(		    w, xterm->screen.selection_time, selection,		    target, type, (caddr_t*)&std_targets, &std_length, format		   );	*length = std_length + 5;	*value = (XtPointer)XtMalloc(sizeof(Atom)*(*length));	targetP = *(Atom**)value;	*targetP++ = XA_STRING;	*targetP++ = XA_TEXT(d);	*targetP++ = XA_COMPOUND_TEXT(d);	*targetP++ = XA_LENGTH(d);	*targetP++ = XA_LIST_LENGTH(d);	bcopy((char*)std_targets, (char*)targetP, sizeof(Atom)*std_length);	XtFree((char*)std_targets);	*type = XA_ATOM;	*format = 32;	return True;    }    if (*target == XA_STRING ||	*target == XA_TEXT(d) ||	*target == XA_COMPOUND_TEXT(d)) {	if (*target == XA_COMPOUND_TEXT(d))	    *type = *target;	else	    *type = XA_STRING;	*value = xterm->screen.selection;	*length = xterm->screen.selection_length;	*format = 8;	return True;    }    if (*target == XA_LIST_LENGTH(d)) {	*value = XtMalloc(4);	if (sizeof(long) == 4)	    *(long*)*value = 1;	else {	    long temp = 1;	    bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);	}	*type = XA_INTEGER;	*length = 1;	*format = 32;	return True;    }    if (*target == XA_LENGTH(d)) {	*value = XtMalloc(4);	if (sizeof(long) == 4)	    *(long*)*value = xterm->screen.selection_length;	else {	    long temp = xterm->screen.selection_length;	    bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);	}	*type = XA_INTEGER;	*length = 1;	*format = 32;	return True;    }    if (XmuConvertStandardSelection(w, xterm->screen.selection_time, selection,				    target, type,				    (caddr_t *)value, length, format))	return True;    /* else */    return False;}static void LoseSelection(w, selection)  Widget w;  Atom *selection;{    register TScreen* screen = &((XtermWidget)w)->screen;    register Atom* atomP;    int i;    for (i = 0, atomP = screen->selection_atoms;	 i < screen->selection_count; i++, atomP++)    {	if (*selection == *atomP) *atomP = (Atom)0;	switch (*atomP) {	  case XA_CUT_BUFFER0:	  case XA_CUT_BUFFER1:	  case XA_CUT_BUFFER2:	  case XA_CUT_BUFFER3:	  case XA_CUT_BUFFER4:	  case XA_CUT_BUFFER5:	  case XA_CUT_BUFFER6:	  case XA_CUT_BUFFER7:	*atomP = (Atom)0;	}    }    for (i = screen->selection_count; i; i--) {	if (screen->selection_atoms[i-1] != 0) break;    }    screen->selection_count = i;    for (i = 0, atomP = screen->selection_atoms;	 i < screen->selection_count; i++, atomP++)    {	if (*atomP == (Atom)0) {	    *atomP = screen->selection_atoms[--screen->selection_count];	}    }    if (screen->selection_count == 0)	TrackText(0, 0, 0, 0);}/* ARGSUSED */static void SelectionDone(w, selection, target)Widget w;Atom *selection, *target;{    /* empty proc so Intrinsics know we want to keep storage */}static /* void */ _OwnSelection(termw, selections, count)    register XtermWidget termw;    String *selections;    Cardinal count;{    Atom* atoms = termw->screen.selection_atoms;    int i;    Boolean have_selection = False;    if (termw->screen.selection_length < 0) return;    if (count > termw->screen.sel_atoms_size) {	XtFree((char*)atoms);	atoms = (Atom*)XtMalloc(count*sizeof(Atom));	termw->screen.selection_atoms = atoms;	termw->screen.sel_atoms_size = count;    }    XmuInternStrings( XtDisplay((Widget)termw), selections, count, atoms );    for (i = 0; i < count; i++) {	int cutbuffer;	switch (atoms[i]) {	  case XA_CUT_BUFFER0: cutbuffer = 0; break;	  case XA_CUT_BUFFER1: cutbuffer = 1; break;	  case XA_CUT_BUFFER2: cutbuffer = 2; break;	  case XA_CUT_BUFFER3: cutbuffer = 3; break;	  case XA_CUT_BUFFER4: cutbuffer = 4; break;	  case XA_CUT_BUFFER5: cutbuffer = 5; break;	  case XA_CUT_BUFFER6: cutbuffer = 6; break;	  case XA_CUT_BUFFER7: cutbuffer = 7; break;	  default:	       cutbuffer = -1;	}	if (cutbuffer >= 0)	    if ( termw->screen.selection_length >		 4*XMaxRequestSize(XtDisplay((Widget)termw))-32)		fprintf(stderr,			"%s: selection too big (%d bytes), not storing in CUT_BUFFER%d\n",			xterm_name, termw->screen.selection_length, cutbuffer);	    else		XStoreBuffer( XtDisplay((Widget)termw), termw->screen.selection,			      termw->screen.selection_length, cutbuffer );	else if (!replyToEmacs) {	    have_selection |=		XtOwnSelection( (Widget)termw, atoms[i],			    termw->screen.selection_time,			    ConvertSelection, LoseSelection, SelectionDone );	}    }    if (!replyToEmacs)	termw->screen.selection_count = count;    if (!have_selection)	TrackText(0, 0, 0, 0);}/* void */DisownSelection(termw)    register XtermWidget termw;{    Atom* atoms = termw->screen.selection_atoms;    Cardinal count = termw->screen.selection_count;    int i;    for (i = 0; i < count; i++) {	int cutbuffer;	switch (atoms[i]) {	  case XA_CUT_BUFFER0: cutbuffer = 0; break;	  case XA_CUT_BUFFER1: cutbuffer = 1; break;	  case XA_CUT_BUFFER2: cutbuffer = 2; break;	  case XA_CUT_BUFFER3: cutbuffer = 3; break;	  case XA_CUT_BUFFER4: cutbuffer = 4; break;	  case XA_CUT_BUFFER5: cutbuffer = 5; break;	  case XA_CUT_BUFFER6: cutbuffer = 6; break;	  case XA_CUT_BUFFER7: cutbuffer = 7; break;	  default:	       cutbuffer = -1;	}	if (cutbuffer < 0)	    XtDisownSelection( (Widget)termw, atoms[i],			       termw->screen.selection_time );    }    termw->screen.selection_count = 0;    termw->screen.startHRow = termw->screen.startHCol = 0;    termw->screen.endHRow = termw->screen.endHCol = 0;}/* returns number of chars in line from scol to ecol out *//* ARGSUSED */static intLength(screen, row, scol, ecol)    register int row, scol, ecol;    register TScreen *screen;{        register int lastcol = LastTextCol(row);	if (ecol > lastcol)	    ecol = lastcol;	return (ecol - scol + 1);}/* copies text into line, preallocated */static char *SaveText(screen, row, scol, ecol, lp, eol)    int row;    int scol, ecol;    TScreen *screen;    register char *lp;		/* pointer to where to put the text */    int *eol;{	register int i = 0;	register Char *ch = screen->buf[4 * (row + screen->topline)];	Char attr;	register int c;	*eol = 0;	i = Length(screen, row, scol, ecol);	ecol = scol + i;	if (*eol == 0) {		if(ScrnGetAttributes(screen, row + screen->topline, 0, &attr, 1) == 1) {			*eol = (attr & LINEWRAPPED) ? 0 : 1;		} else {			/* If we can't get the attributes, assume no wrap */			/* CANTHAPPEN */			(void)fprintf(stderr, "%s: no attributes for %d, %d\n",				xterm_name, row, ecol - 1);			*eol = 1;		}	}	for (i = scol; i < ecol; i++) {	        c = ch[i];		if (c == 0)			c = ' ';		else if(c < ' ') {			if(c == '\036')				c = '#'; /* char on screen is pound sterling */			else				c += 0x5f; /* char is from DEC drawing set */		} else if(c == 0x7f)			c = 0x5f;		*lp++ = c;	}	return(lp);}static voidEditorButton(event)    register XButtonEvent *event;{	register TScreen *screen = &term->screen;	int pty = screen->respond;	char line[6];	register unsigned row, col;	int button; 	button = event->button - 1; 	row = (event->y - screen->border) 	 / FontHeight(screen);	col = (event->x - screen->border - screen->scrollbar)	 / FontWidth(screen);	(void) strcpy(line, "\033[M");	if (screen->send_mouse_pos == 1) {		line[3] = ' ' + button;	} else {		line[3] = ' ' + (KeyState(event->state) << 2) + 			((event->type == ButtonPress)? button:3);	}	line[4] = ' ' + col + 1;	line[5] = ' ' + row + 1;	v_write(pty, line, 6);}/*ARGSUSED*/void HandleGINInput (w, event, param_list, nparamsp)    Widget w;    XEvent *event;    String *param_list;    Cardinal *nparamsp;{    if (term->screen.TekGIN && *nparamsp == 1) {	int c = param_list[0][0];	switch (c) {	  case 'l': case 'm': case 'r':	  case 'L': case 'M': case 'R':	    break;	  default:	    Bell ();			/* let them know they goofed */	    c = 'l';			/* provide a default */	}	TekEnqMouse (c | 0x80);	TekGINoff();    } else {	Bell ();    }}/* ARGSUSED */void HandleSecure(w, event, params, param_count)    Widget w;    XEvent *event;		/* unused */    String *params;		/* [0] = volume */    Cardinal *param_count;	/* 0 or 1 */{    Time time = CurrentTime;    if ((event->xany.type == KeyPress) ||	(event->xany.type == KeyRelease))	time = event->xkey.time;    else if ((event->xany.type == ButtonPress) ||	     (event->xany.type == ButtonRelease))      time = event->xbutton.time;    DoSecureKeyboard (time);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -