void run_command_bind(char *args) /* {{{ */ { /** * create a new keybind * syntax - mode key function [funcarg] */ int key, ret = 0; char *function = NULL, *arg = NULL, *keystr = NULL, *modestr = NULL, *keyname = NULL; void (*func)(); funcmap *fmap; prog_mode mode; /* parse command */ if (args != NULL) ret = sscanf(args, "%ms %ms %ms %m[^\n]", &modestr, &keystr, &function, &arg); if (ret < 3) { statusbar_message(cfg.statusbar_timeout, "syntax: bind <mode> <key> <function> <args>"); tnc_fprintf(logfp, LOG_ERROR, "syntax: bind <mode> <key> <function> <args> [%d](%s)", ret, args); goto cleanup; } /* parse mode string */ if (str_eq(modestr, "tasklist")) mode = MODE_TASKLIST; else if (str_eq(modestr, "pager")) mode = MODE_PAGER; else { tnc_fprintf(logfp, LOG_ERROR, "bind: invalid mode (%s)", modestr); goto cleanup; } /* parse key */ key = parse_key(keystr); /* map function to function call */ fmap = find_function(function, mode); if (fmap==NULL) { tnc_fprintf(logfp, LOG_ERROR, "bind: invalid function specified (%s)", args); goto cleanup; } func = fmap->function; /* error out if there is no argument specified when required */ if (fmap->argn>0 && arg==NULL) { statusbar_message(cfg.statusbar_timeout, "bind: argument required for function %s", function); goto cleanup; } /* add keybind */ add_keybind(key, func, arg, mode); keyname = name_key(key); statusbar_message(cfg.statusbar_timeout, "key %s (%d) bound to %s - %s", keyname, key, modestr, name_function(func)); goto cleanup; cleanup: free(function); free(arg); free(keystr); free(modestr); free(keyname); return; } /* }}} */
void configure(void) /* {{{ */ { /* parse config file to get runtime options */ FILE *cmd; char *filepath, *xdg_config_home, *home; int ret = 0; /* set default settings */ cfg.nc_timeout = NCURSES_WAIT; /* time getch will wait */ cfg.statusbar_timeout = STATUSBAR_TIMEOUT_DEFAULT; /* default time before resetting statusbar */ cfg.sortmode = strdup("drpu"); /* determine sort order */ cfg.follow_task = true; /* follow task after it is moved */ cfg.history_max = 50; /* set default formats */ cfg.formats.title = strdup(" $program_name ($selected_line/$task_count) $> $date"); cfg.formats.task = strdup(" $project $description $> ?$due?$due?$-6priority?"); cfg.formats.view = strdup(" task info"); /* set initial filter */ active_filter = strdup("status:pending"); /* get task version */ cmd = popen("task --version", "r"); while (ret != 1) ret = fscanf(cmd, "%m[0-9.-] ", &(cfg.version)); tnc_fprintf(logfp, LOG_DEBUG, "task version: %s", cfg.version); pclose(cmd); /* default keybinds */ add_keybind(ERR, NULL, NULL, MODE_TASKLIST); add_keybind(ERR, NULL, NULL, MODE_PAGER); add_keybind(KEY_RESIZE, handle_resize, NULL, MODE_ANY); add_keybind('k', key_tasklist_scroll_up, NULL, MODE_TASKLIST); add_keybind('k', key_pager_scroll_up, NULL, MODE_PAGER); add_keybind(KEY_UP, key_tasklist_scroll_up, NULL, MODE_TASKLIST); add_keybind(KEY_UP, key_pager_scroll_up, NULL, MODE_PAGER); add_keybind('j', key_tasklist_scroll_down, NULL, MODE_TASKLIST); add_keybind('j', key_pager_scroll_down, NULL, MODE_PAGER); add_keybind(KEY_DOWN, key_tasklist_scroll_down, NULL, MODE_TASKLIST); add_keybind(KEY_DOWN, key_pager_scroll_down, NULL, MODE_PAGER); add_keybind('g', key_tasklist_scroll_home, NULL, MODE_TASKLIST); add_keybind(KEY_HOME, key_tasklist_scroll_home, NULL, MODE_TASKLIST); add_keybind('g', key_pager_scroll_home, NULL, MODE_PAGER); add_keybind(KEY_HOME, key_pager_scroll_home, NULL, MODE_PAGER); add_keybind('G', key_pager_scroll_end, NULL, MODE_PAGER); add_keybind(KEY_END, key_pager_scroll_end, NULL, MODE_PAGER); add_keybind('G', key_tasklist_scroll_end, NULL, MODE_TASKLIST); add_keybind(KEY_END, key_tasklist_scroll_end, NULL, MODE_TASKLIST); add_keybind('e', key_tasklist_edit, NULL, MODE_ANY); add_keybind('r', key_tasklist_reload, NULL, MODE_TASKLIST); add_keybind('u', key_tasklist_undo, NULL, MODE_TASKLIST); add_keybind('d', key_tasklist_delete, NULL, MODE_ANY); add_keybind('c', key_tasklist_complete, NULL, MODE_ANY); add_keybind('a', key_tasklist_add, NULL, MODE_TASKLIST); add_keybind('v', key_tasklist_view, NULL, MODE_TASKLIST); add_keybind(13, key_tasklist_view, NULL, MODE_TASKLIST); add_keybind(KEY_ENTER, key_tasklist_view, NULL, MODE_TASKLIST); add_keybind('s', key_tasklist_sort, NULL, MODE_TASKLIST); add_keybind('/', key_tasklist_search, NULL, MODE_TASKLIST); add_keybind('n', key_tasklist_search_next, NULL, MODE_TASKLIST); add_keybind('f', key_tasklist_filter, NULL, MODE_TASKLIST); add_keybind('y', key_tasklist_sync, NULL, MODE_TASKLIST); add_keybind('q', key_done, NULL, MODE_TASKLIST); add_keybind('q', key_pager_close, NULL, MODE_PAGER); add_keybind(';', key_command, NULL, MODE_TASKLIST); add_keybind(':', key_command, NULL, MODE_ANY); add_keybind('h', help_window, NULL, MODE_ANY); add_keybind(12, force_redraw, NULL, MODE_TASKLIST); add_keybind(12, force_redraw, NULL, MODE_PAGER); /* determine config path */ xdg_config_home = getenv("XDG_CONFIG_HOME"); if (xdg_config_home == NULL) { home = getenv("HOME"); filepath = malloc((strlen(home)+25)*sizeof(char)); sprintf(filepath, "%s/.config/tasknc/config", home); } else { filepath = malloc((strlen(xdg_config_home)+16)*sizeof(char)); sprintf(filepath, "%s/tasknc/config", xdg_config_home); } run_command_source(filepath); free(filepath); /* compile format strings */ compile_formats(); } /* }}} */