ConEmu: Console Emulator — эмулятор консоли

Здесь обсуждаются темы, косвенно связанные с Far.
User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Wed 25 Jun, 2008 14:47

Latest post of the previous page:

Zoin

*) WM_RBUTTONUP: разобрался, в том смысле, что смог воспроизвести нежелательное меню консоли по правому клику. То есть на данный момент согласен - оставим, как было (и я добавлю коммент в код на будущее). На самом деле когда-нибудь какое-нибудь приложение захочет это событие, но пока примеров нет - заморачиваться не стоит. Завтра обновлю тестовую версию с учетом этого.
*) WM_MOUSEWHEEL: все еще неясно, продолжаю искать подвох.
*) WM_RBUTTONDBLCLK -> WM_RBUTTONDOWN: тоже неясно, может туплю (в одном режиме в панелях Фара элементы выделяются \ развыделяются, в другом становятся текущими и появляется меню - все как я ожидаю). Опиши подробнее, если не лень, в чем неудобство "стандарного" поведения и где подвох. Если лень - забудем, проблем с этим вроде нет.

Почему ж у тебя не работает режим с прокруткой? Не прояснилось?

User avatar
Zoin
Posts: 101
Joined: Sun 11 Feb, 2007 19:28

Re: ConEmu: Console Emulator — эмулятор консоли

Post by Zoin » Wed 25 Jun, 2008 17:58

NightRoman
Нет, всё тоже самое.
Width: 115
Height: 50
хотя и правда не ясно чем оно поможет. Про WM_RBUTTONDBLCLK -> WM_RBUTTONDOWN - достаточно быстро покликать правой кнопкой в панелях по папке - с костылём и без него - думаю будет сразу заметно в чём разница (если конечно райтклик ни на что другое не переопределён)

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 09:31

Zoin
Высота дефолтного буфера необычно мала (у тебя в дефолтной консоли тоже нет прокрутки?), может, в этом дело, попробуй увеличить. Если не поможет, я не знаю, в чем дело, тебе и карты в руки, попробуй разобраться - поможешь и себе, и другим.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 09:32

= Experimental BufferHeight 2008.06.26 =

Суммирую все изменения с начала эпопеи BufferHeight.

ЗАПУСК С УСТАНОВКОЙ ВЫСОТЫ БУФЕРА КОНСОЛИ (РЕЖИМ ПРОКРУТКИ)

Дополнительный ключ: /BufferHeight <высота буфера>. Примеры:
conemu /BufferHeight 9999 /cmd cmd.exe
conemu /bufferheight 1000 /cmd powershell.exe -noexit myscript.ps1

ПОДДЕРЖКА CONMAN: если величина /BufferHeight отрицательная, то это является
указанием принудительно установить родителя консольного окна. Это может быть
нужно, например, для нормальной работы с ConMan. Замечание: в таком режиме в
процессе выделения мышью выделение может скакнуть в левый верхний угол - как
бороться - пока неясно, но если продолжать выделение, оно "восстанавливается".

Если команда /cmd не задана, берется сохраненная команда из реестра, если есть,
а если нет, то в режиме прокрутки запускается "cmd", а в стандартном режиме
сначала пытаемся запустить "far", потом "cmd".

Проверка на слишком маленькую или слишком большую заданную высоту буфера не
делается, рекомендуется выбирать ее так, что она заведомо больше высоты окна (в
строках), но не больше 9999, что является магическим ограничением высоты буфера
в виндовом диалоге настроек консоли.

Режим прокрутки предназначен в первую очередь для интерактивных сессий в
оболочках типа Cmd или PowerShell и не предназначен для программ типа FAR.
FAR, как и раньше следует запускать без всяких /BufferHeight - при этом
установка родителя окна консоли ДЕЛАЕТСЯ, то есть плагины, которые этого
ожидают, это и получают.

ОПИСАНИЕ РЕЖИМА ПРОКРУТКИ

