コード例 #1
0
ファイル: command.c プロジェクト: matthiasbeyer/tasknc
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;
} /* }}} */
コード例 #2
0
ファイル: tasknc.c プロジェクト: skn/tasknc
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();
} /* }}} */