Ignore:
Timestamp:
May 5, 2009, 6:42:08 PM (12 years ago)
Author:
Pascal Terjan
Message:
  • Handle large screens
File:
1 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/main.c

    r3324 r3431  
    159159        char buf[128*1024];
    160160        if(!screen_list) goto end;
    161         if (screen_list->socket[SOCK_CLIENT] && (n = read(screen_list->socket[SOCK_CLIENT], buf, sizeof(buf)-1)) > 0)
     161        if(screen_list->socket[SOCK_CLIENT] && (n = read(screen_list->socket[SOCK_CLIENT], buf, sizeof(buf)-1)) > 0)
    162162        {
    163163            buf[n] = 0;
     
    170170            else if(!strncmp("REFRESH ", buf, 8))
    171171            {
    172                 caca_import_memory(screen_list->cv, buf+8, n-8, "caca");
     172                ssize_t l2 = 0, lb = n-8;
     173                char * buf2 = NULL;
     174                size_t l = caca_import_memory(screen_list->cv, buf+8, lb, "caca");
     175                /* 0 means we have valid data but incomplete, so read the rest */
     176                if(l == 0)
     177                {
     178                    buf2 = realloc(buf2, lb+l2);
     179                    memcpy(buf2+l2, buf+8, lb);
     180                    l2 += lb;
     181                }
     182                while(l == 0)
     183                {
     184                    fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, 0);
     185                    lb = read(screen_list->socket[SOCK_CLIENT], buf, sizeof(buf)-1);
     186                    if(lb < 0)
     187                    {
     188                        debug("Failed to read the end of the refresh message (%s)", strerror(errno));
     189                        l = -1;
     190                    }
     191                    else
     192                    {
     193                        debug("Got %d more bytes", lb);
     194                        buf2 = realloc(buf2, lb+l2);
     195                        memcpy(buf2+l2, buf, lb);
     196                        l2 += lb;
     197                        l = caca_import_memory(screen_list->cv, buf2, l2, "caca");
     198                    }
     199                }
     200                fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, O_NONBLOCK);
    173201                caca_refresh_display(screen_list->dp);
    174202            }
Note: See TracChangeset for help on using the changeset viewer.