summaryrefslogtreecommitdiff
path: root/src/events
diff options
context:
space:
mode:
authorDarksome <dev@darkso.me>2022-07-15 19:42:03 +0300
committerDarksome <dev@darkso.me>2022-07-15 19:42:03 +0300
commit5388b54442614cb0d3d445f101e7cd86bf64c125 (patch)
tree26057ff185e423e944e8b250ed7fe26654b69623 /src/events
parentcb8a6f881b11e9a269fd5f7aa64eafe2beda0b0d (diff)
parent6306d4dae3fa221a6099e109c7faef60bac4fac5 (diff)
Merge upstream
Diffstat (limited to 'src/events')
-rw-r--r--src/events/Devices.cpp224
-rw-r--r--src/events/Events.hpp10
-rw-r--r--src/events/Layers.cpp29
-rw-r--r--src/events/Misc.cpp6
-rw-r--r--src/events/Monitors.cpp60
-rw-r--r--src/events/Popups.cpp3
-rw-r--r--src/events/Windows.cpp71
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;