ProcessConsoleInput

Место, где разработчики плагинов могут поделиться своим опытом.
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 13:34

Latest post of the previous page:

Skirda wrote:И, кстати, когда я говорил про Write, имел ввиду WriteConsoleInput
А, я не понял. Тогда ладно, мне все равно. Давайте уже сделаем как-нибудь :)
Skirda wrote:На экран писать негоже
ПисАть на экран - тоже востребованная задача. Screen Gadgets пишет. Я в PanelTabs тоже бы воспользовался - табы тогда моргали бы меньше...

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

Re: ProcessConsoleInput

Post by HaRT » Mon 24 Jan, 2011 13:50

Max Rusov wrote:
Skirda wrote:На экран писать негоже
ПисАть на экран - тоже востребованная задача.
Чтобы сделать это цивилизованно, надо либо в Фаре поддерживать свою оконную систему, либо организовывать „псевдографические слои” и ими управлять. Без чего-то подобного рискуем получить путаницу и неразбериху из-за конфликта плагинов за области окна.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 13:55

Это фантастика (c). По факту, сейчас плагины уже что-то пытаются писать на экран, и ставят для этого хуки. Я предлагаю дать им для этого "цивилизованный" способ, не переделывая весь FAR.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

Re: ProcessConsoleInput

Post by Skirda » Mon 24 Jan, 2011 14:12

писать в консольный ФАРовский буфер :-)
и, как правильно подметил HaRT, нужен еще слой, который будет отрисовываться последним, т.е. как мне видится - ФАР в буфер вывода кидает в буфер свои творения, потом накладывает плагиновый слой и готовое варево выкатывает на экран.
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 14:23

Все бы хорошо, только, боюсь, в этой жизни мы этого не дождемся :(

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

Re: ProcessConsoleInput

Post by HaRT » Mon 24 Jan, 2011 15:27

Skirda wrote:потом накладывает плагиновый слой и готовое варево выкатывает на экран.
Строго говоря, надо хотя бы по одному слою каждому плагину, который попросил. Плюс средство управления порядком наложения слоёв.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 15:36

Я предлагаю рассматривать эти задачи (Input и Output) по отдельности. С Input'ом все более/менее понятно, давайте сделаем? Это более востребованная фича, на мой взгляд.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

Re: ProcessConsoleInput

Post by Skirda » Mon 24 Jan, 2011 15:38

на мантис про Input
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 15:47


User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

Re: ProcessConsoleInput

Post by Skirda » Thu 27 Jan, 2011 10:02

Max Rusov wrote: - Откуда вызывается функция(?). Тут я не до конца уверен, но есть проблемка в MacroLib'е, что он не может различить, когда ReadConsoleInput вызывается FAR'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами.
Правильно я понимаю, что тебе:
- не важно знать из каких (внутренних) мест Far`а вызывается функция ReadConsoleInput
- важно различать, что это из Far`а или из плагина

В чем профит от этого "тайного" знания?
We are the Borg. You will be assimilated.
So Say We All!

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: ProcessConsoleInput

Post by Maximus5 » Thu 27 Jan, 2011 23:06

Пример.

1. Выполняется длительная операция (сканирование сетевого каталога, копирование файлов, мало ли...) Фар в этот момент в принципе считывает ввод, но обрабатывает только опеределенный набор клавиш (только Esc?). Правильно ли это - другой вопрос (imho неправильно, нельзя, например, ввести текст в ком.строку с опережением), но позволять MacroLib-у менять поведение фара - наверное неправильно. То есть либо нужно все-таки знать из какого места вызван ProcessConsoleInput, либо не вызвать ProcessConsoleInput в спорных случаях. И так фар валится на раз.

2. Запускается PicView. Он зовет ReadConsoleInput. В этот момент перехватывать ввод и выполнять макросы как-то некошерно. Так что, imho, ProcessConsoleInput должен вызываться только тогда, когда ввод считывает сам фар, а плагины - вообще не трогать, пусть живут своей жизнью

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Thu 27 Jan, 2011 23:33

Второй пример - неудачный. Если плагин вызывает ReadConsoleInput, то это его личное дело. FAR про это ничего не узнает и ProcessConsoleInput вызываться по любому не будет (хуки сейчас тоже не сработают - ведь они устанавливаются только на модуль FAR.exe).

Другое дело: если плагин вызывает AdvControl ACTL_WAITKEY. Вот тут уже вопрос: должен ли вызываться ProcessConsoleInput? Если да - то эту ситуацию хотелось бы уметь отличить по флагу.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

ProcessConsoleInputW

Post by Skirda » Thu 12 May, 2011 09:47

Как вы заметили в build 2027 появилось зачаточное состояние mantis#1687.
Вкратце "для чего": что бы плагины могли получать необработанные события консоли и не лазили "на задний двор" ФАРа (в таблицы импорта - к чему это может привести - описано на мантисе).

Пол-дела сделано. Вторая итерация (уже не 2027, а чуть дальше :-)) выглядит так:

