@@ -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-
11001075void
11011076handle_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)
21592020void
21602021handle_new_output (wl_listener* listener, void * data)
21612022{
0 commit comments