XFree86 3.1.2Ec - xterm patch #18 - 1996/7/18 - T.Dickey
This implements the following:
+ escape sequences that act like the CDE dtterm's window operations
(though I have implemented the default width and height -- I've seen
a rather buggy dtterm running that seems to treat width=0 or height=0
literally -- maybe that's a feature, not a bug?)
+ minor tweak to the screen-repainting when resizing (I still cannot
entirely get rid of flicker).
+ still more fixes to terminfo & termcap (I corrected my error for
the hpa code and added some other stuff by comparing to ncurses'
description and rxvt's).
+ a tweak to the patch by Michael Rohleder for the color translation
+ re-order attribute codes to allow later implementation of protected
fields (dtterm supposedly does this; it's probably more useful than
blinking or invisible text -- that uses up all of the available bits
without changing the attribute scheme radically).
My to-do list:
+ debug this on IRIX 5.2 (I've got lousy debugging aids there, and
simply haven't had time til this week to spend the off-hours time
I'll need to troubleshoot the problem).
+ try to reduce the memory usage of the savedLines (I think that it's
feasible to suppress the memory allocated for fore/back color codes
if the user hasn't enabled color).
+ time permitting, implement the protected fields (that's mainly
by modifying the logic for the clear-line and clear-screen functions).
(I have a number of items beyond these that I won't have time to do before 3.2
is frozen).
--------------------------------------------------------------------------------
VTPrsTbl.c | 11 +-
VTparse.def | 1
VTparse.h | 1
charproc.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++----------
ptyx.h | 16 ++-
screen.c | 20 ++--
termcap | 4
terminfo | 38 +++++---
util.c | 4
9 files changed, 284 insertions, 79 deletions
--------------------------------------------------------------------------------
Index: VTPrsTbl.c
--- xterm+/VTPrsTbl.c Mon Jul 8 12:42:24 1996
+++ xterm_a/VTPrsTbl.c Wed Jul 17 19:57:24 1996
@@ -36,7 +36,7 @@
/*
* Stupid Apollo C preprocessor can't handle long lines. So... To keep
- * it happy, we put each onto a seperate line.... Sigh...
+ * it happy, we put each onto a separate line.... Sigh...
*/
Const int groundtable[] =
@@ -486,7 +486,7 @@
CASE_GROUND_STATE,
CASE_GROUND_STATE,
/* ` a b c */
-CASE_GROUND_STATE,
+CASE_HPA,
CASE_GROUND_STATE,
CASE_GROUND_STATE,
CASE_DA1,
@@ -498,7 +498,7 @@
/* h i j k */
CASE_SET,
CASE_GROUND_STATE,
-CASE_HPA,
+CASE_GROUND_STATE,
CASE_GROUND_STATE,
/* l m n o */
CASE_RST,
@@ -511,7 +511,7 @@
CASE_DECSTBM,
CASE_DECSC,
/* t u v w */
-CASE_GROUND_STATE,
+CASE_XTERM_WINOPS,
CASE_DECRC,
CASE_GROUND_STATE,
CASE_GROUND_STATE,
@@ -1068,8 +1068,7 @@
CASE_IGNORE,
CASE_IGNORE,
CASE_IGNORE,
-/* ,
- - . / */
+/* , - . / */
CASE_IGNORE,
CASE_IGNORE,
CASE_IGNORE,
Index: VTparse.def
--- xterm+/VTparse.def Mon Jul 8 12:42:24 1996
+++ xterm_a/VTparse.def Wed Jul 17 19:57:24 1996
@@ -79,3 +79,4 @@
CASE_HP_BUGGY_LL
CASE_HPA
CASE_VPA
+CASE_XTERM_WINOPS
Index: VTparse.h
--- xterm+/VTparse.h Mon Jul 8 12:42:24 1996
+++ xterm_a/VTparse.h Wed Jul 17 19:57:24 1996
@@ -109,3 +109,4 @@
#define CASE_HP_BUGGY_LL 70
#define CASE_HPA 71
#define CASE_VPA 72
+#define CASE_XTERM_WINOPS 73
Index: charproc.c
--- xterm+/charproc.c Mon Jul 8 12:42:24 1996
+++ xterm_a/charproc.c Thu Jul 18 21:39:16 1996
@@ -123,6 +123,7 @@
static int set_character_class PROTO((char *s));
static void DoSetSelectedFont PROTO_XT_SEL_CB_ARGS;
static void FromAlternate PROTO((TScreen *screen));
+static void RequestResize PROTO((XtermWidget termw, int rows, int cols, int text));
static void SwitchBufs PROTO((TScreen *screen));
static void ToAlternate PROTO((TScreen *screen));
static void VTGraphicsOrNoExpose PROTO((XEvent *event));
@@ -136,10 +137,12 @@
static void dotext PROTO((TScreen *screen, unsigned flags, int charset, Char *buf, Char *ptr, unsigned fg, unsigned bg));
static void dpmodes PROTO((XtermWidget termw, void (*func)(unsigned *p, int mask)));
static void restoremodes PROTO((XtermWidget termw));
+static void report_win_label PROTO((TScreen *screen, int code, XTextProperty *text, Status ok));
static void savemodes PROTO((XtermWidget termw));
static void set_vt_box PROTO((TScreen *screen));
static void unparseputn PROTO((unsigned int n, int fd));
static void update_font_info PROTO((TScreen *screen, Bool doresize));
+static void window_ops PROTO((XtermWidget termw));
#define DEFAULT -1
#define TEXT_BUF_SIZE 256
@@ -1435,6 +1438,11 @@
restoremodes(term);
parsestate = groundtable;
break;
+
+ case CASE_XTERM_WINOPS:
+ window_ops(term);
+ parsestate = groundtable;
+ break;
}
}
}
@@ -1953,28 +1961,8 @@
CursorSet(screen, 0, 0, termw->flags);
if((j = func == bitset ? 132 : 80) !=
((termw->flags & IN132COLUMNS) ? 132 : 80) ||
- j != screen->max_col + 1) {
- Dimension replyWidth, replyHeight;
- XtGeometryResult status;
-
- status = XtMakeResizeRequest (
- (Widget) termw,
- (Dimension) FontWidth(screen) * j
- + 2*screen->border
- + screen->scrollbar,
- (Dimension) FontHeight(screen)
- * (screen->max_row + 1)
- + 2 * screen->border,
- &replyWidth, &replyHeight);
-
- if (status == XtGeometryYes ||
- status == XtGeometryDone) {
- ScreenResize (&termw->screen,
- replyWidth,
- replyHeight,
- &termw->flags);
- }
- }
+ j != screen->max_col + 1)
+ RequestResize(termw, 0, j, TRUE);
(*func)(&termw->flags, IN132COLUMNS);
}
break;
@@ -2181,27 +2169,8 @@
CursorSet(screen, 0, 0, termw->flags);
if((j = (screen->save_modes[1] & IN132COLUMNS)
? 132 : 80) != ((termw->flags & IN132COLUMNS)
- ? 132 : 80) || j != screen->max_col + 1) {
- Dimension replyWidth, replyHeight;
- XtGeometryResult status;
- status = XtMakeResizeRequest (
- (Widget) termw,
- (Dimension) FontWidth(screen) * j
- + 2*screen->border
- + screen->scrollbar,
- (Dimension) FontHeight(screen)
- * (screen->max_row + 1)
- + 2*screen->border,
- &replyWidth, &replyHeight);
-
- if (status == XtGeometryYes ||
- status == XtGeometryDone) {
- ScreenResize (&termw->screen,
- replyWidth,
- replyHeight,
- &termw->flags);
- }
- }
+ ? 132 : 80) || j != screen->max_col + 1)
+ RequestResize(termw, 0, j, TRUE);
termw->flags &= ~IN132COLUMNS;
termw->flags |= screen->save_modes[1] &
IN132COLUMNS;
@@ -2290,6 +2259,173 @@
}
/*
+ * Report window label (icon or title) in dtterm protocol
+ * ESC ] code label ESC backslash
+ */
+static void
+report_win_label(screen, code, text, ok)
+ TScreen *screen;
+ int code;
+ XTextProperty *text;
+ Status ok;
+{
+ char **list;
+ int length = 0;
+
+ reply.a_type = ESC;
+ unparseputc(ESC, screen->respond);
+ unparseputc(']', screen->respond);
+ unparseputc(code, screen->respond);
+
+ if (ok
+ && XTextPropertyToStringList(text, &list, &length)) {
+ int n, c;
+ for (n = 0; n < length; n++) {
+ char *s = list[n];
+ while ((c = *s++) != '\0')
+ unparseputc(c, screen->respond);
+ }
+ XFreeStringList(list);
+ }
+
+ unparseputc(ESC, screen->respond);
+ unparseputc('\\', screen->respond);
+}
+
+/*
+ * Window operations (from CDE dtterm description)
+ */
+static void
+window_ops(termw)
+ XtermWidget termw;
+{
+ register TScreen *screen = &termw->screen;
+ XWindowChanges values;
+ XWindowAttributes win_attrs;
+ XTextProperty text;
+ unsigned int value_mask;
+ Position x, y;
+
+ switch (param[0]) {
+ case 1: /* Restore (de-iconify) window */
+ XMapWindow(screen->display,
+ VShellWindow);
+ break;
+
+ case 2: /* Minimize (iconify) window */
+ XIconifyWindow(screen->display,
+ VShellWindow,
+ DefaultScreen(screen->display));
+ break;
+
+ case 3: /* Move the window to the given position */
+ values.x = param[1];
+ values.y = param[2];
+ value_mask = (CWX | CWY);
+ XReconfigureWMWindow(
+ screen->display,
+ VShellWindow,
+ DefaultScreen(screen->display),
+ value_mask,
+ &values);
+ break;
+
+ case 4: /* Resize the window to given size in pixels */
+ RequestResize(termw, param[1], param[2], FALSE);
+ break;
+
+ case 5: /* Raise the window to the front of the stack */
+ XRaiseWindow(screen->display, VShellWindow);
+ break;
+
+ case 6: /* Lower the window to the bottom of the stack */
+ XLowerWindow(screen->display, VShellWindow);
+ break;
+
+ case 7: /* Refresh the window */
+ Redraw();
+ break;
+
+ case 8: /* Resize the text-area, in characters */
+ RequestResize(termw, param[1], param[2], TRUE);
+ break;
+
+ case 11: /* Report the window's state */
+ XGetWindowAttributes(screen->display,
+ VWindow(screen),
+ &win_attrs);
+ reply.a_type = CSI;
+ reply.a_pintro = 0;
+ reply.a_nparam = 1;
+ reply.a_param[0] = (win_attrs.map_state == IsViewable) ? 1 : 2;
+ reply.a_inters = 0;
+ reply.a_final = 't';
+ unparseseq(&reply, screen->respond);
+ break;
+
+ case 13: /* Report the window's position */
+ XtTranslateCoords(toplevel, 0, 0, &x, &y);
+ reply.a_type = CSI;
+ reply.a_pintro = 0;
+ reply.a_nparam = 3;
+ reply.a_param[0] = 3;
+ reply.a_param[1] = x;
+ reply.a_param[2] = y;
+ reply.a_inters = 0;
+ reply.a_final = 't';
+ unparseseq(&reply, screen->respond);
+ break;
+
+ case 14: /* Report the window's size in pixels */
+ XGetWindowAttributes(screen->display,
+ VWindow(screen),
+ &win_attrs);
+ reply.a_type = CSI;
+ reply.a_pintro = 0;
+ reply.a_nparam = 3;
+ reply.a_param[0] = 4;
+ /*FIXME: find if dtterm uses
+ * win_attrs.height or Height
+ * win_attrs.width or Width
+ */
+ reply.a_param[1] = Height(screen);
+ reply.a_param[2] = Width(screen);
+ reply.a_inters = 0;
+ reply.a_final = 't';
+ unparseseq(&reply, screen->respond);
+ break;
+
+ case 18: /* Report the text's size in characters */
+ reply.a_type = CSI;
+ reply.a_pintro = 0;
+ reply.a_nparam = 3;
+ reply.a_param[0] = 8;
+ reply.a_param[1] = screen->max_row + 1;
+ reply.a_param[2] = screen->max_col + 1;
+ reply.a_inters = 0;
+ reply.a_final = 't';
+ unparseseq(&reply, screen->respond);
+ break;
+
+ case 20: /* Report the icon's label */
+ report_win_label(screen, 'L', &text,
+ XGetWMIconName(
+ screen->display,
+ VShellWindow,
+ &text));
+ break;
+
+ case 21: /* Report the window's title */
+ report_win_label(screen, 'l', &text,
+ XGetWMName(
+ screen->display,
+ VShellWindow,
+ &text));
+ break;
+ }
+}
+
+/*
* set a bit in a word given a pointer to the word and a mask.
*/
static void bitset(p, mask)
@@ -2542,6 +2678,52 @@
&term->flags);
}
+
+static void RequestResize(termw, rows, cols, text)
+ XtermWidget termw;
+ int rows;
+ int cols;
+ int text;
+{
+ register TScreen *screen = &termw->screen;
+ Dimension replyWidth, replyHeight;
+ Dimension askedWidth, askedHeight;
+ XtGeometryResult status;
+
+ askedWidth = cols;
+ askedHeight = rows;
+ if (text) {
+ if (askedHeight <= 0)
+ askedHeight = screen->max_row + 1;
+ if (askedWidth <= 0)
+ askedWidth = screen->max_col + 1;
+
+ askedWidth *= FontWidth(screen);
+ askedHeight *= FontHeight(screen);
+
+ askedWidth += (2 * screen->border) + screen->scrollbar;
+ askedHeight += (2 * screen->border);
+
+ } else {
+ if (askedHeight <= 0)
+ askedHeight = FullHeight(screen);
+ if (askedWidth <= 0)
+ askedWidth = FullWidth(screen);
+ }
+
+ status = XtMakeResizeRequest (
+ (Widget) termw,
+ askedWidth, askedHeight,
+ &replyWidth, &replyHeight);
+
+ if (status == XtGeometryYes ||
+ status == XtGeometryDone) {
+ ScreenResize (&termw->screen,
+ replyWidth,
+ replyHeight,
+ &termw->flags);
+ }
+}
extern Atom wm_delete_window; /* for ICCCM delete window */
Index: ptyx.h
--- xterm+/ptyx.h Mon Jun 10 13:03:46 1996
+++ xterm_a/ptyx.h Thu Jul 18 21:22:57 1996
@@ -591,13 +591,17 @@
* term->flags and screen->save_modes. This need only fit in an unsigned.
*/
-#define ATTRIBUTES 0x67 /* mask: user-visible attributes */
/* global flags and character flags (visible character attributes) */
#define INVERSE 0x01 /* invert the characters to be output */
#define UNDERLINE 0x02 /* true if underlining */
#define BOLD 0x04
+/* global flags (also character attributes) */
+#define BG_COLOR 0x08 /* true if background set */
+#define FG_COLOR 0x10 /* true if foreground set */
+
/* character flags (internal attributes) */
-#define LINEWRAPPED 0x08 /* used on the first character in a
+#define PROTECTED 0x20 /* a character is drawn that cannot be erased */
+#define LINEWRAPPED 0x40 /* used on the first character in a
* line to indicate that it wraps onto
* the next line so we can tell the
* difference between lines that have
@@ -605,12 +609,12 @@
* ended naturally with a CR at column
* max_col.
*/
-#define CHARDRAWN 0x10 /* a character has been drawn here on the
+#define CHARDRAWN 0x80 /* a character has been drawn here on the
screen. Used to distinguish blanks from
empty parts of the screen when selecting */
-/* global flags */
-#define BG_COLOR 0x20 /* true if background set */
-#define FG_COLOR 0x40 /* true if foreground set */
+
+ /* mask: user-visible attributes */
+#define ATTRIBUTES (INVERSE|UNDERLINE|BOLD|BG_COLOR|FG_COLOR|PROTECTED)
#define WRAPAROUND 0x400 /* true if auto wraparound mode */
#define REVERSEWRAP 0x800 /* true if reverse wraparound mode */
Index: screen.c
--- xterm+/screen.c Sun Feb 18 12:46:26 1996
+++ xterm_a/screen.c Thu Jul 18 21:41:51 1996
@@ -597,14 +597,18 @@
/* clear the right and bottom internal border because of NorthWest
gravity might have left junk on the right and bottom edges */
- XClearArea (screen->display, tw,
- width - screen->border, 0, /* right edge */
- screen->border, height, /* from top to bottom */
- False);
- XClearArea (screen->display, tw,
- 0, height - screen->border, /* bottom */
- width, screen->border, /* all across the bottom */
- False);
+ if (width >= FullWidth(screen)) {
+ XClearArea (screen->display, tw,
+ FullWidth(screen), 0, /* right edge */
+ 0, height, /* from top to bottom */
+ False);
+ }
+ if (height >= FullHeight(screen)) {
+ XClearArea (screen->display, tw,
+ 0, FullHeight(screen), /* bottom */
+ width, 0, /* all across the bottom */
+ False);
+ }
/* round so that it is unlikely the screen will change size on */
/* small mouse movements. */
Index: termcap
--- xterm+/termcap Mon Jul 8 12:42:24 1996
+++ xterm_a/termcap Wed Jul 17 19:57:24 1996
@@ -21,7 +21,7 @@
:ho=\E[H:\
:im=\E[4h:ei=\E[4l:mi:\
:ks=\E[?1h\E=:ke=\E[?1l\E>:\
- :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:\
:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
:kn#12:\
@@ -38,7 +38,7 @@
:ti=\E7\E[?47h:te=\E[2J\E[?47l\E8:\
:vi=\E[?25l:ve=\E[?25h:\
:up=\E[A:us=\E[4m:ue=\E[24m:xn:\
- :ut:Co#8:NC#7:op=\E100m:AB=\E[4%dm:AF=\E[3%dm:
+ :ut:Co#8:op=\E100m:AB=\E[4%dm:AF=\E[3%dm:
v2|xterm-65|xterm with tall window 65x80 (X Window System):\
:li#65:tc=xterm:
vb|xterm-bold|xterm with bold instead of underline (X Window System):\
Index: terminfo
--- xterm+/terminfo Mon Jul 8 12:42:24 1996
+++ xterm_a/terminfo Wed Jul 17 19:57:24 1996
@@ -11,8 +11,8 @@
xenl,
colors#8,
cols#80,
+ it#8,
lines#24,
- ncv#7,
pairs#64,
acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G,
@@ -31,31 +31,41 @@
cup=\E[%i%p1%d;%p2%dH,
cuu=\E[%p1%dA,
cuu1=\E[A,
+ cvvis=\E[?25h,
dch=\E[%p1%dP,
dch1=\E[P,
dl=\E[%p1%dM,
dl1=\E[M,
ed=\E[J,
el=\E[K,
- el1=\E[1K$<3>,
+ el1=\E[1K,
enacs=\E(B\E)0,
+ flash=\E[?5h\E[?5l,
home=\E[H,
- hpa=\E[%i%p1%dj,
+ hpa=\E[%i%p1%dG,
ht=^I,
hts=\EH,
+ ich=\E[%p1%d@,
+ ich1=\E[@,
il=\E[%p1%dL,
il1=\E[L,
ind=^J,
is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
- kbeg=\E[E,
+ ka1=\EOw,
+ ka3=\EOu,
+ kb2=\EOy,
+ kbeg=\EOE,
kbs=^H,
+ kc1=\EOq,
+ kc3=\EOs,
kcub1=\EOD,
kcud1=\EOB,
kcuf1=\EOC,
kcuu1=\EOA,
- kdch1=\E[3~,
+ kdch1=\177,
kend=\EOF,
- kf1=\EOP,
+ kent=\EOM,
+ kf1=\E[11~,
kf10=\E[21~,
kf11=\E[23~,
kf12=\E[24~,
@@ -66,10 +76,10 @@
kf17=\E[31~,
kf18=\E[32~,
kf19=\E[33~,
- kf2=\EOQ,
+ kf2=\E[12~,
kf20=\E[34~,
- kf3=\EOR,
- kf4=\EOS,
+ kf3=\E[13~,
+ kf4=\E[14~,
kf5=\E[15~,
kf6=\E[17~,
kf7=\E[18~,
@@ -78,21 +88,24 @@
kfnd=\E[1~,
khome=\EOH,
kich1=\E[2~,
+ kmous=\E[M,
knp=\E[6~,
kpp=\E[5~,
kslt=\E[4~,
meml=\El,
memu=\Em,
- op=\E[100m,
+ op=\E[39;49m,
rc=\E8,
rev=\E[7m,
ri=\EM,
rmacs=^O,
+ rmam=\E[?7l,
rmcup=\E[2J\E[?47l\E8,
rmir=\E[4l,
rmkx=\E[?1l\E>,
rmso=\E[27m,
rmul=\E[24m,
+ rs1=^O,
rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
sc=\E7,
setab=\E[4%p1%dm,
@@ -102,6 +115,7 @@
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
sgr0=\E[m\017,
smacs=^N,
+ smam=\E[?7h,
smcup=\E7\E[?47h,
smir=\E[4h,
smkx=\E[?1h\E=,
@@ -113,8 +127,8 @@
lines#65,
use=xterm,
xterm-bold|xterm with bold instead of underline (X Window System),
- smul=\E[1m,
rmul=\E[22m,
+ smul=\E[1m,
use=xterm,
xtermm|monochrome xterm (X Window System),
colors@,
@@ -128,8 +142,8 @@
sgr@,
use=xterm,
xterm-boldso|xterm with bold for standout (X Window System),
- smso=\E[1m,
rmso=\E[22m,
+ smso=\E[1m,
use=xterm,
#
# vi may work better with this entry, because vi
Index: util.c
--- xterm+/util.c Sun Jun 30 12:03:00 1996
+++ xterm_a/util.c Thu Jul 18 21:27:03 1996
@@ -1207,7 +1207,7 @@
int flags;
int color;
{
- Pixel fg = (flags & FG_COLOR)
+ Pixel fg = (flags & FG_COLOR) && (color >= 0)
? term->screen.Acolors[color]
: term->screen.foreground;
@@ -1223,7 +1223,7 @@
int flags;
int color;
{
- Pixel bg = (flags & BG_COLOR)
+ Pixel bg = (flags & BG_COLOR) && (color >= 0)
? term->screen.Acolors[color]
: term->core.background_pixel;