[PATCH libinput 3/8] tools: move option parsing to a helper library
Peter Hutterer
peter.hutterer at who-t.net
Thu Dec 18 15:16:18 PST 2014
event-debug and event-gui can and should share this
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
tools/Makefile.am | 8 +++-
tools/event-debug.c | 121 +++++------------------------------------------
tools/shared.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/shared.h | 45 ++++++++++++++++++
4 files changed, 198 insertions(+), 109 deletions(-)
create mode 100644 tools/shared.c
create mode 100644 tools/shared.h
diff --git a/tools/Makefile.am b/tools/Makefile.am
index aadd874..6dd64c9 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,10 +1,16 @@
noinst_PROGRAMS = event-debug
+noinst_LTLIBRARIES = libshared.la
AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/src
+
+libshared_la_SOURCES = \
+ shared.c \
+ shared.h
+
event_debug_SOURCES = event-debug.c
-event_debug_LDADD = ../src/libinput.la $(LIBUDEV_LIBS)
+event_debug_LDADD = ../src/libinput.la libshared.la $(LIBUDEV_LIBS)
event_debug_LDFLAGS = -no-install
event_debug_CFLAGS = $(LIBUDEV_CFLAGS)
diff --git a/tools/event-debug.c b/tools/event-debug.c
index b6b7140..184c68f 100644
--- a/tools/event-debug.c
+++ b/tools/event-debug.c
@@ -23,7 +23,6 @@
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
-#include <getopt.h>
#include <poll.h>
#include <stdio.h>
#include <signal.h>
@@ -37,110 +36,14 @@
#include <libinput.h>
-static enum {
- MODE_UDEV,
- MODE_DEVICE,
-} mode = MODE_UDEV;
+#include "shared.h"
+
static const char *device;
-static const char *seat = "seat0";
static struct udev *udev;
uint32_t start_time;
static const uint32_t screen_width = 100;
static const uint32_t screen_height = 100;
-static int verbose = 0;
-static int tapping = -1;
-
-static void
-usage(void)
-{
- printf("Usage: %s [options] [--udev [<seat>]|--device /dev/input/event0]\n"
- "--udev <seat>.... Use udev device discovery (default).\n"
- " Specifying a seat ID is optional.\n"
- "--device /path/to/device .... open the given device only\n"
- "\n"
- "Features:\n"
- "--enable-tap\n"
- "--disable-tap.... enable/disable tapping\n"
- "\n"
- "These options apply to all applicable devices, if a feature\n"
- "is not explicitly specified it is left at each device's default.\n"
- "\n"
- "Other options:\n"
- "--verbose ....... Print debugging output.\n"
- "--help .......... Print this help.\n",
- program_invocation_short_name);
-}
-
-enum options {
- OPT_DEVICE,
- OPT_UDEV,
- OPT_HELP,
- OPT_VERBOSE,
- OPT_TAP_ENABLE,
- OPT_TAP_DISABLE,
-};
-
-static int
-parse_args(int argc, char **argv)
-{
- 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 },
- { 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:
- usage();
- exit(0);
- case OPT_DEVICE: /* --device */
- mode = MODE_DEVICE;
- if (!optarg) {
- usage();
- return 1;
- }
- device = optarg;
- break;
- case OPT_UDEV: /* --udev */
- mode = MODE_UDEV;
- if (optarg)
- seat = optarg;
- break;
- case OPT_VERBOSE: /* --verbose */
- verbose = 1;
- break;
- case OPT_TAP_ENABLE:
- tapping = 1;
- break;
- case OPT_TAP_DISABLE:
- tapping = 0;
- break;
- default:
- usage();
- return 1;
- }
-
- }
-
- if (optind < argc) {
- usage();
- return 1;
- }
-
- return 0;
-}
+struct tools_options options;
static int
open_restricted(const char *path, int flags, void *user_data)
@@ -184,12 +87,12 @@ open_udev(struct libinput **li)
return 1;
}
- if (verbose) {
+ if (options.verbose) {
libinput_log_set_handler(*li, log_handler);
libinput_log_set_priority(*li, LIBINPUT_LOG_PRIORITY_DEBUG);
}
- if (libinput_udev_assign_seat(*li, seat)) {
+ if (libinput_udev_assign_seat(*li, options.seat)) {
fprintf(stderr, "Failed to set seat\n");
libinput_unref(*li);
return 1;
@@ -209,7 +112,7 @@ open_device(struct libinput **li, const char *path)
return 1;
}
- if (verbose) {
+ if (options.verbose) {
libinput_log_set_handler(*li, log_handler);
libinput_log_set_priority(*li, LIBINPUT_LOG_PRIORITY_DEBUG);
}
@@ -427,8 +330,8 @@ print_touch_event_with_coords(struct libinput_event *ev)
static void
setup_device(struct libinput_device *device)
{
- if (tapping != -1)
- libinput_device_config_tap_set_enabled(device, tapping);
+ if (options.tapping != -1)
+ libinput_device_config_tap_set_enabled(device, options.tapping);
}
static int
@@ -532,13 +435,15 @@ main(int argc, char **argv)
struct libinput *li;
struct timespec tp;
- if (parse_args(argc, argv))
+ tools_init_options(&options);
+
+ if (tools_parse_args(argc, argv, &options))
return 1;
- if (mode == MODE_UDEV) {
+ if (options.backend == BACKEND_UDEV) {
if (open_udev(&li))
return 1;
- } else if (mode == MODE_DEVICE) {
+ } else if (options.backend == BACKEND_DEVICE) {
if (open_device(&li, device))
return 1;
} else
diff --git a/tools/shared.c b/tools/shared.c
new file mode 100644
index 0000000..17a9673
--- /dev/null
+++ b/tools/shared.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright © 2014 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders not be used in
+ * advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. The copyright holders make
+ * no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define _GNU_SOURCE
+#include <config.h>
+
+#include <errno.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "shared.h"
+
+enum options {
+ OPT_DEVICE,
+ OPT_UDEV,
+ OPT_HELP,
+ OPT_VERBOSE,
+ OPT_TAP_ENABLE,
+ OPT_TAP_DISABLE,
+};
+
+void
+tools_usage()
+{
+ printf("Usage: %s [options] [--udev [<seat>]|--device /dev/input/event0]\n"
+ "--udev <seat>.... Use udev device discovery (default).\n"
+ " Specifying a seat ID is optional.\n"
+ "--device /path/to/device .... open the given device only\n"
+ "\n"
+ "Features:\n"
+ "--enable-tap\n"
+ "--disable-tap.... enable/disable tapping\n"
+ "\n"
+ "These options apply to all applicable devices, if a feature\n"
+ "is not explicitly specified it is left at each device's default.\n"
+ "\n"
+ "Other options:\n"
+ "--verbose ....... Print debugging output.\n"
+ "--help .......... Print this help.\n",
+ program_invocation_short_name);
+}
+
+void
+tools_init_options(struct tools_options *options)
+{
+ memset(options, 0, sizeof(*options));
+ options->tapping = -1;
+ options->backend = BACKEND_UDEV;
+ options->seat = "seat0";
+}
+
+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 },
+ { 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;
+ default:
+ tools_usage();
+ return 1;
+ }
+
+ }
+
+ if (optind < argc) {
+ tools_usage();
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/tools/shared.h b/tools/shared.h
new file mode 100644
index 0000000..fa7c5ef
--- /dev/null
+++ b/tools/shared.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2014 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders not be used in
+ * advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. The copyright holders make
+ * no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _SHARED_H_
+#define _SHARED_H_
+
+enum tools_backend {
+ BACKEND_DEVICE,
+ BACKEND_UDEV
+};
+
+struct tools_options {
+ enum tools_backend backend;
+ const char *device; /* if backend is BACKEND_DEVICE */
+ const char *seat; /* if backend is BACKEND_UDEV */
+
+ int verbose;
+ int tapping;
+};
+
+void tools_init_options(struct tools_options *options);
+int tools_parse_args(int argc, char **argv, struct tools_options *options);
+
+void tools_usage();
+
+#endif
--
2.1.0
More information about the wayland-devel
mailing list