static int parse_args_post(int argc, char *argv[]) { DBG("Parsing arguments post state"); optind = 1; for (;;) { char *gostr = "i:o:p:r:R:s:aUb" \ "L:hvVf:"; struct option long_opts[] = { {"input", 1, 0, 'i'}, {"output", 1, 0, 'o'}, {"policy", 1, 0, 'p'}, {"read-interval", 1, 0, 'r'}, {"rate-interval", 1, 0, 'R'}, {"sleep-interval", 1, 0, 's'}, {"show-all", 0, 0, 'a'}, {"use-si", 0, 0, 'U'}, {"use-bit", 0, 0, 'b'}, {"lifetime", 1, 0, 'L'}, {0, 0, 0, 0}, }; int c = getopt_long(argc, argv, gostr, long_opts, NULL); if (c == -1) break; switch (c) { case 'i': if (input_set(optarg)) return 1; break; case 'o': if (output_set(optarg)) return 1; break; case 'p': cfg_setstr(cfg, "policy", optarg); break; case 'r': cfg_setfloat(cfg, "read_interval", strtod(optarg, NULL)); break; case 'R': cfg_setfloat(cfg, "rate_interval", strtod(optarg, NULL)); break; case 's': cfg_setint(cfg, "sleep_time", strtoul(optarg, NULL, 0)); break; case 'a': cfg_setbool(cfg, "show_all", cfg_true); break; case 'U': cfg_setbool(cfg, "use_si", cfg_true); break; case 'b': cfg_setbool(cfg, "use_bit", cfg_true); break; case 'L': cfg_setint(cfg, "lifetime", strtoul(optarg, NULL, 0)); break; case 'f': /* Already handled in pre getopt loop */ break; default: quit("Aborting...\n"); break; } } return 0; }
static void key_assigner_update(void* data, int status) { key_assigner_t* key = (key_assigner_t*)data; if(status == LOW) return; if(key->assigned == NOT_READY && key->pressed_key != 0) { key->timer += sync_elapsed; if(key->timer >= ACTIVATION_TIME) { int i; key->assigned = WAIT_KEYS; key->timer = (mFloat)0.0; key->timer_ready = (mFloat)0.0; key->timer_unassign = (mFloat)0.0; if(key->type == MOUSE) { key->assigned = CHOOSE; key->selection = KEY_NB; } if(input_set(&player_array[key->player_nb].input, key->sys, key->type)) { player_array[key->player_nb].input.flag = key->sys; if(key->type == MOUSE) { // For the mouse, we guarantee that each signal // will be in the range [1-4] for(i = 0 ; i < KEY_NB ; i++) player_array[key->player_nb].input.key[i] = i + 1; } else { for(i = 0 ; i < KEY_NB ; i++) player_array[key->player_nb].input.key[i] = 0; } } else key->assigned = NOT_READY; } } else if(key->assigned == CHOOSE || key->assigned == READY) { if(key->ready_pressed) { // Don't be able to accept if there's no model to load! if(model_nb_filenames > 0) key->timer_ready += sync_elapsed; } else if(key->unassign_pressed) key->timer_unassign += sync_elapsed; if(key->timer_unassign >= ACTIVATION_TIME) { int i; int players_not_ready = 0; key->assigned = NOT_READY; key->unassign_pressed = 0; key->timer_unassign = (mFloat)0.0; for(i = 0 ; i < KEY_NB ; i++) player_array[key->player_nb].input.key[i] = 0; for(i = 0 ; i < MAX_PLAYERS ; i++) player_array[i].box_force = 1; // This function sets 'ready' to 0 itself. destroy_player(&player_array[key->player_nb]); for(i = 0 ; i < MAX_PLAYERS ; i++) { if(!player_array[i].ready) players_not_ready++; } if(players_not_ready == MAX_PLAYERS) { dont_draw = 1; dont_compute = 1; } } else { if(key->assigned == CHOOSE) { if(key->timer_ready >= ACTIVATION_TIME) { int i; if(load_model(key)) { key->assigned = READY; player_array[key->player_nb].ready = 1; } key->timer_ready = (mFloat)0.0; key->ready_pressed = 0; // Just below, we compute something modulo // key->nb_frames, which raises an exception! key->nb_frames = 1; for(i = 0 ; i < MAX_PLAYERS ; i++) player_array[i].box_force = 1; } } // The state could have gone to 'Ready' by the // code above. if(key->assigned == READY) { key->animation_time += sync_elapsed; if(key->animation_time >= key->frame_time) { key->frame_nb = (key->frame_nb + 1) % key->nb_frames; key->animation_time = (mFloat)0.0; } if(dont_draw) { int players_ready = 0; int i; for(i = 0 ; i < MAX_PLAYERS ; i++) { if(((key_assigner_t*)container_assigner[i].data.data)->assigned == READY || ((key_assigner_t*)container_assigner[i].data.data)->assigned == NOT_READY) players_ready++; } if(players_ready == MAX_PLAYERS) client_join_local(NULL); } } } } }
static void parse_args_post(int argc, char *argv[]) { optind = 1; for (;;) { char *gostr = "i:I:o:O:p:r:R:s:S:P:wadu:U" \ "L:g:hvVf:"; #ifdef HAVE_GETOPT_LONG struct option long_opts[] = { {"input", 1, 0, 'i'}, {"secondary-input", 1, 0, 'I'}, {"output", 1, 0, 'o'}, {"secondary-output", 1, 0, 'O'}, {"policy", 1, 0, 'p'}, {"read-interval", 1, 0, 'r'}, {"rate-interval", 1, 0, 'R'}, {"sleep-interval", 1, 0, 's'}, {"send-signal", 1, 0, 'S'}, {"pidfile", 1, 0, 'P'}, {"wait-for-signal", 0, 0, 'w'}, {"show-all", 0, 0, 'a'}, {"daemon", 0, 0, 'd'}, {"uid", 1, 0, 'u'}, {"use-si", 0, 0, 'U'}, {"lifetime", 1, 0, 'L'}, {"gid", 1, 0, 'g'}, {0, 0, 0, 0}, }; int c = getopt_long(argc, argv, gostr, long_opts, NULL); #else int c = getopt(argc, argv, gostr; #endif if (c == -1) break; switch (c) { case 'i': input_set(optarg); break; case 'I': input_set_secondary(optarg); break; case 'o': output_set(optarg); break; case 'O': output_set_secondary(optarg); break; case 'p': cfg_setstr(cfg, "policy", optarg); break; case 'r': cfg_setfloat(cfg, "read_interval", strtod(optarg, NULL)); break; case 'R': cfg_setfloat(cfg, "rate_interval", strtod(optarg, NULL)); break; case 's': cfg_setint(cfg, "sleep_time", strtoul(optarg, NULL, 0)); break; case 'S': signal_send(optarg); exit(0); case 'w': cfg_setint(cfg, "signal_driven", 1); break; case 'P': cfg_setstr(cfg, "pidfile", optarg); break; case 'a': cfg_setint(cfg, "show_all", 1); break; case 'd': cfg_setbool(cfg, "daemon", cfg_true); break; case 'u': cfg_setstr(cfg, "uid", optarg); break; case 'U': cfg_setbool(cfg, "use_si", cfg_true); break; case 'L': cfg_setint(cfg, "lifetime", strtoul(optarg, NULL, 0)); break; case 'g': cfg_setstr(cfg, "gid", optarg); break; case 'f': /* Already handled in pre getopt loop */ break; default: quit("Aborting...\n"); break; } } }