Немодальный диалог

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
John Doe
Бюрократ
Posts: 12162
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 30 times
Been thanked: 159 times

Немодальный диалог

Post by John Doe » Sat 30 Sep, 2017 09:24

Latest post of the previous page:

Сомневаюсь что должно.

Code: Select all

local id = win.Uuid"45B09D0D-6AE8-416C-BB5A-F5FA7B5CC430"
local F = far.Flags
local function Progress(text,title)
  local len = text:len()
  local items = {
    --[[01]]  {F.DI_SINGLEBOX,0,0,len+2,3,0,0,0,0,title},
    --[[02]]  {F.DI_TEXT,     1,1,0,0,0,0,0,0,text},
  }
  local flags = F.FDLG_NONMODAL
  return far.DialogInit(id,-1,-1,len+2,3,len,items,flags)
end

local hDlg = Progress(" ")
for i=1,5 do
  --hDlg:send"DM_REDRAW"
  win.Sleep(500)
  hDlg:send("DM_SETTEXT",2,i)
end
Тут то же самое, без DM_REDRAW не отображается.

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

Немодальный диалог

Post by NightRoman » Sat 30 Sep, 2017 12:03

DM_REDRAW получше будет (спасибо за напоминание, добавил в Фарнет). Но хорошо бы без этого, если это возможно.

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

Немодальный диалог

Post by NightRoman » Sat 30 Sep, 2017 13:27

Придумал, как обойтись без предложенного пост-DM_CLOSE. В имеющемся DM_CLOSE формируем работу и засылаем Фару с ACTL_SYNCHRO. Когда Фар получит управление, он закроет диалог и уже потом вызовет нашу работу. Неочевидно, может, но работоспособно.

User avatar
John Doe
Бюрократ
Posts: 12162
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 30 times
Been thanked: 159 times

Немодальный диалог

Post by John Doe » Sat 30 Sep, 2017 14:13

NightRoman wrote:
Sat 30 Sep, 2017 13:27
Неочевидно, может, но работоспособно.
Не очевидней ли всё будет, если немодальный диалог будет освобождаться по DialogFree, как и обычный?

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

Немодальный диалог

Post by NightRoman » Sat 30 Sep, 2017 14:52

Непонятно, как это с моему случаю относится. Вот форма (немодальный диалог). Юзер жмет ОК. Мне надо что-то сделать, когда форма закроется. Кто и когда в этом сценарии должен вызывать DialogFree?

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

Немодальный диалог

Post by NightRoman » Sat 30 Sep, 2017 14:56

В принципе, немодальные процессы обычно и устроены на "продолжениях" (continuation). Так что решение с ACTL_SYNCHRO вполне вписывается. Меня, вроде, устраивает. Неочевидно, да. Но решение найдено, задокументирую, подумаю, какие хелперы в Фарнет добавить.

User avatar
John Doe
Бюрократ
Posts: 12162
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 30 times
Been thanked: 159 times

Немодальный диалог

Post by John Doe » Sat 30 Sep, 2017 15:50

NightRoman wrote:
Sat 30 Sep, 2017 14:56
решение с ACTL_SYNCHRO вполне вписывается.
А есть уверенность, что в момент, когда ваш код получит управление, диалог ещё не будет освобождён фаром?
По факту и в моих экспериментах непосредственно после закрытия всё было в порядке, но после разъяснения у меня уверенность пропала.
NightRoman wrote:
Sat 30 Sep, 2017 14:52
Непонятно, как это с моему случаю относится.
Это будет гарантировать, что диалог в вашем распоряжении, пока вы его явно не освободите.

Edit
Впрочем, я действительно не сразу вас понял , ACTL_SYNCHRO вам требуется для того чтобы запустить действие после закрытия диалога, а данные из него вы можете и DN_CLOSE собрать.
Last edited by John Doe on Sat 30 Sep, 2017 15:52, edited 1 time in total.

Shmuel
Posts: 5678
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 199 times

Немодальный диалог

Post by Shmuel » Sat 30 Sep, 2017 17:18

