1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
|
/*
* $XConsortium: ptyx.h,v 1.62 93/02/25 17:21:26 gildea Exp $
*/
/*
* Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Digital Equipment
* Corporation not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/* ptyx.h */
/* @(#)ptyx.h X10/6.6 11/10/86 */
#include <X11/IntrinsicP.h>
#include <X11/Xmu/Misc.h> /* For Max() and Min(). */
#include <X11/Xfuncs.h>
#include <X11/Xosdefs.h>
/* Extra Xlib definitions */
#define AllButtonsUp(detail, ignore) (\
((ignore) == Button1) ? \
(((detail)&(Button2Mask|Button3Mask)) == 0) \
: \
(((ignore) == Button2) ? \
(((detail)&(Button1Mask|Button3Mask)) == 0) \
: \
(((detail)&(Button1Mask|Button2Mask)) == 0)) \
)
#define MAX_COLS 200
#define MAX_ROWS 128
/*
** System V definitions
*/
#ifdef SYSV
#ifdef X_NOT_POSIX
#ifndef CRAY
#define dup2(fd1,fd2) ((fd1 == fd2) ? fd1 : \
(close(fd2), fcntl(fd1, F_DUPFD, fd2)))
#endif
#endif
#endif /* SYSV */
/*
** allow for mobility of the pty master/slave directories
*/
#ifndef PTYDEV
#if defined(hpux) || defined(__hpux)
#define PTYDEV "/dev/ptym/ptyxx"
#else /* !__hpux */
#define PTYDEV "/dev/ptyxx"
#endif /* !__hpux */
#endif /* !PTYDEV */
#ifndef TTYDEV
#if defined(hpux) || defined(__hpux)
#define TTYDEV "/dev/pty/ttyxx"
#else /* !__hpux */
#define TTYDEV "/dev/ttyxx"
#endif /* !__hpux */
#endif /* !TTYDEV */
#ifndef PTYCHAR1
#if defined(hpux) || defined(__hpux)
#define PTYCHAR1 "zyxwvutsrqp"
#else /* !__hpux */
#define PTYCHAR1 "pqrstuvwxyzPQRSTUVWXYZ"
#endif /* !__hpux */
#endif /* !PTYCHAR1 */
#ifndef PTYCHAR2
#if defined(hpux) || defined(__hpux)
#define PTYCHAR2 "fedcba9876543210"
#else /* !__hpux */
#define PTYCHAR2 "0123456789abcdef"
#endif /* !__hpux */
#endif /* !PTYCHAR2 */
#ifndef PTYCHARLEN
#ifdef CRAY
#define PTYCHARLEN 3
#elif defined(__MVS__)
#define PTYCHARLEN 8 /* OS/390 stores, e.g. ut_id="ttyp1234" */
#else
#define PTYCHARLEN 2
#endif
#endif
/* Until the translation manager comes along, I have to do my own translation of
* mouse events into the proper routines. */
typedef enum {NORMAL, LEFTEXTENSION, RIGHTEXTENSION} EventMode;
/*
* The origin of a screen is 0, 0. Therefore, the number of rows
* on a screen is screen->max_row + 1, and similarly for columns.
*/
typedef unsigned char Char; /* to support 8 bit chars */
typedef Char **ScrnBuf;
/*
* ANSI emulation.
*/
#define INQ 0x05
#define FF 0x0C /* C0, C1 control names */
#define LS1 0x0E
#define LS0 0x0F
#define CAN 0x18
#define SUB 0x1A
#define ESC 0x1B
#define US 0x1F
#define DEL 0x7F
#define HTS ('H'+0x40)
#define SS2 0x8E
#define SS3 0x8F
#define DCS 0x90
#define OLDID 0x9A /* ESC Z */
#define CSI 0x9B
#define ST 0x9C
#define OSC 0x9D
#define PM 0x9E
#define APC 0x9F
#define RDEL 0xFF
#define NMENUFONTS 9 /* entries in fontMenu */
#define NBOX 5 /* Number of Points in box */
#define NPARAM 10 /* Max. parameters */
#define MINHILITE 32
typedef struct {
unsigned char a_type;
unsigned char a_pintro;
unsigned char a_final;
unsigned char a_inters;
char a_nparam; /* # of parameters */
char a_dflt[NPARAM]; /* Default value flags */
short a_param[NPARAM]; /* Parameters */
char a_nastyf; /* Error flag */
} ANSI;
typedef struct {
int row;
int col;
unsigned flags; /* Vt100 saves graphics rendition. Ugh! */
char curgl;
char curgr;
char gsets[4];
} SavedCursor;
#define TEK_FONT_LARGE 0
#define TEK_FONT_2 1
#define TEK_FONT_3 2
#define TEK_FONT_SMALL 3
#define TEKNUMFONTS 4
/* Actually there are 5 types of lines, but four are non-solid lines */
#define TEKNUMLINES 4
typedef struct {
int x;
int y;
int fontsize;
int linetype;
} Tmodes;
typedef struct {
int Twidth;
int Theight;
} T_fontsize;
typedef struct {
short *bits;
int x;
int y;
int width;
int height;
} BitmapBits;
#define SAVELINES 256 /* default # lines to save */
#define SCROLLLINES 1 /* default # lines to scroll */
/***====================================================================***/
#define TEXT_FG 0
#define TEXT_BG 1
#define TEXT_CURSOR 2
#define MOUSE_FG 3
#define MOUSE_BG 4
#define TEK_FG 5
#define TEK_BG 6
#define NCOLORS 7
#define COLOR_DEFINED(s,w) ((s)->which&(1<<(w)))
#define COLOR_VALUE(s,w) ((s)->colors[w])
#define SET_COLOR_VALUE(s,w,v) (((s)->colors[w]=(v)),((s)->which|=(1<<(w))))
#define COLOR_NAME(s,w) ((s)->names[w])
#define SET_COLOR_NAME(s,w,v) (((s)->names[w]=(v)),((s)->which|=(1<<(w))))
#define UNDEFINE_COLOR(s,w) ((s)->which&=(~((w)<<1)))
#define OPPOSITE_COLOR(n) (((n)==TEXT_FG?TEXT_BG:\
((n)==TEXT_BG?TEXT_FG:\
((n)==MOUSE_FG?MOUSE_BG:\
((n)==MOUSE_BG?MOUSE_FG:\
((n)==TEK_FG?TEK_BG:\
((n)==TEXT_BG?TEK_FG:(n))))))))
typedef struct {
unsigned which;
Pixel colors[NCOLORS];
char *names[NCOLORS];
} ScrnColors;
/***====================================================================***/
#define MAXCOLORS 18
#define COLOR_0 0
#define COLOR_1 1
#define COLOR_2 2
#define COLOR_3 3
#define COLOR_4 4
#define COLOR_5 5
#define COLOR_6 6
#define COLOR_7 7
#define COLOR_8 8
#define COLOR_9 9
#define COLOR_10 10
#define COLOR_11 11
#define COLOR_12 12
#define COLOR_13 13
#define COLOR_14 14
#define COLOR_15 15
#define COLOR_BD 16
#define COLOR_UL 17
typedef struct {
Display *display; /* X display for screen */
int respond; /* socket for responses
(position report, etc.) */
long pid; /* pid of process on far side */
int uid; /* user id of actual person */
int gid; /* group id of actual person */
GC normalGC; /* normal painting */
GC reverseGC; /* reverse painting */
GC normalboldGC; /* normal painting, bold font */
GC reverseboldGC; /* reverse painting, bold font */
GC cursorGC; /* normal cursor painting */
GC reversecursorGC;/* reverse cursor painting */
GC cursoroutlineGC;/* for painting lines around */
Pixel foreground; /* foreground color */
Pixel cursorcolor; /* Cursor color */
Pixel mousecolor; /* Mouse color */
Pixel mousecolorback; /* Mouse color background */
Pixel colors[MAXCOLORS]; /* ANSI color emulation */
int border; /* inner border */
Cursor arrow; /* arrow cursor */
unsigned short send_mouse_pos; /* user wants mouse transition */
/* and position information */
int select; /* xgterm selected */
Boolean visualbell; /* visual bell mode */
Boolean allowSendEvents;/* SendEvent mode */
Boolean grabbedKbd; /* keyboard is grabbed */
#ifdef ALLOWLOGGING
int logging; /* logging mode */
int logfd; /* file descriptor of log */
char *logfile; /* log file name */
unsigned char *logstart; /* current start of log buffer */
#endif
int inhibit; /* flags for inhibiting changes */
/* VT window parameters */
struct {
Window window; /* X window id */
int width; /* width of columns */
int height; /* height of rows */
int fullwidth; /* full width of window */
int fullheight; /* full height of window */
int f_width; /* width of fonts in pixels */
int f_height; /* height of fonts in pixels */
} fullVwin;
Cursor pointer_cursor; /* pointer cursor in window */
/* Gterm window control */
Boolean Vshow; /* VT window showing */
Boolean Tshow; /* Tek window showing */
Boolean TekEmu; /* true if Tek emulation */
/* Terminal fonts must be of the same size and of fixed width */
XFontStruct *fnt_norm; /* normal font of terminal */
XFontStruct *fnt_bold; /* bold font of terminal */
int enbolden; /* overstrike for bold font */
XPoint *box; /* draw unselected cursor */
int cursor_state; /* ON or OFF */
int cursor_set; /* requested state */
int cursor_col; /* previous cursor column */
int cursor_row; /* previous cursor row */
int cur_col; /* current cursor column */
int cur_row; /* current cursor row */
int max_col; /* rightmost column */
int max_row; /* bottom row */
int top_marg; /* top line of scrolling region */
int bot_marg; /* bottom line of " " */
Widget scrollWidget; /* pointer to scrollbar struct */
int scrollbar; /* if > 0, width of scrollbar, and
scrollbar is showing */
int topline; /* line number of top, <= 0 */
int savedlines; /* number of lines that've been saved */
int savelines; /* number of lines off top to save */
int scrolllines; /* number of lines to button scroll */
Boolean scrollttyoutput; /* scroll to bottom on tty output */
Boolean scrollkey; /* scroll to bottom on key */
ScrnBuf buf; /* ptr to visible screen buf (main) */
ScrnBuf allbuf; /* screen buffer (may include
lines scrolled off top) */
char *sbuf_address; /* main screen memory address */
ScrnBuf altbuf; /* alternate screen buffer */
char *abuf_address; /* alternate screen memory address */
Boolean alternate; /* true if using alternate buf */
unsigned short do_wrap; /* true if cursor in last column
and character just output */
int incopy; /* 0 idle; 1 XCopyArea issued;
-1 first GraphicsExpose seen,
but last not seen */
int copy_src_x; /* params from last XCopyArea ... */
int copy_src_y;
unsigned int copy_width;
unsigned int copy_height;
int copy_dest_x;
int copy_dest_y;
Boolean c132; /* allow change to 132 columns */
Boolean curses; /* cludge-ups for more and vi */
Boolean hp_ll_bc; /* kludge HP-style ll for xdb */
Boolean marginbell; /* true if margin bell on */
int nmarginbell; /* columns from right margin */
int bellarmed; /* cursor below bell margin */
Boolean multiscroll; /* true if multi-scroll */
int scrolls; /* outstanding scroll count,
used only with multiscroll */
SavedCursor sc; /* data for restore cursor */
int save_modes[19]; /* save dec private modes */
/* Improved VT100 emulation stuff. */
char gsets[4]; /* G0 through G3. */
char curgl; /* Current GL setting. */
char curgr; /* Current GR setting. */
char curss; /* Current single shift. */
int scroll_amt; /* amount to scroll */
int refresh_amt; /* amount to refresh */
Boolean jumpscroll; /* whether we should jumpscroll */
Boolean always_highlight; /* whether to highlight cursor */
Boolean underline; /* whether to underline text */
int multiClickTime; /* time between multiclick selects */
int bellSuppressTime; /* msecs after Bell before another allowed */
Boolean bellInProgress; /* still ringing/flashing prev bell? */
char *charClass; /* for overriding word selection */
Boolean cutNewline; /* whether or not line cut has \n */
Boolean cutToBeginningOfLine; /* line cuts to BOL? */
char *selection; /* the current selection */
int selection_size; /* size of allocated buffer */
int selection_length; /* number of significant bytes */
int selection_time; /* latest event timestamp */
int startHRow, startHCol, /* highlighted text */
endHRow, endHCol,
startHCoord, endHCoord;
Atom* selection_atoms; /* which selections we own */
Cardinal sel_atoms_size; /* how many atoms allocated */
Cardinal selection_count; /* how many atoms in use */
Boolean input_eight_bits;/* use 8th bit instead of ESC prefix */
Boolean output_eight_bits; /* honor all bits or strip */
Pixmap menu_item_bitmap;
Pixmap tek_menu_item_bitmap;
Widget mainMenu, vtMenu, tekMenu, fontMenu;
char* menu_font_names[NMENUFONTS];
int menu_font_number;
#ifdef I18N
XIC xic;
#endif
} TScreen;
/* meaning of bits in screen.select flag */
#define INWINDOW 01 /* the mouse is in one of the windows */
#define FOCUS 02 /* one of the windows is the focus window */
#define MULTICLICKTIME 250 /* milliseconds */
typedef struct
{
unsigned flags;
} TKeyboard;
typedef struct _Misc {
char *geo_metry;
char *T_geometry;
char *f_n;
char *f_b;
#ifdef ALLOWLOGGING
Boolean log_on;
#endif
Boolean login_shell;
Boolean re_verse;
int resizeGravity;
Boolean reverseWrap;
Boolean autoWrap;
Boolean logInhibit;
Boolean signalInhibit;
Boolean tekInhibit;
Boolean scrollbar;
Boolean titeInhibit;
Boolean appcursorDefault;
Boolean appkeypadDefault;
#ifdef I18N
char *input_method;
char *preedit_type;
Boolean open_im;
Boolean shared_ic;
#endif
Boolean dynamicColors; /* use colors */
Boolean sb_right; /* scrollbar on right */
} Misc;
typedef struct {int foo;} XgtermClassPart;
typedef struct _XgtermClassRec {
CoreClassPart core_class;
XgtermClassPart xgterm_class;
} XgtermClassRec;
/* define masks for flags */
#define CAPS_LOCK 0x01
#define KYPD_APL 0x02
#define CURSOR_APL 0x04
#define N_MARGINBELL 10
#define MAX_TABS 320
#define TAB_ARRAY_SIZE 10 /* number of ints to provide MAX_TABS bits */
typedef unsigned Tabs [TAB_ARRAY_SIZE];
typedef struct _XgtermWidgetRec {
CorePart core;
TKeyboard keyboard; /* terminal keyboard */
TScreen screen; /* terminal screen */
unsigned flags; /* mode flags */
unsigned cur_foreground; /* current foreground color */
unsigned cur_background; /* current background color */
unsigned initflags; /* initial mode flags */
Tabs tabs; /* tabstops of the terminal */
Misc misc; /* miscellaneous parameters */
} XgtermWidgetRec, *XgtermWidget;
#define BUF_SIZE 4096
/*
* terminal flags
* There are actually two namespaces mixed together here.
* One is the set of flags that can go in screen->buf attributes
* and which must fit in a char.
* The other is the global setting stored in
* 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
/* character flags (internal attributes) */
#define LINEWRAPPED 0x08 /* 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
* wrapped around and lines that have
* ended naturally with a CR at column
* max_col.
*/
#define CHARDRAWN 0x10 /* 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 */
/* global flags */
#define WRAPAROUND 0x400 /* true if auto wraparound mode */
#define REVERSEWRAP 0x800 /* true if reverse wraparound mode */
#define REVERSE_VIDEO 0x1000 /* true if screen white on black */
#define LINEFEED 0x2000 /* true if in auto linefeed mode */
#define ORIGIN 0x4000 /* true if in origin mode */
#define INSERT 0x8000 /* true if in insert mode */
#define SMOOTHSCROLL 0x10000 /* true if in smooth scroll mode */
#define IN132COLUMNS 0x20000 /* true if in 132 column mode */
#define VWindow(screen) (screen->fullVwin.window)
#define VShellWindow term->core.parent->core.window
#define TextWindow(screen) (screen->fullVwin.window)
#define Width(screen) (screen->fullVwin.width)
#define Height(screen) (screen->fullVwin.height)
#define FullWidth(screen) (screen->fullVwin.fullwidth)
#define FullHeight(screen) (screen->fullVwin.fullheight)
#define FontWidth(screen) (screen->fullVwin.f_width)
#define FontHeight(screen) (screen->fullVwin.f_height)
#define CursorX(screen,col) (term->misc.sb_right ? \
(col) * FontWidth(screen) + screen->border : \
(col) * FontWidth(screen) + screen->border \
+ screen->scrollbar)
#define CursorY(screen,row) ((((row) - screen->topline) * FontHeight(screen)) \
+ screen->border)
#define WINDOWEVENTS (TWINDOWEVENTS | PointerMotionMask)
/* flags for cursors */
#define OFF 0
#define ON 1
#define CLEAR 0
#define TOGGLE 1
/* flags for inhibit */
#ifdef ALLOWLOGGING
#define I_LOG 0x01
#endif
#define I_SIGNAL 0x02
#define I_TEK 0x04
extern Cursor make_colored_cursor();
extern int GetBytesAvailable();
extern void first_map_occurred();
extern int kill_process_group();
|