*) Окно имеет стандартную вертикальную полосу прокрутки.
*) Управление прокруткой с клавиатуры:
- CtrlPgUp, CtrlPgDn листают страницы вверх-вниз
- CtrlUp, CtrlDn прокручивают вверх-вниз построчно
*) Работа с выделением только мышью: выделение - левой кнопкой с перемещением,
копирование и вставка - правой кнопкой.

ТЕХНИЧЕСКИЕ ПОДРОБНОСТИ (В ТОМ ЧИСЛЕ ДЛЯ НЕДАВНИХ ОБСУЖДЕНИЙ)

*) Реализована отрисовка выделения (работает только в режиме прокрутки).
*) В режиме прокрутки положение окна консоли подгоняется под положение мыши -
это нужно для корректной работы выделения в оригинальной консоли.
*) В режиме прокрутки при старте устанавливаем QuickEdit режим, это нужно для
возможности выделения мышью в оригинальной консоли.
*) WM_MOUSEWHEEL теперь обрабатывается как событие мыши, нужно для прокрутки.
*) WM_RBUTTONUP НЕ обрабатывается (как и было раньше), чтобы избежать
нежелательного появления консольного меню в некоторых ситуациях.
*) WM_RBUTTONDBLCLK преобразовывается в WM_RBUTTONDOWN (как и было раньше). По
задумке Zoin это помогает быстро быделить и тут же развыделить элемент панели
Фара двойным правым кликом (не знаю зачем, но считаем, что автору видней).

P.S. на случай, если есть\будут вопросы, пока я еще тут, потом на неделю пропаду.

EDIT: removed obsolete archive
Last edited by NightRoman on Thu 03 Jul, 2008 09:41, edited 1 time in total.

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 10:18

а кто-нить кроме меня тут связку ConEmu + ConMan гоняет?

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 11:12

код для определения того, что консоль под ConEmu:

HWND ConsoleWindow = GetConsoleWindow();
HWND ConEmuWindow = 0;

static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR buffer[MAX_PATH];

DWORD process = (DWORD)lParam;

if(GetClassName(hwnd, buffer, sizeof(buffer) / sizeof(*buffer)))
{
if(!lstrcmp(buffer, _T("VirtualConsoleClass")))
{ // ok, found ConEmu window...
DWORD proc = 0;
DWORD thread = GetWindowThreadProcessId(hwnd, &proc);
if(proc == process)
{ // great!!! we found ConEmu window
ConEmuWindow = hwnd;

return FALSE;
}
}
}
return TRUE;
}

static bool DetectConEmu()
{
ConEmuWindow = 0;

DWORD firstProcess = 0;
if(!GetWindowThreadProcessId(ConsoleWindow, &firstProcess))
return false;

EnumWindows(EnumWindowsProc, (LPARAM)firstProcess);

if(ConEmuWindow)
return true;
return false;
}
Last edited by hoopoe on Thu 26 Jun, 2008 11:41, edited 3 times in total.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 11:23

hoopoe
Правильно я понимаю: ты это добавляешь в конман, приседания с отрицательной высотой буфера использовать необязательно, и выделение в конему под конманом прекрасно работает в "режиме прокрутки"?

А какие еще плагины \ приложения ждут, что у скрытой консоли родитель - окно конему? Им бы тоже этот механизм не мешало бы задействовать, все-таки он выглядит более правильным, что ли.

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 11:30

NightRoman wrote:hoopoe
Правильно я понимаю: ты это добавляешь в конман, приседания с отрицательной высотой буфера использовать необязательно, и выделение в конему под конманом прекрасно работает в "режиме прокрутки"?
да, правильно... вот тут приаттачено... если кто попробует и отпишется - то будет респект...
Attachments
Release.rar
(35.47 KiB) Downloaded 154 times

User avatar
HaRT
Moderator
Posts: 8832
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 86 times
Been thanked: 151 times

Re: ConEmu: Console Emulator — эмулятор консоли

Post by HaRT » Thu 26 Jun, 2008 11:46

hoopoe
Прошу код в таком количестве всё-таки приложением, а не прямо в текст.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
t-rex
Страшный и ужасный
Posts: 4901
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by t-rex » Thu 26 Jun, 2008 11:49

HaRT
Да оставь, пусть себе тут программируют. Смертные в этой теме уже давно ничего не понимают :)

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 11:54

еще бага: если ConEmu развернуть на весь экран, то все скроллеры пропадают...

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 11:56

hoopoe wrote:еще бага: если ConEmu развернуть на весь экран, то все скроллеры пропадают...
у меня не проявляется...

al666
Posts: 237
Joined: Mon 04 Jul, 2005 08:55

Re: ConEmu: Console Emulator — эмулятор консоли

Post by al666 » Thu 26 Jun, 2008 12:17

hoopoe wrote:а кто-нить кроме меня тут связку ConEmu + ConMan гоняет?
Я периодически пытаюсь запустить.

Щас поставил обе ваши тестовые версии.

Когда открываю альтернативную консоль как-то они странно взаимодействуют.

Если не указывать ключ conemu /BufferHeight 1000 - выделение мышкой в конмане невидимое, однако выделенный кусок в буфер копирует.

Если же указать ключ conemu /BufferHeight 1000, тогда выделение нормальное, однако такой способ запуска плохо стыкуется с работой в FAR'е.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 12:22

Если не указывать ключ conemu /BufferHeight 1000 - выделение мышкой в конмане невидимое, однако выделенный кусок в буфер копирует.
Это не бага. В нормальном режиме (без /BufferHeight) считается, что конему заточен под Фар, а Фар сам занимается выделением.
Если же указать ключ conemu /BufferHeight 1000, тогда выделение нормальное, однако такой способ запуска плохо стыкуется с работой в FAR'е.
Я бы тоже сказал, что это нормально ибо в режиме прокрутки конему не предназначен для Фара (по крайней мере, в моем видении).

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 12:27

во втором случае можно включить альтернативную консоль и сразу ее выключить - фар вернется в нормальное состояние...

User avatar
hoopoe
Posts: 263
Joined: Mon 28 Mar, 2005 07:44
Location: Нежный Новгород
Has thanked: 1 time
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by hoopoe » Thu 26 Jun, 2008 12:49

поигравшись с последней версией стало понятно, что логика выбора размеров консоли вызывает некоторую критику :)

итак, для случая без /BufferHeight - все понятно... стандартное поведение более чем устраивает... а вот для случая с /BufferHeight логика должна быть следующей:

размерность по X - целиком управляется ConEmu... это не интересно... а вот с Y - тут все не просто... когда ConEmu решает поменять размер окна по вертикали, то он должен посмотреть, имеет ли текущее консольное окно полосу прокрутки... и если нет - то выставить тот размер консоли, которое посчитает нужным... но если полоса прокрутки таки есть, то вертикальные размеры консольного буфера меняться не должны, изменяться может только само окно... код примерно такой:
ConEmu.cpp: 189
убрать этот код:
if (csbi.dwSize.X != size.X || csbi.dwSize.Y != pVCon->BufferHeight)
{
csbi.dwSize.X = size.X;
if (csbi.dwSize.Y == csbi.srWindow.Bottom - csbi.srWindow.Top + 1 || pVCon->BufferHeight < size.Y)
csbi.dwSize.Y = size.Y;
else
csbi.dwSize.Y = pVCon->BufferHeight;
SetConsoleScreenBufferSize(pVCon->hConOut(), csbi.dwSize);
}

и заменить его на этот:
csbi.dwSize.X = size.X;

if(csbi.dwSize.Y == csbi.srWindow.Bottom - csbi.srWindow.Top + 1)
csbi.dwSize.Y = size.Y;
else
csbi.dwSize.Y = max(csbi.dwSize.Y, size.Y);
SetConsoleScreenBufferSize(pVCon->hConOut(), csbi.dwSize);

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: ConEmu: Console Emulator — эмулятор консоли

Post by NightRoman » Thu 26 Jun, 2008 12:55

hoopoe
Ну не пойдет же это (в таком виде), мы ж один раз уже вставали на эту граблю. Опять получается, что /BufferHeight НИКОГДА не устанавливается, а будет взят из дефолтных настроек консоли. Это не то, как задумано.

Post Reply

Return to “Операционные системы, командные оболочки и прочее”