Пример #1
0
int
tools_parse_args(int argc, char **argv, struct tools_context *context)
{
	struct tools_options *options = &context->options;

	while (1) {
		int c;
		int option_index = 0;
		static struct option opts[] = {
			{ "device", 1, 0, OPT_DEVICE },
			{ "udev", 0, 0, OPT_UDEV },
			{ "grab", 0, 0, OPT_GRAB },
			{ "help", 0, 0, OPT_HELP },
			{ "verbose", 0, 0, OPT_VERBOSE },
			{ "enable-tap", 0, 0, OPT_TAP_ENABLE },
			{ "disable-tap", 0, 0, OPT_TAP_DISABLE },
			{ "enable-drag", 0, 0, OPT_DRAG_ENABLE },
			{ "disable-drag", 0, 0, OPT_DRAG_DISABLE },
			{ "enable-drag-lock", 0, 0, OPT_DRAG_LOCK_ENABLE },
			{ "disable-drag-lock", 0, 0, OPT_DRAG_LOCK_DISABLE },
			{ "enable-natural-scrolling", 0, 0, OPT_NATURAL_SCROLL_ENABLE },
			{ "disable-natural-scrolling", 0, 0, OPT_NATURAL_SCROLL_DISABLE },
			{ "enable-left-handed", 0, 0, OPT_LEFT_HANDED_ENABLE },
			{ "disable-left-handed", 0, 0, OPT_LEFT_HANDED_DISABLE },
			{ "enable-middlebutton", 0, 0, OPT_MIDDLEBUTTON_ENABLE },
			{ "disable-middlebutton", 0, 0, OPT_MIDDLEBUTTON_DISABLE },
			{ "enable-dwt", 0, 0, OPT_DWT_ENABLE },
			{ "disable-dwt", 0, 0, OPT_DWT_DISABLE },
			{ "set-click-method", 1, 0, OPT_CLICK_METHOD },
			{ "set-scroll-method", 1, 0, OPT_SCROLL_METHOD },
			{ "set-scroll-button", 1, 0, OPT_SCROLL_BUTTON },
			{ "set-profile", 1, 0, OPT_PROFILE },
			{ "speed", 1, 0, OPT_SPEED },
			{ 0, 0, 0, 0}
		};

		c = getopt_long(argc, argv, "h", opts, &option_index);
		if (c == -1)
			break;

#ifndef __linux__
		program_invocation_short_name = argv[0];
#endif

		switch(c) {
		case 'h':
		case OPT_HELP:
			tools_usage();
			exit(0);
		case OPT_DEVICE:
			options->backend = BACKEND_DEVICE;
			if (!optarg) {
				tools_usage();
				return 1;
			}
			options->device = optarg;
			break;
		case OPT_UDEV:
			options->backend = BACKEND_UDEV;
			if (optarg)
				options->seat = optarg;
			break;
		case OPT_GRAB:
			options->grab = 1;
			break;
		case OPT_VERBOSE:
			options->verbose = 1;
			break;
		case OPT_TAP_ENABLE:
			options->tapping = 1;
			break;
		case OPT_TAP_DISABLE:
			options->tapping = 0;
			break;
		case OPT_DRAG_ENABLE:
			options->drag = 1;
			break;
		case OPT_DRAG_DISABLE:
			options->drag = 0;
			break;
		case OPT_DRAG_LOCK_ENABLE:
			options->drag_lock = 1;
			break;
		case OPT_DRAG_LOCK_DISABLE:
			options->drag_lock = 0;
			break;
		case OPT_NATURAL_SCROLL_ENABLE:
			options->natural_scroll = 1;
			break;
		case OPT_NATURAL_SCROLL_DISABLE:
			options->natural_scroll = 0;
			break;
		case OPT_LEFT_HANDED_ENABLE:
			options->left_handed = 1;
			break;
		case OPT_LEFT_HANDED_DISABLE:
			options->left_handed = 0;
			break;
		case OPT_MIDDLEBUTTON_ENABLE:
			options->middlebutton = 1;
			break;
		case OPT_MIDDLEBUTTON_DISABLE:
			options->middlebutton = 0;
			break;
		case OPT_DWT_ENABLE:
			options->dwt = LIBINPUT_CONFIG_DWT_ENABLED;
			break;
		case OPT_DWT_DISABLE:
			options->dwt = LIBINPUT_CONFIG_DWT_DISABLED;
			break;
		case OPT_CLICK_METHOD:
			if (!optarg) {
				tools_usage();
				return 1;
			}
			if (streq(optarg, "none")) {
				options->click_method =
				LIBINPUT_CONFIG_CLICK_METHOD_NONE;
			} else if (streq(optarg, "clickfinger")) {
				options->click_method =
				LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER;
			} else if (streq(optarg, "buttonareas")) {
				options->click_method =
				LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
			} else {
				tools_usage();
				return 1;
			}
			break;
		case OPT_SCROLL_METHOD:
			if (!optarg) {
				tools_usage();
				return 1;
			}
			if (streq(optarg, "none")) {
				options->scroll_method =
				LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
			} else if (streq(optarg, "twofinger")) {
				options->scroll_method =
				LIBINPUT_CONFIG_SCROLL_2FG;
			} else if (streq(optarg, "edge")) {
				options->scroll_method =
				LIBINPUT_CONFIG_SCROLL_EDGE;
			} else if (streq(optarg, "button")) {
				options->scroll_method =
				LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN;
			} else {
				tools_usage();
				return 1;
			}
			break;
		case OPT_SCROLL_BUTTON:
			if (!optarg) {
				tools_usage();
				return 1;
			}
			options->scroll_button =
			libevdev_event_code_from_name(EV_KEY,
						      optarg);
			if (options->scroll_button == -1) {
				fprintf(stderr,
					"Invalid button %s\n",
					optarg);
				return 1;
			}
			break;
		case OPT_SPEED:
			if (!optarg) {
				tools_usage();
				return 1;
			}
			options->speed = atof(optarg);
			break;
		case OPT_PROFILE:
			if (!optarg) {
				tools_usage();
				return 1;
			}
			if (streq(optarg, "adaptive")) {
				options->profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
			} else if (streq(optarg, "flat")) {
				options->profile = LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT;
			} else {
				tools_usage();
				return 1;
			}
			break;
		default:
			tools_usage();
			return 1;
		}

	}

	if (optind < argc) {
		tools_usage();
		return 1;
	}

	return 0;
}
int
tools_parse_args(int argc, char **argv, struct tools_options *options)
{
	while (1) {
		int c;
		int option_index = 0;
		static struct option opts[] = {
			{ "device", 1, 0, OPT_DEVICE },
			{ "udev", 0, 0, OPT_UDEV },
			{ "help", 0, 0, OPT_HELP },
			{ "verbose", 0, 0, OPT_VERBOSE },
			{ "enable-tap", 0, 0, OPT_TAP_ENABLE },
			{ "disable-tap", 0, 0, OPT_TAP_DISABLE },
			{ "enable-natural-scrolling", 0, 0, OPT_NATURAL_SCROLL_ENABLE },
			{ "disable-natural-scrolling", 0, 0, OPT_NATURAL_SCROLL_DISABLE },
			{ "enable-left-handed", 0, 0, OPT_LEFT_HANDED_ENABLE },
			{ "disable-left-handed", 0, 0, OPT_LEFT_HANDED_DISABLE },
			{ "enable-middlebutton", 0, 0, OPT_MIDDLEBUTTON_ENABLE },
			{ "disable-middlebutton", 0, 0, OPT_MIDDLEBUTTON_DISABLE },
			{ "set-click-method", 1, 0, OPT_CLICK_METHOD },
			{ "set-scroll-method", 1, 0, OPT_SCROLL_METHOD },
			{ "set-scroll-button", 1, 0, OPT_SCROLL_BUTTON },
			{ "speed", 1, 0, OPT_SPEED },
			{ 0, 0, 0, 0}
		};

		c = getopt_long(argc, argv, "h", opts, &option_index);
		if (c == -1)
			break;

		switch(c) {
			case 'h': /* --help */
			case OPT_HELP:
				tools_usage();
				exit(0);
			case OPT_DEVICE: /* --device */
				options->backend = BACKEND_DEVICE;
				if (!optarg) {
					tools_usage();
					return 1;
				}
				options->device = optarg;
				break;
			case OPT_UDEV: /* --udev */
				options->backend = BACKEND_UDEV;
				if (optarg)
					options->seat = optarg;
				break;
			case OPT_VERBOSE: /* --verbose */
				options->verbose = 1;
				break;
			case OPT_TAP_ENABLE:
				options->tapping = 1;
				break;
			case OPT_TAP_DISABLE:
				options->tapping = 0;
				break;
			case OPT_NATURAL_SCROLL_ENABLE:
				options->natural_scroll = 1;
				break;
			case OPT_NATURAL_SCROLL_DISABLE:
				options->natural_scroll = 0;
				break;
			case OPT_LEFT_HANDED_ENABLE:
				options->left_handed = 1;
				break;
			case OPT_LEFT_HANDED_DISABLE:
				options->left_handed = 0;
				break;
			case OPT_MIDDLEBUTTON_ENABLE:
				options->middlebutton = 1;
				break;
			case OPT_MIDDLEBUTTON_DISABLE:
				options->middlebutton = 0;
				break;
			case OPT_CLICK_METHOD:
				if (!optarg) {
					tools_usage();
					return 1;
				}
				if (strcmp(optarg, "none") == 0) {
					options->click_method =
						LIBINPUT_CONFIG_CLICK_METHOD_NONE;
				} else if (strcmp(optarg, "clickfinger") == 0) {
					options->click_method =
						LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER;
				} else if (strcmp(optarg, "buttonareas") == 0) {
					options->click_method =
						LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
				} else {
					tools_usage();
					return 1;
				}
				break;
			case OPT_SCROLL_METHOD:
				if (!optarg) {
					tools_usage();
					return 1;
				}
				if (strcmp(optarg, "none") == 0) {
					options->scroll_method =
						LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
				} else if (strcmp(optarg, "twofinger") == 0) {
					options->scroll_method =
						LIBINPUT_CONFIG_SCROLL_2FG;
				} else if (strcmp(optarg, "edge") == 0) {
					options->scroll_method =
						LIBINPUT_CONFIG_SCROLL_EDGE;
				} else if (strcmp(optarg, "button") == 0) {
					options->scroll_method =
						LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN;
				} else {
					tools_usage();
					return 1;
				}
				break;
			case OPT_SCROLL_BUTTON:
				if (!optarg) {
					tools_usage();
					return 1;
				}
				options->scroll_button =
					libevdev_event_code_from_name(EV_KEY,
								      optarg);
				if (options->scroll_button == -1) {
					fprintf(stderr,
						"Invalid button %s\n",
						optarg);
					return 1;
				}
				break;
			case OPT_SPEED:
				if (!optarg) {
					tools_usage();
					return 1;
				}
				options->speed = atof(optarg);
				break;
			default:
				tools_usage();
				return 1;
		}

	}

	if (optind < argc) {
		tools_usage();
		return 1;
	}

	return 0;
}