2020-08-19 07:53:02 +00:00
|
|
|
From 32f86b37c78454ad51ac427ccc772b7a62fa89c8 Mon Sep 17 00:00:00 2001
|
2020-08-09 11:22:33 +00:00
|
|
|
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
|
|
Date: Fri, 6 Mar 2020 17:50:41 -0300
|
2020-08-19 07:53:02 +00:00
|
|
|
Subject: [PATCH 08/16] libobs: Introduce the concept of a Unix platform
|
2020-08-09 11:22:33 +00:00
|
|
|
|
|
|
|
This is a Unix-specific code. The only available platforms
|
|
|
|
at this point are the X11/GLX and X11/EGL platforms.
|
|
|
|
|
|
|
|
The concept of a platform display is also introduced. Again,
|
|
|
|
the only display that is set right now is the X11 display.
|
|
|
|
---
|
|
|
|
UI/obs-app.cpp | 12 +++++++++
|
|
|
|
libobs/CMakeLists.txt | 6 +++++
|
|
|
|
libobs/obs-nix-platform.c | 42 +++++++++++++++++++++++++++++++
|
|
|
|
libobs/obs-nix-platform.h | 52 +++++++++++++++++++++++++++++++++++++++
|
|
|
|
libobs/obs-nix-x11.c | 5 ++--
|
|
|
|
libobs/obs-nix.c | 15 +++++++++--
|
|
|
|
6 files changed, 128 insertions(+), 4 deletions(-)
|
|
|
|
create mode 100644 libobs/obs-nix-platform.c
|
|
|
|
create mode 100644 libobs/obs-nix-platform.h
|
|
|
|
|
|
|
|
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
|
|
|
|
index b6f0b7d5..cf9ecabf 100644
|
|
|
|
--- a/UI/obs-app.cpp
|
|
|
|
+++ b/UI/obs-app.cpp
|
|
|
|
@@ -54,6 +54,11 @@
|
|
|
|
#include <pthread.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+#if !defined(_WIN32) && !defined(__APPLE__)
|
|
|
|
+#include <obs-nix-platform.h>
|
|
|
|
+#include <QX11Info>
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
#include "ui-config.h"
|
|
|
|
@@ -1346,6 +1351,13 @@ bool OBSApp::OBSInit()
|
|
|
|
|
|
|
|
qRegisterMetaType<VoidFunc>();
|
|
|
|
|
|
|
|
+#if !defined(_WIN32) && !defined(__APPLE__)
|
|
|
|
+ obs_set_nix_platform(OBS_NIX_PLATFORM_X11_GLX);
|
|
|
|
+ if (QApplication::platformName() == "xcb") {
|
|
|
|
+ obs_set_nix_platform_display(QX11Info::display());
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
if (!StartupOBS(locale.c_str(), GetProfilerNameStore()))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
diff --git a/libobs/CMakeLists.txt b/libobs/CMakeLists.txt
|
|
|
|
index 1625363f..489334c0 100644
|
|
|
|
--- a/libobs/CMakeLists.txt
|
|
|
|
+++ b/libobs/CMakeLists.txt
|
|
|
|
@@ -180,13 +180,18 @@ elseif(APPLE)
|
|
|
|
elseif(UNIX)
|
|
|
|
set(libobs_PLATFORM_SOURCES
|
|
|
|
obs-nix.c
|
|
|
|
+ obs-nix-platform.c
|
|
|
|
obs-nix-x11.c
|
|
|
|
util/threading-posix.c
|
|
|
|
util/pipe-posix.c
|
|
|
|
util/platform-nix.c)
|
|
|
|
|
|
|
|
+ set(libobs_PLATFORM_HEADERS
|
|
|
|
+ obs-nix-platform.h)
|
|
|
|
+
|
|
|
|
if(NEEDS_SIMDE)
|
|
|
|
set(libobs_PLATFORM_HEADERS
|
|
|
|
+ ${libobs_PLATFORM_HEADERS}
|
|
|
|
util/simde/check.h
|
|
|
|
util/simde/hedley.h
|
|
|
|
util/simde/mmx.h
|
|
|
|
@@ -197,6 +202,7 @@ elseif(UNIX)
|
|
|
|
util/threading-posix.h)
|
|
|
|
else()
|
|
|
|
set(libobs_PLATFORM_HEADERS
|
|
|
|
+ ${libobs_PLATFORM_HEADERS}
|
|
|
|
util/threading-posix.h)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
diff --git a/libobs/obs-nix-platform.c b/libobs/obs-nix-platform.c
|
|
|
|
new file mode 100644
|
|
|
|
index 00000000..e07a4d7b
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/libobs/obs-nix-platform.c
|
|
|
|
@@ -0,0 +1,42 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ Copyright (C) 2019 by Jason Francis <cycl0ps@tuta.io>
|
|
|
|
+
|
|
|
|
+ This program is free software: you can redistribute it and/or modify
|
|
|
|
+ it under the terms of the GNU General Public License as published by
|
|
|
|
+ the Free Software Foundation, either version 2 of the License, or
|
|
|
|
+ (at your option) any later version.
|
|
|
|
+
|
|
|
|
+ This program is distributed in the hope that it will be useful,
|
|
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
+ GNU General Public License for more details.
|
|
|
|
+
|
|
|
|
+ You should have received a copy of the GNU General Public License
|
|
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
+******************************************************************************/
|
|
|
|
+
|
|
|
|
+#include "obs-nix-platform.h"
|
|
|
|
+
|
|
|
|
+static enum obs_nix_platform_type obs_nix_platform = OBS_NIX_PLATFORM_X11_GLX;
|
|
|
|
+
|
|
|
|
+static void *obs_nix_platform_display = NULL;
|
|
|
|
+
|
|
|
|
+void obs_set_nix_platform(enum obs_nix_platform_type platform)
|
|
|
|
+{
|
|
|
|
+ obs_nix_platform = platform;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+enum obs_nix_platform_type obs_get_nix_platform(void)
|
|
|
|
+{
|
|
|
|
+ return obs_nix_platform;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void obs_set_nix_platform_display(void *display)
|
|
|
|
+{
|
|
|
|
+ obs_nix_platform_display = display;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void *obs_get_nix_platform_display(void)
|
|
|
|
+{
|
|
|
|
+ return obs_nix_platform_display;
|
|
|
|
+}
|
|
|
|
diff --git a/libobs/obs-nix-platform.h b/libobs/obs-nix-platform.h
|
|
|
|
new file mode 100644
|
|
|
|
index 00000000..4cf9d8cd
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/libobs/obs-nix-platform.h
|
|
|
|
@@ -0,0 +1,52 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ Copyright (C) 2019 by Jason Francis <cycl0ps@tuta.io>
|
|
|
|
+
|
|
|
|
+ This program is free software: you can redistribute it and/or modify
|
|
|
|
+ it under the terms of the GNU General Public License as published by
|
|
|
|
+ the Free Software Foundation, either version 2 of the License, or
|
|
|
|
+ (at your option) any later version.
|
|
|
|
+
|
|
|
|
+ This program is distributed in the hope that it will be useful,
|
|
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
+ GNU General Public License for more details.
|
|
|
|
+
|
|
|
|
+ You should have received a copy of the GNU General Public License
|
|
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
+******************************************************************************/
|
|
|
|
+
|
|
|
|
+#pragma once
|
|
|
|
+
|
|
|
|
+#include "util/c99defs.h"
|
|
|
|
+
|
|
|
|
+#ifdef __cplusplus
|
|
|
|
+extern "C" {
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+enum obs_nix_platform_type {
|
|
|
|
+ OBS_NIX_PLATFORM_X11_GLX,
|
|
|
|
+ OBS_NIX_PLATFORM_X11_EGL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Sets the Unix platform.
|
|
|
|
+ * @param platform The platform to select.
|
|
|
|
+ */
|
|
|
|
+EXPORT void obs_set_nix_platform(enum obs_nix_platform_type platform);
|
|
|
|
+/**
|
|
|
|
+ * Gets the host platform.
|
|
|
|
+ */
|
|
|
|
+EXPORT enum obs_nix_platform_type obs_get_nix_platform(void);
|
|
|
|
+/**
|
|
|
|
+ * Sets the host platform's display connection.
|
|
|
|
+ * @param display The host display connection.
|
|
|
|
+ */
|
|
|
|
+EXPORT void obs_set_nix_platform_display(void *display);
|
|
|
|
+/**
|
|
|
|
+ * Gets the host platform's display connection.
|
|
|
|
+ */
|
|
|
|
+EXPORT void *obs_get_nix_platform_display(void);
|
|
|
|
+
|
|
|
|
+#ifdef __cplusplus
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
diff --git a/libobs/obs-nix-x11.c b/libobs/obs-nix-x11.c
|
|
|
|
index 29aa3c7f..bb3bc0b7 100644
|
|
|
|
--- a/libobs/obs-nix-x11.c
|
|
|
|
+++ b/libobs/obs-nix-x11.c
|
|
|
|
@@ -18,6 +18,7 @@
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
#include "obs-internal.h"
|
|
|
|
+#include "obs-nix-platform.h"
|
|
|
|
#include "obs-nix-x11.h"
|
|
|
|
|
|
|
|
#include <xcb/xcb.h>
|
|
|
|
@@ -32,7 +33,7 @@
|
|
|
|
|
|
|
|
void obs_nix_x11_log_info(void)
|
|
|
|
{
|
|
|
|
- Display *dpy = XOpenDisplay(NULL);
|
|
|
|
+ Display *dpy = obs_get_nix_platform_display();
|
|
|
|
if (!dpy) {
|
|
|
|
blog(LOG_INFO, "Unable to open X display");
|
|
|
|
return;
|
|
|
|
@@ -827,7 +828,7 @@ static inline void registerMouseEvents(struct obs_core_hotkeys *hotkeys)
|
|
|
|
|
|
|
|
static bool obs_nix_x11_hotkeys_platform_init(struct obs_core_hotkeys *hotkeys)
|
|
|
|
{
|
|
|
|
- Display *display = XOpenDisplay(NULL);
|
|
|
|
+ Display *display = obs_get_nix_platform_display();
|
|
|
|
if (!display)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
diff --git a/libobs/obs-nix.c b/libobs/obs-nix.c
|
|
|
|
index df1d99df..9c52279a 100644
|
|
|
|
--- a/libobs/obs-nix.c
|
|
|
|
+++ b/libobs/obs-nix.c
|
|
|
|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
|
|
#include "obs-internal.h"
|
|
|
|
#include "obs-nix.h"
|
|
|
|
+#include "obs-nix-platform.h"
|
|
|
|
#include "obs-nix-x11.h"
|
|
|
|
#if defined(__FreeBSD__)
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
@@ -289,12 +290,22 @@ void log_system_info(void)
|
|
|
|
#if defined(__linux__)
|
|
|
|
log_distribution_info();
|
|
|
|
#endif
|
|
|
|
- obs_nix_x11_log_info();
|
|
|
|
+ switch (obs_get_nix_platform()) {
|
|
|
|
+ case OBS_NIX_PLATFORM_X11_GLX:
|
|
|
|
+ case OBS_NIX_PLATFORM_X11_EGL:
|
|
|
|
+ obs_nix_x11_log_info();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
bool obs_hotkeys_platform_init(struct obs_core_hotkeys *hotkeys)
|
|
|
|
{
|
|
|
|
- hotkeys_vtable = obs_nix_x11_get_hotkeys_vtable();
|
|
|
|
+ switch (obs_get_nix_platform()) {
|
|
|
|
+ case OBS_NIX_PLATFORM_X11_GLX:
|
|
|
|
+ case OBS_NIX_PLATFORM_X11_EGL:
|
|
|
|
+ hotkeys_vtable = obs_nix_x11_get_hotkeys_vtable();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return hotkeys_vtable->init(hotkeys);
|
|
|
|
}
|
|
|
|
--
|
|
|
|
2.28.0
|
|
|
|
|