Add an option parser

On one hand, getopt (in particular the -o suboption syntax) sucks on the
server side, and on the client side we would like to avoid the glib
dependency.  We can roll out own option parser and solve both problems
and save a few lines of code total.
Kristian Høgsberg 13 years ago
parent 22ba60e514
commit bcacef19b0
  1. 5
      clients/Makefile.am
  2. 2
      clients/clickdot.c
  3. 2
      clients/desktop-shell.c
  4. 2
      clients/dnd.c
  5. 47
      clients/eventdemo.c
  6. 2
      clients/flower.c
  7. 2
      clients/gears.c
  8. 6
      clients/image.c
  9. 2
      clients/resizor.c
  10. 2
      clients/smoke.c
  11. 2
      clients/tablet-shell.c
  12. 11
      clients/terminal.c
  13. 11
      clients/view.c
  14. 36
      clients/window.c
  15. 4
      clients/window.h
  16. 11
      clients/wscreensaver.c
  17. 1
      shared/Makefile.am
  18. 18
      shared/config-parser.h
  19. 82
      shared/option-parser.c
  20. 5
      src/Makefile.am
  21. 37
      src/compositor-drm.c
  22. 33
      src/compositor-openwfd.c
  23. 35
      src/compositor-wayland.c
  24. 35
      src/compositor-x11.c
  25. 75
      src/compositor.c
  26. 4
      src/compositor.h

@ -57,8 +57,9 @@ libtoytoolkit_a_SOURCES = \
cairo-util.c \ cairo-util.c \
cairo-util.h cairo-util.h
toolkit_libs = \ toolkit_libs = \
libtoytoolkit.a \ libtoytoolkit.a \
../shared/libconfig-parser.la \
$(CLIENT_LIBS) $(CAIRO_EGL_LIBS) -lrt -lm $(CLIENT_LIBS) $(CAIRO_EGL_LIBS) -lrt -lm
flower_SOURCES = flower.c flower_SOURCES = flower.c

