Bugs / Найденные баги (2)
- Author
- Message
-
Offline
- Posts: 20
- Joined: Wed Dec 19, 2012 7:43 pm
Второй патч отключает обработку ESC, кроме как отмену долгих операций.
Я пока не придумал как сделать так, чтобы ESC и отменял долгие операции и не буферизировался при этом.
Например, чтобы если я нажал 10 раз ESC, пока одна вкладка грузится, то у меня закрылась текущая вкладка, с отменой загрузки, а не 10 вкладок вслед за ней.
В то же время ESC без загрузки должен закрывать текущую вкладку.
Одна идея состоит в том, чтобы отсылать сообщение только раз при загрузке и игнорировать все последующие разы.
Но тут могут проблемы с многоэтапными загрузками.
Вторая идея состоит в том чтобы разделить кода сообщений. Отмена загрузки это один код, а закрытие окна - другой.
Правда если буферизируются сами нажатия ESC, то это не поможет.
Можно еще попробовать вычитывать буфер нажатий, при отмене загрузки окна, чтобы лишние нажатия не ушли в основную обработку.
Я пока не придумал как сделать так, чтобы ESC и отменял долгие операции и не буферизировался при этом.
Например, чтобы если я нажал 10 раз ESC, пока одна вкладка грузится, то у меня закрылась текущая вкладка, с отменой загрузки, а не 10 вкладок вслед за ней.
В то же время ESC без загрузки должен закрывать текущую вкладку.
Одна идея состоит в том, чтобы отсылать сообщение только раз при загрузке и игнорировать все последующие разы.
Но тут могут проблемы с многоэтапными загрузками.
Вторая идея состоит в том чтобы разделить кода сообщений. Отмена загрузки это один код, а закрытие окна - другой.
Правда если буферизируются сами нажатия ESC, то это не поможет.
Можно еще попробовать вычитывать буфер нажатий, при отмене загрузки окна, чтобы лишние нажатия не ушли в основную обработку.
-
Offline
- Posts: 20
- Joined: Wed Dec 19, 2012 7:43 pm
-
Offline
- Posts: 20
- Joined: Wed Dec 19, 2012 7:43 pm
Слишком маленький первый раздел статусной строки:

При том что остальная часть пуста и не используется.
Думаю что увеличения на 40 будет достаточно:

Кстати, в рамках идеи: может стоит попробовать рисовать прогресс бар поверх номера строки? Это позволит сократить используемое место.
Я, правда, не уверен что это подходит для всех возможных случаев, но вроде нет такого сценария, когда номер строки нужен в то время, как активен прогресс бар.

При том что остальная часть пуста и не используется.
Думаю что увеличения на 40 будет достаточно:

Code: Select all
lpSBParts[SBP_POSITION]=150;
lpSBParts[SBP_MODIFY]=260;
lpSBParts[SBP_INSERT]=290;
lpSBParts[SBP_NEWLINE]=320;
lpSBParts[SBP_CODEPAGE]=-1;
//Set user parts
if (lpStatusStack->nElements)
{
STATUSPART *sp;
int nPartIndex=SBP_USER;
int nPartSize;
lpSBParts[SBP_CODEPAGE]=600;
Я, правда, не уверен что это подходит для всех возможных случаев, но вроде нет такого сценария, когда номер строки нужен в то время, как активен прогресс бар.
-
Online
- Posts: 286
- Joined: Mon Jun 20, 2011 8:33 am
- Location: Электросталь
Instructor
Negative lookahead срабатывает, нет. Не срабатывает любая цифра > 1. У positive lookahead тоже не срабатывает.
Negative lookahead
Code: Select all
(?!\d{1})
Code: Select all
(?!\d{2})
-
Offline
- Posts: 20
- Joined: Wed Dec 19, 2012 7:43 pm
Проблема: при открытии большого файла (737 мб) появляется диалог о нехватке памяти.
Диалогов появляется два, один строго над другим.
Если закрыть сначала нижний, оттащив верхний в сторону, а потом верхний, то все работает как надо.
Но если закрыть сначала верхний (возможно думая, что диалог один), то второй диалог ломается и кнопки на нем перестают работать.
Его нельзя закрыть крестиком, и ни одной из кнопок.
Это происходит из-за того что все рассчитано на то что диалог будет один:
структуры выделяются на стеке, есть глобальные статические переменные и так далее.
Источник проблемы:
Диалог отображается два раза.
Стек вызова с остановкой на строке:
if (ae) AE_NotifyErrSpace(ae, dwBytes);
Как можно видеть когда выведен первый диалог (DialogBoxParamWide), срабатывает AE_WrapLines, который вызывает вывод второго диалога.
Можно решить проблему двумя путями:
1. Правильный, не выводить второй модальный диалог, если уже есть один.
2. Костыль: не выводить диалог о нехватке памяти, если уже выведен один. Например через глобальный флаг (статическая переменная). Но это не решит проблему в других подобных случаях.
К тому же я бы изменил код обработки кнопок диалога, чтобы его можно было закрыть, если структуры поломаны. Например так:
Простейший фикс выглядит так:
Диалогов появляется два, один строго над другим.
Если закрыть сначала нижний, оттащив верхний в сторону, а потом верхний, то все работает как надо.
Но если закрыть сначала верхний (возможно думая, что диалог один), то второй диалог ломается и кнопки на нем перестают работать.
Его нельзя закрыть крестиком, и ни одной из кнопок.
Это происходит из-за того что все рассчитано на то что диалог будет один:
структуры выделяются на стеке, есть глобальные статические переменные и так далее.
Источник проблемы:
Диалог отображается два раза.
Стек вызова с остановкой на строке:
if (ae) AE_NotifyErrSpace(ae, dwBytes);
Code: Select all
notepad.exe!AE_HeapAlloc+0x77
0x0000000000000000
notepad.exe!AE_HeapAlloc+0x77
notepad.exe!AE_LineWrap+0x23b
notepad.exe!AE_WrapLines+0x305
notepad.exe!AE_UpdateWrap+0x111
notepad.exe!AE_EditProc+0x197b
notepad.exe!AE_EditShellProc+0x13a
notepad.exe!CallWindowProcWide+0x43
notepad.exe!EditProc+0x24c
notepad.exe!EditProc+0x270
notepad.exe!CommonEditProc+0x36
USER32.dll!gapfnScSendMessage+0x332
[...]
USER32.dll!DialogBoxParamW+0x3f
notepad.exe!DialogBoxParamWide+0x43
notepad.exe!API_DialogBoxParam+0x37
notepad.exe!MessageBoxCustom+0x81
notepad.exe!EditParentMessages+0x447
notepad.exe!FrameProc+0x871
notepad.exe!CommonFrameProc+0x36
0x0000000000000000
notepad.exe!lpfnFrameProcRet
Можно решить проблему двумя путями:
1. Правильный, не выводить второй модальный диалог, если уже есть один.
2. Костыль: не выводить диалог о нехватке памяти, если уже выведен один. Например через глобальный флаг (статическая переменная). Но это не решит проблему в других подобных случаях.
К тому же я бы изменил код обработки кнопок диалога, чтобы его можно было закрыть, если структуры поломаны. Например так:
Code: Select all
BOOL bEnd = FALSE;
for (lpButton=lpDialog->bmb; lpButton && lpButton->wpButtonStr; ++lpButton)
{
if (wCommand == IDCANCEL ? (lpButton->dwFlags & BMB_DEFAULT) : wCommand == lpButton->nButtonControlID)
{
bEnd = TRUE;
break;
}
}
if (bEnd || (wCommand == IDCANCEL && lpButton == lpDialog->bmb))
{
EndDialog(hDlg, wCommand);
if (bDeleteFont) DeleteObject(hFont);
hFont=NULL;
hDlgMsgBox=NULL;
return TRUE;
}
Code: Select all
if (((NMHDR *)lParam)->code == AEN_ERRSPACE)
{
static BOOL bOpen=FALSE;
if (!bOpen)
{
BUTTONMESSAGEBOX bmb[]={{IDYES, MAKEINTRESOURCEW(STR_MESSAGEBOX_TERMINATE), BMB_DEFAULT},
{IDNO, MAKEINTRESOURCEW(STR_MESSAGEBOX_CONTINUE), 0},
{0, 0, 0}};
bOpen=TRUE;
API_LoadString(hLangModule, MSG_ERROR_NOT_ENOUGH_MEMORY, wbuf, BUFFER_SIZE);
if (MessageBoxCustom(hMainWnd, wbuf, APP_MAIN_TITLEW, MB_ICONERROR, NULL, &bmb[0]) == IDYES)
ExitProcess(0);
bOpen=FALSE;
}
}
-
Offline
- Posts: 20
- Joined: Wed Dec 19, 2012 7:43 pm
Нужно включить поддержку больших адресов:
https://docs.microsoft.com/en-us/cpp/bu ... ew=vs-2017
Тогда 32-битный акелпад сможет выделить память до 4 ГБ, а не до 2 ГБ, что позволит работать с большими файлами на 64-битных системах.
Естественно, что нужно учитывать кое-какие особенности:
https://blogs.msdn.microsoft.com/oldnew ... 0/?p=38183
https://docs.microsoft.com/en-us/cpp/bu ... ew=vs-2017
Тогда 32-битный акелпад сможет выделить память до 4 ГБ, а не до 2 ГБ, что позволит работать с большими файлами на 64-битных системах.
Естественно, что нужно учитывать кое-какие особенности:
https://blogs.msdn.microsoft.com/oldnew ... 0/?p=38183
-
Offline
- Posts: 874
- Joined: Sat Jan 16, 2010 2:03 pm
wertfds
1. Будем теперь в пинг-понг картинками играть?
2. Если вы читали моё предыдущее сообщение целиком, то там написано: "можно выбрать подходящий (или не подходящий) шрифт на своё усмотрение". Очевидно, что в вашем случае выбран "не подходящий". На приведённом (мною) скриншоте использован шрифт "DejaVu Sans Mono". Выглядит, как мне кажется, хорошо.
3. О "Consolas".
Вероятно на вашем на компьютере используются как минимум две версии одного и того же шрифта. Consolas, если верить описанию (сам не пересчитывал), в зависимости от версии содержит от 713 (ver 1.0) до 2735 (ver 5.32) глифов.
У меня под XP используется версия 1.0 из дистрибутива (Consolas Font Pack for Microsoft Visual Studio 2005 or 2008), так она ещё хуже выглядит (все символы, включая крайний, также отсутствуют).
Можете проверить, не используется ли плагин Fonts, и что находится в папке "{AkelPad}\AkelFiles\Plugs\Fonts".
1. Будем теперь в пинг-понг картинками играть?
2. Если вы читали моё предыдущее сообщение целиком, то там написано: "можно выбрать подходящий (или не подходящий) шрифт на своё усмотрение". Очевидно, что в вашем случае выбран "не подходящий". На приведённом (мною) скриншоте использован шрифт "DejaVu Sans Mono". Выглядит, как мне кажется, хорошо.
3. О "Consolas".
Вероятно на вашем на компьютере используются как минимум две версии одного и того же шрифта. Consolas, если верить описанию (сам не пересчитывал), в зависимости от версии содержит от 713 (ver 1.0) до 2735 (ver 5.32) глифов.
У меня под XP используется версия 1.0 из дистрибутива (Consolas Font Pack for Microsoft Visual Studio 2005 or 2008), так она ещё хуже выглядит (все символы, включая крайний, также отсутствуют).
Можете проверить, не используется ли плагин Fonts, и что находится в папке "{AkelPad}\AkelFiles\Plugs\Fonts".
-
Offline
- Posts: 47
- Joined: Sat Mar 10, 2018 11:35 am
1 и 2. зачем выбирать "более подходящий шрифт" и закрывать глаза на проблему? в старом бородатом блокноте выбран шрифт Consolas, и там всё показывается. В новом навороченом Akelpad выбран тот же самый шрифт Consolas и эти же символы не показываются. чей это косяк? шрифта? системы? кривых рук, которые выбрали "неподходящий Consolas шрифт"? Билла Гейтса? или текстового редактора?
3. Fonts::Main (вкл / выкл) в обоих случаях показывается одинаково
\AkelFiles\Plugs\Fonts пустая
эта сборка вообще свежераспакованная, подключены только ContextMenu Hotkeys ToolBar
шрифт Consolas в системе естественно один и тот же установлен, что для блокнота, что для акеля

а по поводу XP - если запустить в Windows 95, там ещё хуже всё будет со шрифтами, так что теперь, на этом основании считать, что всё в порядке?
https://ru.wikipedia.org/wiki/%D0%AE%D0 ... 0%BE%D0%B4

плагины Toolbar и ContextMenu этим не страдают, всё отображается нормально, как и в блокноте.
да, в плагинах может быть шрифт не Consolas, но почему тогда Блокнот правильно отображает то?
что имеем? стандартную историю, когда нужно использовать несколько текстовых редакторов, а то никто не может "побороть" Блокнот по мощи.

3. Fonts::Main (вкл / выкл) в обоих случаях показывается одинаково
\AkelFiles\Plugs\Fonts пустая
эта сборка вообще свежераспакованная, подключены только ContextMenu Hotkeys ToolBar
шрифт Consolas в системе естественно один и тот же установлен, что для блокнота, что для акеля

а по поводу XP - если запустить в Windows 95, там ещё хуже всё будет со шрифтами, так что теперь, на этом основании считать, что всё в порядке?
https://ru.wikipedia.org/wiki/%D0%AE%D0 ... 0%BE%D0%B4

плагины Toolbar и ContextMenu этим не страдают, всё отображается нормально, как и в блокноте.
да, в плагинах может быть шрифт не Consolas, но почему тогда Блокнот правильно отображает то?
что имеем? стандартную историю, когда нужно использовать несколько текстовых редакторов, а то никто не может "побороть" Блокнот по мощи.

-
Offline
- Posts: 47
- Joined: Sat Mar 10, 2018 11:35 am