Code: Select all

typedef unsigned __int64 PROCESSCONSOLEINPUT_FLAGS;
static const PROCESSCONSOLEINPUT_FLAGS
	PCIF_NONE            =0,
	PCIF_FROMMAIN        =0x0000000000000001ULL;
	// PCIF_PEEK
	// PCIF_READ

struct ProcessConsoleInputInfo
{
	size_t StructSize;
	PROCESSCONSOLEINPUT_FLAGS Flags;
	const INPUT_RECORD *Rec;
};

int WINAPI ProcessConsoleInputW(struct ProcessConsoleInputInfo *Info);
ПлагинМанагер будет бегать по всем плагинам, имеющим функцию, и вызывать. Цикл опроса прекращается, если плагин вернул 0 (или 1? или... - нужно уточнять)
В первоначальном варианте планировалось, что плагин сможет "менять" данные (посредством передачи ФАРу RecOut), но пока решили отказаться, по причине непоняток, описанных ниже.
Т.к. "выставлена" INPUT_RECORD, то это подразумевает весь диапазон консольных событий.
Естественно это все еще будет уточняться...

Осталась самая "большучесть":
1. откуда вызывать ProcessConsoleInputW; есть пара идей - либо обернуть вокруг GetInputRecord (здесь тогда не будет peek), либо вогнать в console::PeekInput и console::ReadInput (здесь получается нагрузка)
2. что должна возвращать функция? Достаточно 0 и 1 или нужны какие-то дополнительные указания
3. из-за "непонятки" (1) пока не добавлены PCIF_PEEK и PCIF_READ
4. ...

Надо обсуждать :facepalm:
We are the Borg. You will be assimilated.
So Say We All!

Yegor
Posts: 1029
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 8 times
Been thanked: 19 times

Re: ProcessConsoleInputW

Post by Yegor » Thu 12 May, 2011 10:49

Skirda wrote:Цикл опроса прекращается, если плагин вернул 0 (или 1? или... - нужно уточнять)
Я так понимаю, что если плагин нажатие обработал, то сам Фар ее тоже уже не обрабатывает, так?
Skirda wrote:В первоначальном варианте планировалось, что плагин сможет "менять" данные (посредством передачи ФАРу RecOut), но пока решили отказаться, по причине непоняток, описанных ниже.
Менять структуру приходилось в большинстве случаев, чтобы не дать ее обработать Фару повторно. Хотя такая возможность может и понадобится.
Skirda wrote:1. откуда вызывать ProcessConsoleInputW; есть пара идей - либо обернуть вокруг GetInputRecord (здесь тогда не будет peek), либо вогнать в console::PeekInput и console::ReadInput (здесь получается нагрузка)
Для простоты - обернуть вокруг GetInputRecord. В будущем никто не помешает поменять.
Skirda wrote:2. что должна возвращать функция? Достаточно 0 и 1 или нужны какие-то дополнительные указания
Пусть будет int, для начала 0 и 1, опять же потом посмотрим.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

Re: ProcessConsoleInputW

Post by Skirda » Thu 12 May, 2011 11:10

Yegor wrote:
Skirda wrote:Цикл опроса прекращается, если плагин вернул 0 (или 1? или... - нужно уточнять)
Я так понимаю, что если плагин нажатие обработал, то сам Фар ее тоже уже не обрабатывает, так?
Как вариант. Кроме того, заканчивается засылка месага плагинам. Обсуждаемо.
Yegor wrote:Для простоты - обернуть вокруг GetInputRecord. В будущем никто не помешает поменять.
Тогда пропадает peek.
Yegor wrote:
Skirda wrote:2. что должна возвращать функция? Достаточно 0 и 1 или нужны какие-то дополнительные указания
Пусть будет int, для начала 0 и 1, опять же потом посмотрим.
Там int и так. Мы тут проектируем кусок АПИ, посему лучше сейчас по максимуму уточнить, иначе потом ждать очередного слома :D
We are the Borg. You will be assimilated.
So Say We All!

Yegor
Posts: 1029
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 8 times
Been thanked: 19 times

Re: ProcessConsoleInputW

Post by Yegor » Thu 12 May, 2011 12:35

Думаю, в такой реализации Peek будет бесполезным, на мой взгляд.

Returns:
0 - продолжаем бегать по плагинам
1 - плагин польностью обработал событие (бегать по плагинам не надо, Фар тоже событие не обрабатывает)

2? - плагин обработал событие, но не хочет его отдавать другим, кроме Фара (Фар обрабатывает событие как обычно).
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин

Yegor
Posts: 1029
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 8 times
Been thanked: 19 times

Re: ProcessConsoleInputW

Post by Yegor » Thu 12 May, 2011 12:37

А какие "непонятки", с тем чтобы убрать const у INPUT_RECORD *Rec в структуре и разрешить ее модифицировать?
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин

Post Reply

Return to “Разработка плагинов”