@ -164,7 +164,7 @@ main(int argc, char *argv[])
struct display *display; struct display *display;
struct clickdot *clickdot; struct clickdot *clickdot;
display = display_create(&argc, &argv, NULL); display = display_create(argc, argv);
if (display == NULL) { if (display == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -707,7 +707,7 @@ int main(int argc, char *argv[])
desktop.unlock_task.run = unlock_dialog_finish; desktop.unlock_task.run = unlock_dialog_finish;
wl_list_init(&desktop.outputs); wl_list_init(&desktop.outputs);
desktop.display = display_create(&argc, &argv, NULL); desktop.display = display_create(argc, argv);
if (desktop.display == NULL) { if (desktop.display == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -561,7 +561,7 @@ main(int argc, char *argv[])
{ {
struct display *d; struct display *d;
d = display_create(&argc, &argv, NULL); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -315,36 +315,20 @@ eventdemo_create(struct display *d)
} }
/** /**
* \brief command line options for eventdemo * \brief command line options for eventdemo
*
* see
* http://developer.gimp.org/api/2.0/glib/glib-Commandline-option-parser.html
*/ */
static const GOptionEntry option_entries[] = { static const struct weston_option eventdemo_options[] = {
{"title", 0, 0, G_OPTION_ARG_STRING, { WESTON_OPTION_STRING, "title", 0, &title },
&title, "Set the window title to TITLE", "TITLE"}, { WESTON_OPTION_INTEGER, "width", 'w', &width },
{"width", 'w', 0, G_OPTION_ARG_INT, { WESTON_OPTION_INTEGER, "height", 'h', &height },
&width, "Set the window's width to W", "W"}, { WESTON_OPTION_INTEGER, "max-width", 0, &width_max },
{"height", 'h', 0, G_OPTION_ARG_INT, { WESTON_OPTION_INTEGER, "max-height", 0, &height_max },
&height, "Set the window's height to H", "H"}, { WESTON_OPTION_BOOLEAN, "no-border", 'b', &noborder },
{"maxwidth", 0, 0, G_OPTION_ARG_INT, { WESTON_OPTION_BOOLEAN, "log-redraw", '0', &log_redraw },
&width_max, "Set the window's maximum width to W", "W"}, { WESTON_OPTION_BOOLEAN, "log-resize", '0', &log_resize },
{"maxheight", 0, 0, G_OPTION_ARG_INT, { WESTON_OPTION_BOOLEAN, "log-focus", '0', &log_focus },
&height_max, "Set the window's maximum height to H", "H"}, { WESTON_OPTION_BOOLEAN, "log-key", '0', &log_key },
{"noborder", 'b', 0, G_OPTION_ARG_NONE, { WESTON_OPTION_BOOLEAN, "log-button", '0', &log_button },
&noborder, "Don't draw window borders", 0}, { WESTON_OPTION_BOOLEAN, "log-motion", '0', &log_motion },
{"log-redraw", 0, 0, G_OPTION_ARG_NONE,
&log_redraw, "Log redraw events to stdout", 0},
{"log-resize", 0, 0, G_OPTION_ARG_NONE,
&log_resize, "Log resize events to stdout", 0},
{"log-focus", 0, 0, G_OPTION_ARG_NONE,
&log_focus, "Log keyboard focus events to stdout", 0},
{"log-key", 0, 0, G_OPTION_ARG_NONE,
&log_key, "Log key events to stdout", 0},
{"log-button", 0, 0, G_OPTION_ARG_NONE,
&log_button, "Log button events to stdout", 0},
{"log-motion", 0, 0, G_OPTION_ARG_NONE,
&log_motion, "Log motion events to stdout", 0},
{NULL}
}; };
/** /**
@ -357,8 +341,11 @@ main(int argc, char *argv[])
struct display *d; struct display *d;
struct eventdemo *e; struct eventdemo *e;
argc = parse_options(eventdemo_options,
ARRAY_LENGTH(eventdemo_options), argc, argv);
/* Connect to the display and have the arguments parsed */ /* Connect to the display and have the arguments parsed */
d = display_create(&argc, &argv, option_entries); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -168,7 +168,7 @@ int main(int argc, char *argv[])
struct display *d; struct display *d;
struct timeval tv; struct timeval tv;
d = display_create(&argc, &argv, NULL); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -369,7 +369,7 @@ int main(int argc, char *argv[])
{ {
struct display *d; struct display *d;
d = display_create(&argc, &argv, NULL); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -220,17 +220,13 @@ image_create(struct display *display, const char *filename)
return image; return image;
} }
static const GOptionEntry option_entries[] = {
{ NULL }
};
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
struct display *d; struct display *d;
int i; int i;
d = display_create(&argc, &argv, option_entries); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -242,7 +242,7 @@ main(int argc, char *argv[])
struct display *display; struct display *display;
struct resizor *resizor; struct resizor *resizor;
display = display_create(&argc, &argv, NULL); display = display_create(argc, argv);
if (display == NULL) { if (display == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -283,7 +283,7 @@ int main(int argc, char *argv[])
struct display *d; struct display *d;
int size; int size;
d = display_create(&argc, &argv, NULL); d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -316,7 +316,7 @@ int main(int argc, char *argv[])
uint32_t id; uint32_t id;
struct tablet_shell *shell; struct tablet_shell *shell;
display = display_create(&argc, &argv, NULL); display = display_create(argc, argv);
if (display == NULL) { if (display == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -2362,10 +2362,8 @@ terminal_run(struct terminal *terminal, const char *path)
return 0; return 0;
} }
static const GOptionEntry option_entries[] = { static const struct weston_option terminal_options[] = {
{ "fullscreen", 'f', 0, G_OPTION_ARG_NONE, { WESTON_OPTION_BOOLEAN, "fullscreen", 'f', &option_fullscreen },
&option_fullscreen, "Run in fullscreen mode" },
{ NULL }
}; };
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -2374,7 +2372,10 @@ int main(int argc, char *argv[])
struct terminal *terminal; struct terminal *terminal;
const char *shell; const char *shell;
d = display_create(&argc, &argv, option_entries); argc = parse_options(terminal_options,
ARRAY_LENGTH(terminal_options), argc, argv);
d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -252,10 +252,8 @@ view_create(struct display *display,
static int option_fullscreen; static int option_fullscreen;
static const GOptionEntry option_entries[] = { static const struct weston_option view_options[] = {
{ "fullscreen", 'f', 0, G_OPTION_ARG_NONE, { WESTON_OPTION_BOOLEAN, "fullscreen", 0, &option_fullscreen },
&option_fullscreen, "Run in fullscreen mode" },
{ NULL }
}; };
int int
@ -264,7 +262,10 @@ main(int argc, char *argv[])
struct display *d; struct display *d;
int i; int i;
d = display_create(&argc, &argv, option_entries); argc = parse_options(view_options,
ARRAY_LENGTH(view_options), argc, argv);
d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return -1; return -1;

@ -231,14 +231,10 @@ const char *option_xkb_layout = "us";
const char *option_xkb_variant = ""; const char *option_xkb_variant = "";
const char *option_xkb_options = ""; const char *option_xkb_options = "";
static const GOptionEntry xkb_option_entries[] = { static const struct weston_option xkb_options[] = {
{ "xkb-layout", 0, 0, G_OPTION_ARG_STRING, { WESTON_OPTION_STRING, "xkb-layout", 0, &option_xkb_layout },
&option_xkb_layout, "XKB Layout" }, { WESTON_OPTION_STRING, "xkb-variant", 0, &option_xkb_variant },
{ "xkb-variant", 0, 0, G_OPTION_ARG_STRING, { WESTON_OPTION_STRING, "xkb-options", 0, &option_xkb_options },
&option_xkb_variant, "XKB Variant" },
{ "xkb-options", 0, 0, G_OPTION_ARG_STRING,
&option_xkb_options, "XKB Options" },
{ NULL }
}; };
static const cairo_user_data_key_t surface_data_key; static const cairo_user_data_key_t surface_data_key;
@ -2921,32 +2917,14 @@ handle_display_data(struct task *task, uint32_t events)
} }
struct display * struct display *
display_create(int *argc, char **argv[], const GOptionEntry *option_entries) display_create(int argc, char *argv[])
{ {
struct display *d; struct display *d;
GOptionContext *context;
GOptionGroup *xkb_option_group;
GError *error;
g_type_init(); g_type_init();
context = g_option_context_new(NULL); argc = parse_options(xkb_options,
if (option_entries) ARRAY_LENGTH(xkb_options), argc, argv);
g_option_context_add_main_entries(context, option_entries, "Wayland View");
xkb_option_group = g_option_group_new("xkb",
"Keyboard options",
"Show all XKB options",
NULL, NULL);
g_option_group_add_entries(xkb_option_group, xkb_option_entries);
g_option_context_add_group (context, xkb_option_group);
if (!g_option_context_parse(context, argc, argv, &error)) {
fprintf(stderr, "option parsing failed: %s\n", error->message);
exit(EXIT_FAILURE);
}
g_option_context_free(context);
d = malloc(sizeof *d); d = malloc(sizeof *d);
if (d == NULL) if (d == NULL)

@ -24,9 +24,9 @@
#define _WINDOW_H_ #define _WINDOW_H_
#include <xkbcommon/xkbcommon.h> #include <xkbcommon/xkbcommon.h>
#include <glib.h>
#include <wayland-client.h> #include <wayland-client.h>
#include <cairo.h> #include <cairo.h>
#include "../shared/config-parser.h"
struct window; struct window;
struct widget; struct widget;
@ -47,7 +47,7 @@ struct rectangle {
}; };
struct display * struct display *
display_create(int *argc, char **argv[], const GOptionEntry *option_entries); display_create(int argc, char *argv[]);
void void
display_destroy(struct display *display); display_destroy(struct display *display);

@ -296,10 +296,8 @@ global_handler(struct wl_display *display, uint32_t id,
} }
} }
static const GOptionEntry option_entries[] = { static const struct weston_option wscreensaver_options[] = {
{ "demo", 0, 0, G_OPTION_ARG_NONE, &demo_mode, { WESTON_OPTION_BOOLEAN, "demo", 0, &demo_mode },
"Run as a regular application, not a screensaver.", NULL },
{ NULL }
}; };
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -309,7 +307,10 @@ int main(int argc, char *argv[])
init_frand(); init_frand();
d = display_create(&argc, &argv, option_entries); argc = parse_options(wscreensaver_options,
ARRAY_LENGTH(wscreensaver_options), argc, argv);
d = display_create(argc, argv);
if (d == NULL) { if (d == NULL) {
fprintf(stderr, "failed to create display: %m\n"); fprintf(stderr, "failed to create display: %m\n");
return EXIT_FAILURE; return EXIT_FAILURE;

@ -1,4 +1,5 @@
noinst_LTLIBRARIES = libconfig-parser.la noinst_LTLIBRARIES = libconfig-parser.la
libconfig_parser_la_SOURCES = \ libconfig_parser_la_SOURCES = \
config-parser.c \ config-parser.c \
option-parser.c \
config-parser.h config-parser.h

@ -51,5 +51,23 @@ parse_config_file(const char *path,
char * char *
config_file_path(const char *name); config_file_path(const char *name);
enum weston_option_type {
WESTON_OPTION_INTEGER,
WESTON_OPTION_UNSIGNED_INTEGER,
WESTON_OPTION_STRING,
WESTON_OPTION_BOOLEAN,
};
struct weston_option {
enum weston_option_type type;
const char *name;
int short_name;
void *data;
};
int
parse_options(const struct weston_option *options,
int count, int argc, char *argv[]);
#endif /* CONFIGPARSER_H */ #endif /* CONFIGPARSER_H */

@ -0,0 +1,82 @@
/*
* Copyright © 2012 Kristian Høgsberg
*
* 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.
*/
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "config-parser.h"
static void
handle_option(const struct weston_option *option, char *value)
{
switch (option->type) {
case WESTON_OPTION_INTEGER:
* (int32_t *) option->data = strtol(value, NULL, 0);
return;
case WESTON_OPTION_UNSIGNED_INTEGER:
* (uint32_t *) option->data = strtoul(value, NULL, 0);
return;
case WESTON_OPTION_STRING:
* (char **) option->data = strdup(value);
return;
case WESTON_OPTION_BOOLEAN:
* (int32_t *) option->data = 1;
return;
default:
assert(0);
}
}
int
parse_options(const struct weston_option *options,
int count, int argc, char *argv[])
{
int i, j, k, len = 0;
for (i = 1, j = 1; i < argc; i++) {
for (k = 0; k < count; k++) {
if (options[k].name)
len = strlen(options[k].name);
if (options[k].name &&
argv[i][0] == '-' &&
argv[i][1] == '-' &&
strncmp(options[k].name, &argv[i][2], len) == 0 &&
(argv[i][len + 2] == '=' || argv[i][len + 2] == '\0')) {
handle_option(&options[k], &argv[i][len + 3]);
break;
} else if (options[k].short_name &&
argv[i][0] == '-' &&
options[k].short_name == argv[i][1]) {
handle_option(&options[k], &argv[i][2]);
break;
}
}
if (k == count)
argv[j++] = argv[i];
}
argv[j] = NULL;
return j;
}

@ -9,8 +9,9 @@ AM_CPPFLAGS = \
weston_LDFLAGS = -export-dynamic weston_LDFLAGS = -export-dynamic
weston_CFLAGS = $(GCC_CFLAGS) weston_CFLAGS = $(GCC_CFLAGS)
weston_LDADD = \ weston_LDADD = \
$(COMPOSITOR_LIBS) $(DLOPEN_LIBS) $(XSERVER_LAUNCHER_LIBS) -lm $(COMPOSITOR_LIBS) $(DLOPEN_LIBS) $(XSERVER_LAUNCHER_LIBS) -lm \
../shared/libconfig-parser.la
weston_SOURCES = \ weston_SOURCES = \
compositor.c \ compositor.c \

@ -1639,34 +1639,19 @@ drm_compositor_create(struct wl_display *display,
return &ec->base; return &ec->base;
} }
struct weston_compositor *
backend_init(struct wl_display *display, char *options);
WL_EXPORT struct weston_compositor * WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, char *options) backend_init(struct wl_display *display, int argc, char *argv[])
{ {
int connector = 0, i; int connector = 0, tty = 0;
const char *seat; const char *seat = default_seat;
char *p, *value;
int tty = 0; const struct weston_option drm_options[] = {
{ WESTON_OPTION_INTEGER, "connector", 0, &connector },
static char * const tokens[] = { "connector", "seat", "tty", NULL }; { WESTON_OPTION_STRING, "seat", 0, &seat },
{ WESTON_OPTION_INTEGER, "tty", 0, &tty },
p = options; };
seat = default_seat;
while (i = getsubopt(&p, tokens, &value), i != -1) { parse_options(drm_options, ARRAY_LENGTH(drm_options), argc, argv);
switch (i) {
case 0:
connector = strtol(value, NULL, 0);
break;
case 1:
seat = value;
break;
case 2:
tty = strtol(value, NULL, 0);
break;
}
}
return drm_compositor_create(display, connector, seat, tty); return drm_compositor_create(display, connector, seat, tty);
} }

@ -663,34 +663,19 @@ wfd_compositor_create(struct wl_display *display,
return &ec->base; return &ec->base;
} }
struct weston_compositor *
backend_init(struct wl_display *display, char *options);
WL_EXPORT struct weston_compositor * WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, char *options) backend_init(struct wl_display *display, int argc, char *argv[])
{ {
int connector = 0, i; int connector = 0, tty = 0;
const char *seat; const char *seat;
char *p, *value;
int tty = 0;
static char * const tokens[] = { "connector", "seat", "tty", NULL }; const struct weston_option wfd_options[] = {
{ WESTON_OPTION_INTEGER, "connector", 0, &connector },
p = options; { WESTON_OPTION_STRING, "seat", 0, &seat },
seat = default_seat; { WESTON_OPTION_INTEGER, "tty", 0, &tty },
while (i = getsubopt(&p, tokens, &value), i != -1) { };
switch (i) {
case 0: parse_options(&wfd_options, ARRAY_LENGTH(wfd_options), argc, argv);
connector = strtol(value, NULL, 0);
break;
case 1:
seat = value;
break;
case 2:
tty = strtol(value, NULL, 0);
break;
}
}
return wfd_compositor_create(display, connector, seat, tty); return wfd_compositor_create(display, connector, seat, tty);
} }

@ -721,31 +721,20 @@ wayland_compositor_create(struct wl_display *display,
return &c->base; return &c->base;
} }
struct weston_compositor *
backend_init(struct wl_display *display, char *options);
WL_EXPORT struct weston_compositor * WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, char *options) backend_init(struct wl_display *display, int argc, char *argv[])
{ {
int width = 1024, height = 640, i; int width = 1024, height = 640;
char *p, *value, *display_name = NULL; char *display_name = NULL;
static char * const tokens[] = { "width", "height", "display", NULL }; const struct weston_option wayland_options[] = {
{ WESTON_OPTION_INTEGER, "width", 0, &width },
p = options; { WESTON_OPTION_INTEGER, "height", 0, &height },
while (i = getsubopt(&p, tokens, &value), i != -1) { { WESTON_OPTION_STRING, "display", 0, &display_name },
switch (i) { };
case 0:
width = strtol(value, NULL, 0); parse_options(wayland_options,
break; ARRAY_LENGTH(wayland_options), argc, argv);
case 1:
height = strtol(value, NULL, 0);
break;
case 2:
display_name = strdup(value);
break;
}
}
return wayland_compositor_create(display, width, height, display_name); return wayland_compositor_create(display, width, height, display_name);
} }

