Changeset 3498 for neercs/trunk


Ignore:
Timestamp:
May 22, 2009, 9:56:16 AM (11 years ago)
Author:
Pascal Terjan
Message:

Only send the dirty rectangles to the client

Location:
neercs/trunk/src
Files:
2 edited

Legend:

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

    r3459 r3498  
    175175                break;
    176176            }
    177             else if(!strncmp("REFRESH ", buf, 8))
    178             {
     177            else if(!strncmp("UPDATE ", buf, 7))
     178            {
     179                int x, y;
    179180                ssize_t l2 = 0, lb = 0;
    180181                char * buf2;
    181182                size_t l = 0;
    182                 int dt;
     183                /* FIXME check the length before calling atoi*/
     184                x = atoi(buf+8);
     185                y = atoi(buf+19);
    183186                /* 0 means we have valid data but incomplete, so read the rest */
    184187                while(l == 0)
     
    201204                    {
    202205                        l2 += lb;
    203                         l = caca_import_memory(screen_list->cv, buf, l2, "caca");
     206                        l = caca_import_area_from_memory(screen_list->cv, x, y, buf, l2, "caca");
    204207                    }
    205208                }
    206209                fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, O_NONBLOCK);
     210            }
     211            else if(!strncmp("REFRESH", buf, 7))
     212            {
     213                int dt;
    207214                caca_refresh_display(screen_list->dp);
    208215                dt = caca_get_display_time(screen_list->dp);
  • neercs/trunk/src/server.c

    r3496 r3498  
    9797static int request_refresh(struct screen_list* screen_list)
    9898{
    99     size_t bytes;
    100     void *buf;
    101 
    102     buf = caca_export_memory (screen_list->cv, "caca", &bytes);
     99#if defined HAVE_CACA_DIRTY_RECTANGLES
     100    int ndirty = caca_get_dirty_rect_count(screen_list->cv);
     101    if(!ndirty)
     102        return 0;
     103#endif
    103104    if(!screen_list->socket[SOCK_CLIENT])
    104105        connect_socket(screen_list, SOCK_CLIENT);
    105106    if(screen_list->socket[SOCK_CLIENT])
    106107    {
    107         size_t bufsize, towrite = bytes;
     108        size_t bufsize, towrite;
    108109        ssize_t written = 0, ret;
    109110        socklen_t optlen = sizeof(bufsize);
    110         debug("Requesting refresh for %d", bytes);
    111        
     111        size_t bytes;
     112        void *buf;
     113        char buf2[30];
     114        int x, y, w, h, i;
     115
    112116        getsockopt(screen_list->socket[SOCK_CLIENT], SOL_SOCKET, SO_SNDBUF,
    113117                   &bufsize, &optlen);
    114118        bufsize /= 2;
    115119        debug("bufsize=%d", bufsize);
    116         ret = write(screen_list->socket[SOCK_CLIENT],
    117                     "REFRESH ",
    118                     8);
    119         if(ret <= 8 && errno != EAGAIN)
    120         {
     120
     121#if defined HAVE_CACA_DIRTY_RECTANGLES
     122        for (i=0; i<ndirty; i++)
     123        {
     124            caca_get_dirty_rect(screen_list->cv, i, &x, &y, &w, &h);
     125#else
     126        {
     127            i = 0;
     128            x = 0;
     129            y = 0;
     130            w = caca_get_canvas_width(screen_list->cv);
     131            h = caca_get_canvas_height(screen_list->cv);
     132#endif
     133            buf = caca_export_area_to_memory (screen_list->cv,
     134                                              x, y, w, h,
     135                                              "caca",
     136                                              &bytes);
     137            debug("Requesting refresh for %d", bytes);
     138            towrite = bytes;
     139            sprintf(buf2, "UPDATE %10d %10d ", x, y);
     140            ret = write(screen_list->socket[SOCK_CLIENT], buf2, 29);
     141            if(ret < 29 && errno != EAGAIN)
     142            {
     143                free(buf);
     144                return -1;
     145            }
     146            while(towrite > 0)
     147            {
     148                ssize_t n;
     149                debug("Wrote %d, %d remaining", written, towrite);
     150                /* Block to write the end of the message */
     151                fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, 0);
     152                n = write(screen_list->socket[SOCK_CLIENT],
     153                          (char *)buf + written,
     154                          towrite > bufsize ? bufsize : towrite);
     155                if(n < 0)
     156                {
     157                    debug("Can't refresh (%s), with %d bytes (out of %d)", strerror(errno), towrite > bufsize ? bufsize : towrite, towrite);
     158                    return -1;
     159                }
     160                written += n;
     161                towrite -= n;
     162            }
     163            fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, O_NONBLOCK);
    121164            free(buf);
    122             return -1;
    123         }
    124         while(towrite > 0)
    125         {
    126             ssize_t n;
    127             debug("Wrote %d, %d remaining", written, towrite);
    128             /* Block to write the end of the message */
    129             fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, 0);
    130             n = write(screen_list->socket[SOCK_CLIENT],
    131                       (char *)buf + written,
    132                       towrite > bufsize ? bufsize : towrite);
    133             if(n < 0)
    134             {
    135                 debug("Can't refresh (%s), with %d bytes (out of %d)", strerror(errno), towrite > bufsize ? bufsize : towrite, towrite);
    136                 return -1;
    137             }
    138             written += n;
    139             towrite -= n;
    140         }
    141         fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, O_NONBLOCK);
     165        }
     166        write(screen_list->socket[SOCK_CLIENT], "REFRESH", 7);
    142167#if defined HAVE_CACA_DIRTY_RECTANGLES
    143168        caca_clear_dirty_rect_list(screen_list->cv);
    144169#endif
    145170    }
    146     free(buf);
    147171    return 0;
    148172}
     
    258282            else if(!strncmp("DELAY ", buf, 6))
    259283            {
     284                /* FIXME check the length before calling atoi*/
    260285                screen_list->delay = atoi(buf+6);
    261286            }
     
    263288            {
    264289                caca_free_canvas(screen_list->cv);
     290                /* FIXME check the length before calling atoi */
    265291                screen_list->cv = caca_create_canvas(atoi(buf+7), atoi(buf+18));
    266292                screen_list->width  = caca_get_canvas_width(screen_list->cv);
     
    406432                }
    407433                else
    408                     debug("Skipping refresh (%d < %d)", tdiff, screen_list->delay);
     434                    debug("Skipping refresh (%lld < %d)", tdiff, screen_list->delay);
    409435            }
    410436        }
Note: See TracChangeset for help on using the changeset viewer.