Skip to content

Commit cea9ba4

Browse files
rm key replay. also noticed some type of race condition with wofi
1 parent f8a4403 commit cea9ba4

4 files changed

Lines changed: 5 additions & 219 deletions

File tree

include/WindowManager/WindowManager.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ class WindowManagerInterface
6868
virtual void registerControls(Controls* controls) = 0;
6969
virtual void tick() = 0;
7070
virtual void handleHotkeySym(xkb_keysym_t sym, bool modifierHeld, bool shiftHeld) = 0;
71-
virtual void keyReplay(const std::vector<std::pair<std::string, uint32_t>>& entries) = 0;
72-
virtual std::vector<ReplayEvent> consumeReadyReplaySyms(uint64_t now_ms) = 0;
73-
virtual bool hasPendingReplay() const = 0;
7471
virtual bool consumeScreenshotRequest() = 0;
7572
virtual void requestScreenshot() = 0;
7673
virtual bool consumeMenuSpawnPending() = 0;
@@ -192,9 +189,6 @@ class WindowManager : public WindowManagerInterface
192189
void registerControls(Controls* controls) override;
193190
void tick() override;
194191
void handleHotkeySym(xkb_keysym_t sym, bool superHeld, bool shiftHeld) override;
195-
void keyReplay(const std::vector<std::pair<std::string, uint32_t>>& entries) override;
196-
std::vector<ReplayEvent> consumeReadyReplaySyms(uint64_t now_ms) override;
197-
bool hasPendingReplay() const override { return replayActive; }
198192
bool consumeScreenshotRequest() override;
199193
void requestScreenshot() override;
200194
bool consumeMenuSpawnPending() override { return menuSpawnPending.exchange(false); }

src/WindowManager/WindowManager.cpp

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,63 +1109,6 @@ WindowManager::setCursorVisible(bool visible)
11091109
cursorVisible = visible;
11101110
}
11111111

