From 6db67f5055db11c21f8ab8f04119cf03036f2c58 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Wed, 11 Jul 2018 23:20:09 +0200 Subject: [PATCH] Added (basic) support for xpra backend --- src/bbconfig.c | 2 +- src/optirun.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/bbconfig.c b/src/bbconfig.c index 1dff5e0..d7c4bce 100644 --- a/src/bbconfig.c +++ b/src/bbconfig.c @@ -148,7 +148,7 @@ void print_usage(int exit_val) { --no-failsafe do not run a program if the nvidia card is unavailable\n\ --no-xorg do not start secondary X server (implies -b none)\n\ -b, --bridge METHOD acceleration/displaying bridge to use. Valid values\n\ - are auto, virtualgl and primus. The --vgl-* options\n\ + are auto, xpra, virtualgl and primus. The --vgl-* options\n\ only make sense when using the virtualgl bridge,\n\ while the --primus-* options apply only when using\n\ the primus bridge.\n\ diff --git a/src/optirun.c b/src/optirun.c index 65c83d4..d163bfb 100644 --- a/src/optirun.c +++ b/src/optirun.c @@ -96,6 +96,33 @@ static int run_fallback(char *argv[]) { return EXIT_FAILURE; } +static int check_xpra(void) { + /* check if xpra exists */ + char *p = which_program("xpra"); + int has_xpra = (p != NULL); + free(p); + return has_xpra; +} + +static int run_xpra(int argc, char **argv) { + char * xpra_args[12]; + xpra_args[0] = "xpra"; + xpra_args[1] = "start"; + xpra_args[2] = "--start-child"; + // TODO: Parse all arguments into a proper command string. We ignore everything after the first argument now. + xpra_args[3] = argv[optind]; + xpra_args[4] = "--use-display=yes"; + xpra_args[5] = "--pulseaudio=no"; + xpra_args[6] = "--attach=yes"; + xpra_args[7] = "--exit-with-client=yes"; + xpra_args[8] = "--exit-with-children=yes"; + xpra_args[9] = "--daemon=no"; + xpra_args[10] = bb_config.x_display; + xpra_args[11] = 0; + int exitcode = bb_run_fork(xpra_args, 0); + return exitcode; +} + static int check_virtualgl(void) { /* check if vglrun and vglclient exist */ char *p = which_program("vglrun"); @@ -298,6 +325,7 @@ struct optirun_bridge { }; static struct optirun_bridge backends[] = { + {"xpra", check_xpra, run_xpra}, {"virtualgl", check_virtualgl, run_virtualgl}, {"primus", check_primus, run_primus}, {"none", check_none, run_none}, // keep last @@ -322,7 +350,7 @@ static int run_app(int argc, char *argv[]) { if (!strcmp(bb_config.optirun_bridge, "auto")) { while (back->name && !back->check_availability()) ++back; if (!back->name || !strcmp(back->name, "none")) { - bb_log(LOG_ERR, "No bridge found. Try installing primus or virtualgl.\n"); + bb_log(LOG_ERR, "No bridge found. Try installing primus, virtualgl or xpra.\n"); goto out; } bb_log(LOG_DEBUG, "Using auto-detected bridge %s\n", back->name);