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

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

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

Post by John Doe »

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: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

DM_REDRAW получше будет (спасибо за напоминание, добавил в Фарнет). Но хорошо бы без этого, если это возможно.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

Придумал, как обойтись без предложенного пост-DM_CLOSE. В имеющемся DM_CLOSE формируем работу и засылаем Фару с ACTL_SYNCHRO. Когда Фар получит управление, он закроет диалог и уже потом вызовет нашу работу. Неочевидно, может, но работоспособно.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

NightRoman wrote: Sat 30 Sep, 2017 13:27Неочевидно, может, но работоспособно.
Не очевидней ли всё будет, если немодальный диалог будет освобождаться по DialogFree, как и обычный?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

Непонятно, как это с моему случаю относится. Вот форма (немодальный диалог). Юзер жмет ОК. Мне надо что-то сделать, когда форма закроется. Кто и когда в этом сценарии должен вызывать DialogFree?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

В принципе, немодальные процессы обычно и устроены на "продолжениях" (continuation). Так что решение с ACTL_SYNCHRO вполне вписывается. Меня, вроде, устраивает. Неочевидно, да. Но решение найдено, задокументирую, подумаю, какие хелперы в Фарнет добавить.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

Shmuel wrote: Sat 30 Sep, 2017 17:18Вот здесь употреблять в диалоговой процедуре основной lua_State нельзя - не будет работать и будет падать.
как было — тоже падало. до 619 выполнить
lua:@test.lua
lua:collectgarbage()
lua:far.DialogRun(DDD)
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

а можно пример, как внутри rings.new():dostring обращаться к фаровским библиотекам?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Пожалуйста. Только библиотека немножко патченая мной.
rings.7z
(6.1 KiB) Downloaded 113 times
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

В мануале есть пример, но сказано
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: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Не доходят руки разобраться с этим примером :(
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

Shmuel wrote: Sat 30 Sep, 2017 18:51Только библиотека немножко патченая мной.
сам патч, для тех, кто сам собрать захочет.
Attachments
rings.patch.7z
(714 Bytes) Downloaded 110 times
2useven10
Posts: 5204
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

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

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