Ignore:
Timestamp:
Jun 15, 2008 2:40:24 PM (6 years ago)
Author:
jylam
Message:
  • Exploded main() into smaller parts (and that's ugly for now, yes)
File:
1 edited

Legend:

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

    r2395 r2400  
    4949    int eof = 0, refresh = 1, command = 0;
    5050
    51     /* Add-ons*/
    52     int mini = 1;
    53     int status = 1;
    54     int help = 0;
    55 
    5651
    5752    nt = argc - 1;
     
    10196    screen_list->count = 0;
    10297    screen_list->width  = cucul_get_canvas_width(cv);
    103     screen_list->height = cucul_get_canvas_height(cv) - ((mini*6) + (status));
     98    screen_list->mini = 1;
     99    screen_list->help = 0;
     100    screen_list->status = 1;
     101    screen_list->height = cucul_get_canvas_height(cv) - ((screen_list->mini*6) + (screen_list->status));
    104102    screen_list->wm_type = WM_VSPLIT;
    105103    screen_list->in_bell = 0;
     
    163161        }
    164162        else if(ret)
    165             for(i = 0; i < screen_list->count; i++)
    166             {
    167                 /* FIXME: try a new strategy: read all filedescriptors until
    168                  * each of them starved at least once. */
    169 
    170                 if(screen_list->screen[i]->fd < 0 ||
    171                    !FD_ISSET(screen_list->screen[i]->fd, &fdset))
    172                     continue;
    173 
    174                 for(;;)
    175                 {
    176                     ssize_t nr;
    177 
    178                     screen_list->screen[i]->buf =
    179                         realloc(screen_list->screen[i]->buf,
    180                                 screen_list->screen[i]->total + 1024);
    181                     nr = read(screen_list->screen[i]->fd,
    182                               screen_list->screen[i]->buf +
    183                               screen_list->screen[i]->total, 1024);
    184 
    185                     if(nr > 0)
    186                     {
    187                         screen_list->screen[i]->total += nr;
    188                         continue;
    189                     }
    190 
    191                     if(nr == 0 || errno != EWOULDBLOCK) {
    192                         close(screen_list->screen[i]->fd);
    193                         screen_list->screen[i]->fd = -1;
    194                         destroy_screen(screen_list->screen[i]);
    195                         remove_screen(screen_list, i, 0);
    196                         if(i < prevpty) prevpty--;
    197                         if(i == pty)
    198                         {
    199                             pty = prevpty;
    200                             prevpty = 0;
    201                         }
    202                         if(i < pty) pty--;
    203                         refresh = 1;
    204                     }
    205 
    206                     break;
    207                 }
    208             }
    209 
     163        {
     164            /* Read each terminal content */
     165            refresh |= update_screens_contents(screen_list, &fdset, &pty, &prevpty);
     166        }
     167        /* No more screens, exit */
    210168        if(!screen_list->count) break;
    211169
    212         for(i = 0; i < screen_list->count; i++)
    213         if(screen_list->screen[i]->total)
    214         {
    215             unsigned long int bytes;
    216 
    217             bytes = import_term(screen_list,
    218                                 screen_list->screen[i],
    219                                 screen_list->screen[i]->buf,
    220                                 screen_list->screen[i]->total);
    221 
    222             if(bytes > 0)
    223             {
    224                 screen_list->screen[i]->total -= bytes;
    225                 memmove(screen_list->screen[i]->buf,
    226                         screen_list->screen[i]->buf + bytes,
    227                         screen_list->screen[i]->total);
    228                 refresh = 1;
    229             }
    230         }
     170        /* Update each screen canvas  */
     171        refresh |= update_terms(screen_list);
    231172
    232173        /* Get events, if any */
     
    250191                case 'm':
    251192                case 0x0d: //CACA_KEY_CTRL_M:
    252                     mini = !mini;
     193                    screen_list->mini = !screen_list->mini;
    253194                    refresh = 1;
    254195                    break;
     
    289230                case 'h':
    290231                case 0x08: //CACA_KEY_CTRL_H:
    291                     help = !help;
     232                    screen_list->help = !screen_list->help;
    292233                    refresh = 1;
    293234                    break;
     
    309250                    write(screen_list->screen[pty]->fd, "\x1b[D", 3); break;
    310251                case CACA_KEY_ESCAPE:
    311                     if(help) help = 0;
     252                    if(screen_list->help) screen_list->help = 0;
    312253                default:
    313254                    write(screen_list->screen[pty]->fd, &c, 1); break;
     
    327268        }
    328269
    329         /* Refresh screen */
     270        /* Resfresh screen */
    330271        if(refresh || screen_list->in_bell)
    331272        {
    332273            refresh = 0;
    333 
    334             screen_list->width  = cucul_get_canvas_width(cv);
    335             screen_list->height = cucul_get_canvas_height(cv) - (mini*6);
    336 
    337             update_windows_props(cv, screen_list, pty);
    338 
    339             if(screen_list->screen[pty]->title)
    340                 caca_set_display_title(dp, screen_list->screen[pty]->title);
    341             else
    342                 caca_set_display_title(dp, PACKAGE_STRING);
    343 
    344             cucul_set_color_ansi(cv, CUCUL_DEFAULT, CUCUL_DEFAULT);
    345             cucul_clear_canvas(cv);
    346             cucul_set_color_ansi(cv, CUCUL_LIGHTRED, CUCUL_BLACK);
    347 
    348             for(i = screen_list->count - 1; i >=0; i--)
    349             {
    350                 if(i!=pty)
    351                 {
    352                     cucul_blit(cv,
    353                                screen_list->screen[i]->x,
    354                                screen_list->screen[i]->y,
    355                                screen_list->screen[i]->cv, NULL);
    356                     cucul_draw_cp437_box(cv,
    357                                          screen_list->screen[i]->x - 1,
    358                                          screen_list->screen[i]->y - 1,
    359                                          screen_list->screen[i]->w + 2,
    360                                          screen_list->screen[i]->h + 2);
    361                     if(screen_list->screen[i]->title)
    362                         cucul_printf(cv,
    363                                      screen_list->screen[i]->x,
    364                                      screen_list->screen[i]->y - 1,
    365                                      " %.*s ",
    366                                      screen_list->screen[i]->w - 3,
    367                                      screen_list->screen[i]->title);
    368                 }
    369 
    370             }
    371 
    372             cucul_blit(cv,
    373                        screen_list->screen[pty]->x,
    374                        screen_list->screen[pty]->y,
    375                        screen_list->screen[pty]->cv, NULL);
    376 
    377             if(screen_list->screen[pty]->bell)
    378             {
    379                 cucul_set_color_ansi(cv, CUCUL_RED, CUCUL_BLACK);
    380                 screen_list->screen[pty]->bell = 0;
    381                 screen_list->in_bell--;
    382             }
    383             else
    384             {
    385                 cucul_set_color_ansi(cv, CUCUL_LIGHTGREEN, CUCUL_BLACK);
    386             }
    387 
    388             cucul_draw_cp437_box(cv,
    389                                  screen_list->screen[pty]->x - 1,
    390                                  screen_list->screen[pty]->y - 1,
    391                                  screen_list->screen[pty]->w + 2,
    392                                  screen_list->screen[pty]->h + 2);
    393 
    394             if(screen_list->screen[pty]->title)
    395             {
    396                 cucul_printf(cv,
    397                              screen_list->screen[pty]->x,
    398                              screen_list->screen[pty]->y - 1,
    399                              " %.*s ",
    400                              screen_list->screen[pty]->w - 3,
    401                              screen_list->screen[pty]->title);
    402             }
    403 
    404             cucul_gotoxy(cv,
    405                          screen_list->screen[pty]->x +
    406                          cucul_get_cursor_x(screen_list->screen[pty]->cv),
    407                          screen_list->screen[pty]->y +
    408                          cucul_get_cursor_y(screen_list->screen[pty]->cv));
    409 
    410 
    411             if(mini)
    412             {
    413                 draw_thumbnails(cv, screen_list, pty);
    414             }
    415             if(status)
    416             {
    417                 draw_status(cv, screen_list, pty);
    418             }
    419             if(help)
    420             {
    421                 draw_help(cv, screen_list, pty);
    422             }
    423 
    424             caca_refresh_display(dp);
     274            refresh_screens(cv, dp, screen_list,  pty);
    425275        }
    426276
     
    499349}
    500350
     351
     352
     353int update_terms(struct screen_list* screen_list)
     354{
     355    int i, refresh = 0;
     356    for(i = 0; i < screen_list->count; i++)
     357    {
     358        if(screen_list->screen[i]->total)
     359        {
     360            unsigned long int bytes;
     361
     362            bytes = import_term(screen_list,
     363                                screen_list->screen[i],
     364                                screen_list->screen[i]->buf,
     365                                screen_list->screen[i]->total);
     366
     367            if(bytes > 0)
     368            {
     369                screen_list->screen[i]->total -= bytes;
     370                memmove(screen_list->screen[i]->buf,
     371                        screen_list->screen[i]->buf + bytes,
     372                        screen_list->screen[i]->total);
     373                refresh = 1;
     374            }
     375        }
     376    }
     377    return refresh;
     378}
     379
     380
     381
     382
     383int update_screens_contents(struct screen_list* screen_list,
     384                             fd_set *fdset,
     385                             int *pty, int *prevpty)
     386{
     387    int i, refresh = 0;
     388    for(i = 0; i < screen_list->count; i++)
     389    {
     390        /* FIXME: try a new strategy: read all filedescriptors until
     391         * each of them starved at least once. */
     392
     393        if(screen_list->screen[i]->fd < 0 ||
     394           !FD_ISSET(screen_list->screen[i]->fd, fdset))
     395            continue;
     396
     397        for(;;)
     398        {
     399            ssize_t nr;
     400
     401            screen_list->screen[i]->buf =
     402                realloc(screen_list->screen[i]->buf,
     403                        screen_list->screen[i]->total + 1024);
     404            nr = read(screen_list->screen[i]->fd,
     405                      screen_list->screen[i]->buf +
     406                      screen_list->screen[i]->total, 1024);
     407
     408            if(nr > 0)
     409            {
     410                screen_list->screen[i]->total += nr;
     411                continue;
     412            }
     413
     414            if(nr == 0 || errno != EWOULDBLOCK) {
     415                close(screen_list->screen[i]->fd);
     416                screen_list->screen[i]->fd = -1;
     417                destroy_screen(screen_list->screen[i]);
     418                remove_screen(screen_list, i, 0);
     419                if(i < (*prevpty)) (*prevpty)--;
     420                if(i == *pty)
     421                {
     422                    *pty = *prevpty;
     423                    *prevpty = 0;
     424                }
     425                if(i < (*pty)) (*pty)--;
     426                refresh = 1;
     427            }
     428
     429            break;
     430        }
     431    }
     432    return refresh;
     433}
     434
     435void refresh_screens(cucul_canvas_t *cv,
     436                     caca_display_t *dp,
     437                     struct screen_list *screen_list,
     438                     int pty)
     439{
     440    int i;
     441
     442    screen_list->width  = cucul_get_canvas_width(cv);
     443    screen_list->height = cucul_get_canvas_height(cv) - (screen_list->mini*6);
     444
     445    update_windows_props(cv, screen_list, pty);
     446
     447    if(screen_list->screen[pty]->title)
     448        caca_set_display_title(dp, screen_list->screen[pty]->title);
     449    else
     450        caca_set_display_title(dp, PACKAGE_STRING);
     451
     452    cucul_set_color_ansi(cv, CUCUL_DEFAULT, CUCUL_DEFAULT);
     453    cucul_clear_canvas(cv);
     454    cucul_set_color_ansi(cv, CUCUL_LIGHTRED, CUCUL_BLACK);
     455
     456    for(i = screen_list->count - 1; i >=0; i--)
     457    {
     458        if(i!=pty)
     459        {
     460            cucul_blit(cv,
     461                       screen_list->screen[i]->x,
     462                       screen_list->screen[i]->y,
     463                       screen_list->screen[i]->cv, NULL);
     464            cucul_draw_cp437_box(cv,
     465                                 screen_list->screen[i]->x - 1,
     466                                 screen_list->screen[i]->y - 1,
     467                                 screen_list->screen[i]->w + 2,
     468                                 screen_list->screen[i]->h + 2);
     469            if(screen_list->screen[i]->title)
     470                cucul_printf(cv,
     471                             screen_list->screen[i]->x,
     472                             screen_list->screen[i]->y - 1,
     473                             " %.*s ",
     474                             screen_list->screen[i]->w - 3,
     475                             screen_list->screen[i]->title);
     476        }
     477    }
     478
     479    cucul_blit(cv,
     480               screen_list->screen[pty]->x,
     481               screen_list->screen[pty]->y,
     482               screen_list->screen[pty]->cv, NULL);
     483
     484    if(screen_list->screen[pty]->bell)
     485    {
     486        cucul_set_color_ansi(cv, CUCUL_RED, CUCUL_BLACK);
     487        screen_list->screen[pty]->bell = 0;
     488        screen_list->in_bell--;
     489    }
     490    else
     491    {
     492        cucul_set_color_ansi(cv, CUCUL_LIGHTGREEN, CUCUL_BLACK);
     493    }
     494
     495    cucul_draw_cp437_box(cv,
     496                         screen_list->screen[pty]->x - 1,
     497                         screen_list->screen[pty]->y - 1,
     498                         screen_list->screen[pty]->w + 2,
     499                         screen_list->screen[pty]->h + 2);
     500
     501    if(screen_list->screen[pty]->title)
     502    {
     503        cucul_printf(cv,
     504                     screen_list->screen[pty]->x,
     505                     screen_list->screen[pty]->y - 1,
     506                     " %.*s ",
     507                     screen_list->screen[pty]->w - 3,
     508                     screen_list->screen[pty]->title);
     509    }
     510
     511    cucul_gotoxy(cv,
     512                 screen_list->screen[pty]->x +
     513                 cucul_get_cursor_x(screen_list->screen[pty]->cv),
     514                 screen_list->screen[pty]->y +
     515                 cucul_get_cursor_y(screen_list->screen[pty]->cv));
     516
     517
     518    if(screen_list->mini)
     519    {
     520        draw_thumbnails(cv, screen_list, pty);
     521    }
     522    if(screen_list->status)
     523    {
     524        draw_status(cv, screen_list, pty);
     525    }
     526    if(screen_list->help)
     527    {
     528        draw_help(cv, screen_list, pty);
     529    }
     530
     531    caca_refresh_display(dp);
     532}
    501533
    502534
Note: See TracChangeset for help on using the changeset viewer.