Changeset d3109ff in mainline for uspace/srv/hid/remcons/remcons.c
- Timestamp:
- 2024-09-24T17:59:36Z (16 months ago)
- Branches:
- master
- Children:
- 6a753a9c
- Parents:
- 3fcea34
- File:
-
- 1 edited
-
uspace/srv/hid/remcons/remcons.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/remcons/remcons.c
r3fcea34 rd3109ff 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2012 Vojtech Horky 4 4 * All rights reserved. … … 51 51 #include <inttypes.h> 52 52 #include <str.h> 53 #include <vt/vt100.h> 53 54 #include "telnet.h" 54 55 #include "user.h" 56 #include "remcons.h" 55 57 56 58 #define APP_GETTERM "/app/getterm" … … 74 76 static errno_t remcons_open(con_srvs_t *, con_srv_t *); 75 77 static errno_t remcons_close(con_srv_t *); 78 static errno_t remcons_read(con_srv_t *, void *, size_t, size_t *); 76 79 static errno_t remcons_write(con_srv_t *, void *, size_t, size_t *); 77 80 static void remcons_sync(con_srv_t *); … … 81 84 static errno_t remcons_get_size(con_srv_t *, sysarg_t *, sysarg_t *); 82 85 static errno_t remcons_get_color_cap(con_srv_t *, console_caps_t *); 86 static void remcons_set_style(con_srv_t *, console_style_t); 87 static void remcons_set_color(con_srv_t *, console_color_t, 88 console_color_t, console_color_attr_t); 89 static void remcons_set_color(con_srv_t *, console_color_t, 90 console_color_t, console_color_attr_t); 91 static void remcons_set_rgb_color(con_srv_t *, pixel_t, pixel_t); 92 static void remcons_cursor_visibility(con_srv_t *, bool); 83 93 static errno_t remcons_get_event(con_srv_t *, cons_event_t *); 84 94 … … 86 96 .open = remcons_open, 87 97 .close = remcons_close, 88 .read = NULL,98 .read = remcons_read, 89 99 .write = remcons_write, 90 100 .sync = remcons_sync, … … 94 104 .get_size = remcons_get_size, 95 105 .get_color_cap = remcons_get_color_cap, 96 .set_style = NULL,97 .set_color = NULL,98 .set_rgb_color = NULL,99 .set_cursor_visibility = NULL,106 .set_style = remcons_set_style, 107 .set_color = remcons_set_color, 108 .set_rgb_color = remcons_set_rgb_color, 109 .set_cursor_visibility = remcons_cursor_visibility, 100 110 .get_event = remcons_get_event 101 111 }; … … 115 125 static telnet_user_t *srv_to_user(con_srv_t *srv) 116 126 { 117 return srv->srvs->sarg; 127 remcons_t *remcons = (remcons_t *)srv->srvs->sarg; 128 return remcons->user; 129 } 130 131 static remcons_t *srv_to_remcons(con_srv_t *srv) 132 { 133 remcons_t *remcons = (remcons_t *)srv->srvs->sarg; 134 return remcons; 118 135 } 119 136 … … 141 158 } 142 159 160 static errno_t remcons_read(con_srv_t *srv, void *data, size_t size, 161 size_t *nread) 162 { 163 telnet_user_t *user = srv_to_user(srv); 164 errno_t rc; 165 166 rc = telnet_user_recv(user, data, size, nread); 167 if (rc != EOK) 168 return rc; 169 170 return EOK; 171 } 172 143 173 static errno_t remcons_write(con_srv_t *srv, void *data, size_t size, size_t *nwritten) 144 174 { … … 161 191 static void remcons_clear(con_srv_t *srv) 162 192 { 163 (void) srv; 193 remcons_t *remcons = srv_to_remcons(srv); 194 195 if (remcons->enable_ctl) { 196 vt100_cls(remcons->vt); 197 vt100_set_pos(remcons->vt, 0, 0); 198 remcons->user->cursor_x = 0; 199 remcons->user->cursor_y = 0; 200 } 164 201 } 165 202 166 203 static void remcons_set_pos(con_srv_t *srv, sysarg_t col, sysarg_t row) 167 204 { 168 telnet_user_t *user = srv_to_user(srv); 169 170 telnet_user_update_cursor_x(user, col); 205 remcons_t *remcons = srv_to_remcons(srv); 206 telnet_user_t *user = srv_to_user(srv); 207 208 if (remcons->enable_ctl) { 209 vt100_set_pos(remcons->vt, col, row); 210 remcons->user->cursor_x = col; 211 remcons->user->cursor_y = row; 212 } else { 213 telnet_user_update_cursor_x(user, col); 214 } 171 215 } 172 216 … … 176 220 177 221 *col = user->cursor_x; 178 *row = 0;222 *row = user->cursor_y; 179 223 180 224 return EOK; … … 183 227 static errno_t remcons_get_size(con_srv_t *srv, sysarg_t *cols, sysarg_t *rows) 184 228 { 185 (void) srv; 186 187 *cols = 100; 188 *rows = 1; 229 remcons_t *remcons = srv_to_remcons(srv); 230 231 if (remcons->enable_ctl) { 232 *cols = 80; 233 *rows = 25; 234 } else { 235 *cols = 100; 236 *rows = 1; 237 } 189 238 190 239 return EOK; … … 193 242 static errno_t remcons_get_color_cap(con_srv_t *srv, console_caps_t *ccaps) 194 243 { 195 (void) srv; 196 *ccaps = CONSOLE_CAP_NONE; 197 198 return EOK; 244 remcons_t *remcons = srv_to_remcons(srv); 245 246 if (remcons->enable_ctl) 247 *ccaps = CONSOLE_CAP_INDEXED | CONSOLE_CAP_RGB; 248 else 249 *ccaps = 0; 250 251 return EOK; 252 } 253 254 static void remcons_set_style(con_srv_t *srv, console_style_t style) 255 { 256 remcons_t *remcons = srv_to_remcons(srv); 257 char_attrs_t attrs; 258 259 if (remcons->enable_ctl) { 260 attrs.type = CHAR_ATTR_STYLE; 261 attrs.val.style = style; 262 vt100_set_attr(remcons->vt, attrs); 263 } 264 } 265 266 static void remcons_set_color(con_srv_t *srv, console_color_t bgcolor, 267 console_color_t fgcolor, console_color_attr_t flags) 268 { 269 remcons_t *remcons = srv_to_remcons(srv); 270 char_attrs_t attrs; 271 272 if (remcons->enable_ctl) { 273 attrs.type = CHAR_ATTR_INDEX; 274 attrs.val.index.bgcolor = bgcolor; 275 attrs.val.index.fgcolor = fgcolor; 276 attrs.val.index.attr = flags; 277 vt100_set_attr(remcons->vt, attrs); 278 } 279 } 280 281 static void remcons_set_rgb_color(con_srv_t *srv, pixel_t bgcolor, 282 pixel_t fgcolor) 283 { 284 remcons_t *remcons = srv_to_remcons(srv); 285 char_attrs_t attrs; 286 287 if (remcons->enable_ctl) { 288 attrs.type = CHAR_ATTR_RGB; 289 attrs.val.rgb.bgcolor = bgcolor; 290 attrs.val.rgb.fgcolor = fgcolor; 291 vt100_set_attr(remcons->vt, attrs); 292 } 293 } 294 295 static void remcons_cursor_visibility(con_srv_t *srv, bool visible) 296 { 297 remcons_t *remcons = srv_to_remcons(srv); 298 299 if (remcons->enable_ctl) 300 vt100_cursor_visibility(remcons->vt, visible); 199 301 } 200 302 … … 287 389 } 288 390 391 static void remcons_vt_putchar(void *arg, char32_t c) 392 { 393 remcons_t *remcons = (remcons_t *)arg; 394 char buf[STR_BOUNDS(1)]; 395 size_t off; 396 errno_t rc; 397 398 (void)arg; 399 400 off = 0; 401 rc = chr_encode(c, buf, &off, sizeof(buf)); 402 if (rc != EOK) 403 return; 404 405 (void)telnet_user_send_data(remcons->user, buf, off); 406 } 407 408 static void remcons_vt_cputs(void *arg, const char *str) 409 { 410 remcons_t *remcons = (remcons_t *)arg; 411 412 (void)telnet_user_send_data(remcons->user, str, str_size(str)); 413 } 414 415 static void remcons_vt_flush(void *arg) 416 { 417 remcons_t *remcons = (remcons_t *)arg; 418 (void)remcons; 419 } 420 289 421 /** Handle network connection. 290 422 * … … 294 426 static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn) 295 427 { 428 char_attrs_t attrs; 429 remcons_t *remcons = calloc(1, sizeof(remcons_t)); 430 assert(remcons != NULL); // XXX 296 431 telnet_user_t *user = telnet_user_create(conn); 297 432 assert(user); 298 433 434 remcons->enable_ctl = true; 435 remcons->user = user; 436 437 if (remcons->enable_ctl) { 438 user->rows = 25; 439 } else { 440 user->rows = 1; 441 } 442 443 remcons->vt = vt100_state_create((void *)remcons, 80, 25, 444 remcons_vt_putchar, remcons_vt_cputs, remcons_vt_flush); 445 assert(remcons->vt != NULL); // XXX 446 remcons->vt->enable_rgb = true; 447 448 if (remcons->enable_ctl) { 449 attrs.type = CHAR_ATTR_STYLE; 450 attrs.val.style = STYLE_NORMAL; 451 vt100_set_sgr(remcons->vt, attrs); 452 vt100_cls(remcons->vt); 453 vt100_set_pos(remcons->vt, 0, 0); 454 } 455 299 456 con_srvs_init(&user->srvs); 300 457 user->srvs.ops = &con_ops; 301 user->srvs.sarg = user;458 user->srvs.sarg = remcons; 302 459 user->srvs.abort_timeout = 1000; 303 460
Note:
See TracChangeset
for help on using the changeset viewer.
