Changeset 3940 for neercs/trunk/src/main.c
- Timestamp:
- Nov 18, 2009, 3:55:57 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
neercs/trunk/src/main.c
r3939 r3940 81 81 struct screen_list *screen_list = NULL; 82 82 int args; 83 long long unsigned int last_key_time = 0; 83 84 84 int mainret = -1; 85 #define NEERCS_RECV_BUFSIZE 128*1024 86 char * buf = NULL; 87 85 88 86 screen_list = create_screen_list(); 89 87 screen_list->default_shell = getenv("SHELL"); … … 152 150 } 153 151 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); 253 154 254 if(ret)255 break;256 257 ret = caca_get_event(screen_list->dp,258 CACA_EVENT_KEY_PRESS259 |CACA_EVENT_RESIZE260 |CACA_EVENT_QUIT,261 &ev, 10000);262 if(ret)263 ret = send_event(ev, screen_list);264 265 if(ret)266 break;267 }268 269 155 /* Clean up */ 270 156 mainret = 0; 271 157 end: 272 if(buf) 273 free(buf); 158 274 159 if(screen_list) 275 160 {
Note: See TracChangeset
for help on using the changeset viewer.