Changeset 3940


Ignore:
Timestamp:
Nov 18, 2009, 3:55:57 PM (11 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Move client's mainloop to client.c
Location:
neercs/trunk/src
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/Makefile.am

    r3439 r3940  
    44neercs_SOURCES = neercs.h mygetopt.c mygetopt.h recurrent.c main.c screens.c \
    55                 term.c grab.c effects.c wm.c screensaver.c attach.c \
    6                  configuration.c mytrace.c mytrace.h input.c lock.c server.c
     6                 configuration.c mytrace.c mytrace.h input.c lock.c server.c \
     7                 client.c                 
    78neercs_CFLAGS = @CACA_CFLAGS@
    89neercs_LDADD = @CACA_LIBS@ @UTIL_LIBS@ @PAM_LIBS@
  • neercs/trunk/src/main.c

    r3939 r3940  
    8181    struct screen_list *screen_list = NULL;
    8282    int args;
    83     long long unsigned int last_key_time = 0;
     83
    8484    int mainret = -1;
    85 #define NEERCS_RECV_BUFSIZE 128*1024
    86     char * buf = NULL;
    87    
     85       
    8886    screen_list = create_screen_list();
    8987    screen_list->default_shell = getenv("SHELL");
     
    152150    }
    153151
    154     last_key_time = get_us();
    155 
    156     for(;;)
    157     {
    158         caca_event_t ev;
    159         int ret = 0;
    160         ssize_t n;
    161         if(!screen_list) goto end;
    162         if(!buf)
    163             buf = malloc(NEERCS_RECV_BUFSIZE);
    164         if(!buf)
    165         {
    166             debug("Failed to allocate memory");
    167             goto end;
    168         }
    169         if(screen_list->socket[SOCK_CLIENT] && (n = read(screen_list->socket[SOCK_CLIENT], buf, NEERCS_RECV_BUFSIZE-1)) > 0)
    170         {
    171             buf[n] = 0;
    172             debug("Received from server: %s", buf);
    173             if(!strncmp("DETACH", buf, 6))
    174             {
    175                 ret = 1;
    176                 break;
    177             }
    178             else if(!strncmp("UPDATE ", buf, 7))
    179             {
    180                 int x, y;
    181                 ssize_t l2 = 0, lb = 0;
    182                 char * buf2;
    183                 size_t l = 0;
    184                 /* FIXME check the length before calling atoi*/
    185                 x = atoi(buf+8);
    186                 y = atoi(buf+19);
    187                 /* 0 means we have valid data but incomplete, so read the rest */
    188                 while(l == 0)
    189                 {
    190                     buf2 = realloc(buf, l2 + NEERCS_RECV_BUFSIZE);
    191                     if(!buf2)
    192                     {
    193                         debug("Failed to allocate memory");
    194                         goto end;
    195                     }
    196                     buf = buf2;
    197                     fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, 0);
    198                     lb = read(screen_list->socket[SOCK_CLIENT], buf+l2, NEERCS_RECV_BUFSIZE-1);
    199                     if(lb < 0)
    200                     {
    201                         debug("Failed to read the end of the refresh message (%s)", strerror(errno));
    202                         l = -1;
    203                     }
    204                     else
    205                     {
    206                         l2 += lb;
    207 #if defined HAVE_CACA_DIRTY_RECTANGLES
    208                         l = caca_import_area_from_memory(screen_list->cv, x, y, buf, l2, "caca");
    209 #else
    210                         l = caca_import_memory(screen_list->cv, buf, l2, "caca");
    211 #endif
    212                     }
    213                 }
    214                 fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, O_NONBLOCK);
    215             }
    216             else if(!strncmp("REFRESH ", buf, 8))
    217             {
    218                 int dt, x, y;
    219                 /* FIXME check the length before calling atoi*/
    220                 x = atoi(buf+8);
    221                 y = atoi(buf+19);
    222                 caca_gotoxy(screen_list->cv, x, y);
    223                 caca_refresh_display(screen_list->dp);
    224                 dt = caca_get_display_time(screen_list->dp);
    225                 debug("refreshtime=%dms (limit %d, requested %d)", dt/1000, screen_list->delay, screen_list->requested_delay);
    226                 /* Adjust refresh delay so that the server do not compute useless things */
    227                 if(dt > 2*1000*screen_list->delay && screen_list->delay <= 100)
    228                 {
    229                     screen_list->delay*=2;
    230                     send_delay(screen_list);
    231                 }
    232                 else if(dt < screen_list->delay*1000*1.2 &&
    233                         screen_list->delay >= 3*screen_list->requested_delay/2)
    234                 {
    235                     screen_list->delay=2*screen_list->delay/3;
    236                     send_delay(screen_list);
    237                 }
    238             }
    239             else if(!strncmp("CURSOR ", buf, 7))
    240             {
    241                 caca_set_cursor(screen_list->dp, atoi(buf+7));
    242             }
    243             else if(!strncmp("TITLE ", buf, 6))
    244             {
    245                 caca_set_display_title(screen_list->dp, buf+6);
    246                 caca_refresh_display(screen_list->dp);
    247             }
    248             else
    249             {
    250                 debug("Unknown message received from server: %s", buf);
    251             }
    252         }
     152
     153    mainloop(screen_list);
    253154       
    254         if(ret)
    255             break;
    256 
    257         ret = caca_get_event(screen_list->dp,
    258                              CACA_EVENT_KEY_PRESS
    259                              |CACA_EVENT_RESIZE
    260                              |CACA_EVENT_QUIT,
    261                              &ev, 10000);
    262         if(ret)
    263             ret = send_event(ev, screen_list);
    264 
    265         if(ret)
    266             break;
    267     }
    268 
    269155    /* Clean up */
    270156    mainret = 0;
    271157end:
    272     if(buf)
    273         free(buf);
     158
    274159    if(screen_list)
    275160    {
  • neercs/trunk/src/neercs.h

    r3939 r3940  
    238238void free_screen_list(struct screen_list *screen_list);
    239239
     240void mainloop(struct screen_list *screen_list);
     241
    240242int create_pty(char *cmd, unsigned int w, unsigned int h, int *cpid);
    241243int create_pty_grab(long pid, unsigned int w, unsigned int h, int *cpid);
Note: See TracChangeset for help on using the changeset viewer.