From 506b950d02f533aa49df8be5a5d3f844ac2fd0ce Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Fri, 6 Mar 2020 17:50:41 -0300 Subject: [PATCH] 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. --- UI/obs-app.cpp | 12 +++++++++ libobs/CMakeLists.txt | 4 ++- 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, 125 insertions(+), 5 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 e72f73d1c..cf1e89018 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -58,6 +58,11 @@ #include #endif +#if !defined(_WIN32) && !defined(__APPLE__) +#include +#include +#endif + #include #include "ui-config.h" @@ -1384,6 +1389,13 @@ bool OBSApp::OBSInit() qRegisterMetaType(); +#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 ea5250e1a..6bc83b3e4 100644 --- a/libobs/CMakeLists.txt +++ b/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 diff --git a/libobs/obs-nix-platform.c b/libobs/obs-nix-platform.c new file mode 100644 index 000000000..e07a4d7b8 --- /dev/null +++ b/libobs/obs-nix-platform.c @@ -0,0 +1,42 @@ +/****************************************************************************** + Copyright (C) 2019 by Jason Francis + + 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 . +******************************************************************************/ + +#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 000000000..4cf9d8cd2 --- /dev/null +++ b/libobs/obs-nix-platform.h @@ -0,0 +1,52 @@ +/****************************************************************************** + Copyright (C) 2019 by Jason Francis + + 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 . +******************************************************************************/ + +#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 29aa3c7f8..bb3bc0b7c 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 @@ -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 4e8501224..bedd2d974 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 @@ -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); }