/*! \brief Initializes socket for receiving
 *
 * @retval TRUE Socket initialization was successful
 * @retval FALSE Socket initialization failed
 */
bool QNodeReceiver::socketReady() {

	//display error message and return early if socket creation failed
	if (!socketCreation()) {
		display(ERROR, QString("Socket creation failed!"));
		return false;
	}

	//display error message and return early if socket option setting failed
	if (!socketOption()) {
		display(ERROR, QString("Socket option setting failed!"));
		return false;
	}

	//display error message and return early if socket binding failed
	if (!socketBinding()) {
		display(ERROR, QString("Socket binding failed!"));
		return false;
	}
	return true;
}
Beispiel #2
0
xt::Process::Process(const westring &xbmcTestBase,
                     const westring &tempFileName) :
  m_pid(0)
{
  std::stringstream socketOptionStream;
  socketOptionStream << "--socket=";
  socketOptionStream << tempFileName.c_str();
  
  std::string socketOption(socketOptionStream.str());

  std::stringstream modulesOptionStream;
  modulesOptionStream << "--modules=";
  modulesOptionStream << xbmcTestBase.c_str();
  modulesOptionStream << "xbmc/windowing/tests/wayland/xbmc-wayland-test-extension.so";
  
  std::string modulesOption(modulesOptionStream.str());
  
  std::string program(FindBinaryFromPATH("weston"));
  const char *options[] =
  {
    program.c_str(),
    "--backend=headless-backend.so",
    modulesOption.c_str(),
    socketOption.c_str(),
    NULL
  };
  
  m_pid = fork();
  
  switch (m_pid)
  {
    case 0:
      Child(program.c_str(),
            const_cast <char * const *>(options));
    case -1:
      ForkError();
    default:
      Parent();
  }
}
Beispiel #3
0
int main(int argc, char **argv)
{
    if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) {
        fmt::print("Could not lock memory pages.\n");
    } else {
        fmt::print(stderr, "Succesfully locked memory pages.\n");
    }

    sched_param schedParam;
    memset(&schedParam, 0, sizeof(schedParam));
    schedParam.sched_priority = 10;
    if (sched_setscheduler(0, SCHED_FIFO | SCHED_RESET_ON_FORK, &schedParam) != -1) {
        fmt::print("Succesfully changed the process scheduler to SCHED_FIFO.\n");
    } else {
        fmt::print(stderr, "Could not change the process scheduler: {}.\n", strerror(errno));
    }

    setenv("QT_MESSAGE_PATTERN", "[%{if-debug}D%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif} %{appname}"
                                 " - %{file}:%{line}] == %{message}", 0);

    QCoreApplication app(argc, argv);
    app.setApplicationName(QStringLiteral("Orbital"));
    app.setApplicationVersion(QStringLiteral("0.1"));

    QCommandLineParser parser;
    parser.setApplicationDescription(QStringLiteral("Orbital compositor"));
    parser.addHelpOption();
    parser.addVersionOption();

    QCommandLineOption socketOption({ QStringLiteral("S"), QStringLiteral("socket") }, QStringLiteral("Socket name"));
    parser.addOption(socketOption);

    QCommandLineOption backendOption({ QStringLiteral("B"), QStringLiteral("backend") }, QStringLiteral("Backend plugin"), QStringLiteral("name"));
    parser.addOption(backendOption);

    parser.process(app);

    Orbital::StringView backendKey;
    QByteArray opt;
    if (parser.isSet(backendOption)) {
        opt = parser.value(backendOption).toUtf8();
        backendKey = opt;
    } else if (getenv("WAYLAND_DISPLAY")) {
        backendKey = "wayland-backend";
    } else if (getenv("DISPLAY")) {
        backendKey = "x11-backend";
    } else {
        backendKey = "drm-backend";
    }

    Orbital::BackendFactory::searchPlugins();
    Orbital::Backend *backend = Orbital::BackendFactory::createBackend(backendKey);
    if (!backend) {
        return 1;
    }

    Orbital::Compositor compositor(backend);
    if (!compositor.init("")) {
        return 1;
    }

    wl_display_run(compositor.display());
    return 0;
}
Beispiel #4
0
int main(int argc, char *argv[])
{
    // Disable ptrace except for gdb
    disablePtrace();

    // Setup the environment
    setupEnvironment();

    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    // Application
    QApplication app(argc, argv);
    app.setApplicationName(QLatin1String("Papyros Shell"));
    app.setApplicationVersion(QLatin1String(PAPYROS_SHELL_VERSION_STRING));
    app.setOrganizationName(QLatin1String("Ppayros"));
    app.setOrganizationDomain(QLatin1String("papyros.io"));
    app.setFallbackSessionManagementEnabled(false);
    app.setQuitOnLastWindowClosed(false);

    // Command line parser
    QCommandLineParser parser;
    parser.setApplicationDescription(TR("Wayland compositor for the Papyros desktop environment"));
    parser.addHelpOption();
    parser.addVersionOption();

    // Wayland socket
    QCommandLineOption socketOption(QStringLiteral("wayland-socket-name"), TR("Wayland socket"),
                                    TR("name"));
    parser.addOption(socketOption);

    // Nested mode
    QCommandLineOption nestedOption(
            QStringList() << QStringLiteral("n") << QStringLiteral("nested"),
            TR("Nest into a compositor that supports _wl_fullscreen_shell"));
    parser.addOption(nestedOption);

    // Fake screen configuration
    QCommandLineOption fakeScreenOption(QStringLiteral("fake-screen"),
                                        TR("Use fake screen configuration"), TR("filename"));
    parser.addOption(fakeScreenOption);

#if DEVELOPMENT_BUILD
    // Load shell from an arbitrary path
    QCommandLineOption qmlOption(QStringLiteral("qml"),
                                 QStringLiteral("Load a shell main QML file"),
                                 QStringLiteral("filename"));
    parser.addOption(qmlOption);
#endif

    // Parse command line
    parser.process(app);

    // Restart with D-Bus session if necessary
    if (qEnvironmentVariableIsEmpty("DBUS_SESSION_BUS_ADDRESS")) {
        qCritical("No D-Bus session bus available, please run Hawaii with dbus-launch.");
        return 1;
    }

    // Arguments
    bool nested = parser.isSet(nestedOption);
    QString socket = parser.value(socketOption);
    QString fakeScreenData = parser.value(fakeScreenOption);

    // Nested mode requires running from Wayland and a socket name
    // and fake screen data cannot be used
    if (nested) {
        if (!QGuiApplication::platformName().startsWith(QStringLiteral("greenisland"))) {
            qCritical("Nested mode only make sense when running on Wayland.\n"
                      "Please pass the \"-platform greenisland\" argument.");
            return 1;
        }

        if (socket.isEmpty()) {
            qCritical("Nested mode requires you to specify a socket name.\n"
                      "Please specify it with the \"--wayland-socket-name\" argument.");
            return 1;
        }

        if (!fakeScreenData.isEmpty()) {
            qCritical("Fake screen configuration cannot be used when nested");
            return 1;
        }
    }

    // Print version information
    qDebug("== Papyros Shell v%s (Green Island v%s) ==\n"
           "** http://papyros.io\n"
           "** Bug reports to: https://github.com/papyros/papyros-shell/issues\n"
           "** Build: %s-%s",
           PAPYROS_SHELL_VERSION_STRING, GREENISLAND_VERSION_STRING, PAPYROS_SHELL_VERSION_STRING,
           GIT_REV);

    // Application
    Application *papyros = new Application();
    papyros->setScreenConfiguration(fakeScreenData);

    // Create the compositor and run
    bool urlAlreadySet = false;
#if DEVELOPMENT_BUILD
    if (parser.isSet(qmlOption)) {
        urlAlreadySet = true;
        papyros->setUrl(QUrl::fromLocalFile(parser.value(qmlOption)));
    }
#endif
    if (!urlAlreadySet)
        papyros->setUrl(QUrl(QStringLiteral("qrc:/Compositor.qml")));
    QCoreApplication::postEvent(papyros, new StartupEvent());

    return app.exec();
}