Changeset 2480


Ignore:
Timestamp:
Jun 23, 2008, 11:39:11 PM (15 years ago)
Author:
Pascal Terjan
Message:
  • Move most actions outside of option parsing
File:
1 edited

Legend:

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

    r2479 r2480  
    33 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
    44 *                2008 Jean-Yves Lamoureux <jylam@lnxscene.org>
     5 *                2008 Pascal Terjan <pterjan@linuxfr.org>
    56 *                All Rights Reserved
    67 *
     
    8384    int lock_offset = 0;
    8485    int mainret = 0;
     86    int attach = 0;
     87    int *to_grab = NULL;
     88    int nb_to_grab = 0;
    8589
    8690    default_shell = getenv("SHELL");
     
    9599    if(args==0)
    96100        args = 1;
    97 
    98     /* Create main canvas and associated caca window */
    99     /* FIXME: do not create display for -R/-h/-v */
    100     cv = cucul_create_canvas(0, 0);
    101     dp = caca_create_display(cv);
    102     if(!dp)
    103         return 1;
    104     caca_set_cursor(dp, 1);
    105 
    106     w = cucul_get_canvas_width(cv);
    107     h = cucul_get_canvas_height(cv);
    108 
    109101
    110102    /* Create screen list */
     
    122114    }
    123115
    124 
    125116    screen_list->count = 0;
    126     screen_list->width  = cucul_get_canvas_width(cv);
    127117    screen_list->mini = 1;
    128118    screen_list->help = 0;
    129119    screen_list->status = 1;
    130     screen_list->height = cucul_get_canvas_height(cv) - ((screen_list->mini*6) + (screen_list->status));
    131120    screen_list->wm_type = WM_VSPLIT;
    132121    screen_list->in_bell = 0;
     
    168157    {
    169158        int option_index = 0;
    170         char **sockets;
    171         int grab = 0;
     159        int pidopt;
    172160        static struct myoption long_options[] =
    173161            {
     
    189177        {
    190178        case 'P': /* --pid */
    191             add_screen(screen_list,create_screen_grab(w, h, atoi(myoptarg)));
     179            pidopt = atoi(myoptarg);
     180            if(pidopt <= 0)
     181            {
     182                fprintf(stderr, "Invalid pid %d\n", pidopt);
     183                if(to_grab)
     184                    free(to_grab);
     185                return -1;
     186            }
     187            if(!to_grab)
     188            {
     189                /* At most argc-1-s times -P <pid> */
     190                to_grab = (int *)malloc(((argc-1-s)/2)*sizeof(int));
     191                if(!to_grab)
     192                {
     193                    fprintf(stderr, "Can't allocate memory at %s:%d\n", __FUNCTION__, __LINE__);
     194                    return -1;
     195                }
     196            }
     197            to_grab[nb_to_grab++] = pidopt;
    192198            s+=2;
    193             grab = 1;
    194199            break;
    195200        case 'R':
    196             if(grab)
    197             {
    198                 fprintf(stderr, "-P and -R can not be used together!\n");
    199                 mainret = -1;
    200                 goto end;
    201             }
    202             caca_free_display(dp);
    203             dp = NULL;
    204             sockets = list_sockets(screen_list->socket_dir);
    205             if(sockets && sockets[0])
    206             {
    207                 request_attach(sockets[0]);
    208                 for(i=0; sockets[i]; i++)
    209                     free(sockets[i]);
    210                 free(sockets);
    211             }
    212             else
    213             {
    214                 fprintf(stderr, "No socket found!\n");
    215                 mainret = -1;
    216             }
    217             goto end;
     201            attach = 1;
     202            s+=1;
    218203            break;
    219204        case 'h': /* --help */
    220205            usage(argc, argv);
    221             goto end;
     206            return 0;
    222207            break;
    223208        case 'v': /* --version */
    224209            version();
    225             goto end;
     210            return 0;
    226211            break;
    227212        default:
    228213            fprintf(stderr, "Unknown argument #%d\n", myoptind);
    229             mainret = -1;
    230             goto end;
    231             break;
    232         }
    233     }
    234 
    235 
    236     if(s == 0 && argc<2)
     214            return -1;
     215            break;
     216        }
     217    }
     218
     219    if(attach)
     220    {
     221        char **sockets;
     222        if(nb_to_grab || (argc-1 > s))
     223        {
     224            fprintf(stderr, "-R can be associated with commands or pids!\n");
     225            return -1;
     226        }
     227        sockets = list_sockets(screen_list->socket_dir);
     228        if(sockets && sockets[0])
     229        {
     230            request_attach(sockets[0]);
     231            fprintf(stderr, "Failed to attach!\n");
     232            for(i=0; sockets[i]; i++)
     233                free(sockets[i]);
     234            free(sockets);
     235        }
     236        else
     237        {
     238            fprintf(stderr, "No socket found!\n");
     239        }
     240        return -1;
     241    }
     242
     243    /* Create main canvas and associated caca window */
     244    cv = cucul_create_canvas(0, 0);
     245    dp = caca_create_display(cv);
     246    if(!dp)
     247        return 1;
     248    caca_set_cursor(dp, 1);
     249
     250    w = cucul_get_canvas_width(cv);
     251    h = cucul_get_canvas_height(cv);
     252
     253    screen_list->width  = cucul_get_canvas_width(cv);
     254    screen_list->height = cucul_get_canvas_height(cv) - ((screen_list->mini*6) + (screen_list->status));
     255
     256    if(nb_to_grab == 0 && s == argc -1)
    237257    {
    238258        add_screen(screen_list, create_screen(w, h, default_shell));
    239259    }
     260
     261    /* Attach processes */
     262    for(i=0; i<nb_to_grab - s; i++)
     263    {
     264        add_screen(screen_list,create_screen_grab(w, h, to_grab[i]));
     265    }
     266    free(to_grab);
    240267
    241268    /* Launch command line processes */
     
    244271        add_screen(screen_list, create_screen(w, h, argv[i+s+1]));
    245272    }
    246 
    247273
    248274    /* Windows are in a temporary state, resize them to the right dimensions */
     
    534560    }
    535561
    536 end:
    537562    /* Clean up */
    538563    if(dp)
Note: See TracChangeset for help on using the changeset viewer.