-
Notifications
You must be signed in to change notification settings - Fork 177
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixes #2634 #2636
Fixes #2634 #2636
Conversation
8abb150
to
ff8b3d2
Compare
Сори, я этот код не идеально понимаю, сделал быструю заплатку нейронкой. Вот как она объясняет изменения: Исходный код RepaintsDeferFinish имел следующий недостаток: при force = true он сбрасывал счетчик отложенных перерисовок _repaint_defer в 0, прежде чем проверял, есть ли отложенные операции в векторе _deferred_repaints. Это приводило к ситуации, когда при вызове UnfreezeConsoleOutput() после завершения QuickEdit (qedit) отложенные перерисовки не выполнялись, так как s_shadow_out уже был установлен в nullptr, а _repaint_defer сбрасывался в 0 из-за force = true, не давая коду добраться до применения отложенных перерисовок. void ConsoleOutput::RepaintsDeferFinish(bool force)
{
// ...
{
// ...
if (force) {
_repaint_defer = 0; // Сброс счетчика _до_ проверки наличия отложенных перерисовок
} else if (_repaint_defer > 0) {
--_repaint_defer;
}
if (_repaint_defer == 0) { // Проверка _после_ потенциального сброса
deferred_repaints.swap(_deferred_repaints);
}
// ...
}
// ...
} Измененный код исправляет эту проблему, перемещая проверку наличия отложенных перерисовок перед условным сбросом _repaint_defer: void ConsoleOutput::RepaintsDeferFinish(bool force)
{
// ...
{
// ...
if (force) {
_repaint_defer = 0;
} else if (_repaint_defer > 0) {
--_repaint_defer;
}
// !!! Ключевое изменение !!!
// Проверка наличия отложенных операций _до_ условного сброса
if (!_deferred_repaints.empty()) { // Если есть отложенные перерисовки
deferred_repaints.swap(_deferred_repaints); // перемещаем их для обработки
}
// ...
}
// ...
} Теперь, даже если _repaint_defer будет сброшен в 0 из-за force = true, код всё равно проверит, есть ли что-то в _deferred_repaints, и если есть - выполнит отложенные операции. Это гарантирует, что перерисовка экрана произойдет после завершения QuickEdit, независимо от состояния s_shadow_out и счетчика _repaint_defer. По сути, это изменение делает применение отложенных перерисовок независимым от флага force, если такие перерисовки накопились. Главное - не пропустить их, если вектор _deferred_repaints не пуст. |
С zsh у меня без фикса работает клипбоард всегда(Было выбрано использовать клипбоард всегда). |
а какой нейронкой вы код анализируете? |
Gemini 1.5 Pro. Пробовал кучу разных, для программирования эта показала себя лучше прочих. Но надо помнить, что все они галлбцинируют, код всегда руками проверять надо. |
ну вобщем то это неправильно, отложенные прорисовки потому и отложенные, чтобы их откладывать, проблема была в другом месте - что их откладывали там где их не надо было откладывать) |
У меня баг больше не воспроизводится. 💪 🔥 |
Fixes #2634