Changeset 7cfe5c0 in mainline for uspace/lib/c/generic/io/chargrid.c
- Timestamp:
- 2012-08-20T19:16:24Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6b99156
- Parents:
- b9cb911 (diff), 01e397ac (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/chargrid.c
rb9cb911 r7cfe5c0 27 27 */ 28 28 29 /** @addtogroup console29 /** @addtogroup libc 30 30 * @{ 31 31 */ … … 39 39 #include <bool.h> 40 40 #include <as.h> 41 #include "screenbuffer.h" 42 43 /** Structure for buffering state of one virtual console. 44 * 45 */ 46 struct screenbuffer { 47 size_t size; /**< Structure size */ 48 screenbuffer_flag_t flags; /**< Screenbuffer flags */ 49 50 sysarg_t cols; /**< Number of columns */ 51 sysarg_t rows; /**< Number of rows */ 52 53 sysarg_t col; /**< Current column */ 54 sysarg_t row; /**< Current row */ 55 bool cursor_visible; /**< Cursor visibility */ 56 57 char_attrs_t attrs; /**< Current attributes */ 58 59 sysarg_t top_row; /**< The first row in the cyclic buffer */ 60 charfield_t data[]; /**< Screen contents (cyclic buffer) */ 61 }; 62 63 /** Create a screenbuffer. 41 #include <io/chargrid.h> 42 43 /** Create a chargrid. 64 44 * 65 45 * @param[in] cols Number of columns. 66 46 * @param[in] rows Number of rows. 67 * @param[in] flags Screenbufferflags.68 * 69 * @return New screenbuffer.47 * @param[in] flags Chargrid flags. 48 * 49 * @return New chargrid. 70 50 * @return NULL on failure. 71 51 * 72 52 */ 73 screenbuffer_t *screenbuffer_create(sysarg_t cols, sysarg_t rows,74 screenbuffer_flag_t flags)53 chargrid_t *chargrid_create(sysarg_t cols, sysarg_t rows, 54 chargrid_flag_t flags) 75 55 { 76 56 size_t size = 77 sizeof( screenbuffer_t) + cols * rows * sizeof(charfield_t);78 screenbuffer_t *scrbuf;79 80 if ((flags & SCREENBUFFER_FLAG_SHARED) == SCREENBUFFER_FLAG_SHARED) {81 scrbuf = ( screenbuffer_t *) as_area_create(AS_AREA_ANY, size,57 sizeof(chargrid_t) + cols * rows * sizeof(charfield_t); 58 chargrid_t *scrbuf; 59 60 if ((flags & CHARGRID_FLAG_SHARED) == CHARGRID_FLAG_SHARED) { 61 scrbuf = (chargrid_t *) as_area_create(AS_AREA_ANY, size, 82 62 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 83 63 if (scrbuf == AS_MAP_FAILED) 84 64 return NULL; 85 65 } else { 86 scrbuf = ( screenbuffer_t *) malloc(size);66 scrbuf = (chargrid_t *) malloc(size); 87 67 if (scrbuf == NULL) 88 68 return NULL; … … 99 79 100 80 scrbuf->top_row = 0; 101 screenbuffer_clear(scrbuf);81 chargrid_clear(scrbuf); 102 82 103 83 return scrbuf; 104 84 } 105 85 106 /** Return keyfield by coordinates 107 * 108 * The back buffer is organized as a cyclic buffer. 109 * Therefore we must take into account the topmost column. 110 * 111 * @param scrbuf Screenbuffer 112 * @param col Column position on screen 113 * @param row Row position on screen 114 * 115 * @return Keyfield structure on (row, col) 116 * 117 */ 118 charfield_t *screenbuffer_field_at(screenbuffer_t *scrbuf, sysarg_t col, 119 sysarg_t row) 120 { 121 return scrbuf->data + 122 ((row + scrbuf->top_row) % scrbuf->rows) * scrbuf->cols + 123 col; 124 } 125 126 bool screenbuffer_cursor_at(screenbuffer_t *scrbuf, sysarg_t col, sysarg_t row) 86 void chargrid_destroy(chargrid_t *srcbuf) 87 { 88 // TODO 89 } 90 91 bool chargrid_cursor_at(chargrid_t *scrbuf, sysarg_t col, sysarg_t row) 127 92 { 128 93 return ((scrbuf->cursor_visible) && (scrbuf->col == col) && … … 130 95 } 131 96 132 sysarg_t screenbuffer_get_top_row(screenbuffer_t *scrbuf)97 sysarg_t chargrid_get_top_row(chargrid_t *scrbuf) 133 98 { 134 99 return scrbuf->top_row; 135 100 } 136 101 137 static sysarg_t screenbuffer_update_rows(screenbuffer_t *scrbuf)102 static sysarg_t chargrid_update_rows(chargrid_t *scrbuf) 138 103 { 139 104 if (scrbuf->row == scrbuf->rows) { 140 105 scrbuf->row = scrbuf->rows - 1; 141 106 scrbuf->top_row = (scrbuf->top_row + 1) % scrbuf->rows; 142 screenbuffer_clear_row(scrbuf, scrbuf->row);107 chargrid_clear_row(scrbuf, scrbuf->row); 143 108 144 109 return scrbuf->rows; … … 148 113 } 149 114 150 static sysarg_t screenbuffer_update_cols(screenbuffer_t *scrbuf)115 static sysarg_t chargrid_update_cols(chargrid_t *scrbuf) 151 116 { 152 117 /* Column overflow */ … … 154 119 scrbuf->col = 0; 155 120 scrbuf->row++; 156 return screenbuffer_update_rows(scrbuf);121 return chargrid_update_rows(scrbuf); 157 122 } 158 123 … … 160 125 } 161 126 162 /** Store one character to screenbuffer.127 /** Store one character to chargrid. 163 128 * 164 129 * Its position is determined by scrbuf->col 165 130 * and scrbuf->row. 166 131 * 167 * @param scrbuf Screenbuffer.132 * @param scrbuf Chargrid. 168 133 * @param ch Character to store. 169 134 * @param update Update coordinates. … … 174 139 * 175 140 */ 176 sysarg_t screenbuffer_putchar(screenbuffer_t *scrbuf, wchar_t ch, bool update)141 sysarg_t chargrid_putchar(chargrid_t *scrbuf, wchar_t ch, bool update) 177 142 { 178 143 assert(scrbuf->col < scrbuf->cols); … … 180 145 181 146 charfield_t *field = 182 screenbuffer_field_at(scrbuf, scrbuf->col, scrbuf->row);147 chargrid_charfield_at(scrbuf, scrbuf->col, scrbuf->row); 183 148 184 149 field->ch = ch; … … 188 153 if (update) { 189 154 scrbuf->col++; 190 return screenbuffer_update_cols(scrbuf);155 return chargrid_update_cols(scrbuf); 191 156 } 192 157 … … 194 159 } 195 160 196 /** Jump to a new row in screenbuffer.197 * 198 * @param scrbuf Screenbuffer.161 /** Jump to a new row in chargrid. 162 * 163 * @param scrbuf Chargrid. 199 164 * 200 165 * @return Number of rows which have been affected. In usual … … 203 168 * 204 169 */ 205 sysarg_t screenbuffer_newline(screenbuffer_t *scrbuf)170 sysarg_t chargrid_newline(chargrid_t *scrbuf) 206 171 { 207 172 assert(scrbuf->col < scrbuf->cols); … … 211 176 scrbuf->row++; 212 177 213 return screenbuffer_update_rows(scrbuf);214 } 215 216 /** Jump to a new row in screenbuffer.217 * 218 * @param scrbuf Screenbuffer.178 return chargrid_update_rows(scrbuf); 179 } 180 181 /** Jump to a new row in chargrid. 182 * 183 * @param scrbuf Chargrid. 219 184 * @param tab_size Tab size. 220 185 * … … 224 189 * 225 190 */ 226 sysarg_t screenbuffer_tabstop(screenbuffer_t *scrbuf, sysarg_t tab_size)191 sysarg_t chargrid_tabstop(chargrid_t *scrbuf, sysarg_t tab_size) 227 192 { 228 193 assert(scrbuf->col < scrbuf->cols); … … 233 198 234 199 for (sysarg_t i = 0; i < spaces; i++) 235 flush += screenbuffer_putchar(scrbuf, ' ', true) - 1;200 flush += chargrid_putchar(scrbuf, ' ', true) - 1; 236 201 237 202 return flush; 238 203 } 239 204 240 /** Jump to the previous character in screenbuffer.205 /** Jump to the previous character in chargrid. 241 206 * 242 207 * Currently no scrollback is supported. 243 208 * 244 * @param scrbuf Screenbuffer.209 * @param scrbuf Chargrid. 245 210 * 246 211 * @return Number of rows which have been affected. In usual … … 250 215 * 251 216 */ 252 sysarg_t screenbuffer_backspace(screenbuffer_t *scrbuf)217 sysarg_t chargrid_backspace(chargrid_t *scrbuf) 253 218 { 254 219 assert(scrbuf->col < scrbuf->cols); … … 262 227 scrbuf->row--; 263 228 264 screenbuffer_putchar(scrbuf, ' ', false);229 chargrid_putchar(scrbuf, ' ', false); 265 230 return 2; 266 231 } 267 232 268 233 scrbuf->col--; 269 screenbuffer_putchar(scrbuf, ' ', false);234 chargrid_putchar(scrbuf, ' ', false); 270 235 return 1; 271 236 } 272 237 273 /** Clear the screenbuffer.274 * 275 * @param scrbuf Screenbuffer.276 * 277 */ 278 void screenbuffer_clear(screenbuffer_t *scrbuf)238 /** Clear the chargrid. 239 * 240 * @param scrbuf Chargrid. 241 * 242 */ 243 void chargrid_clear(chargrid_t *scrbuf) 279 244 { 280 245 for (size_t pos = 0; pos < (scrbuf->cols * scrbuf->rows); pos++) { … … 288 253 } 289 254 290 /** Update current screenbuffercoordinates291 * 292 * @param scrbuf Screenbuffer.255 /** Update current chargrid coordinates 256 * 257 * @param scrbuf Chargrid. 293 258 * @param col New column. 294 259 * @param row New row. 295 260 * 296 261 */ 297 void screenbuffer_set_cursor(screenbuffer_t *scrbuf, sysarg_t col, sysarg_t row)262 void chargrid_set_cursor(chargrid_t *scrbuf, sysarg_t col, sysarg_t row) 298 263 { 299 264 scrbuf->col = col; … … 301 266 } 302 267 303 void screenbuffer_set_cursor_visibility(screenbuffer_t *scrbuf, bool visible)268 void chargrid_set_cursor_visibility(chargrid_t *scrbuf, bool visible) 304 269 { 305 270 scrbuf->cursor_visible = visible; 306 271 } 307 272 308 /** Get current screenbuffercoordinates309 * 310 * @param scrbuf Screenbuffer.273 /** Get current chargrid coordinates 274 * 275 * @param scrbuf Chargrid. 311 276 * @param col Column. 312 277 * @param row Row. 313 278 * 314 279 */ 315 void screenbuffer_get_cursor(screenbuffer_t *scrbuf, sysarg_t *col,280 void chargrid_get_cursor(chargrid_t *scrbuf, sysarg_t *col, 316 281 sysarg_t *row) 317 282 { … … 323 288 } 324 289 325 bool screenbuffer_get_cursor_visibility(screenbuffer_t *scrbuf)290 bool chargrid_get_cursor_visibility(chargrid_t *scrbuf) 326 291 { 327 292 return scrbuf->cursor_visible; … … 330 295 /** Clear one buffer row. 331 296 * 332 * @param scrbuf Screenbuffer.297 * @param scrbuf Chargrid. 333 298 * @param row Row to clear. 334 299 * 335 300 */ 336 void screenbuffer_clear_row(screenbuffer_t *scrbuf, sysarg_t row)301 void chargrid_clear_row(chargrid_t *scrbuf, sysarg_t row) 337 302 { 338 303 for (sysarg_t col = 0; col < scrbuf->cols; col++) { 339 304 charfield_t *field = 340 screenbuffer_field_at(scrbuf, col, row);305 chargrid_charfield_at(scrbuf, col, row); 341 306 342 307 field->ch = 0; … … 346 311 } 347 312 348 /** Set screenbufferstyle.349 * 350 * @param scrbuf Screenbuffer.313 /** Set chargrid style. 314 * 315 * @param scrbuf Chargrid. 351 316 * @param style Style. 352 317 * 353 318 */ 354 void screenbuffer_set_style(screenbuffer_t *scrbuf, console_style_t style)319 void chargrid_set_style(chargrid_t *scrbuf, console_style_t style) 355 320 { 356 321 scrbuf->attrs.type = CHAR_ATTR_STYLE; … … 358 323 } 359 324 360 /** Set screenbuffercolor.361 * 362 * @param scrbuf Screenbuffer.325 /** Set chargrid color. 326 * 327 * @param scrbuf Chargrid. 363 328 * @param bgcolor Background color. 364 329 * @param fgcolor Foreground color. … … 366 331 * 367 332 */ 368 void screenbuffer_set_color(screenbuffer_t *scrbuf, console_color_t bgcolor,333 void chargrid_set_color(chargrid_t *scrbuf, console_color_t bgcolor, 369 334 console_color_t fgcolor, console_color_attr_t attr) 370 335 { … … 375 340 } 376 341 377 /** Set screenbufferRGB color.378 * 379 * @param scrbuf Screenbuffer.342 /** Set chargrid RGB color. 343 * 344 * @param scrbuf Chargrid. 380 345 * @param bgcolor Background color. 381 346 * @param fgcolor Foreground color. 382 347 * 383 348 */ 384 void screenbuffer_set_rgb_color(screenbuffer_t *scrbuf, pixel_t bgcolor,349 void chargrid_set_rgb_color(chargrid_t *scrbuf, pixel_t bgcolor, 385 350 pixel_t fgcolor) 386 351 {
Note:
See TracChangeset
for help on using the changeset viewer.