diff options
| author | Darksome <dev@darkso.me> | 2022-07-15 19:42:03 +0300 |
|---|---|---|
| committer | Darksome <dev@darkso.me> | 2022-07-15 19:42:03 +0300 |
| commit | 5388b54442614cb0d3d445f101e7cd86bf64c125 (patch) | |
| tree | 26057ff185e423e944e8b250ed7fe26654b69623 /src/events | |
| parent | cb8a6f881b11e9a269fd5f7aa64eafe2beda0b0d (diff) | |
| parent | 6306d4dae3fa221a6099e109c7faef60bac4fac5 (diff) | |
Merge upstream
Diffstat (limited to 'src/events')
| -rw-r--r-- | src/events/Devices.cpp | 224 | ||||
| -rw-r--r-- | src/events/Events.hpp | 10 | ||||
| -rw-r--r-- | src/events/Layers.cpp | 29 | ||||
| -rw-r--r-- | src/events/Misc.cpp | 6 | ||||
| -rw-r--r-- | src/events/Monitors.cpp | 60 | ||||
| -rw-r--r-- | src/events/Popups.cpp | 3 | ||||
| -rw-r--r-- | src/events/Windows.cpp | 71 |
7 files changed, 265 insertions, 138 deletions
diff --git a/src/events/Devices.cpp b/src/events/Devices.cpp index 04763be1..349ffe61 100644 --- a/src/events/Devices.cpp +++ b/src/events/Devices.cpp @@ -15,145 +15,179 @@ // // // ---------------------------------------------------- // -void Events::listener_keyboardDestroy(void* owner, void* data) { - SKeyboard* PKEYBOARD = (SKeyboard*)owner; - g_pInputManager->destroyKeyboard(PKEYBOARD); +void Events::listener_keyboardDestroy(void *owner, void *data) { + SKeyboard *PKEYBOARD = (SKeyboard *)owner; + g_pInputManager->destroyKeyboard(PKEYBOARD); - Debug::log(LOG, "Destroyed keyboard %x", PKEYBOARD); + Debug::log(LOG, "Destroyed keyboard %x", PKEYBOARD); } -void Events::listener_keyboardKey(void* owner, void* data) { - SKeyboard* PKEYBOARD = (SKeyboard*)owner; - g_pInputManager->onKeyboardKey((wlr_keyboard_key_event*)data, PKEYBOARD); +void Events::listener_keyboardKey(void *owner, void *data) { + SKeyboard *PKEYBOARD = (SKeyboard *)owner; + g_pInputManager->onKeyboardKey((wlr_keyboard_key_event *)data, PKEYBOARD); } -void Events::listener_keyboardMod(void* owner, void* data) { - SKeyboard* PKEYBOARD = (SKeyboard*)owner; - g_pInputManager->onKeyboardMod(data, PKEYBOARD); +void Events::listener_keyboardMod(void *owner, void *data) { + SKeyboard *PKEYBOARD = (SKeyboard *)owner; + g_pInputManager->onKeyboardMod(data, PKEYBOARD); } -void Events::listener_mouseFrame(wl_listener* listener, void* data) { - wlr_seat_pointer_notify_frame(g_pCompositor->m_sSeat.seat); +void Events::listener_mouseFrame(wl_listener *listener, void *data) { + wlr_seat_pointer_notify_frame(g_pCompositor->m_sSeat.seat); } -void Events::listener_mouseMove(wl_listener* listener, void* data) { - g_pInputManager->onMouseMoved((wlr_pointer_motion_event*)data); +void Events::listener_mouseMove(wl_listener *listener, void *data) { + g_pInputManager->onMouseMoved((wlr_pointer_motion_event *)data); } -void Events::listener_mouseMoveAbsolute(wl_listener* listener, void* data) { - g_pInputManager->onMouseWarp((wlr_pointer_motion_absolute_event*)data); +void Events::listener_mouseMoveAbsolute(wl_listener *listener, void *data) { + g_pInputManager->onMouseWarp((wlr_pointer_motion_absolute_event *)data); } -void Events::listener_mouseButton(wl_listener* listener, void* data) { - g_pInputManager->onMouseButton((wlr_pointer_button_event*)data); +void Events::listener_mouseButton(wl_listener *listener, void *data) { + g_pInputManager->onMouseButton((wlr_pointer_button_event *)data); } -void Events::listener_mouseAxis(wl_listener* listener, void* data) { - g_pInputManager->onMouseWheel((wlr_pointer_axis_event*)data); +void Events::listener_mouseAxis(wl_listener *listener, void *data) { + g_pInputManager->onMouseWheel((wlr_pointer_axis_event *)data); } -void Events::listener_requestMouse(wl_listener* listener, void* data) { - const auto EVENT = (wlr_seat_pointer_request_set_cursor_event*)data; +void Events::listener_requestMouse(wl_listener *listener, void *data) { + const auto EVENT = (wlr_seat_pointer_request_set_cursor_event *)data; - g_pInputManager->processMouseRequest(EVENT); + g_pInputManager->processMouseRequest(EVENT); } -void Events::listener_newInput(wl_listener* listener, void* data) { - const auto DEVICE = (wlr_input_device*)data; +void Events::listener_newInput(wl_listener *listener, void *data) { + const auto DEVICE = (wlr_input_device *)data; - switch(DEVICE->type) { - case WLR_INPUT_DEVICE_KEYBOARD: - Debug::log(LOG, "Attached a keyboard with name %s", DEVICE->name); - g_pInputManager->newKeyboard(DEVICE); - break; - case WLR_INPUT_DEVICE_POINTER: - Debug::log(LOG, "Attached a mouse with name %s", DEVICE->name); - g_pInputManager->newMouse(DEVICE); - break; - case WLR_INPUT_DEVICE_TOUCH: - Debug::log(LOG, "Attached a touch device with name %s", DEVICE->name); - Debug::log(WARN, "!!!! Hyprland does not directly support touchscreens, bugs may occur !!!!"); - wlr_cursor_attach_input_device(g_pCompositor->m_sWLRCursor, DEVICE); - break; - case WLR_INPUT_DEVICE_TABLET_TOOL: - Debug::log(LOG, "Attached a tablet tool with name %s", DEVICE->name); - g_pInputManager->newTabletTool(DEVICE); - break; - case WLR_INPUT_DEVICE_TABLET_PAD: - Debug::log(LOG, "Attached a tablet pad with name %s", DEVICE->name); - g_pInputManager->newTabletPad(DEVICE); - break; - default: - Debug::log(WARN, "Unrecognized input device plugged in: %s", DEVICE->name); - break; - } - - g_pInputManager->updateCapabilities(DEVICE); + switch (DEVICE->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + Debug::log(LOG, "Attached a keyboard with name %s", DEVICE->name); + g_pInputManager->newKeyboard(DEVICE); + break; + case WLR_INPUT_DEVICE_POINTER: + Debug::log(LOG, "Attached a mouse with name %s", DEVICE->name); + g_pInputManager->newMouse(DEVICE); + break; + case WLR_INPUT_DEVICE_TOUCH: + Debug::log(LOG, "Attached a touch device with name %s", DEVICE->name); + Debug::log(WARN, "!!!! Hyprland does not directly support touchscreens, " + "bugs may occur !!!!"); + wlr_cursor_attach_input_device(g_pCompositor->m_sWLRCursor, DEVICE); + break; + case WLR_INPUT_DEVICE_TABLET_TOOL: + Debug::log(LOG, "Attached a tablet tool with name %s", DEVICE->name); + g_pInputManager->newTabletTool(DEVICE); + break; + case WLR_INPUT_DEVICE_TABLET_PAD: + Debug::log(LOG, "Attached a tablet pad with name %s", DEVICE->name); + g_pInputManager->newTabletPad(DEVICE); + break; + default: + Debug::log(WARN, "Unrecognized input device plugged in: %s", DEVICE->name); + break; + } + + g_pInputManager->updateCapabilities(DEVICE); } -void Events::listener_newConstraint(wl_listener* listener, void* data) { - const auto PCONSTRAINT = (wlr_pointer_constraint_v1*)data; +void Events::listener_newConstraint(wl_listener *listener, void *data) { + const auto PCONSTRAINT = (wlr_pointer_constraint_v1 *)data; - Debug::log(LOG, "New mouse constraint at %x", PCONSTRAINT); + Debug::log(LOG, "New mouse constraint at %x", PCONSTRAINT); - g_pInputManager->m_lConstraints.emplace_back(); - const auto CONSTRAINT = &g_pInputManager->m_lConstraints.back(); + g_pInputManager->m_lConstraints.emplace_back(); + const auto CONSTRAINT = &g_pInputManager->m_lConstraints.back(); - CONSTRAINT->pMouse = g_pCompositor->m_sSeat.mouse; - CONSTRAINT->constraint = PCONSTRAINT; + CONSTRAINT->pMouse = g_pCompositor->m_sSeat.mouse; + CONSTRAINT->constraint = PCONSTRAINT; - CONSTRAINT->hyprListener_destroyConstraint.initCallback(&PCONSTRAINT->events.destroy, &Events::listener_destroyConstraint, CONSTRAINT, "Constraint"); - CONSTRAINT->hyprListener_setConstraintRegion.initCallback(&PCONSTRAINT->events.set_region, &Events::listener_setConstraintRegion, CONSTRAINT, "Constraint"); + CONSTRAINT->hyprListener_destroyConstraint.initCallback( + &PCONSTRAINT->events.destroy, &Events::listener_destroyConstraint, + CONSTRAINT, "Constraint"); + CONSTRAINT->hyprListener_setConstraintRegion.initCallback( + &PCONSTRAINT->events.set_region, &Events::listener_setConstraintRegion, + CONSTRAINT, "Constraint"); - if (g_pCompositor->m_pLastFocus == PCONSTRAINT->surface) { - g_pInputManager->constrainMouse(CONSTRAINT->pMouse, PCONSTRAINT); - } + if (g_pCompositor->m_pLastFocus == PCONSTRAINT->surface) { + g_pInputManager->constrainMouse(CONSTRAINT->pMouse, PCONSTRAINT); + } } -void Events::listener_destroyConstraint(void* owner, void* data) { - const auto PCONSTRAINT = (SConstraint*)owner; +void Events::listener_destroyConstraint(void *owner, void *data) { + const auto PCONSTRAINT = (SConstraint *)owner; + + if (PCONSTRAINT->pMouse->currentConstraint == PCONSTRAINT->constraint) { + PCONSTRAINT->pMouse->hyprListener_commitConstraint.removeCallback(); + + const auto PWINDOW = + g_pCompositor->getConstraintWindow(g_pCompositor->m_sSeat.mouse); + + if (PWINDOW) { + if (PWINDOW->m_bIsX11) { + wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, + PCONSTRAINT->constraint->current.cursor_hint.x + + PWINDOW->m_uSurface.xwayland->x, + PWINDOW->m_uSurface.xwayland->y + + PCONSTRAINT->constraint->current.cursor_hint.y); + + wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, + PCONSTRAINT->constraint->current.cursor_hint.x, + PCONSTRAINT->constraint->current.cursor_hint.y); + } else { + wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, + PCONSTRAINT->constraint->current.cursor_hint.x + + PWINDOW->m_vRealPosition.vec().x, + PCONSTRAINT->constraint->current.cursor_hint.y + + PWINDOW->m_vRealPosition.vec().y); + + wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, + PCONSTRAINT->constraint->current.cursor_hint.x, + PCONSTRAINT->constraint->current.cursor_hint.y); + } + } - if (PCONSTRAINT->pMouse->currentConstraint == PCONSTRAINT->constraint) { - PCONSTRAINT->pMouse->hyprListener_commitConstraint.removeCallback(); + PCONSTRAINT->pMouse->currentConstraint = nullptr; + } - const auto PWINDOW = g_pCompositor->getConstraintWindow(g_pCompositor->m_sSeat.mouse); + Debug::log(LOG, "Unconstrained mouse from %x", PCONSTRAINT->constraint); - if (PWINDOW) { - if (PWINDOW->m_bIsX11) { - wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, - PCONSTRAINT->constraint->current.cursor_hint.x + PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y + PCONSTRAINT->constraint->current.cursor_hint.y); + g_pInputManager->m_lConstraints.remove(*PCONSTRAINT); +} - wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, PCONSTRAINT->constraint->current.cursor_hint.x, PCONSTRAINT->constraint->current.cursor_hint.y); - } else { - wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, - PCONSTRAINT->constraint->current.cursor_hint.x + PWINDOW->m_vRealPosition.vec().x, PCONSTRAINT->constraint->current.cursor_hint.y + PWINDOW->m_vRealPosition.vec().y); +void Events::listener_setConstraintRegion(void *owner, void *data) { + // no +} - wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, PCONSTRAINT->constraint->current.cursor_hint.x, PCONSTRAINT->constraint->current.cursor_hint.y); - } - } +void Events::listener_newVirtPtr(wl_listener *listener, void *data) { + const auto EV = (wlr_virtual_pointer_v1_new_pointer_event *)data; + const auto POINTER = EV->new_pointer; + const auto DEVICE = &POINTER->pointer.base; - PCONSTRAINT->pMouse->currentConstraint = nullptr; - } + g_pInputManager->newMouse(DEVICE, true); +} - Debug::log(LOG, "Unconstrained mouse from %x", PCONSTRAINT->constraint); +void Events::listener_destroyMouse(void *owner, void *data) { + const auto PMOUSE = (SMouse *)owner; - g_pInputManager->m_lConstraints.remove(*PCONSTRAINT); + g_pInputManager->destroyMouse(PMOUSE->mouse); } -void Events::listener_setConstraintRegion(void* owner, void* data) { - // no +void Events::listener_swipeBegin(wl_listener *listener, void *data) { + const auto EVENT = (wlr_pointer_swipe_begin_event *)data; + + g_pInputManager->onSwipeBegin(EVENT); } -void Events::listener_newVirtPtr(wl_listener* listener, void* data) { - const auto EV = (wlr_virtual_pointer_v1_new_pointer_event*)data; - const auto POINTER = EV->new_pointer; - const auto DEVICE = &POINTER->pointer.base; +void Events::listener_swipeUpdate(wl_listener *listener, void *data) { + const auto EVENT = (wlr_pointer_swipe_update_event *)data; - g_pInputManager->newMouse(DEVICE); + g_pInputManager->onSwipeUpdate(EVENT); } -void Events::listener_destroyMouse(void* owner, void* data) { - const auto PMOUSE = (SMouse*)owner; +void Events::listener_swipeEnd(wl_listener *listener, void *data) { + const auto EVENT = (wlr_pointer_swipe_end_event *)data; - g_pInputManager->destroyMouse(PMOUSE->mouse); + g_pInputManager->onSwipeEnd(EVENT); } diff --git a/src/events/Events.hpp b/src/events/Events.hpp index 9d1fdb53..63e65fdc 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -49,6 +49,7 @@ namespace Events { DYNLISTENFUNC(fullscreenWindow); DYNLISTENFUNC(activateX11); DYNLISTENFUNC(configureX11); + DYNLISTENFUNC(unmanagedSetGeometry); // Window subsurfaces // LISTENER(newSubsurfaceWindow); @@ -112,4 +113,13 @@ namespace Events { // Renderer destroy LISTENER(RendererDestroy); + + LISTENER(newIdleInhibitor); + + LISTENER(swipeBegin); + LISTENER(swipeEnd); + LISTENER(swipeUpdate); + + // session + LISTENER(sessionActive); };
\ No newline at end of file diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 773ba909..0e2f49d5 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -32,8 +32,9 @@ void Events::listener_newLayerSurface(wl_listener* listener, void* data) { } const auto PMONITOR = (SMonitor*)g_pCompositor->getMonitorFromOutput(WLRLAYERSURFACE->output); - PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].push_back(new SLayerSurface()); - SLayerSurface* layerSurface = PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].back(); + SLayerSurface* layerSurface = PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].emplace_back(new SLayerSurface()); + + layerSurface->szNamespace = WLRLAYERSURFACE->_namespace; if (!WLRLAYERSURFACE->output) { WLRLAYERSURFACE->output = g_pCompositor->m_vMonitors.front()->output; // TODO: current mon @@ -50,6 +51,8 @@ void Events::listener_newLayerSurface(wl_listener* listener, void* data) { WLRLAYERSURFACE->data = layerSurface; layerSurface->monitorID = PMONITOR->ID; + layerSurface->forceBlur = g_pConfigManager->shouldBlurLS(layerSurface->szNamespace); + Debug::log(LOG, "LayerSurface %x (namespace %s layer %d) created on monitor %s", layerSurface->layerSurface, layerSurface->layerSurface->_namespace, layerSurface->layer, PMONITOR->szName.c_str()); } @@ -96,8 +99,6 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { layersurface->layerSurface->mapped = true; - wlr_surface_send_enter(layersurface->layerSurface->surface, layersurface->layerSurface->output); - // fix if it changed its mon const auto PMONITOR = g_pCompositor->getMonitorFromOutput(layersurface->layerSurface->output); @@ -115,9 +116,15 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); - if (layersurface->layerSurface->current.keyboard_interactive) + if (layersurface->layerSurface->current.keyboard_interactive && (!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint)) { // don't focus if constrained + wlr_surface_send_enter(layersurface->layerSurface->surface, layersurface->layerSurface->output); g_pCompositor->focusSurface(layersurface->layerSurface->surface); + const auto LOCAL = g_pInputManager->getMouseCoordsInternal() - Vector2D(layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y); + wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, layersurface->layerSurface->surface, LOCAL.x, LOCAL.y); + wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, 0, LOCAL.x, LOCAL.y); + } + layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); wlr_box geomFixed = {layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y, layersurface->geometry.width, layersurface->geometry.height}; @@ -150,14 +157,17 @@ void Events::listener_unmapLayerSurface(void* owner, void* data) { if (layersurface->layerSurface->mapped) layersurface->layerSurface->mapped = false; - if (layersurface->layerSurface->surface == g_pCompositor->m_pLastFocus) - g_pCompositor->m_pLastFocus = nullptr; - const auto PMONITOR = g_pCompositor->getMonitorFromOutput(layersurface->layerSurface->output); if (!PMONITOR) return; + // refocus if needed + if (layersurface->layerSurface->surface == g_pCompositor->m_pLastFocus) { + g_pCompositor->m_pLastFocus = nullptr; + g_pInputManager->refocus(); + } + wlr_box geomFixed = {layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y, layersurface->geometry.width, layersurface->geometry.height}; g_pHyprRenderer->damageBox(&geomFixed); @@ -206,5 +216,8 @@ void Events::listener_commitLayerSurface(void* owner, void* data) { layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); + // update geom if it changed + layersurface->geometry = {layersurface->geometry.x, layersurface->geometry.y, layersurface->layerSurface->surface->current.width, layersurface->layerSurface->surface->current.height}; + g_pHyprRenderer->damageSurface(layersurface->layerSurface->surface, layersurface->position.x, layersurface->position.y); }
\ No newline at end of file diff --git a/src/events/Misc.cpp b/src/events/Misc.cpp index c25b1c6a..503d2111 100644 --- a/src/events/Misc.cpp +++ b/src/events/Misc.cpp @@ -157,4 +157,10 @@ void Events::listener_InhibitDeactivate(wl_listener* listener, void* data) { void Events::listener_RendererDestroy(wl_listener* listener, void* data) { Debug::log(LOG, "!!Renderer destroyed!!"); +} + +void Events::listener_sessionActive(wl_listener* listener, void* data) { + Debug::log(LOG, "Session got activated!"); + + g_pCompositor->m_bSessionActive = true; }
\ No newline at end of file diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 11527cee..24a8faa7 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -149,10 +149,10 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { g_pCompositor->deactivateAllWLRWorkspaces(PNEWWORKSPACE->m_pWlrHandle); PNEWWORKSPACE->setActive(true); + // if (!pMostHzMonitor || monitorRule.refreshRate > pMostHzMonitor->refreshRate) pMostHzMonitor = PNEWMONITOR; - // if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet g_pCompositor->m_pLastMonitor = PNEWMONITOR; @@ -166,6 +166,11 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { void Events::listener_monitorFrame(void* owner, void* data) { SMonitor* const PMONITOR = (SMonitor*)owner; + if ((g_pCompositor->m_sWLRSession && !g_pCompositor->m_sWLRSession->active) || !g_pCompositor->m_bSessionActive) { + Debug::log(WARN, "Attempted to render frame on inactive session!"); + return; // cannot draw on session inactive (different tty) + } + static std::chrono::high_resolution_clock::time_point startRender = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point startRenderOverlay = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point endRenderOverlay = std::chrono::high_resolution_clock::now(); @@ -173,6 +178,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; + static auto *const PNOVFR = &g_pConfigManager->getConfigValuePtr("misc:no_vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -181,28 +187,11 @@ void Events::listener_monitorFrame(void* owner, void* data) { g_pDebugOverlay->frameData(PMONITOR); } - // Hack: only check when monitor with top hz refreshes, saves a bit of resources. - // This is for stuff that should be run every frame - if (PMONITOR->ID == pMostHzMonitor->ID) { - g_pCompositor->sanityCheckWorkspaces(); - g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); - - HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit - - g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd - - if (g_pConfigManager->m_bWantsMonitorReload) - g_pConfigManager->performMonitorReload(); - - g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts - } - if (PMONITOR->framesToSkip > 0) { PMONITOR->framesToSkip -= 1; if (!PMONITOR->noFrameSchedule) - wlr_output_schedule_frame(PMONITOR->output); + g_pCompositor->scheduleFrameForMonitor(PMONITOR); else { Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str()); } @@ -210,6 +199,22 @@ void Events::listener_monitorFrame(void* owner, void* data) { return; } + // checks // + if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that + g_pCompositor->sanityCheckWorkspaces(); + g_pAnimationManager->tick(); + + HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit + + g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd + + if (g_pConfigManager->m_bWantsMonitorReload) + g_pConfigManager->performMonitorReload(); + + g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + } + // // + timespec now; clock_gettime(CLOCK_MONOTONIC, &now); @@ -228,10 +233,16 @@ void Events::listener_monitorFrame(void* owner, void* data) { return; } + // we need to cleanup fading out when rendering the appropriate context + g_pCompositor->cleanupFadingOut(PMONITOR->ID); + if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && PMONITOR->forceFullFrames == 0 && damageBlinkCleanup == 0) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); // we update shit at the monitor's Hz so we need to schedule frames because rollback wont + + if (*PDAMAGEBLINK || *PNOVFR) + g_pCompositor->scheduleFrameForMonitor(PMONITOR); + return; } @@ -266,7 +277,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { // potentially can save on resources. g_pHyprOpenGL->begin(PMONITOR, &damage); - g_pHyprOpenGL->clear(CColor(100, 11, 11, 255)); + g_pHyprOpenGL->clear(CColor(17, 17, 17, 255)); g_pHyprOpenGL->clearWithTex(); // will apply the hypr "wallpaper" g_pHyprRenderer->renderAllClientsForMonitor(PMONITOR->ID, &now); @@ -319,7 +330,8 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); + if (*PDAMAGEBLINK || *PNOVFR) + g_pCompositor->scheduleFrameForMonitor(PMONITOR); if (*PDEBUGOVERLAY == 1) { const float µs = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f; @@ -353,8 +365,7 @@ void Events::listener_monitorDestroy(void* owner, void* data) { if (!BACKUPMON) { Debug::log(CRIT, "No monitors! Unplugged last! Exiting."); - g_pCompositor->cleanupExit(); - exit(1); + g_pCompositor->cleanup(); return; } @@ -386,7 +397,6 @@ void Events::listener_monitorDestroy(void* owner, void* data) { g_pCompositor->m_vMonitors.erase(std::remove_if(g_pCompositor->m_vMonitors.begin(), g_pCompositor->m_vMonitors.end(), [&](std::unique_ptr<SMonitor>& el) { return el.get() == pMonitor; })); - // update the pMostHzMonitor if (pMostHzMonitor == pMonitor) { int mostHz = 0; SMonitor* pMonitorMostHz = nullptr; diff --git a/src/events/Popups.cpp b/src/events/Popups.cpp index cfb92f9b..04064696 100644 --- a/src/events/Popups.cpp +++ b/src/events/Popups.cpp @@ -92,6 +92,9 @@ void Events::listener_newPopupXDG(void* owner, void* data) { ASSERT(PWINDOW); + if (!PWINDOW->m_bIsMapped) + return; + Debug::log(LOG, "New layer popup created from XDG window %x -> %s", PWINDOW, PWINDOW->m_szTitle.c_str()); const auto WLRPOPUP = (wlr_xdg_popup*)data; diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 3c1d83f5..3d46931e 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -32,6 +32,9 @@ void addViewCoords(void* pWindow, int* x, int* y) { void Events::listener_mapWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; + static auto *const PINACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:inactive_opacity")->floatValue; + static auto *const PACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:active_opacity")->floatValue; + const auto PMONITOR = g_pCompositor->getMonitorFromCursor(); const auto PWORKSPACE = PMONITOR->specialWorkspaceOpen ? g_pCompositor->getWorkspaceByID(SPECIAL_WORKSPACE_ID) : g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace); PWINDOW->m_iMonitorID = PMONITOR->ID; @@ -145,7 +148,7 @@ void Events::listener_mapWindow(void* owner, void* data) { try { std::string alphaPart = r.szRule.substr(r.szRule.find_first_of(' ') + 1); - if (alphaPart.find_first_of(' ') != std::string::npos) { + if (alphaPart.contains(' ')) { // we have a comma, 2 values PWINDOW->m_sSpecialRenderData.alpha = std::stof(alphaPart.substr(0, alphaPart.find_first_of(' '))); PWINDOW->m_sSpecialRenderData.alphaInactive = std::stof(alphaPart.substr(alphaPart.find_first_of(' ') + 1)); @@ -163,13 +166,17 @@ void Events::listener_mapWindow(void* owner, void* data) { if (requestedWorkspace != "") { // process requested workspace - if (requestedWorkspace.find_first_of(' ') != std::string::npos) { + if (requestedWorkspace.contains(' ')) { // check for silent - if (requestedWorkspace.find("silent") != std::string::npos) { + if (requestedWorkspace.contains("silent")) { workspaceSilent = true; } requestedWorkspace = requestedWorkspace.substr(0, requestedWorkspace.find_first_of(' ')); + + if (requestedWorkspace == "special") { + workspaceSilent = true; + } } if (!workspaceSilent) { @@ -192,8 +199,8 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto SIZEXSTR = VALUE.substr(0, VALUE.find(" ")); const auto SIZEYSTR = VALUE.substr(VALUE.find(" ") + 1); - const auto SIZEX = SIZEXSTR.find('%') == std::string::npos ? std::stoi(SIZEXSTR) : std::stoi(SIZEXSTR.substr(0, SIZEXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; - const auto SIZEY = SIZEYSTR.find('%') == std::string::npos ? std::stoi(SIZEYSTR) : std::stoi(SIZEYSTR.substr(0, SIZEYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; + const auto SIZEX = !SIZEXSTR.contains('%') ? std::stoi(SIZEXSTR) : std::stoi(SIZEXSTR.substr(0, SIZEXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; + const auto SIZEY = !SIZEYSTR.contains('%') ? std::stoi(SIZEYSTR) : std::stoi(SIZEYSTR.substr(0, SIZEYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; Debug::log(LOG, "Rule size, applying to window %x", PWINDOW); @@ -208,8 +215,8 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto POSXSTR = VALUE.substr(0, VALUE.find(" ")); const auto POSYSTR = VALUE.substr(VALUE.find(" ") + 1); - const auto POSX = POSXSTR.find('%') == std::string::npos ? std::stoi(POSXSTR) : std::stoi(POSXSTR.substr(0, POSXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; - const auto POSY = POSYSTR.find('%') == std::string::npos ? std::stoi(POSYSTR) : std::stoi(POSYSTR.substr(0, POSYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; + const auto POSX = !POSXSTR.contains('%') ? std::stoi(POSXSTR) : std::stoi(POSXSTR.substr(0, POSXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; + const auto POSY = !POSYSTR.contains('%') ? std::stoi(POSYSTR) : std::stoi(POSYSTR.substr(0, POSYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; Debug::log(LOG, "Rule move, applying to window %x", PWINDOW); @@ -231,8 +238,11 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_vPseudoSize = PWINDOW->m_vRealSize.goalv() - Vector2D(10,10); } - if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus) + if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && PWINDOW->m_iX11Type != 2) { g_pCompositor->focusWindow(PWINDOW); + PWINDOW->m_fActiveInactiveAlpha.setValueAndWarp(*PACTIVEALPHA); + } else + PWINDOW->m_fActiveInactiveAlpha.setValueAndWarp(*PINACTIVEALPHA); Debug::log(LOG, "Window got assigned a surfaceTreeNode %x", PWINDOW->m_pSurfaceTree); @@ -246,6 +256,9 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->hyprListener_activateX11.initCallback(&PWINDOW->m_uSurface.xwayland->events.request_activate, &Events::listener_activateX11, PWINDOW, "XWayland Window Late"); PWINDOW->hyprListener_configureX11.initCallback(&PWINDOW->m_uSurface.xwayland->events.request_configure, &Events::listener_configureX11, PWINDOW, "XWayland Window Late"); PWINDOW->hyprListener_setTitleWindow.initCallback(&PWINDOW->m_uSurface.xwayland->events.set_title, &Events::listener_setTitleWindow, PWINDOW, "XWayland Window Late"); + + if (PWINDOW->m_iX11Type == 2) + PWINDOW->hyprListener_setGeometryX11U.initCallback(&PWINDOW->m_uSurface.xwayland->events.set_geometry, &Events::listener_unmanagedSetGeometry, PWINDOW, "XWayland Window Late"); } // do the animation thing @@ -254,7 +267,10 @@ void Events::listener_mapWindow(void* owner, void* data) { if (workspaceSilent) { // move the window if (g_pCompositor->m_pLastWindow == PWINDOW) { - g_pKeybindManager->m_mDispatchers["movetoworkspacesilent"](requestedWorkspace); + if (requestedWorkspace != "special") + g_pKeybindManager->m_mDispatchers["movetoworkspacesilent"](requestedWorkspace); + else + g_pKeybindManager->m_mDispatchers["movetoworkspace"]("special"); } else { Debug::log(ERR, "Tried to set workspace silent rule to a nofocus window!"); } @@ -268,9 +284,15 @@ void Events::listener_mapWindow(void* owner, void* data) { g_pXWaylandManager->setWindowFullscreen(PFULLWINDOW, PFULLWINDOW->m_bIsFullscreen); } + PWINDOW->m_vRealPosition.warp(); + PWINDOW->m_vRealSize.warp(); + g_pCompositor->setWindowFullscreen(PWINDOW, true, FULLSCREEN_FULL); } + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); + PWINDOW->m_pSurfaceTree = SubsurfaceTree::createTreeRoot(g_pXWaylandManager->getWindowSurface(PWINDOW), addViewCoords, PWINDOW, PWINDOW); Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y); @@ -293,6 +315,7 @@ void Events::listener_unmapWindow(void* owner, void* data) { PWINDOW->hyprListener_activateX11.removeCallback(); PWINDOW->hyprListener_configureX11.removeCallback(); PWINDOW->hyprListener_setTitleWindow.removeCallback(); + PWINDOW->hyprListener_setGeometryX11U.removeCallback(); } if (PWINDOW->m_bIsFullscreen) { @@ -350,14 +373,19 @@ void Events::listener_unmapWindow(void* owner, void* data) { // Destroy Foreign Toplevel wlr_foreign_toplevel_handle_v1_destroy(PWINDOW->m_phForeignToplevel); PWINDOW->m_phForeignToplevel = nullptr; + + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); } void Events::listener_commitWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; - if (!g_pCompositor->windowValidMapped(PWINDOW)) + if (!PWINDOW->m_bMappedX11 || PWINDOW->m_bHidden || (PWINDOW->m_bIsX11 && !PWINDOW->m_bMappedX11)) return; + g_pHyprRenderer->damageSurface(g_pXWaylandManager->getWindowSurface(PWINDOW), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y); + // Debug::log(LOG, "Window %x committed", PWINDOW); // SPAM! } @@ -472,6 +500,29 @@ void Events::listener_configureX11(void* owner, void* data) { g_pHyprRenderer->damageWindow(PWINDOW); } +void Events::listener_unmanagedSetGeometry(void* owner, void* data) { + CWindow* PWINDOW = (CWindow*)owner; + + if (!PWINDOW->m_bMappedX11 || PWINDOW->m_bHidden) + return; + + const auto POS = PWINDOW->m_vRealPosition.goalv(); + const auto SIZ = PWINDOW->m_vRealSize.goalv(); + + if (abs(floor(POS.x) - PWINDOW->m_uSurface.xwayland->x) > 2 || abs(floor(POS.y) - PWINDOW->m_uSurface.xwayland->y) > 2 || abs(floor(SIZ.x) - PWINDOW->m_uSurface.xwayland->width) > 2 || abs(floor(SIZ.y) - PWINDOW->m_uSurface.xwayland->height) > 2) { + g_pHyprRenderer->damageWindow(PWINDOW); + PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y)); + + if (abs(floor(SIZ.x) - PWINDOW->m_uSurface.xwayland->width) > 2 || abs(floor(SIZ.y) - PWINDOW->m_uSurface.xwayland->height) > 2) + PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->width, PWINDOW->m_uSurface.xwayland->height)); + + g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.vec()); + g_pCompositor->moveWindowToTop(PWINDOW); + PWINDOW->updateWindowDecos(); + g_pHyprRenderer->damageWindow(PWINDOW); + } +} + void Events::listener_surfaceXWayland(wl_listener* listener, void* data) { const auto XWSURFACE = (wlr_xwayland_surface*)data; |
