فهرست منبع

libobs: Introduce the concept of a Unix platform

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.
Georges Basile Stavracas Neto 6 سال پیش
والد
کامیت
506b950d02
6فایلهای تغییر یافته به همراه125 افزوده شده و 5 حذف شده
  1. 12 0
      UI/obs-app.cpp
  2. 3 1
      libobs/CMakeLists.txt
  3. 42 0
      libobs/obs-nix-platform.c
  4. 52 0
      libobs/obs-nix-platform.h
  5. 3 2
      libobs/obs-nix-x11.c
  6. 13 2
      libobs/obs-nix.c

+ 12 - 0
UI/obs-app.cpp

@@ -58,6 +58,11 @@
 #include <pthread.h>
 #endif
 
+#if !defined(_WIN32) && !defined(__APPLE__)
+#include <obs-nix-platform.h>
+#include <QX11Info>
+#endif
+
 #include <iostream>
 
 #include "ui-config.h"
@@ -1384,6 +1389,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;
 

+ 3 - 1
libobs/CMakeLists.txt

@@ -187,13 +187,15 @@ 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
-		util/threading-posix.h)
+		util/threading-posix.h
+		obs-nix-platform.h)
 
 	if(HAVE_PULSEAUDIO)
 		set(libobs_audio_monitoring_HEADERS

+ 42 - 0
libobs/obs-nix-platform.c

@@ -0,0 +1,42 @@
+/******************************************************************************
+    Copyright (C) 2019 by Jason Francis <[email protected]>
+
+    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;
+}

+ 52 - 0
libobs/obs-nix-platform.h

@@ -0,0 +1,52 @@
+/******************************************************************************
+    Copyright (C) 2019 by Jason Francis <[email protected]>
+
+    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

+ 3 - 2
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;
 

+ 13 - 2
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
@@ -316,12 +317,22 @@ void log_system_info(void)
 	log_distribution_info();
 	log_desktop_session_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);
 }