1112-
void
1113-
WindowManager::keyReplay(const std::vector<std::pair<std::string, uint32_t>>& entries)
1114-
{
1115-
replayQueue.clear();
1116-
replayIndex = 0;
1117-
replayActive = false;
1118-
replayStart = std::chrono::steady_clock::now();
1119-
uint64_t cumulative = 0;
1120-
for (const auto& e : entries) {
1121-
if (e.first.empty()) {
1122-
continue;
1123-
}
1124-
xkb_keysym_t sym =
1125-
xkb_keysym_from_name(e.first.c_str(), XKB_KEYSYM_NO_FLAGS);
1126-
if (sym == XKB_KEY_NoSymbol) {
1127-
continue;
1128-
}
1129-
cumulative += e.second;
1130-
char name[64] = {0};
1131-
xkb_keysym_get_name(sym, name, sizeof(name));
1132-
// Detailed replay log to debug dropped/garbled input; keep to avoid
1133-
// reintroducing silent failures in future refactors.
1134-
WL_WM_LOG("WM: keyReplay add sym=%s(%u) delay=%u cumulative=%llu\n",
1135-
name,
1136-
sym,
1137-
e.second,
1138-
(unsigned long long)cumulative);
1139-
replayQueue.push_back(ReplayEvent{ sym, cumulative });
1140-
}
1141-
WL_WM_LOG("WM: keyReplay queued count=%zu cumulative=%llu\n",
1142-
replayQueue.size(),
1143-
(unsigned long long)cumulative);
1144-
replayActive = !replayQueue.empty();
1145-
}
1146-
1147-
std::vector<ReplayEvent>
1148-
WindowManager::consumeReadyReplaySyms(uint64_t now_ms)
1149-
{
1150-
std::vector<ReplayEvent> ready;
1151-
if (!replayActive) {
1152-
return ready;
1153-
}
1154-
uint64_t start_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
1155-
replayStart.time_since_epoch())
1156-
.count();
1157-
uint64_t elapsed = now_ms > start_ms ? now_ms - start_ms : 0;
1158-
while (replayIndex < replayQueue.size() &&
1159-
elapsed >= replayQueue[replayIndex].ready_ms) {
1160-
ready.push_back(replayQueue[replayIndex]);
1161-
++replayIndex;
1162-
}
1163-
if (replayIndex >= replayQueue.size()) {
1164-
replayActive = false;
1165-
}
1166-
return ready;
1167-
}
1168-
11691112
void
11701113
WindowManager::requestScreenshot()
11711114
{

src/api.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -421,18 +421,6 @@ Api::processBatchedRequest(BatchedRequest batchedRequest)
421421
}
422422
break;
423423
}
424-
case KEY_REPLAY: {
425-
if (wm) {
426-
std::vector<std::pair<std::string, uint32_t>> entries;
427-
const auto& replay = batchedRequest.request.keyreplay();
428-
entries.reserve(replay.entries_size());
429-
for (const auto& e : replay.entries()) {
430-
entries.emplace_back(e.sym(), e.delay_ms());
431-
}
432-
wm->keyReplay(entries);
433-
}
434-
break;
435-
}
436424
case POINTER_REPLAY: {
437425
if (controls) {
438426
const auto& replay = batchedRequest.request.pointerreplay();

src/wayland/wlr_compositor.cpp

Lines changed: 5 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,31 +1072,6 @@ process_key_sym(WlrServer* server,
10721072
}
10731073
}
10741074

1075-
static void
1076-
flush_pending_replay_keyups(WlrServer* server,
1077-
wlr_keyboard* keyboard,
1078-
uint32_t now_msec)
1079-
{
1080-
if (!server || server->pendingReplayKeyups.empty()) {
1081-
return;
1082-
}
1083-
auto it = server->pendingReplayKeyups.begin();
1084-
while (it != server->pendingReplayKeyups.end()) {
1085-
if (now_msec >= it->release_time_msec) {
1086-
process_key_sym(server,
1087-
keyboard,
1088-
it->sym,
1089-
false,
1090-
now_msec,
1091-
it->keycode,
1092-
it->update_mods);
1093-
it = server->pendingReplayKeyups.erase(it);
1094-
} else {
1095-
++it;
1096-
}
1097-
}
1098-
}
1099-
11001075
void
11011076
handle_keyboard_key(wl_listener* listener, void* data)
11021077
{
@@ -1869,6 +1844,9 @@ handle_output_frame(wl_listener* listener, void* data)
18691844
struct wlr_output_state output_state;
18701845
wlr_output_state_init(&output_state);
18711846

1847+
// no-op if the swapchain has already been configured
1848+
// only errors if old swapchain isn't configured properly
1849+
// and a new one couldn't be created & configured
18721850
if (!wlr_output_configure_primary_swapchain(
18731851
handle->output, &output_state, &handle->swapchain)) {
18741852
wlr_log(WLR_ERROR, "Failed to configure primary swapchain");
@@ -1922,125 +1900,6 @@ handle_output_frame(wl_listener* listener, void* data)
19221900
// Ensure Wayland apps have textures attached once the renderer exists.
19231901
ensure_wayland_apps_registered(server);
19241902

1925-
if (server->engine) {
1926-
auto wm = server->engine->getWindowManager();
1927-
if (wm) {
1928-
uint64_t now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
1929-
std::chrono::steady_clock::now().time_since_epoch())
1930-
.count();
1931-
uint32_t now_msec = static_cast<uint32_t>(now_ms & 0xffffffff);
1932-
auto ready = wm->consumeReadyReplaySyms(now_ms);
1933-
wlr_keyboard* kbd = nullptr;
1934-
if (server->last_keyboard_device) {
1935-
kbd = wlr_keyboard_from_input_device(server->last_keyboard_device);
1936-
} else if (server->seat && server->seat->keyboard_state.keyboard) {
1937-
kbd = server->seat->keyboard_state.keyboard;
1938-
} else {
1939-
kbd = ensure_virtual_keyboard(server);
1940-
}
1941-
static bool logged_missing_keyboard = false;
1942-
if (!kbd && !logged_missing_keyboard) {
1943-
logged_missing_keyboard = true;
1944-
}
1945-
auto shift_lookup = keycode_for_keysym(kbd, XKB_KEY_Shift_L);
1946-
xkb_keysym_t modifier_sym_left =
1947-
server->hotkeyModifier == HotkeyModifier::Alt ? XKB_KEY_Alt_L : XKB_KEY_Super_L;
1948-
auto modifier_lookup = keycode_for_keysym(kbd, modifier_sym_left);
1949-
uint32_t base_msec = now_msec;
1950-
uint32_t step = 0;
1951-
constexpr uint32_t kReplayHoldMs = 16;
1952-
for (size_t i = 0; i < ready.size(); ++i) {
1953-
auto sym = ready[i].sym;
1954-
auto lookup = keycode_for_keysym(kbd, sym);
1955-
if (!lookup.has_value() || lookup->keycode == 0) {
1956-
continue;
1957-
}
1958-
uint32_t hw_keycode = lookup->keycode >= 8 ? lookup->keycode - 8 : lookup->keycode;
1959-
uint32_t time_msec = base_msec + step;
1960-
bool is_modifier_sym = is_hotkey_sym(server->hotkeyModifier, sym);
1961-
bool is_shift_sym = sym == XKB_KEY_Shift_L || sym == XKB_KEY_Shift_R;
1962-
bool is_last = (i + 1) == ready.size();
1963-
bool replay_has_future = wm->hasPendingReplay();
1964-
if (is_modifier_sym && server->pendingReplayModifier &&
1965-
server->pendingReplayModifierKeycode != 0) {
1966-
// Avoid overlapping modifier presses that clear modifiers out of order.
1967-
process_key_sym(server,
1968-
kbd,
1969-
server->pendingReplayModifierSym,
1970-
false,
1971-
time_msec,
1972-
server->pendingReplayModifierKeycode,
1973-
true);
1974-
server->pendingReplayModifier = false;
1975-
server->pendingReplayModifierKeycode = 0;
1976-
server->pendingReplayModifierSym = XKB_KEY_NoSymbol;
1977-
}
1978-
if ((is_modifier_sym || is_shift_sym) && (replay_has_future || !is_last)) {
1979-
// Hold modifiers (including shift) across the next keypress to mirror
1980-
// physical combos like Shift+0.
1981-
if (is_shift_sym && shift_lookup.has_value() && shift_lookup->keycode) {
1982-
server->pendingReplayShift = true;
1983-
}
1984-
server->pendingReplayModifier = true;
1985-
server->pendingReplayModifierKeycode = hw_keycode;
1986-
server->pendingReplayModifierSym = sym;
1987-
process_key_sym(server, kbd, sym, true, time_msec, hw_keycode, true);
1988-
// Do not release yet; move to next symbol.
1989-
step += 1;
1990-
continue;
1991-
}
1992-
if (lookup->needsShift && shift_lookup.has_value() && shift_lookup->keycode) {
1993-
uint32_t shift_hw = shift_lookup->keycode >= 8 ? shift_lookup->keycode - 8
1994-
: shift_lookup->keycode;
1995-
process_key_sym(server,
1996-
kbd,
1997-
XKB_KEY_Shift_L,
1998-
true,
1999-
time_msec,
2000-
shift_hw,
2001-
true);
2002-
time_msec += 1;
2003-
step += 1;
2004-
}
2005-
process_key_sym(server, kbd, sym, true, time_msec, hw_keycode, true);
2006-
uint64_t hold_ms = kReplayHoldMs;
2007-
if (i + 1 < ready.size()) {
2008-
auto delta_ms = ready[i + 1].ready_ms - ready[i].ready_ms;
2009-
if (delta_ms > hold_ms) {
2010-
hold_ms = static_cast<uint32_t>(std::min<uint64_t>(delta_ms, 10000));
2011-
}
2012-
}
2013-
uint32_t release_time = time_msec + static_cast<uint32_t>(hold_ms);
2014-
server->pendingReplayKeyups.push_back(
2015-
ReplayKeyRelease{ sym, release_time, hw_keycode, true });
2016-
if (lookup->needsShift && shift_lookup.has_value() && shift_lookup->keycode) {
2017-
uint32_t shift_hw = shift_lookup->keycode >= 8 ? shift_lookup->keycode - 8
2018-
: shift_lookup->keycode;
2019-
server->pendingReplayKeyups.push_back(
2020-
ReplayKeyRelease{ XKB_KEY_Shift_L, release_time + 1, shift_hw, true });
2021-
step += 1;
2022-
}
2023-
step += 2;
2024-
if (server->pendingReplayModifier && !is_modifier_sym && !is_shift_sym) {
2025-
// Release held modifier after the combo key with a realistic hold so the
2026-
// replay path mirrors physical key timing.
2027-
uint32_t modifier_release_time =
2028-
time_msec + static_cast<uint32_t>(std::max<uint64_t>(hold_ms, kReplayHoldMs));
2029-
server->pendingReplayKeyups.push_back(
2030-
ReplayKeyRelease{ server->pendingReplayModifierSym,
2031-
modifier_release_time,
2032-
server->pendingReplayModifierKeycode,
2033-
true });
2034-
server->pendingReplayModifier = false;
2035-
server->pendingReplayModifierKeycode = 0;
2036-
server->pendingReplayModifierSym = XKB_KEY_NoSymbol;
2037-
step += 1;
2038-
}
2039-
}
2040-
flush_pending_replay_keyups(server, kbd, now_msec);
2041-
}
2042-
}
2043-
20441903
if (server->engine) {
20451904
Controls* controls = server->engine->getControls();
20461905
Camera* camera = server->engine->getCamera();
@@ -2156,6 +2015,8 @@ handle_output_frame(wl_listener* listener, void* data)
21562015
server->lastFrameTime = frameStart;
21572016
}
21582017

2018+
// This is called when wayland detects a new output such as a monitor
2019+
// It sets up size, cursor info, and frame notify handler (which will render each frame)
21592020
void
21602021
handle_new_output(wl_listener* listener, void* data)
21612022
{

0 commit comments

Comments
 (0)