Bugfix/resolution change event Fixes part of #620 (#867)

* Detect resolution changes

* include Qt5Widgets

* find Qt5Widgets

Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
This commit is contained in:
Murat Seker
2020-07-12 09:23:13 +02:00
committed by GitHub
parent 22ace55447
commit c32a4df587
9 changed files with 55 additions and 10 deletions

View File

@@ -4,6 +4,7 @@ SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/x11)
# Find X11
find_package(X11 REQUIRED)
find_package(Qt5Widgets REQUIRED)
include_directories( ${X11_INCLUDES} )
@@ -18,5 +19,7 @@ add_library(x11-grabber ${X11_SOURCES} )
target_link_libraries(x11-grabber
hyperion
${X11_LIBRARIES}
${X11_Xrandr_LIB}
${X11_Xrender_LIB}
Qt5::Widgets
)

View File

@@ -1,6 +1,9 @@
#include <utils/Logger.h>
#include <grabber/X11Grabber.h>
#include <xcb/randr.h>
#include <xcb/xcb_event.h>
X11Grabber::X11Grabber(int cropLeft, int cropRight, int cropTop, int cropBottom, int pixelDecimation)
: Grabber("X11GRABBER", 0, 0, cropLeft, cropRight, cropTop, cropBottom)
, _x11Display(nullptr)
@@ -35,6 +38,10 @@ void X11Grabber::freeResources()
{
// Cleanup allocated resources of the X11 grab
XDestroyImage(_xImage);
if (_XRandRAvailable)
{
qApp->removeNativeEventFilter(this);
}
if(_XShmAvailable)
{
XShmDetach(_x11Display, &_shminfo);
@@ -51,6 +58,11 @@ void X11Grabber::freeResources()
void X11Grabber::setupResources()
{
if (_XRandRAvailable)
{
qApp->installNativeEventFilter(this);
}
if(_XShmAvailable)
{
_xImage = XShmCreateImage(_x11Display, _windowAttr.visual, _windowAttr.depth, ZPixmap, NULL, &_shminfo, _width, _height);
@@ -99,6 +111,7 @@ bool X11Grabber::Setup()
int dummy, pixmaps_supported;
_XRandRAvailable = XRRQueryExtension(_x11Display, &_XRandREventBase, &dummy);
_XRenderAvailable = XRenderQueryExtension(_x11Display, &dummy, &dummy);
_XShmAvailable = XShmQueryExtension(_x11Display);
XShmQueryVersion(_x11Display, &dummy, &dummy, &pixmaps_supported);
@@ -293,3 +306,20 @@ void X11Grabber::setCropping(unsigned cropLeft, unsigned cropRight, unsigned cro
Grabber::setCropping(cropLeft, cropRight, cropTop, cropBottom);
if(_x11Display != nullptr) updateScreenDimensions(true); // segfault on init
}
bool X11Grabber::nativeEventFilter(const QByteArray & eventType, void * message, long int * /*result*/)
{
if (!_XRandRAvailable || eventType != "xcb_generic_event_t") {
return false;
}
xcb_generic_event_t *e = static_cast<xcb_generic_event_t*>(message);
const uint8_t xEventType = XCB_EVENT_RESPONSE_TYPE(e);
if (xEventType == _XRandREventBase + XCB_RANDR_SCREEN_CHANGE_NOTIFY)
{
updateScreenDimensions(true);
}
return false;
}