diff --git a/CMakeLists.txt b/CMakeLists.txt index 04afc6038..ba3194236 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ set(obs-browser_HEADERS # only allow browser panels on win32 for now -- other operating systems # need more testing -if(WIN32 AND BROWSER_PANEL_SUPPORT_ENABLED) +if(BROWSER_PANEL_SUPPORT_ENABLED) list(APPEND obs-browser_SOURCES panel/browser-panel.cpp panel/browser-panel-client.cpp diff --git a/panel/browser-panel-internal.hpp b/panel/browser-panel-internal.hpp index 2a01b8a50..50a474091 100644 --- a/panel/browser-panel-internal.hpp +++ b/panel/browser-panel-internal.hpp @@ -55,6 +55,8 @@ class QCefWidgetInternal : public QCefWidget { std::string script; CefRefPtr rqc; QTimer timer; + QWindow *window = nullptr; + QWidget *container = nullptr; bool allowAllPopups_ = false; virtual void resizeEvent(QResizeEvent *event) override; diff --git a/panel/browser-panel.cpp b/panel/browser-panel.cpp index e42ba4a46..531e2a231 100644 --- a/panel/browser-panel.cpp +++ b/panel/browser-panel.cpp @@ -16,6 +16,10 @@ #include #include +#if !defined(_WIN32) && !defined(__APPLE__) +#include +#endif + extern bool QueueCEFTask(std::function task); extern "C" void obs_browser_initialize(void); extern os_event_t *cef_started_event; @@ -220,8 +224,6 @@ void QCefWidgetInternal::closeBrowser() void QCefWidgetInternal::Init() { - WId id = winId(); - bool success = QueueCEFTask([this, id]() { CefWindowInfo windowInfo; @@ -237,10 +239,11 @@ void QCefWidgetInternal::Init() size *= devicePixelRatio(); #endif RECT rc = {0, 0, size.width(), size.height()}; - windowInfo.SetAsChild((HWND)id, rc); -#elif __APPLE__ - windowInfo.SetAsChild((CefWindowHandle)id, 0, 0, size.width(), - size.height()); + windowInfo.SetAsChild((HWND)this->window->winId(), rc); +#else + CefRect rc = {0, 0, size.width(), size.height()}; + windowInfo.SetAsChild((CefWindowHandle)this->window->winId(), + rc); #endif CefRefPtr browserClient = @@ -253,9 +256,7 @@ void QCefWidgetInternal::Init() CefRefPtr(), #endif rqc); -#ifdef _WIN32 Resize(); -#endif }); if (success) @@ -270,7 +271,6 @@ void QCefWidgetInternal::resizeEvent(QResizeEvent *event) void QCefWidgetInternal::Resize() { -#ifdef _WIN32 #ifdef SUPPORTS_FRACTIONAL_SCALING QSize size = this->size() * devicePixelRatioF(); #elif @@ -280,13 +280,28 @@ void QCefWidgetInternal::Resize() QueueCEFTask([this, size]() { if (!cefBrowser) return; + +#ifdef _WIN32 HWND hwnd = cefBrowser->GetHost()->GetWindowHandle(); SetWindowPos(hwnd, nullptr, 0, 0, size.width(), size.height(), SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER); SendMessage(hwnd, WM_SIZE, 0, MAKELPARAM(size.width(), size.height())); - }); +#elif __APPLE__ +#else + auto id = cefBrowser->GetHost()->GetWindowHandle(); + auto xDisplay = cef_get_xdisplay(); + XWindowChanges changes = {}; + changes.x = 0; + changes.y = 0; + changes.width = size.width(); + changes.height = size.height(); + XConfigureWindow(xDisplay, id, CWX | CWY | CWHeight | CWWidth, + &changes); #endif + + this->container->resize(size.width(), size.height()); + }); } void QCefWidgetInternal::showEvent(QShowEvent *event) @@ -294,10 +309,13 @@ void QCefWidgetInternal::showEvent(QShowEvent *event) QWidget::showEvent(event); if (!cefBrowser) { + window = new QWindow(); obs_browser_initialize(); connect(&timer, SIGNAL(timeout()), this, SLOT(Init())); timer.start(500); Init(); + container = QWidget::createWindowContainer(window, this); + container->show(); } } diff --git a/panel/browser-panel.hpp b/panel/browser-panel.hpp index a9c4afcf9..a67ea5aad 100644 --- a/panel/browser-panel.hpp +++ b/panel/browser-panel.hpp @@ -72,7 +72,8 @@ static inline QCef *obs_browser_init_panel(void) #ifdef _WIN32 void *lib = os_dlopen("obs-browser"); #else - void *lib = os_dlopen("../obs-plugins/obs-browser"); + // Need to un-hardcode this, as I couldn't get it to work otherwise + void *lib = os_dlopen("/usr/lib/obs-plugins/obs-browser.so"); #endif QCef *(*create_qcef)(void) = nullptr; @@ -93,7 +94,7 @@ static inline int obs_browser_qcef_version(void) #ifdef _WIN32 void *lib = os_dlopen("obs-browser"); #else - void *lib = os_dlopen("../obs-plugins/obs-browser"); + void *lib = os_dlopen("/usr/lib/obs-plugins/obs-browser.so"); #endif int (*qcef_version)(void) = nullptr;