Changes in uspace/lib/c/generic/io/console.c [79ae36dd:96b02eb9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/console.c
r79ae36dd r96b02eb9 37 37 #include <libc.h> 38 38 #include <async.h> 39 #include <errno.h>40 #include <stdio.h>41 #include <malloc.h>42 #include <vfs/vfs_sess.h>43 39 #include <io/console.h> 44 40 #include <ipc/console.h> 45 41 46 console_ctrl_t *console_init(FILE *ifile, FILE *ofile)42 void console_clear(int phone) 47 43 { 48 console_ctrl_t *ctrl = malloc(sizeof(console_ctrl_t)); 49 if (!ctrl) 50 return NULL; 51 52 ctrl->input_sess = fsession(EXCHANGE_SERIALIZE, ifile); 53 if (!ctrl->input_sess) { 54 free(ctrl); 55 return NULL; 56 } 57 58 ctrl->output_sess = fsession(EXCHANGE_SERIALIZE, ofile); 59 if (!ctrl->output_sess) { 60 free(ctrl); 61 return NULL; 62 } 63 64 ctrl->input = ifile; 65 ctrl->output = ofile; 66 ctrl->input_aid = 0; 67 68 return ctrl; 44 async_msg_0(phone, CONSOLE_CLEAR); 69 45 } 70 46 71 void console_done(console_ctrl_t *ctrl)47 int console_get_size(int phone, sysarg_t *cols, sysarg_t *rows) 72 48 { 73 free(ctrl);49 return async_req_0_2(phone, CONSOLE_GET_SIZE, cols, rows); 74 50 } 75 51 76 bool console_kcon(void)52 void console_set_style(int phone, uint8_t style) 77 53 { 78 #if 0 79 return __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE); 80 #endif 81 82 return false; 54 async_msg_1(phone, CONSOLE_SET_STYLE, style); 83 55 } 84 56 85 void console_flush(console_ctrl_t *ctrl) 57 void console_set_color(int phone, uint8_t fg_color, uint8_t bg_color, 58 uint8_t flags) 86 59 { 87 fflush(ctrl->output);60 async_msg_3(phone, CONSOLE_SET_COLOR, fg_color, bg_color, flags); 88 61 } 89 62 90 void console_ clear(console_ctrl_t *ctrl)63 void console_set_rgb_color(int phone, uint32_t fg_color, uint32_t bg_color) 91 64 { 92 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 93 async_msg_0(exch, CONSOLE_CLEAR); 94 async_exchange_end(exch); 65 async_msg_2(phone, CONSOLE_SET_RGB_COLOR, fg_color, bg_color); 95 66 } 96 67 97 int console_get_size(console_ctrl_t *ctrl, sysarg_t *cols, sysarg_t *rows)68 void console_cursor_visibility(int phone, bool show) 98 69 { 99 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 100 int rc = async_req_0_2(exch, CONSOLE_GET_SIZE, cols, rows); 101 async_exchange_end(exch); 102 103 return rc; 70 async_msg_1(phone, CONSOLE_CURSOR_VISIBILITY, (show != false)); 104 71 } 105 72 106 void console_set_style(console_ctrl_t *ctrl, uint8_t style)73 int console_get_color_cap(int phone, sysarg_t *ccap) 107 74 { 108 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 109 async_msg_1(exch, CONSOLE_SET_STYLE, style); 110 async_exchange_end(exch); 75 return async_req_0_1(phone, CONSOLE_GET_COLOR_CAP, ccap); 111 76 } 112 77 113 void console_set_color(console_ctrl_t *ctrl, uint8_t fg_color, uint8_t bg_color, 114 uint8_t flags) 78 void console_kcon_enable(int phone) 115 79 { 116 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 117 async_msg_3(exch, CONSOLE_SET_COLOR, fg_color, bg_color, flags); 118 async_exchange_end(exch); 80 async_msg_0(phone, CONSOLE_KCON_ENABLE); 119 81 } 120 82 121 void console_set_rgb_color(console_ctrl_t *ctrl, uint32_t fg_color, 122 uint32_t bg_color) 83 int console_get_pos(int phone, sysarg_t *col, sysarg_t *row) 123 84 { 124 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 125 async_msg_2(exch, CONSOLE_SET_RGB_COLOR, fg_color, bg_color); 126 async_exchange_end(exch); 85 return async_req_0_2(phone, CONSOLE_GET_POS, col, row); 127 86 } 128 87 129 void console_ cursor_visibility(console_ctrl_t *ctrl, bool show)88 void console_set_pos(int phone, sysarg_t col, sysarg_t row) 130 89 { 131 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 132 async_msg_1(exch, CONSOLE_CURSOR_VISIBILITY, (show != false)); 133 async_exchange_end(exch); 90 async_msg_2(phone, CONSOLE_GOTO, col, row); 134 91 } 135 92 136 int console_get_color_cap(console_ctrl_t *ctrl, sysarg_t *ccap)93 bool console_get_event(int phone, console_event_t *event) 137 94 { 138 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 139 int rc = async_req_0_1(exch, CONSOLE_GET_COLOR_CAP, ccap); 140 async_exchange_end(exch); 95 sysarg_t type; 96 sysarg_t key; 97 sysarg_t mods; 98 sysarg_t c; 141 99 142 return rc; 143 } 144 145 int console_get_pos(console_ctrl_t *ctrl, sysarg_t *col, sysarg_t *row) 146 { 147 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 148 int rc = async_req_0_2(exch, CONSOLE_GET_POS, col, row); 149 async_exchange_end(exch); 100 int rc = async_req_0_4(phone, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 101 if (rc < 0) 102 return false; 150 103 151 return rc; 152 } 153 154 void console_set_pos(console_ctrl_t *ctrl, sysarg_t col, sysarg_t row) 155 { 156 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 157 async_msg_2(exch, CONSOLE_GOTO, col, row); 158 async_exchange_end(exch); 159 } 160 161 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event) 162 { 163 if (ctrl->input_aid == 0) { 164 sysarg_t type; 165 sysarg_t key; 166 sysarg_t mods; 167 sysarg_t c; 168 169 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 170 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 171 async_exchange_end(exch); 172 173 if (rc != EOK) { 174 errno = rc; 175 return false; 176 } 177 178 event->type = type; 179 event->key = key; 180 event->mods = mods; 181 event->c = c; 182 } else { 183 sysarg_t retval; 184 async_wait_for(ctrl->input_aid, &retval); 185 186 ctrl->input_aid = 0; 187 188 if (retval != EOK) { 189 errno = (int) retval; 190 return false; 191 } 192 193 event->type = IPC_GET_ARG1(ctrl->input_call); 194 event->key = IPC_GET_ARG2(ctrl->input_call); 195 event->mods = IPC_GET_ARG3(ctrl->input_call); 196 event->c = IPC_GET_ARG4(ctrl->input_call); 197 } 198 199 return true; 200 } 201 202 bool console_get_kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event, 203 suseconds_t *timeout) 204 { 205 struct timeval t0; 206 gettimeofday(&t0, NULL); 207 208 if (ctrl->input_aid == 0) { 209 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 210 ctrl->input_aid = async_send_0(exch, CONSOLE_GET_EVENT, 211 &ctrl->input_call); 212 async_exchange_end(exch); 213 } 214 215 sysarg_t retval; 216 int rc = async_wait_timeout(ctrl->input_aid, &retval, *timeout); 217 if (rc != EOK) { 218 *timeout = 0; 219 errno = rc; 220 return false; 221 } 222 223 ctrl->input_aid = 0; 224 225 if (retval != EOK) { 226 errno = (int) retval; 227 return false; 228 } 229 230 event->type = IPC_GET_ARG1(ctrl->input_call); 231 event->key = IPC_GET_ARG2(ctrl->input_call); 232 event->mods = IPC_GET_ARG3(ctrl->input_call); 233 event->c = IPC_GET_ARG4(ctrl->input_call); 234 235 /* Update timeout */ 236 struct timeval t1; 237 gettimeofday(&t1, NULL); 238 *timeout -= tv_sub(&t1, &t0); 104 event->type = type; 105 event->key = key; 106 event->mods = mods; 107 event->c = c; 239 108 240 109 return true;
Note:
See TracChangeset
for help on using the changeset viewer.