Bugs / Найденные баги (2)

Russian main discussion
  • Author
  • Message
Offline
Posts: 20
Joined: Wed Dec 19, 2012 7:43 pm

Post by Enyby »

Второй патч отключает обработку ESC, кроме как отмену долгих операций.
Я пока не придумал как сделать так, чтобы ESC и отменял долгие операции и не буферизировался при этом.
Например, чтобы если я нажал 10 раз ESC, пока одна вкладка грузится, то у меня закрылась текущая вкладка, с отменой загрузки, а не 10 вкладок вслед за ней.
В то же время ESC без загрузки должен закрывать текущую вкладку.

Одна идея состоит в том, чтобы отсылать сообщение только раз при загрузке и игнорировать все последующие разы.
Но тут могут проблемы с многоэтапными загрузками.

Вторая идея состоит в том чтобы разделить кода сообщений. Отмена загрузки это один код, а закрытие окна - другой.
Правда если буферизируются сами нажатия ESC, то это не поможет.

Можно еще попробовать вычитывать буфер нажатий, при отмене загрузки окна, чтобы лишние нажатия не ушли в основную обработку.

Offline
Posts: 3243
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Enyby wrote:Я сделал патч,.. Его можно куда-то прислать?
А куда-то сюда можно?

Offline
Posts: 20
Joined: Wed Dec 19, 2012 7:43 pm

Post by Enyby »

А там некуда. Но автор уже сделал несколько коммитов там, на озвученные здесь проблемы, так что он читает эту тему.

Кстати, в моем патче, по поводу ESC, ошибки. После них Esc не закрывает файл. Но автор свою реализацию сделал. Я ее еще не тестил, но мне кажется что там все должно быть правильно.

Offline
Posts: 20
Joined: Wed Dec 19, 2012 7:43 pm

Post by Enyby »

Слишком маленький первый раздел статусной строки:
Image

При том что остальная часть пуста и не используется.

Думаю что увеличения на 40 будет достаточно:
Image

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: Электросталь

Post by yozhic »

Instructor
Negative lookahead

Code: Select all

(?!\d{1})
срабатывает,

Code: Select all

(?!\d{2})
нет. Не срабатывает любая цифра > 1. У positive lookahead тоже не срабатывает.

Offline
Posts: 20
Joined: Wed Dec 19, 2012 7:43 pm

Post by Enyby »

Проблема: при открытии большого файла (737 мб) появляется диалог о нехватке памяти.
Диалогов появляется два, один строго над другим.
Если закрыть сначала нижний, оттащив верхний в сторону, а потом верхний, то все работает как надо.
Но если закрыть сначала верхний (возможно думая, что диалог один), то второй диалог ломается и кнопки на нем перестают работать.
Его нельзя закрыть крестиком, и ни одной из кнопок.
Это происходит из-за того что все рассчитано на то что диалог будет один:
структуры выделяются на стеке, есть глобальные статические переменные и так далее.

Источник проблемы:
Диалог отображается два раза.

Стек вызова с остановкой на строке:
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
Как можно видеть когда выведен первый диалог (DialogBoxParamWide), срабатывает AE_WrapLines, который вызывает вывод второго диалога.

Можно решить проблему двумя путями:
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

Post by Enyby »

Нужно включить поддержку больших адресов:
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: 20
Joined: Wed Dec 19, 2012 7:43 pm

Post by Enyby »

Если видимо окно поиска или замены текста, то двойной клик по номеру строки, в статусной строке, не показывает диалог перехода к номеру строки.

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

Post by wertfds »

не отображает
█ ▆ ▅ ▃ ▂ ▃ ▅ ▆ █

Image

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

wertfds wrote:не отображает
Молодой человек знает, что в Windows существует более одного шрифта? И что можно выбрать подходящий (или не подходящий) шрифт на своё усмотрение?
Меню [Вид]-->[Шрифт]
Image

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

Post by wertfds »

opk44 wrote: Меню [Вид]-->[Шрифт]
Image

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

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".

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

Post by wertfds »

1 и 2. зачем выбирать "более подходящий шрифт" и закрывать глаза на проблему? в старом бородатом блокноте выбран шрифт Consolas, и там всё показывается. В новом навороченом Akelpad выбран тот же самый шрифт Consolas и эти же символы не показываются. чей это косяк? шрифта? системы? кривых рук, которые выбрали "неподходящий Consolas шрифт"? Билла Гейтса? или текстового редактора?
3. Fonts::Main (вкл / выкл) в обоих случаях показывается одинаково
\AkelFiles\Plugs\Fonts пустая
эта сборка вообще свежераспакованная, подключены только ContextMenu Hotkeys ToolBar
шрифт Consolas в системе естественно один и тот же установлен, что для блокнота, что для акеля
Image

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

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

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

wertfds wrote:эта сборка вообще свежераспакованная
Можно поинтересоваться, о какой сборке идет речь, и где вы её взяли?

Post Reply