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