📄 xterm-patch
字号:
+#define CASE_TAKE_DONE 133 #endif /* included_VTparse_h */diff -Naur xterm-200/button.c xterm-200-new/button.c--- xterm-200/button.c 2005-02-06 16:42:37.000000000 -0500+++ xterm-200-new/button.c 2005-04-06 11:31:46.000000000 -0400@@ -1174,7 +1174,9 @@ return cutbuffer; } -static void+int base64_paste = 0; /* Set if paste data should be sent as base64 */++void _GetSelection(Widget w, Time ev_time, String * params, /* selections in precedence order */@@ -1208,19 +1210,34 @@ int fmt8 = 8; Atom type = XA_STRING; char *line;+ int x;++ /* Selection from X server */++#if OPT_WIDE_CHARS+ /* Joe Allen - 2005-4-4: assume X's cut buffer is UTF-8 if+ the xterm is UTF-8 */+ if (term->screen.utf8_mode)+ type = XA_UTF8_STRING(XtDisplay(w));+#endif /* 'line' is freed in SelectionReceived */ line = XFetchBuffer(XtDisplay(w), &inbytes, cutbuffer); nbytes = (unsigned long) inbytes;+ if (nbytes > 0) SelectionReceived(w, NULL, &selection, &type, (XtPointer) line, &nbytes, &fmt8); else if (num_params > 1) _GetSelection(w, ev_time, params + 1, num_params - 1, NULL);+ else+ base64_paste = 0; return; } else { struct _SelectionList *list; + /* Selection owned by someone */+ if (targets == NULL || targets[0] == None) { targets = _SelectionTargets(w); }@@ -1280,9 +1297,65 @@ # define tty_vwrite(pty,lag,l) v_write(pty,lag,l) #endif /* defined VMS */ +/* Return base64 code character given 6-bit number */++char base64_code[]="\+ABCDEFGHIJKLMNOPQRSTUVWXYZ\+abcdefghijklmnopqrstuvwxyz\+0123456789+/";++/* Be careful: _qWriteSelectionData expects these to be initialized+ to zero. Base64_flush() is the last step of the conversion, it+ clears these variables. */++int base64_accu = 0;+int base64_count = 0;+int base64_pad = 0;+ static void _qWriteSelectionData(TScreen * screen, Char * lag, unsigned length) {+ if (base64_paste) {+ /* Send data as base64 */+ unsigned char *p = (unsigned char *)lag;+ Char buf[64];+ unsigned x = 0;+ while (length--) {+ switch (base64_count) {+ case 0:+ buf[x++] = base64_code[*p >> 2];+ base64_accu = (*p & 0x3);+ base64_count = 2;+ ++p;+ break;+ case 2:+ buf[x++] = base64_code[(base64_accu << 4) + (*p >> 4)];+ base64_accu = (*p & 0xF);+ base64_count = 4;+ ++p;+ break;+ case 4:+ buf[x++] = base64_code[(base64_accu << 2) + (*p >> 6)];+ buf[x++] = base64_code[*p & 0x3F];+ base64_accu = 0;+ base64_count = 0;+ ++p;+ break;+ }+ if (x >= 63) {+ /* Write 63 or 64 characters */+ base64_pad += x;+ tty_vwrite(screen->respond, buf, x);+ x = 0;+ }+ }+ if (x != 0) {+ base64_pad += x;+ tty_vwrite(screen->respond, buf, x);+ }+ return;+ }+ #if OPT_READLINE if (SCREEN_FLAG(screen, paste_quotes)) { while (length--) {@@ -1295,6 +1368,29 @@ } static void+base64_flush(TScreen *screen)+{+ unsigned char x;+ switch (base64_count) {+ case 0:+ break;+ case 2:+ x = base64_code[base64_accu << 4];+ tty_vwrite(screen->respond, &x, 1);+ break;+ case 4:+ x = base64_code[base64_accu << 2];+ tty_vwrite(screen->respond, &x, 1);+ break;+ }+ if (base64_pad & 3)+ tty_vwrite(screen->respond, "===", 4 - (base64_pad & 3));+ base64_count = 0;+ base64_accu = 0;+ base64_pad = 0;+}++static void _WriteSelectionData(TScreen * screen, Char * line, int length) { /* Write data to pty a line at a time. */@@ -1325,13 +1421,14 @@ if (lag != end) { _qWriteSelectionData(screen, lag, (unsigned) (end - lag)); }+ if (base64_paste)+ base64_flush(screen); #ifdef VMS tt_pasting = False; tt_start_read(); /* reenable reads or a character may be lost */ #endif } -#if OPT_READLINE static void _WriteKey(TScreen * screen, Char * in) {@@ -1350,7 +1447,6 @@ line[count++] = '~'; tty_vwrite(screen->respond, line, count); }-#endif /* OPT_READLINE */ /* SelectionReceived: stuff received selection text into pty */ @@ -1434,18 +1530,20 @@ if (text_list != NULL && text_list_count != 0) { int i; -#if OPT_READLINE- if (SCREEN_FLAG(screen, paste_brackets))+ if (base64_paste)+ _WriteKey(screen, "202");+ else if (screen->paste_brackets) _WriteKey(screen, "200");-#endif for (i = 0; i < text_list_count; i++) { int len = strlen(text_list[i]); _WriteSelectionData(screen, (Char *) text_list[i], len); }-#if OPT_READLINE- if (SCREEN_FLAG(screen, paste_brackets))+ if (base64_paste) {+ tty_vwrite(screen->respond, "\33", 1);+ base64_paste = 0;+ }+ else if (screen->paste_brackets) _WriteKey(screen, "201");-#endif XFreeStringList(text_list); } else goto fail;@@ -1461,6 +1559,8 @@ _GetSelection(w, list->time, list->params, list->count, list->targets); XtFree((char *) client_data);+ } else {+ base64_paste = 0; } return; }@@ -2452,6 +2552,96 @@ _OwnSelection(term, params, num_params); } +void ClearSelectionBuffer()+{+ TScreen *screen = &term->screen;+ screen->selection_length = 0;+ base64_count = 0;+}++void AppendStrToSelectionBuffer(Char *text,int len)+{+ TScreen *screen = &term->screen;+ if (len != 0) {+ int j = screen->selection_length + len; /* New length */+ int k = j + (j >> 2) + 80; /* New size if we grow buffer: grow by ~50% */+ if (j + 1 >= screen->selection_size) {+ if (!screen->selection_length) {+ /* New buffer */+ Char *line;+ if ((line = (Char *) malloc((unsigned) k)) == 0)+ SysError(ERROR_BMALLOC2);+ XtFree((char *) screen->selection_data);+ screen->selection_data = line;+ } else {+ /* Realloc buffer */+ screen->selection_data = (Char *) realloc(screen->selection_data, (unsigned) k);+ if (screen->selection_data == 0)+ SysError(ERROR_BMALLOC2);+ }+ screen->selection_size = k;+ }+ memcpy(screen->selection_data + screen->selection_length, text, len);+ screen->selection_length += len;+ screen->selection_data[screen->selection_length] = 0;+ }+}++void AppendToSelectionBuffer(unsigned c)+{+ int six;+ Char ch;++ /* Decode base64 character */+ if (c >= 'A' && c <= 'Z')+ six = c - 'A';+ else if (c >= 'a' && c <= 'z')+ six = c - 'a' + 26;+ else if (c >= '0' && c <= '9')+ six = c - '0' + 52;+ else if (c == '+')+ six = 62;+ else+ six = 63;++ /* Accumulate bytes */+ switch (base64_count) {+ case 0:+ base64_accu = six;+ base64_count = 6;+ break;++ case 2:+ ch = (base64_accu << 6) + six;+ base64_count = 0;+ AppendStrToSelectionBuffer(&ch, 1);+ break;++ case 4:+ ch = (base64_accu << 4) + (six >> 2);+ base64_accu = (six & 0x3);+ base64_count = 2;+ AppendStrToSelectionBuffer(&ch, 1);+ break;++ case 6:+ ch = (base64_accu << 2) + (six >> 4);+ base64_accu = (six & 0xF);+ base64_count = 4;+ AppendStrToSelectionBuffer(&ch, 1);+ break;+ }+}++extern char *select_args[]; /* in charproc.c */++void CompleteSelection()+{+ base64_count = 0;+ base64_accu = 0;+ _OwnSelection(term, select_args, 2);+}+ static Bool _ConvertSelectionHelper(Widget w, Atom * type, XtPointer *value,@@ -2715,9 +2905,14 @@ */ unsigned long length = termw->screen.selection_length; Char *data = termw->screen.selection_data;+#ifdef junk+/* These days it's better to assume that X server's cut & paste buffers+ are UTF-8 when the locale is UTF-8.+ Joe Allen, 2005-04-04 */ if_OPT_WIDE_CHARS((&(termw->screen)), { data = UTF8toLatin1(data, length, &length); });+#endif TRACE(("XStoreBuffer(%d)\n", cutbuffer)); XStoreBuffer(XtDisplay((Widget) termw), (char *) data,@@ -2885,6 +3080,18 @@ return (result); } +/* 32 + following 7-bit word:++ 1:0 Button no: 0, 1, 2. 3=release.+ 2 shift+ 3 meta+ 4 ctrl+ 5 set for motion notify+ 6 set for wheel+*/++/* Position: 32 - 255. */+ static int BtnCode(XButtonEvent * event, int button) {@@ -2904,6 +3111,16 @@ #define MOUSE_LIMIT (255 - 32) +/* When screen->out_of_frame set, coordinates can go outside+ of frame as follows:+ Code Coord + ---- -----+ 33 - 240 1 - 208 (208 positive coordinates)+ 32, 255 - 241 0, -1 - -15 (16 negative coordinates)++ When range is exceeded, the maximum closest value is sent+*/+ static void EditorButton(XButtonEvent * event) {@@ -2923,20 +3140,41 @@ row = (event->y - screen->border) / FontHeight(screen); col = (event->x - OriginX(screen)) / FontWidth(screen); - /* Limit to screen dimensions */- if (row < 0)- row = 0;- else if (row > screen->max_row)- row = screen->max_row;- else if (row > MOUSE_LIMIT)- row = MOUSE_LIMIT;-- if (col < 0)- col = 0;- else if (col > screen->max_col)- col = screen->max_col;- else if (col > MOUSE_LIMIT)- col = MOUSE_LIMIT;+ if (screen->out_of_frame) {+ if (row > 207)+ row = 207;+ else if (row < -16)+ row = 208;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -