View Issue Details

IDProjectCategoryView StatusLast Update
0001390Far ManagerInterfacepublic2020-01-03 08:46
Reporteralexmitin Assigned To 
PrioritynormalSeveritymajorReproducibilityalways
Status feedbackResolutionopen 
Platformx86OSWindowsOS VersionXP SP3
Product Version2.0 
Summary0001390: После Alt+F9, Alt+F9 появляются горизонтальный и вертикальный скроллбары
DescriptionПосле Alt+F9, Alt+F9 появляются горизонтальный и вертикальный скроллбары.

Воспроизведение:
1) Нажать Alt+F9, чтобы максимизировать окно FAR
2) Нажать Alt+F9, чтобы вернуть старый размер.

Наблюдаемое:
Появляются горизонтальный и вертикальные полосы прокрутки.

Желаемое:
Окно FAR возвращается в прежний размер без полос прокрутки.

Причина:
Не восстанавливается Screen Buffer Size.

Additional InformationFAR 2.0 (build 1566) x86
TagsWindowMode
Build

Relationships

has duplicate 0003692 new после перехода в полный экран alt+enter и возвращения в обычный - не восстанавливается вид 

Activities

alexmitin

2010-05-23 02:41

reporter   bugnote:0005394

Полосы прокрутки появляются при WindowMode=1.

[HKEY_CURRENT_USER\Software\Far2\System]
"WindowMode"=dword:00000001

JohnDoe

2010-05-23 10:29

updater   bugnote:0005397

Ну так это так и задумано.
В этом режиме фар не пытается управлять буфером.

alexmitin

2010-05-26 03:47

reporter   bugnote:0005410

Это не совсем верно.

При первом нажатии Alt+F9 (максимизация окна) функция console::SetSize() изменяет размер буфера консоли путем вызова SetConsoleScreenBufferSize().

А вот при втором нажатии Alt+F9 (восстановление прежнего размера) функция console::SetSize() уже не вызывает SetConsoleScreenBufferSize(). Это и приводит к появлению полос прокрутки.

Функция:
bool console::SetSize(COORD Size)
{
    bool Result=false;
    if(Opt.WindowMode)
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        GetConsoleScreenBufferInfo(GetOutputHandle(), &csbi);
        csbi.srWindow.Left=0;
        csbi.srWindow.Right=Size.X-1;
        csbi.srWindow.Bottom=csbi.dwSize.Y-1;
        csbi.srWindow.Top=csbi.srWindow.Bottom-(Size.Y-1);
        COORD WindowCoord={csbi.srWindow.Right-csbi.srWindow.Left+1, csbi.srWindow.Bottom-csbi.srWindow.Top+1};
        if(WindowCoord.X>csbi.dwSize.X || WindowCoord.Y>csbi.dwSize.Y)
        {
            WindowCoord.X=Max(WindowCoord.X,csbi.dwSize.X);
            WindowCoord.Y=Max(WindowCoord.Y,csbi.dwSize.Y);
            SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord);
        }
        Result=SetWindowRect(csbi.srWindow);
    }
    else
    {
        Result=SetConsoleScreenBufferSize(GetOutputHandle(), Size)!=FALSE;
    }
    return Result;
}

alexmitin

2010-05-26 04:20

reporter   bugnote:0005411

Предлагаемое исправление:

bool console::SetSize(COORD Size)
{
...
   if(WindowCoord.X != csbi.dwSize.X || WindowCoord.Y>csbi.dwSize.Y)
   {
      //WindowCoord.X=Min(WindowCoord.X,csbi.dwSize.X);
      WindowCoord.Y=Max(WindowCoord.Y,csbi.dwSize.Y);
      SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord);
   }
...
}

Тестировалось с такими параметрами.

1) Far.exe -w
2) ScreenBufferSize=(150,9999)
3) WindowSize=(150,50)

Изначально окно FAR содержит вертикальную полосу прокрутки.

Первое нажатие Alt+F9 разворачивает окно на весь экран. Второе - возвращает окно в прежний вид. Горизонтальная полоса прокрутки не появляется.

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

Если это не удобно - поведение можно сделать настраиваемым.
Т.е. что-то вроде:

if( Opt.WindowModePreserveScreenBuffer )
{
   if(WindowCoord.X>csbi.dwSize.X || WindowCoord.Y>csbi.dwSize.Y)
   {
      WindowCoord.X=Max(WindowCoord.X,csbi.dwSize.X);
      WindowCoord.Y=Max(WindowCoord.Y,csbi.dwSize.Y);
      SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord);
   }
}
else
{
   if(WindowCoord.X != csbi.dwSize.X || WindowCoord.Y>csbi.dwSize.Y)
   {
      WindowCoord.Y=Max(WindowCoord.Y,csbi.dwSize.Y);
      SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord);
   }
}

JohnDoe

2010-05-26 21:35

updater   bugnote:0005425

Возможен и другой вариант реализации: макросом.
При условии что будут реализованы соответствующие макрофункции.
(http://forum.farmanager.com/viewtopic.php?p=63358#p63358)

alexmitin

2010-05-26 22:09

reporter   bugnote:0005426

Чем именно макрос может помочь?

Действие, аналогичное Alt+F9 (максимизация) можно сделать дважды нажав левой кнопкой мышки на заголовок окна. Поведение при этом ожидается аналогичное однократному нажатию Alt+F9.

Как при двойном нажатии на заголовок окна вызовется макрос?

JohnDoe

2010-05-27 08:58

updater   bugnote:0005427

Last edited: 2010-05-27 08:58

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

P.S.
Попрошу заметить, что в текущей реализации ваше пожелание абсолютно справедливо, потому что буфер и так теряется на каждый чих.
Но, надеюсь, DrKnS найдёт время пофиксить это.

JohnDoe

2010-05-27 21:15

updater   bugnote:0005428

Last edited: 2010-05-27 21:19

Хочу развить идею alexmitin дальше:

>Возможный побочный эффект: при восстановлении размера окна, если до этого был
>вывод при развернутом окне, вывод обрезается до нового горизонтального размера
>окна.
>Если это не удобно - поведение можно сделать настраиваемым.

Не надо никаких настроек: этого побочного эффекта можно будет избежать и так.
Всего лишь перед усечением нужно выяснить размер самой длинной строки буфера.

В крайнем случае, думаю можно это и плагином делать.
(Взять за основу http://forum.farmanager.com/viewtopic.php?p=53289#p53289)

kolio

2019-01-17 09:01

reporter   bugnote:0016416

аналогичная проблема - только с вертикальной полосой прокрутки
https://bugs.farmanager.com/view.php?id=3692
только с alt+enter, alt+enter

DrKnS

2019-01-17 09:49

administrator   bugnote:0016419

far:config

System.WindowMode.StickyY = true

kolio

2020-01-03 08:46

reporter   bugnote:0016678

увы не помогло System.WindowMode.StickyY = true
полоса остается

у меня far и так почти на весь экран, но он после выхода из полноэкрана еще выше по высоте внутри полосы прокрутки становится на 6 строк

Issue History

Date Modified Username Field Change
2010-05-23 02:23 alexmitin New Issue
2010-05-23 02:41 alexmitin Note Added: 0005394
2010-05-23 10:29 JohnDoe Note Added: 0005397
2010-05-26 03:47 alexmitin Note Added: 0005410
2010-05-26 04:20 alexmitin Note Added: 0005411
2010-05-26 21:35 JohnDoe Note Added: 0005425
2010-05-26 22:09 alexmitin Note Added: 0005426
2010-05-27 08:58 JohnDoe Note Added: 0005427
2010-05-27 08:58 JohnDoe Note Edited: 0005427
2010-05-27 21:15 JohnDoe Note Added: 0005428
2010-05-27 21:19 JohnDoe Note Edited: 0005428
2017-11-02 15:59 JohnDoe Tag Attached: WindowMode
2019-01-17 09:01 kolio Note Added: 0016416
2019-01-17 09:49 DrKnS Status new => feedback
2019-01-17 09:49 DrKnS Note Added: 0016419
2019-02-22 08:16 JohnDoe Relationship added has duplicate 0003692
2020-01-03 08:46 kolio Note Added: 0016678