libobs: Add a Wayland platform

Introduce the OBS_NIX_PLATFORM_WAYLAND enum value, and try to detect
it when OBS Studio runs by looking into the platform name.
master
Georges Basile Stavracas Neto 2020-03-06 18:53:42 -03:00
parent 9810fe9220
commit 2b3cb54771
12 changed files with 260 additions and 1 deletions

View File

@ -202,6 +202,8 @@ if(APPLE)
list(APPEND CMAKE_INSTALL_RPATH "@loader_path/" "@executable_path/")
elseif(UNIX)
option(USE_XDG "Utilize XDG Base Directory Specification" ON)
option(ENABLE_WAYLAND "Build support for Wayland" ON)
if(USE_XDG)
add_definitions(-DUSE_XDG)
endif()

View File

@ -396,6 +396,16 @@ if(WIN32)
OUTPUT_NAME "obs${_output_suffix}")
endif()
if (ENABLE_WAYLAND)
find_package(Qt5Gui REQUIRED)
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
set(obs_PLATFORM_LIBRARIES
${obs_PLATFORM_LIBRARIES}
Qt5::Gui
Qt5::GuiPrivate)
endif()
target_link_libraries(obs
libobs
Qt5::Widgets

View File

@ -61,6 +61,11 @@
#if !defined(_WIN32) && !defined(__APPLE__)
#include <obs-nix-platform.h>
#include <QX11Info>
#ifdef ENABLE_WAYLAND
#include <qpa/qplatformnativeinterface.h>
#endif
#endif
#include <iostream>
@ -1398,6 +1403,18 @@ bool OBSApp::OBSInit()
}
obs_set_nix_platform_display(QX11Info::display());
}
#ifdef ENABLE_WAYLAND
if (QApplication::platformName().contains("wayland")) {
obs_set_nix_platform(OBS_NIX_PLATFORM_WAYLAND);
QPlatformNativeInterface *native =
QGuiApplication::platformNativeInterface();
obs_set_nix_platform_display(
native->nativeResourceForIntegration("display"));
blog(LOG_INFO, "Platform: Wayland");
}
#endif
#endif
if (!StartupOBS(locale.c_str(), GetProfilerNameStore()))

View File

@ -0,0 +1,78 @@
# Try to find Wayland on a Unix system
#
# This will define:
#
# WAYLAND_FOUND - True if Wayland is found
# WAYLAND_LIBRARIES - Link these to use Wayland
# WAYLAND_INCLUDE_DIRS - Include directory for Wayland
# WAYLAND_DEFINITIONS - Compiler flags for using Wayland
#
# In addition the following more fine grained variables will be defined:
#
# Wayland_Client_FOUND WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES
# Wayland_Server_FOUND WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES
# Wayland_EGL_FOUND WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES
# Wayland_Cursor_FOUND WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES
#
# Copyright (c) 2013 Martin Gräßlin <mgraesslin@kde.org>
# 2020 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
IF (NOT WIN32)
# Use pkg-config to get the directories and then use these values
# in the find_path() and find_library() calls
find_package(PkgConfig)
PKG_CHECK_MODULES(PKG_WAYLAND QUIET wayland-client wayland-server wayland-egl wayland-cursor)
set(WAYLAND_DEFINITIONS ${PKG_WAYLAND_CFLAGS})
find_path(WAYLAND_CLIENT_INCLUDE_DIRS NAMES wayland-client.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_CLIENT_LIBRARIES NAMES wayland-client HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_CLIENT_INCLUDE_DIRS AND WAYLAND_CLIENT_LIBRARIES)
set(Wayland_Client_FOUND TRUE)
else()
set(Wayland_Client_FOUND FALSE)
endif()
mark_as_advanced(WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES)
find_path(WAYLAND_CURSOR_INCLUDE_DIRS NAMES wayland-cursor.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_CURSOR_LIBRARIES NAMES wayland-cursor HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_CURSOR_INCLUDE_DIRS AND WAYLAND_CURSOR_LIBRARIES)
set(Wayland_Cursor_FOUND TRUE)
else()
set(Wayland_Cursor_FOUND FALSE)
endif()
mark_as_advanced(WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES)
find_path(WAYLAND_EGL_INCLUDE_DIRS NAMES wayland-egl.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_EGL_LIBRARIES NAMES wayland-egl HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_EGL_INCLUDE_DIRS AND WAYLAND_EGL_LIBRARIES)
set(Wayland_EGL_FOUND TRUE)
else()
set(Wayland_EGL_FOUND FALSE)
endif()
mark_as_advanced(WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES)
find_path(WAYLAND_SERVER_INCLUDE_DIRS NAMES wayland-server.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_SERVER_LIBRARIES NAMES wayland-server HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_SERVER_INCLUDE_DIRS AND WAYLAND_SERVER_LIBRARIES)
set(Wayland_Server_FOUND TRUE)
else()
set(Wayland_Server_FOUND FALSE)
endif()
mark_as_advanced(WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES)
set(WAYLAND_INCLUDE_DIRS ${WAYLAND_CLIENT_INCLUDE_DIRS} ${WAYLAND_SERVER_INCLUDE_DIRS} ${WAYLAND_EGL_INCLUDE_DIRS} ${WAYLAND_CURSOR_INCLUDE_DIRS})
set(WAYLAND_LIBRARIES ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_SERVER_LIBRARIES} ${WAYLAND_EGL_LIBRARIES} ${WAYLAND_CURSOR_LIBRARIES})
mark_as_advanced(WAYLAND_INCLUDE_DIRS WAYLAND_LIBRARIES)
list(REMOVE_DUPLICATES WAYLAND_INCLUDE_DIRS)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Wayland REQUIRED_VARS WAYLAND_LIBRARIES WAYLAND_INCLUDE_DIRS HANDLE_COMPONENTS)
ENDIF ()

