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