zg wrote:
Fri 29 Sep, 2017 14:02
в общем в дискуссию призывается Shmuel, для разъяснения для чего вообще эта странная магия с сохранением состояния в диалоге нужна
Можно было бы и без магии (сделать правку в luaplug.c), но это поломает существующие плагины. Сейчас из luaplug.c в LF_DlgProc всегда передаётся основной lua_State* плагина (что нехорошо, но оставлено так, чтобы не поломать API). Но есть сценарии, когда можно использовать дополнительные независимые lua_State - например, используя библиотеку rings. Вот здесь употреблять в диалоговой процедуре основной lua_State нельзя - не будет работать и будет падать.
Last edited by Shmuel on Sat 30 Sep, 2017 17:20, edited 1 time in total.

User avatar
zg
zero-gravity
Posts: 5533
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Немодальный диалог

Post by zg » Sat 30 Sep, 2017 17:36

Shmuel wrote:
Sat 30 Sep, 2017 17:18
Вот здесь употреблять в диалоговой процедуре основной lua_State нельзя - не будет работать и будет падать.
как было — тоже падало. до 619 выполнить
lua:@test.lua
lua:collectgarbage()
lua:far.DialogRun(DDD)

Shmuel
Posts: 5678
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 199 times

Немодальный диалог

Post by Shmuel » Sat 30 Sep, 2017 17:37

zg wrote:
Sat 30 Sep, 2017 17:36
как было — тоже падало
А разве кто-то спорит?
P.S. В сценарии с независимыми lua_State и раньше не падало. В сценарии с макросами - падало, но это не было никому известно до последнего времени. Твой фикс починил сценарий с макросами, но поломал сценарий с независимыми lua_State. Поэтому пришлось сделать по-другому.
Last edited by Shmuel on Sat 30 Sep, 2017 17:49, edited 1 time in total.

User avatar
zg
zero-gravity
Posts: 5533
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Немодальный диалог

Post by zg » Sat 30 Sep, 2017 18:38

а можно пример, как внутри rings.new():dostring обращаться к фаровским библиотекам?

Shmuel
Posts: 5678
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 199 times

Немодальный диалог

Post by Shmuel » Sat 30 Sep, 2017 18:51

Пожалуйста. Только библиотека немножко патченая мной.
rings.7z
(6.1 KiB) Downloaded 37 times

User avatar
John Doe
Бюрократ
Posts: 12162
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 30 times
Been thanked: 159 times

Немодальный диалог

Post by John Doe » Sat 30 Sep, 2017 19:14

В мануале есть пример, но сказано
After replacing the standard Lua 5.1 DLL with one from LuaJIT 2.0, this example has stopped working. The issue is investigated.

Shmuel
Posts: 5678
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 199 times

Немодальный диалог

Post by Shmuel » Sat 30 Sep, 2017 19:30

Не доходят руки разобраться с этим примером :(

User avatar
zg
zero-gravity
Posts: 5533
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Немодальный диалог

Post by zg » Sat 30 Sep, 2017 23:22

Shmuel wrote:
Sat 30 Sep, 2017 18:51
Только библиотека немножко патченая мной.
сам патч, для тех, кто сам собрать захочет.
Attachments
rings.patch.7z
(714 Bytes) Downloaded 30 times

2useven10
Posts: 3716
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 147 times

Немодальный диалог

Post by 2useven10 » Mon 21 May, 2018 17:05

Как самому из немодального диалога переключиться на окно под ним.
Есть ACTL_SETCURRENTWINDOW, но как выбрать правильное окно?

User avatar
John Doe
Бюрократ
Posts: 12162
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 30 times
Been thanked: 159 times

Немодальный диалог

Post by John Doe » Mon 21 May, 2018 17:22

@2useven10

Code: Select all

zg 17.10.2014 04:06:40 +0200 - build 4138

1. ACTL_GETWINDOWINFO возвращает все окна в порядке текущего z-order'а.
Текущее окно имеет максимальный индекс, окно под ним на единицу меньше.

Не документировано, но пока так.

Post Reply

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