1 /* Public Domain Curses */
2
3 #include "pdcx11.h"
4
5 #include <string.h>
6
7 #ifdef CHTYPE_LONG
8
9 # define A(x) ((chtype)x | A_ALTCHARSET)
10
11 chtype acs_map[128] =
12 {
13 A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10),
14 A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19),
15 A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), A(28),
16 A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', '\'', '(',
17 ')', '*',
18
19 # ifdef PDC_WIDE
20 0x2192, 0x2190, 0x2191, 0x2193,
21 # else
22 '>', '<', '^', 'v',
23 # endif
24
25 '/',
26
27 # ifdef PDC_WIDE
28 0x2588,
29 # else
30 A(0),
31 # endif
32
33 '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=',
34 '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
35 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
36 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
37
38 # ifdef PDC_WIDE
39 0x2666, 0x2592,
40 # else
41 A(1), A(2),
42 # endif
43
44 'b', 'c', 'd', 'e',
45
46 # ifdef PDC_WIDE
47 0x00b0, 0x00b1, 0x2591, 0x00a4, 0x2518, 0x2510, 0x250c, 0x2514,
48 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524,
49 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3,
50 0x00b7,
51 # else
52 A(7), A(8), '#', 0xa4, A(11), A(12), A(13), A(14), A(15), A(16),
53 A(17), A(18), A(19), A(20), A(21), A(22), A(23), A(24), A(25),
54 A(26), A(27), A(28), A(29), A(30), 0xb7,
55 # endif
56
57 A(127)
58 };
59
60 # undef A
61
62 #endif
63
PDC_display_cursor(int oldrow,int oldcol,int newrow,int newcol,int visibility)64 int PDC_display_cursor(int oldrow, int oldcol, int newrow, int newcol,
65 int visibility)
66 {
67 char buf[30];
68 int idx, pos;
69
70 PDC_LOG(("%s:PDC_display_cursor() - called: NEW row %d col %d, vis %d\n",
71 XCLOGMSG, newrow, newcol, visibility));
72
73 if (visibility == -1)
74 {
75 /* Only send the CURSES_DISPLAY_CURSOR message, no data */
76
77 idx = CURSES_DISPLAY_CURSOR;
78 memcpy(buf, &idx, sizeof(int));
79 idx = sizeof(int);
80 }
81 else
82 {
83 if ((oldrow == newrow) && (oldcol == newcol))
84 {
85 /* Do not send a message because it will cause the blink state
86 to reset. */
87 return OK;
88 }
89
90 idx = CURSES_CURSOR;
91 memcpy(buf, &idx, sizeof(int));
92
93 idx = sizeof(int);
94 pos = oldrow + (oldcol << 8);
95 memcpy(buf + idx, &pos, sizeof(int));
96
97 idx += sizeof(int);
98 pos = newrow + (newcol << 8);
99 memcpy(buf + idx, &pos, sizeof(int));
100
101 idx += sizeof(int);
102 }
103
104 if (XC_write_socket(xc_display_sock, buf, idx) < 0)
105 XCursesExitCursesProcess(1, "exiting from PDC_display_cursor");
106
107 return OK;
108 }
109
110 /* position hardware cursor at (y, x) */
111
PDC_gotoyx(int row,int col)112 void PDC_gotoyx(int row, int col)
113 {
114 PDC_LOG(("PDC_gotoyx() - called: row %d col %d\n", row, col));
115
116 PDC_display_cursor(SP->cursrow, SP->curscol, row, col, SP->visibility);
117 }
118
119 /* update the given physical line to look like the corresponding line in
120 curscr */
121
PDC_transform_line(int lineno,int x,int len,const chtype * srcp)122 void PDC_transform_line(int lineno, int x, int len, const chtype *srcp)
123 {
124 PDC_LOG(("PDC_transform_line() - called: line %d\n", lineno));
125
126 XC_get_line_lock(lineno);
127
128 memcpy(Xcurscr + XCURSCR_Y_OFF(lineno) + (x * sizeof(chtype)), srcp,
129 len * sizeof(chtype));
130
131 *(Xcurscr + XCURSCR_START_OFF + lineno) = x;
132 *(Xcurscr + XCURSCR_LENGTH_OFF + lineno) = len;
133
134 XC_release_line_lock(lineno);
135
136 XCursesInstructAndWait(CURSES_REFRESH);
137 }
138