View File

@ -28,7 +28,7 @@ elseif(APPLE)
${COCOA}
${IOSURF}
${OPENGL_gl_LIBRARY})
else() #This needs to change to be more specific to get ready for Wayland
else()
find_package(XCB COMPONENTS XCB REQUIRED)
find_package(X11_XCB REQUIRED)

View File

@ -32,6 +32,11 @@ static void init_winsys(void)
case OBS_NIX_PLATFORM_X11_EGL:
gl_vtable = gl_x11_egl_get_winsys_vtable();
break;
#ifdef ENABLE_WAYLAND
case OBS_NIX_PLATFORM_WAYLAND:
blog(LOG_ERROR, "EGL/Wayland not implemented yet");
break;
#endif
}
assert(gl_vtable != NULL);

View File

@ -197,6 +197,21 @@ elseif(UNIX)
util/threading-posix.h
obs-nix-platform.h)
if(ENABLE_WAYLAND)
find_package(Wayland COMPONENTS Client REQUIRED)
set(libobs_PLATFORM_SOURCES ${libobs_PLATFORM_SOURCES}
obs-nix-wayland.c)
include_directories(
${WAYLAND_CLIENT_INCLUDE_DIR})
add_definitions(
${WAYLAND_DEFINITIONS})
set(libobs_PLATFORM_DEPS
${libobs_PLATFORM_DEPS}
${WAYLAND_CLIENT_LIBRARIES})
endif()
if(HAVE_PULSEAUDIO)
set(libobs_audio_monitoring_HEADERS
audio-monitoring/pulse/pulseaudio-wrapper.h)

View File

