static int readCharacters_AtSpiScreen (const ScreenBox *box, ScreenCharacter *buffer) { long x,y; clearScreenCharacters(buffer,box->height*box->width); pthread_mutex_lock(&updateMutex); if (!curTerm) { setScreenMessage(box, buffer, nonatspi); goto out; } if (!curNumRows) { goto out; } if (!validateScreenBox(box, curNumCols, curNumRows)) { goto out; } for (y=0; y<box->height; y++) { if (curRowLengths[box->top+y]) { for (x=0; x<box->width; x++) { if (box->left+x<curRowLengths[box->top+y] - (curRows[box->top+y][curRowLengths[box->top+y]-1]=='\n')) { buffer[y*box->width+x].text = curRows[box->top+y][box->left+x]; } } } } out: pthread_mutex_unlock(&updateMutex); return 1; }
void setScreenMessage (const ScreenBox *box, ScreenCharacter *buffer, const char *message) { const ScreenCharacter *end = buffer + box->width; unsigned int index = 0; size_t length = strlen(message); mbstate_t state; memset(&state, 0, sizeof(state)); clearScreenCharacters(buffer, (box->width * box->height)); while (length) { wchar_t wc; size_t result = mbrtowc(&wc, message, length, &state); if ((ssize_t)result < 1) break; message += result; length -= result; if (index++ >= box->left) { if (buffer == end) break; (buffer++)->text = wc; } } }