void toggle_document_option(struct session *ses, unsigned char *option_name) { struct option *option; assert(ses && ses->doc_view && ses->tab && ses->tab->term); if_assert_failed return; if (!ses->doc_view->vs) { nowhere_box(ses->tab->term, NULL); return; } option = get_opt_rec(config_options, option_name); assert(option); if_assert_failed return; if (ses->option) option = get_option_shadow(option, config_options, ses->option); if (!option) return; toggle_option(ses, option); draw_formatted(ses, 1); }
/* * Handle a char of an option toggle command. */ static int mca_opt_char(int c) { PARG parg; /* * This may be a short option (single char), * or one char of a long option name, * or one char of the option parameter. */ if (curropt == NULL && len_cmdbuf() == 0) { int ret = mca_opt_first_char(c); if (ret != NO_MCA) return (ret); } if (optgetname) { /* We're getting a long option name. */ if (c != '\n' && c != '\r') return (mca_opt_nonfirst_char(c)); if (curropt == NULL) { parg.p_string = get_cmdbuf(); error("There is no --%s option", &parg); return (MCA_DONE); } optgetname = FALSE; cmd_reset(); } else { if (is_erase_char(c)) return (NO_MCA); if (curropt != NULL) /* We're getting the option parameter. */ return (NO_MCA); curropt = findopt(c); if (curropt == NULL) { parg.p_string = propt(c); error("There is no %s option", &parg); return (MCA_DONE); } } /* * If the option which was entered does not take a * parameter, toggle the option immediately, * so user doesn't have to hit RETURN. */ if ((optflag & ~OPT_NO_PROMPT) != OPT_TOGGLE || !opt_has_param(curropt)) { toggle_option(curropt, islower(c), "", optflag); return (MCA_DONE); } /* * Display a prompt appropriate for the option parameter. */ start_mca(A_OPT_TOGGLE, opt_prompt(curropt), NULL, 0); return (MCA_MORE); }
static void toggle_option(MojoGuiSetupOptions *parent, MojoGuiSetupOptions *opts, int *line, int target) { if ((opts != NULL) && (target > *line)) { if (!opts->is_group_parent) { if (++(*line) == target) { const boolean toggled = ((opts->value) ? false : true); // "radio buttons" in a group? if ((parent) && (parent->is_group_parent)) { if (toggled) // drop unless we weren't the current toggle. { // set all siblings to false... MojoGuiSetupOptions *i = parent->child; while (i != NULL) { i->value = false; i = i->next_sibling; } // while opts->value = true; // reset us to be true. } // if } // if else // individual "check box" was chosen. { opts->value = toggled; } // else return; // we found it, bail. } // if } // if if (opts->value) // if option is toggled on, descend to children. toggle_option(opts, opts->child, line, target); toggle_option(parent, opts->next_sibling, line, target); } // if } // toggle_option
static int MojoGui_stdio_options(MojoGuiSetupOptions *opts, boolean can_back, boolean can_fwd) { const char *inst_opts_str = xstrdup(_("Options")); const char *prompt = xstrdup(_("Choose number to change.")); int retval = -1; boolean getout = false; char buf[128]; int len = 0; while (!getout) { int line = 0; printf("\n\n"); printf("%s", inst_opts_str); printf("\n"); print_options(opts, &line, 1); printf("\n"); if ((len = readstr(prompt, buf, sizeof (buf), can_back, true)) < 0) getout = true; else if (len == 0) { getout = true; retval = 1; } // else if else { char *endptr = NULL; int target = (int) strtol(buf, &endptr, 10); if (*endptr == '\0') // complete string was a valid number? { line = 0; toggle_option(NULL, opts, &line, target); } // if } // else } // while free((void *) inst_opts_str); free((void *) prompt); return retval; } // MojoGui_stdio_options
static void FlowPSParseOption(PS_CONFIG *config, char *fname, int lineno, char *key, char *value) { int ivalue; if(!key || !value) { FatalError("%s:(%d) Invalid command line arguments!\n"); } if(s_debug > 1) flow_printf("key: %s value: %s\n", key, value); if(!strcasecmp(key, "scoreboard-memcap-talker")) { ivalue = atoi(value); config->sb_memcap_talker = ivalue; } else if(!strcasecmp(key, "scoreboard-memcap-scanner")) { ivalue = atoi(value); config->sb_memcap_scanner = ivalue; } else if(!strcasecmp(key,"unique-memcap")) { ivalue = atoi(value); config->ut_memcap = ivalue; } else if(!strcasecmp(key,"server-memcap")) { ivalue = atoi(value); config->server_memcap = ivalue; } else if(!strcasecmp(key, "scoreboard-rows-talker")) { ivalue = atoi(value); config->sb_rows_talker = ivalue; } else if(!strcasecmp(key, "scoreboard-rows-scanner")) { ivalue = atoi(value); config->sb_rows_scanner = ivalue; } else if(!strcasecmp(key,"unique-rows")) { ivalue = atoi(value); config->ut_rows = ivalue; } else if(!strcasecmp(key,"server-rows")) { ivalue = atoi(value); config->server_rows = ivalue; } else if(!strcasecmp(key, "server-watchnet")) { IPSET *ipset = ipset_new(IPV4_FAMILY); if(!ipset || ip4_setparse(ipset, value) !=0) { FatalError("%s(%d) Unable to create an IPSet from %s\n", file_name,file_line,value); } config->server_watchnet_ipv4 = ipset; } else if(!strcasecmp(key, "src-ignore-net")) { IPSET *ipset = ipset_new(IPV4_FAMILY); if(!ipset || ip4_setparse(ipset, value) !=0) { FatalError("%s(%d) Unable to create an IPSet from %s\n", file_name,file_line,value); } config->src_ignore_ipv4 = ipset; } else if(!strcasecmp(key, "dst-ignore-net")) { IPSET *ipset = ipset_new(IPV4_FAMILY); if(!ipset || ip4_setparse(ipset, value) !=0) { FatalError("%s(%d) Unable to create an IPSet from %s\n", file_name,file_line,value); } config->dst_ignore_ipv4 = ipset; } else if(!strcasecmp(key, "tcp-penalties")) { if(toggle_option(key, value, &config->tcp_penalties)) { FatalError("%s(%d) Error processing %s directive (value = %s)\n", file_name,file_line,key,value); } } else if(!strcasecmp(key, "server-learning-time")) { ivalue = atoi(value); config->server_learning_time = ivalue; } else if(!strcasecmp(key, "server-ignore-limit")) { ivalue = atoi(value); config->server_ignore_limit = ivalue; } else if(!strcasecmp(key, "server-scanner-limit")) { ivalue = atoi(value); config->server_scanner_limit = ivalue; } else if(!strcasecmp(key, "talker-fixed-threshold")) { ivalue = atoi(value); config->limit_talker.fixed = ivalue; } else if(!strcasecmp(key, "talker-sliding-threshold")) { ivalue = atoi(value); config->limit_talker.sliding = ivalue; } else if(!strcasecmp(key, "talker-fixed-window")) { ivalue = atoi(value); config->limit_talker.fixed_size = ivalue; } else if(!strcasecmp(key, "talker-sliding-window")) { ivalue = atoi(value); config->limit_talker.sliding_size = ivalue; } else if(!strcasecmp(key, "talker-sliding-scale-factor")) { config->limit_talker.window_scale = (float)strtod(value, NULL); } else if(!strcasecmp(key, "scanner-fixed-threshold")) { ivalue = atoi(value); config->limit_scanner.fixed = ivalue; } else if(!strcasecmp(key, "scanner-sliding-threshold")) { ivalue = atoi(value); config->limit_scanner.sliding = ivalue; } else if(!strcasecmp(key, "scanner-fixed-window")) { ivalue = atoi(value); config->limit_scanner.fixed_size = ivalue; } else if(!strcasecmp(key, "scanner-sliding-window")) { ivalue = atoi(value); config->limit_scanner.sliding_size = ivalue; } else if(!strcasecmp(key, "scanner-sliding-scale-factor")) { config->limit_scanner.window_scale = (float)strtod(value, NULL); } else if(!strcasecmp(key, "base-score")) { config->base_score = atoi(value); } else if(!strcasecmp(key, "dumpall")) { config->dumpall = atoi(value); } else if(!strcasecmp(key, "alert-mode")) { if(!strcasecmp(value, "once")) { config->alert_once = 1; } else if(!strcasecmp(value, "all")) { config->alert_once = 0; } else { FatalError("%s(%d) Bad option to %s => %s\n", file_name, file_line, key, value); } } else if(!strcasecmp(key, "output-mode")) { if(!strcasecmp(value, "msg")) { config->output_mode = VARIABLEMSG; } else if(!strcasecmp(value, "pktkludge")) { config->output_mode = PKTKLUDGE; } else { FatalError("%s(%d) Bad option to %s => %s\n", file_name, file_line, key, value); } } else { FatalError("%s(%d) Unknown Arguments: key(%s) value(%s)\n", fname, lineno, key, value); } }
static bool view_driver(struct view *view, enum request request) { int i; if (request == REQ_NONE) return true; if (request >= REQ_RUN_REQUESTS) { request = open_run_request(view, request); // exit quickly rather than going through view_request and back if (request == REQ_QUIT) return false; } request = view_request(view, request); if (request == REQ_NONE) return true; switch (request) { case REQ_MOVE_UP: case REQ_MOVE_DOWN: case REQ_MOVE_PAGE_UP: case REQ_MOVE_PAGE_DOWN: case REQ_MOVE_HALF_PAGE_UP: case REQ_MOVE_HALF_PAGE_DOWN: case REQ_MOVE_FIRST_LINE: case REQ_MOVE_LAST_LINE: move_view(view, request); break; case REQ_SCROLL_FIRST_COL: case REQ_SCROLL_LEFT: case REQ_SCROLL_RIGHT: case REQ_SCROLL_LINE_DOWN: case REQ_SCROLL_LINE_UP: case REQ_SCROLL_PAGE_DOWN: case REQ_SCROLL_PAGE_UP: case REQ_SCROLL_WHEEL_DOWN: case REQ_SCROLL_WHEEL_UP: scroll_view(view, request); break; case REQ_VIEW_GREP: open_grep_view(view); break; case REQ_VIEW_MAIN: open_main_view(view, OPEN_DEFAULT); break; case REQ_VIEW_DIFF: open_diff_view(view, OPEN_DEFAULT); break; case REQ_VIEW_LOG: open_log_view(view, OPEN_DEFAULT); break; case REQ_VIEW_TREE: open_tree_view(view, OPEN_DEFAULT); break; case REQ_VIEW_HELP: open_help_view(view, OPEN_DEFAULT); break; case REQ_VIEW_REFS: open_refs_view(view, OPEN_DEFAULT); break; case REQ_VIEW_BLAME: open_blame_view(view, OPEN_DEFAULT); break; case REQ_VIEW_BLOB: open_blob_view(view, OPEN_DEFAULT); break; case REQ_VIEW_STATUS: open_status_view(view, OPEN_DEFAULT); break; case REQ_VIEW_STAGE: open_stage_view(view, NULL, 0, OPEN_DEFAULT); break; case REQ_VIEW_PAGER: open_pager_view(view, OPEN_DEFAULT); break; case REQ_VIEW_STASH: open_stash_view(view, OPEN_DEFAULT); break; case REQ_NEXT: case REQ_PREVIOUS: if (view->parent) { int line; view = view->parent; line = view->pos.lineno; view_request(view, request); move_view(view, request); if (view_is_displayed(view)) update_view_title(view); if (line != view->pos.lineno) view_request(view, REQ_ENTER); } else { move_view(view, request); } break; case REQ_VIEW_NEXT: { int nviews = displayed_views(); int next_view = nviews ? (current_view + 1) % nviews : current_view; if (next_view == current_view) { report("Only one view is displayed"); break; } current_view = next_view; /* Blur out the title of the previous view. */ update_view_title(view); report_clear(); break; } case REQ_REFRESH: report("Refreshing is not supported by the %s view", view->name); break; case REQ_PARENT: report("Moving to parent is not supported by the %s view", view->name); break; case REQ_BACK: report("Going back is not supported by the %s view", view->name); break; case REQ_MAXIMIZE: if (displayed_views() == 2) maximize_view(view, true); break; case REQ_OPTIONS: toggle_option(view); break; case REQ_SEARCH: case REQ_SEARCH_BACK: search_view(view, request); break; case REQ_FIND_NEXT: case REQ_FIND_PREV: find_next(view, request); break; case REQ_MOVE_NEXT_MERGE: case REQ_MOVE_PREV_MERGE: report("Moving between merge commits is not supported by the %s view", view->name); break; case REQ_STOP_LOADING: foreach_view(view, i) { if (view->pipe) report("Stopped loading the %s view", view->name), end_update(view, true); } break; case REQ_SHOW_VERSION: report("tig-%s (built %s)", TIG_VERSION, __DATE__); return true; case REQ_SCREEN_REDRAW: redraw_display(true); break; case REQ_EDIT: report("Nothing to edit"); break; case REQ_ENTER: report("Nothing to enter"); break; case REQ_VIEW_CLOSE: /* XXX: Mark closed views by letting view->prev point to the * view itself. Parents to closed view should never be * followed. */ if (view->prev && view->prev != view) { maximize_view(view->prev, true); view->prev = view; watch_unregister(&view->watch); view->parent = NULL; break; } /* Fall-through */ case REQ_QUIT: return false; default: report("Unknown key, press %s for help", get_view_key(view, REQ_VIEW_HELP)); return true; } return true; }
/** * Main daemon routine */ int main( int argc, char **argv ) { int c, option_index = 0; char *bin = basename( argv[0] ); char config_file[MAX_OPT_LEN] = ""; int force_log_level = FALSE; int log_level = 0; int rc; int chgd = 0; char err_msg[4096]; int neg = 0; char badcfg[RBH_PATH_MAX]; /* parse command line options */ while ((c = getopt_long_only(argc, argv, SHORT_OPT_STRING, option_tab, &option_index )) != -1) { switch ( c ) { case '!': neg = 1; break; case 'u': toggle_option(match_user, "user"); prog_options.user = optarg; prog_options.userneg = neg; neg = 0; break; case 'g': toggle_option(match_group, "group"); prog_options.group = optarg; prog_options.groupneg = neg; neg = 0; break; case 'U': /* match numerical (non resolved) users */ toggle_option(match_user, "user"); prog_options.user = "******"; prog_options.userneg = neg; neg = 0; break; case 'G': /* match numerical (non resolved) groups */ toggle_option(match_group, "group"); prog_options.group = "[0-9]*"; prog_options.groupneg = neg; neg = 0; break; case 'n': toggle_option(match_name, "name"); prog_options.name = optarg; prog_options.nameneg = neg; neg = 0; break; #ifdef _LUSTRE case 'o': toggle_option(match_ost, "ost"); prog_options.ost_idx = str2int(optarg); if (prog_options.ost_idx == (unsigned int)-1) { fprintf(stderr, "invalid ost index '%s': unsigned integer expected\n", optarg); exit(1); } if (neg) { fprintf(stderr, "! () is not supported for ost criteria\n"); exit(1); } break; case 'P': toggle_option(match_pool, "pool"); prog_options.pool = optarg; break; case 'O': prog_options.lsost = 1; prog_options.print = 0; disp_mask |= LSOST_DISPLAY_MASK; if (neg) { fprintf(stderr, "! (-not) unexpected before -lsost option\n"); exit(1); } break; #endif case 't': toggle_option(match_type, "type"); prog_options.type = opt2type(optarg); if (prog_options.type == NULL) { fprintf(stderr, "invalid type '%s': expected types: "TYPE_HELP".\n", optarg); exit(1); } if (neg) { fprintf(stderr, "! (-not) is not supported for type criteria\n"); exit(1); } break; case 's': toggle_option(match_size, "size"); if (set_size_filter(optarg)) exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for size criteria\n"); exit(1); } break; case 'A': toggle_option(match_atime, "atime/amin"); if (set_time_filter(optarg, 0, TRUE, atime)) exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; case 'a': toggle_option(match_atime, "atime/amin"); if (set_time_filter(optarg, 60, TRUE, atime)) exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; case 'C': toggle_option(match_crtime, "crtime"); if (set_time_filter(optarg, 0, TRUE, rh_crtime)) exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; case 'M': toggle_option(match_mtime, "mtime/mmin/msec"); if (set_time_filter(optarg, 0, TRUE, mtime)) exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; case 'm': toggle_option(match_mtime, "mtime/mmin/msec"); if (set_time_filter(optarg, 60, FALSE, mtime)) /* don't allow suffix (multiplier is 1min) */ exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; case 'z': toggle_option(match_mtime, "mtime/mmin/msec"); if (set_time_filter(optarg, 1, FALSE, mtime)) /* don't allow suffix (multiplier is 1sec) */ exit(1); if (neg) { fprintf(stderr, "! (-not) is not supported for time criteria\n"); exit(1); } break; #ifdef ATTR_INDEX_status case 'S': toggle_option(match_status, "status"); prog_options.status = status2dbval(optarg); if ( prog_options.status == (file_status_t)-1 ) { fprintf(stderr, "Unknown status '%s'. Allowed status: %s.\n", optarg, allowed_status()); exit(1); } prog_options.statusneg = neg; neg = 0; break; #endif case 'l': prog_options.ls = 1; prog_options.print = 0; disp_mask |= LS_DISPLAY_MASK; if (neg) { fprintf(stderr, "! (-not) unexpected before -ls option\n"); exit(1); } break; case 'p': prog_options.print = 1; disp_mask |= LS_DISPLAY_MASK; if (neg) { fprintf(stderr, "! (-not) unexpected before -ls option\n"); exit(1); } break; case 'E': toggle_option(exec, "exec"); prog_options.exec_cmd = optarg; prog_options.print = 0; break; case 'f': rh_strncpy(config_file, optarg, MAX_OPT_LEN); if (neg) { fprintf(stderr, "! (-not) unexpected before -f option\n"); exit(1); } break; case 'd': force_log_level = TRUE; log_level = str2debuglevel( optarg ); if ( log_level == -1 ) { fprintf(stderr, "Unsupported log level '%s'. CRIT, MAJOR, EVENT, VERB, DEBUG or FULL expected.\n", optarg); exit(1); } if (neg) { fprintf(stderr, "! (-not) unexpected before -d option\n"); exit(1); } break; case 'b': prog_options.bulk = force_nobulk; break; case 'h': display_help( bin ); exit( 0 ); break; case 'V': display_version( bin ); exit( 0 ); break; case ':': case '?': default: display_help( bin ); exit( 1 ); break; } } /* get default config file, if not specified */ if (SearchConfig(config_file, config_file, &chgd, badcfg, MAX_OPT_LEN) != 0) { fprintf(stderr, "No config file (or too many) found matching %s\n", badcfg); exit(2); } else if (chgd) { fprintf(stderr, "Using config file '%s'.\n", config_file ); } /* only read ListMgr config */ if ( ReadRobinhoodConfig( 0, config_file, err_msg, &config, FALSE ) ) { fprintf( stderr, "Error reading configuration file '%s': %s\n", config_file, err_msg ); exit( 1 ); } process_config_file = config_file; /* set global configuration */ global_config = config.global_config; /* set policies info */ policies = config.policies; if ( force_log_level ) config.log_config.debug_level = log_level; else config.log_config.debug_level = LVL_MAJOR; /* no event message */ /* Set logging to stderr */ strcpy( config.log_config.log_file, "stderr" ); strcpy( config.log_config.report_file, "stderr" ); strcpy( config.log_config.alert_file, "stderr" ); /* Initialize logging */ rc = InitializeLogs( bin, &config.log_config ); if ( rc ) { fprintf( stderr, "Error opening log files: rc=%d, errno=%d: %s\n", rc, errno, strerror( errno ) ); exit( rc ); } /* Initialize filesystem access */ rc = InitFS(); if (rc) exit(rc); /* Initialize list manager */ rc = ListMgr_Init( &config.lmgr_config, TRUE ); if ( rc ) { DisplayLog( LVL_CRIT, FIND_TAG, "Error %d initializing list manager", rc ); exit( rc ); } else DisplayLog( LVL_DEBUG, FIND_TAG, "ListManager successfully initialized" ); if (CheckLastFS( ) != 0) exit(1); /* Create database access */ rc = ListMgr_InitAccess(&lmgr); if (rc) { DisplayLog( LVL_CRIT, FIND_TAG, "Error %d: cannot connect to database", rc ); exit(rc); } if (argc == optind) { /* no argument: default is root * => switch to bulk mode (unless nobulk is specified) */ if (prog_options.bulk != force_nobulk) { DisplayLog(LVL_DEBUG, FIND_TAG, "Optimization: switching to bulk DB request mode"); mkfilters(FALSE); /* keep dirs */ return list_bulk(); } else { char *id = config.global_config.fs_path; mkfilters(TRUE); /* exclude dirs */ /* no path specified, list all entries */ rc = list_contents(&id, 1); } } else { mkfilters(TRUE); /* exclude dirs */ rc = list_contents(argv+optind, argc-optind); } ListMgr_CloseAccess( &lmgr ); return rc; }
static int view_driver(struct view *view, enum request request) { int i; if (request == REQ_NONE) return TRUE; if (request >= REQ_RUN_REQUESTS) { request = open_run_request(view, request); // exit quickly rather than going through view_request and back if (request == REQ_QUIT) return FALSE; } request = view_request(view, request); if (request == REQ_NONE) return TRUE; switch (request) { case REQ_MOVE_UP: case REQ_MOVE_DOWN: case REQ_MOVE_PAGE_UP: case REQ_MOVE_PAGE_DOWN: case REQ_MOVE_FIRST_LINE: case REQ_MOVE_LAST_LINE: move_view(view, request); break; case REQ_SCROLL_FIRST_COL: case REQ_SCROLL_LEFT: case REQ_SCROLL_RIGHT: case REQ_SCROLL_LINE_DOWN: case REQ_SCROLL_LINE_UP: case REQ_SCROLL_PAGE_DOWN: case REQ_SCROLL_PAGE_UP: case REQ_SCROLL_WHEEL_DOWN: case REQ_SCROLL_WHEEL_UP: scroll_view(view, request); break; case REQ_VIEW_GREP: open_grep_view(view); break; case REQ_VIEW_MAIN: case REQ_VIEW_DIFF: case REQ_VIEW_LOG: case REQ_VIEW_TREE: case REQ_VIEW_HELP: case REQ_VIEW_BRANCH: case REQ_VIEW_BLAME: case REQ_VIEW_BLOB: case REQ_VIEW_STATUS: case REQ_VIEW_STAGE: case REQ_VIEW_PAGER: case REQ_VIEW_STASH: open_view(view, request, OPEN_DEFAULT); break; case REQ_NEXT: case REQ_PREVIOUS: if (view->parent) { int line; view = view->parent; line = view->pos.lineno; view_request(view, request); move_view(view, request); if (view_is_displayed(view)) update_view_title(view); if (line != view->pos.lineno) view_request(view, REQ_ENTER); } else { move_view(view, request); } break; case REQ_VIEW_NEXT: { int nviews = displayed_views(); int next_view = (current_view + 1) % nviews; if (next_view == current_view) { report("Only one view is displayed"); break; } current_view = next_view; /* Blur out the title of the previous view. */ update_view_title(view); report_clear(); break; } case REQ_REFRESH: report("Refreshing is not supported by the %s view", view->name); break; case REQ_PARENT: report("Moving to parent is not supported by the the %s view", view->name); break; case REQ_BACK: report("Going back is not supported for by %s view", view->name); break; case REQ_MAXIMIZE: if (displayed_views() == 2) maximize_view(view, TRUE); break; case REQ_OPTIONS: case REQ_TOGGLE_LINENO: case REQ_TOGGLE_DATE: case REQ_TOGGLE_AUTHOR: case REQ_TOGGLE_FILENAME: case REQ_TOGGLE_GRAPHIC: case REQ_TOGGLE_REV_GRAPH: case REQ_TOGGLE_REFS: case REQ_TOGGLE_CHANGES: case REQ_TOGGLE_IGNORE_SPACE: case REQ_TOGGLE_ID: case REQ_TOGGLE_FILES: case REQ_TOGGLE_TITLE_OVERFLOW: case REQ_TOGGLE_FILE_SIZE: case REQ_TOGGLE_UNTRACKED_DIRS: case REQ_TOGGLE_VERTICAL_SPLIT: { char action[SIZEOF_STR] = ""; enum view_flag flags = toggle_option(view, request, action); if (flags == VIEW_FLAG_RESET_DISPLAY) { resize_display(); redraw_display(TRUE); } else { foreach_displayed_view(view, i) { if (view_has_flags(view, flags) && !view->unrefreshable) reload_view(view); else redraw_view(view); } } if (*action) report("%s", action); } break; case REQ_TOGGLE_SORT_FIELD: case REQ_TOGGLE_SORT_ORDER: report("Sorting is not yet supported for the %s view", view->name); break; case REQ_DIFF_CONTEXT_UP: case REQ_DIFF_CONTEXT_DOWN: report("Changing the diff context is not yet supported for the %s view", view->name); break; case REQ_SEARCH: case REQ_SEARCH_BACK: search_view(view, request); break; case REQ_FIND_NEXT: case REQ_FIND_PREV: find_next(view, request); break; case REQ_STOP_LOADING: foreach_view(view, i) { if (view->pipe) report("Stopped loading the %s view", view->name), end_update(view, TRUE); } break; case REQ_SHOW_VERSION: report("tig-%s (built %s)", TIG_VERSION, __DATE__); return TRUE; case REQ_SCREEN_REDRAW: redraw_display(TRUE); break; case REQ_EDIT: report("Nothing to edit"); break; case REQ_ENTER: report("Nothing to enter"); break; case REQ_VIEW_CLOSE: /* XXX: Mark closed views by letting view->prev point to the * view itself. Parents to closed view should never be * followed. */ if (view->prev && view->prev != view) { maximize_view(view->prev, TRUE); view->prev = view; break; } /* Fall-through */ case REQ_QUIT: return FALSE; default: report("Unknown key, press %s for help", get_view_key(view, REQ_VIEW_HELP)); return TRUE; } return TRUE; }
/* * Execute a multicharacter command. */ static void exec_mca(void) { char *cbuf; cmd_exec(); cbuf = get_cmdbuf(); switch (mca) { case A_F_SEARCH: case A_B_SEARCH: multi_search(cbuf, (int)number); break; case A_FILTER: search_type ^= SRCH_NO_MATCH; set_filter_pattern(cbuf, search_type); break; case A_FIRSTCMD: /* * Skip leading spaces or + signs in the string. */ while (*cbuf == '+' || *cbuf == ' ') cbuf++; if (every_first_cmd != NULL) free(every_first_cmd); if (*cbuf == '\0') every_first_cmd = NULL; else every_first_cmd = save(cbuf); break; case A_OPT_TOGGLE: toggle_option(curropt, opt_lower, cbuf, optflag); curropt = NULL; break; case A_F_BRACKET: match_brac(cbuf[0], cbuf[1], 1, (int)number); break; case A_B_BRACKET: match_brac(cbuf[1], cbuf[0], 0, (int)number); break; case A_EXAMINE: if (secure) break; /* POSIX behavior, but possibly generally useful */ if (strlen(cbuf) == 0) { reopen_curr_ifile(); jump_back(1); break; } /* POSIX behavior - probably not generally useful */ if (less_is_more && (strcmp(cbuf, "#") == 0)) { if (ntags()) { error("No previous file", NULL_PARG); break; } if (edit_prev(1)) { error("No previous file", NULL_PARG); } else { jump_back(1); } break; } edit_list(cbuf); /* If tag structure is loaded then clean it up. */ cleantags(); break; case A_SHELL: /* * !! just uses whatever is in shellcmd. * Otherwise, copy cmdbuf to shellcmd, * expanding any special characters ("%" or "#"). */ if (*cbuf != '!') { if (shellcmd != NULL) free(shellcmd); shellcmd = fexpand(cbuf); } if (secure) break; if (shellcmd == NULL) lsystem("", "!done"); else lsystem(shellcmd, "!done"); break; case A_PIPE: if (secure) break; (void) pipe_mark(pipec, cbuf); error("|done", NULL_PARG); break; } }