@ -26,6 +26,10 @@ extern "C" {
enum obs_nix_platform_type {
OBS_NIX_PLATFORM_X11_GLX,
OBS_NIX_PLATFORM_X11_EGL,
#ifdef ENABLE_WAYLAND
OBS_NIX_PLATFORM_WAYLAND,
#endif
};
/**

88
libobs/obs-nix-wayland.c Normal file
View File

@ -0,0 +1,88 @@
/******************************************************************************
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-internal.h"
#include "obs-nix-platform.h"
#include "obs-nix-wayland.h"
#include <wayland-client.h>
void obs_nix_wayland_log_info(void)
{
struct wl_display *display = obs_get_nix_platform_display();
if (display == NULL) {
blog(LOG_INFO, "Unable to connect to Wayland server");
return;
}
//TODO: query some information about the wayland server if possible
blog(LOG_INFO, "Connected to Wayland server");
}
static bool
obs_nix_wayland_hotkeys_platform_init(struct obs_core_hotkeys *hotkeys)
{
UNUSED_PARAMETER(hotkeys);
return true;
}
static void
obs_nix_wayland_hotkeys_platform_free(struct obs_core_hotkeys *hotkeys)
{
UNUSED_PARAMETER(hotkeys);
}
static bool
obs_nix_wayland_hotkeys_platform_is_pressed(obs_hotkeys_platform_t *context,
obs_key_t key)
{
UNUSED_PARAMETER(context);
UNUSED_PARAMETER(key);
return false;
}
static void obs_nix_wayland_key_to_str(obs_key_t key, struct dstr *dstr)
{
UNUSED_PARAMETER(key);
UNUSED_PARAMETER(dstr);
}
static obs_key_t obs_nix_wayland_key_from_virtual_key(int sym)
{
UNUSED_PARAMETER(sym);
return OBS_KEY_NONE;
}
static int obs_nix_wayland_key_to_virtual_key(obs_key_t key)
{
UNUSED_PARAMETER(key);
return 0;
}
static const struct obs_nix_hotkeys_vtable wayland_hotkeys_vtable = {
.init = obs_nix_wayland_hotkeys_platform_init,
.free = obs_nix_wayland_hotkeys_platform_free,
.is_pressed = obs_nix_wayland_hotkeys_platform_is_pressed,
.key_to_str = obs_nix_wayland_key_to_str,
.key_from_virtual_key = obs_nix_wayland_key_from_virtual_key,
.key_to_virtual_key = obs_nix_wayland_key_to_virtual_key,
};
const struct obs_nix_hotkeys_vtable *obs_nix_wayland_get_hotkeys_vtable(void)
{
return &wayland_hotkeys_vtable;
}

24
libobs/obs-nix-wayland.h Normal file
View File

@ -0,0 +1,24 @@
/******************************************************************************
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 "obs-nix.h"
void obs_nix_wayland_log_info(void);
const struct obs_nix_hotkeys_vtable *obs_nix_wayland_get_hotkeys_vtable(void);

View File

@ -20,6 +20,11 @@
#include "obs-nix.h"
#include "obs-nix-platform.h"
#include "obs-nix-x11.h"
#ifdef ENABLE_WAYLAND
#include "obs-nix-wayland.h"
#endif
#if defined(__FreeBSD__)
#define _GNU_SOURCE
#endif
@ -322,6 +327,10 @@ void log_system_info(void)
case OBS_NIX_PLATFORM_X11_EGL:
obs_nix_x11_log_info();
break;
#ifdef ENABLE_WAYLAND
case OBS_NIX_PLATFORM_WAYLAND:
break;
#endif
}
}
@ -332,6 +341,11 @@ bool obs_hotkeys_platform_init(struct obs_core_hotkeys *hotkeys)
case OBS_NIX_PLATFORM_X11_EGL:
hotkeys_vtable = obs_nix_x11_get_hotkeys_vtable();
break;
#ifdef ENABLE_WAYLAND
case OBS_NIX_PLATFORM_WAYLAND:
hotkeys_vtable = obs_nix_wayland_get_hotkeys_vtable();
break;
#endif
}
return hotkeys_vtable->init(hotkeys);

View File

@ -22,6 +22,8 @@
#define LIBOBS_IMAGEMAGICK_DIR_STYLE_7GE 7
#define LIBOBS_IMAGEMAGICK_DIR_STYLE @LIBOBS_IMAGEMAGICK_DIR_STYLE@
#cmakedefine ENABLE_WAYLAND
/* NOTE: Release candidate version numbers internally are always the previous
* main release number! For example, if the current public release is 21.0 and
* the build is 22.0 release candidate 1, internally the build number (defined