make LSes transparent on not-selecting displays

This commit is contained in:
vaxerski 2022-09-02 21:24:01 +02:00
parent a110c397e2
commit ceae5d7357
3 changed files with 68 additions and 54 deletions

View file

@ -81,6 +81,8 @@ void Events::handleCapabilities(void *data, wl_seat *wl_seat, uint32_t capabilit
} }
void Events::handlePointerEnter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) { void Events::handlePointerEnter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) {
g_pHyprpicker->markDirty();
for (auto& ls : g_pHyprpicker->m_vLayerSurfaces) { for (auto& ls : g_pHyprpicker->m_vLayerSurfaces) {
if (ls->pSurface == surface) { if (ls->pSurface == surface) {
g_pHyprpicker->m_pLastSurface = ls.get(); g_pHyprpicker->m_pLastSurface = ls.get();
@ -94,7 +96,11 @@ void Events::handlePointerEnter(void *data, struct wl_pointer *wl_pointer, uint3
} }
void Events::handlePointerLeave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) { void Events::handlePointerLeave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) {
// ignored for (auto& ls : g_pHyprpicker->m_vLayerSurfaces) {
if (ls->pSurface == surface) {
g_pHyprpicker->renderSurface(ls.get(), true);
}
}
} }
void Events::handlePointerAxis(void *data, wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { void Events::handlePointerAxis(void *data, wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) {

View file

@ -219,7 +219,7 @@ void CHyprpicker::convertBuffer(SPoolBuffer* pBuffer) {
} }
} }
void CHyprpicker::renderSurface(CLayerSurface* pSurface) { void CHyprpicker::renderSurface(CLayerSurface* pSurface, bool forceInactive) {
const auto PBUFFER = getBufferForLS(pSurface); const auto PBUFFER = getBufferForLS(pSurface);
if (!PBUFFER || !pSurface->screenBuffer.buffer) if (!PBUFFER || !pSurface->screenBuffer.buffer)
@ -241,6 +241,7 @@ void CHyprpicker::renderSurface(CLayerSurface* pSurface) {
cairo_rectangle(PCAIRO, 0, 0, pSurface->m_pMonitor->size.x * pSurface->m_pMonitor->scale, pSurface->m_pMonitor->size.y * pSurface->m_pMonitor->scale); cairo_rectangle(PCAIRO, 0, 0, pSurface->m_pMonitor->size.x * pSurface->m_pMonitor->scale, pSurface->m_pMonitor->size.y * pSurface->m_pMonitor->scale);
cairo_fill(PCAIRO); cairo_fill(PCAIRO);
if (pSurface == g_pHyprpicker->m_pLastSurface && !forceInactive) {
const auto SCALEBUFS = Vector2D{pSurface->screenBuffer.pixelSize.x / PBUFFER->pixelSize.x, pSurface->screenBuffer.pixelSize.y / PBUFFER->pixelSize.y}; const auto SCALEBUFS = Vector2D{pSurface->screenBuffer.pixelSize.x / PBUFFER->pixelSize.x, pSurface->screenBuffer.pixelSize.y / PBUFFER->pixelSize.y};
const auto SCALECURSOR = Vector2D{ const auto SCALECURSOR = Vector2D{
g_pHyprpicker->m_pLastSurface->screenBuffer.pixelSize.x / (g_pHyprpicker->m_pLastSurface->buffers[0].pixelSize.x / g_pHyprpicker->m_pLastSurface->m_pMonitor->scale), g_pHyprpicker->m_pLastSurface->screenBuffer.pixelSize.x / (g_pHyprpicker->m_pLastSurface->buffers[0].pixelSize.x / g_pHyprpicker->m_pLastSurface->m_pMonitor->scale),
@ -270,6 +271,7 @@ void CHyprpicker::renderSurface(CLayerSurface* pSurface) {
// | --------- | // | --------- |
// //
cairo_restore(PCAIRO); cairo_restore(PCAIRO);
cairo_save(PCAIRO); cairo_save(PCAIRO);
@ -307,6 +309,12 @@ void CHyprpicker::renderSurface(CLayerSurface* pSurface) {
cairo_restore(PCAIRO); cairo_restore(PCAIRO);
cairo_pattern_destroy(PATTERN); cairo_pattern_destroy(PATTERN);
} else {
cairo_set_operator(PCAIRO, CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgba(PCAIRO, 0, 0, 0, 0);
cairo_rectangle(PCAIRO, 0, 0, pSurface->m_pMonitor->size.x * pSurface->m_pMonitor->scale, pSurface->m_pMonitor->size.y * pSurface->m_pMonitor->scale);
cairo_fill(PCAIRO);
}
sendFrame(pSurface); sendFrame(pSurface);
cairo_destroy(PCAIRO); cairo_destroy(PCAIRO);

View file

@ -37,7 +37,7 @@ public:
Vector2D m_vLastCoords; Vector2D m_vLastCoords;
void renderSurface(CLayerSurface*); void renderSurface(CLayerSurface*, bool forceInactive = false);
void createBuffer(SPoolBuffer*, int32_t, int32_t, uint32_t); void createBuffer(SPoolBuffer*, int32_t, int32_t, uint32_t);
void destroyBuffer(SPoolBuffer*); void destroyBuffer(SPoolBuffer*);