@ -817,36 +817,19 @@ x11_compositor_create(struct wl_display *display,
return &c->base; return &c->base;
} }
struct weston_compositor *
backend_init(struct wl_display *display, char *options);
WL_EXPORT struct weston_compositor * WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, char *options) backend_init(struct wl_display *display, int argc, char *argv[])
{ {
int width = 1024, height = 640, fullscreen = 0, count = 1, i; int width = 1024, height = 640, fullscreen = 0, count = 1;
char *p, *value;
static char * const tokens[] = { const struct weston_option x11_options[] = {
"width", "height", "fullscreen", "output-count", NULL { WESTON_OPTION_INTEGER, "width", 0, &width },
{ WESTON_OPTION_INTEGER, "height", 0, &height },
{ WESTON_OPTION_BOOLEAN, "fullscreen", 0, &fullscreen },
{ WESTON_OPTION_INTEGER, "output-count", 0, &count },
}; };
p = options; parse_options(x11_options, ARRAY_LENGTH(x11_options), argc, argv);
while (i = getsubopt(&p, tokens, &value), i != -1) {
switch (i) {
case 0:
width = strtol(value, NULL, 0);
break;
case 1:
height = strtol(value, NULL, 0);
break;
case 2:
fullscreen = 1;
break;
case 3:
count = strtol(value, NULL, 0);
break;
}
}
return x11_compositor_create(display, return x11_compositor_create(display,
width, height, count, fullscreen); width, height, count, fullscreen);

@ -42,7 +42,6 @@
#include <math.h> #include <math.h>
#include <linux/input.h> #include <linux/input.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <getopt.h>
#include <signal.h> #include <signal.h>
#include <setjmp.h> #include <setjmp.h>
#include <execinfo.h> #include <execinfo.h>
@ -50,8 +49,6 @@
#include <wayland-server.h> #include <wayland-server.h>
#include "compositor.h" #include "compositor.h"
static const char *option_socket_name = NULL;
static struct wl_list child_process_list; static struct wl_list child_process_list;
static jmp_buf segv_jmp_buf; static jmp_buf segv_jmp_buf;
@ -2460,57 +2457,28 @@ int main(int argc, char *argv[])
struct wl_event_source *signals[4]; struct wl_event_source *signals[4];
struct wl_event_loop *loop; struct wl_event_loop *loop;
struct sigaction segv_action; struct sigaction segv_action;
int o, xserver = 0;
void *shell_module, *backend_module; void *shell_module, *backend_module;
int (*shell_init)(struct weston_compositor *ec); int (*shell_init)(struct weston_compositor *ec);
struct weston_compositor struct weston_compositor
*(*backend_init)(struct wl_display *display, char *options); *(*backend_init)(struct wl_display *display,
int argc, char *argv[]);
int i;
char *backend = NULL; char *backend = NULL;
char *backend_options = "";
char *shell = NULL; char *shell = NULL;
char *p; int32_t idle_time = 300;
int option_idle_time = 300; int32_t xserver;
int i; char *socket_name = NULL;
static const char opts[] = "B:b:o:S:i:s:x"; const struct weston_option core_options[] = {
static const struct option longopts[ ] = { { WESTON_OPTION_STRING, "backend", 'B', &backend },
{ "backend", 1, NULL, 'B' }, { WESTON_OPTION_STRING, "socket", 'S', &socket_name },
{ "backend-options", 1, NULL, 'o' }, { WESTON_OPTION_INTEGER, "idle-time", 'i', &idle_time },
{ "socket", 1, NULL, 'S' }, { WESTON_OPTION_STRING, "shell", 's', &shell },
{ "idle-time", 1, NULL, 'i' }, { WESTON_OPTION_BOOLEAN, "xserver", 0, &xserver },
{ "shell", 1, NULL, 's' },
{ "xserver", 0, NULL, 'x' },
{ NULL, }
}; };
while (o = getopt_long(argc, argv, opts, longopts, &o), o > 0) { argc = parse_options(core_options,
switch (o) { ARRAY_LENGTH(core_options), argc, argv);
case 'B':
backend = optarg;
break;
case 'o':
backend_options = optarg;
break;
case 'S':
option_socket_name = optarg;
break;
case 'i':
option_idle_time = strtol(optarg, &p, 0);
if (*p != '\0') {
fprintf(stderr,
"invalid idle time option: %s\n",
optarg);
exit(EXIT_FAILURE);
}
break;
case 's':
shell = optarg;
break;
case 'x':
xserver = 1;
break;
}
}
display = wl_display_create(); display = wl_display_create();
@ -2553,14 +2521,19 @@ int main(int argc, char *argv[])
if (!shell_init) if (!shell_init)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
ec = backend_init(display, backend_options); ec = backend_init(display, argc, argv);
if (ec == NULL) { if (ec == NULL) {
fprintf(stderr, "failed to create compositor\n"); fprintf(stderr, "failed to create compositor\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
ec->option_idle_time = option_idle_time; for (i = 1; argv[i]; i++)
ec->idle_time = option_idle_time; fprintf(stderr, "unhandled option: %s\n", argv[i]);
if (argv[1])
exit(EXIT_FAILURE);
ec->option_idle_time = idle_time;
ec->idle_time = idle_time;
#ifdef BUILD_XSERVER_LAUNCHER #ifdef BUILD_XSERVER_LAUNCHER
if (xserver) if (xserver)
@ -2570,7 +2543,7 @@ int main(int argc, char *argv[])
if (shell_init(ec) < 0) if (shell_init(ec) < 0)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (wl_display_add_socket(display, option_socket_name)) { if (wl_display_add_socket(display, socket_name)) {
fprintf(stderr, "failed to add socket: %m\n"); fprintf(stderr, "failed to add socket: %m\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

@ -34,6 +34,7 @@
#include <EGL/eglext.h> #include <EGL/eglext.h>
#include "matrix.h" #include "matrix.h"
#include "../shared/config-parser.h"
struct weston_transform { struct weston_transform {
struct weston_matrix matrix; struct weston_matrix matrix;
@ -552,4 +553,7 @@ weston_surface_set_color(struct weston_surface *surface,
void void
weston_surface_destroy(struct weston_surface *surface); weston_surface_destroy(struct weston_surface *surface);
struct weston_compositor *
backend_init(struct wl_display *display, int argc, char *argv[]);
#endif #endif

Loading…
Cancel
Save