Scripts discussion (2)

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

ScreenView.js

Post by San_dr »

KDJ, Можно ли в плагине ScreenView.js ввести окно выбора и чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI ? (как сделано для Font, ColorTheme, ColorCoderTheme)

Использую так-же плагин LineBoardRClickPanel.js Совместное использование позволяет создавать очень гибкие еонфигурации, например такую, когда для текста отводится все место, остается только панель нумерации строк и возможность вызвать два контекстных меню - меню поля редактирования и меню, вызываемое скриптом LineBoardRClickPanel.js. Здесь нужен режим PMDI - иначе есть риск остаться без всяких меню закрыв последнюю вкладку. А вот, например режим совместной прокрутки двух документов в одном окне для визуального сравнения ( Call("Scripts::Main", 1, "tileTabs.js")) - требует режим MDI... это я навскидку назвал пару примеров, когда нужно менять режим работы окна, есть и другие.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

San_dr wrote:чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI?
Для этого, вероятно, понадобится перезапуск AkelPad.

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

Skif_off wrote: Для этого, вероятно, понадобится перезапуск AkelPad.
Скорее всего, но не думаю, чтоб это было проблемой, просто надо, чтобы возле чекбокса была предупреждающая надпись о необходимости рестарта.,

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Небольшое дополнение.
Версии AkelPad'а и Scripts, напоминаю, по-прежнему тестовые.
У меня еще и на стареньком VersionInfo.js периодически падает.
Только этот под отладкой ни в какую не падает, тогда как tileTabs.js стабильно падает как раз при подключении отладчика (а в нормальных условиях – только периодически).
Если сделать «Run To Cursor» к концу файла, то падает, но ничего интересного не показывает. Даже переменные все почему-то в undefined стоят – кроме функций и объектов AkelPad, WScript и Constants.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Re: ScreenView.js

Post by KDJ »

San_dr wrote:Можно ли в плагине ScreenView.js ввести окно выбора и чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI ?
It seems to me that the script ScreenView.js is no right place for the function switching window mode.
For fast switching, you can assign shortcut keys or put icons on the toolbar and use the script restart.js.
Example for toolbar:

Code: Select all

"SDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 0) {AkelPad.Command(4261); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
"PMDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 2) {AkelPad.Command(4263); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Я даже на всякий случай проверил без
Даже? Это первое, что надо было сделать :)

У тестовых файлов отличающаяся архитектура, поэтому не используйте их в рабочей папке: 4.8.8 Dev + Scripts плагин.

Добрался до Win7 падения действительно есть на winMergeTabs.js и tileTabs.js, где используется "AkelPad.WindowSubClass(hMainWnd". Стоило поменять на "AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/", как падений больше не было.

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

KDJ, помоги, не хватает ума - как мне слить в одной кнопке или пункте меню такие действия (если это возможно):

Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0') + Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

San_dr

Code: Select all

"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0'); if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

KDJ wrote:

Code: Select all

"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0'); if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
Dziękujemy! Udało się.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:
Infocatcher wrote:Я даже на всякий случай проверил без
Даже? Это первое, что надо было сделать :)
Ммм... а, возможно, и нет.
Я снова убрал autoSaveSession.js из автозагрузки (пока что на старых версиях), так пока что tileTabs.js падает только при отладке. Во всяком случае, выходит, что с autoSaveSession.js частота падений выше.
Instructor wrote:У тестовых файлов отличающаяся архитектура, поэтому не используйте их в рабочей папке: 4.8.8 Dev + Scripts плагин.
Хм, с autoSaveSession.js уже не проверить.
Под отладкой tileTabs.js по-прежнему падает, без отладки пока ни разу не упал.

А нельзя ли в oSys.RegisterCallback() проверять тип первого аргумента, чтобы все старые скрипты по-прежнему работали?
Или как можно из самого скрипта проверить, не запущен ли он на старой версии?

Upd:
Более того, если в autoSaveSession.js закомментировать собственно сохранение:

Code: Select all

//AkelPad.Call("Sessions::Main", 2, sessionName);
, то падать продолжает.

Даже вот такого достаточно в автозагрузке, чтобы увеличить частоту падений:

Code: Select all

var isMDI = AkelPad.IsMDI();
if(!isMDI) // We silently ignore SDI mode to allow use the same settings in any mode!
	WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
	// Script is running, second call close it
	AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
	WScript.Quit();
}

if(hMainWnd) {
	if(
		AkelPad.WindowSubClass(
			1 /*WSC_MAINPROC*/,
			mainCallback,
			0x4E /*WM_NOTIFY*/,
			0x416 /*AKDN_FRAME_ACTIVATE*/,
			0x418 /*AKDN_FRAME_DESTROY*/
			//0x436 /*AKDN_OPENDOCUMENT_FINISH*/
			//0x406 /*AKDN_MAIN_ONFINISH*/
		)
	) {
		if(
			isMDI != 1 /*WMD_MDI*/
			|| AkelPad.WindowSubClass(
				3 /*WSC_FRAMEPROC*/,
				mainCallback,
				0x4E /*WM_NOTIFY*/
			)
		) {
			AkelPad.ScriptNoMutex(); // Allow other scripts running
			AkelPad.WindowGetMessage(); // Message loop

			AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
			AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);
		}
		else {
			AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
			AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_FRAMEPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
		}
	}
	else {
		AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_MAINPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	}
}

function mainCallback(hWnd, uMsg, wParam, lParam) {
}
Даже с

Code: Select all

		AkelPad.WindowSubClass(
			1 /*WSC_MAINPROC*/,
			mainCallback,
			0x4E /*WM_NOTIFY*/
		)
по-прежнему падает.


Upd #2:
Вообще, логично предположить, что и скрипт в автозагрузке, и отладка влияют на «производительность» обработки сообщений. То есть что-то начинает работать медленнее, а другое что-то некорректно ожидает окончания предыдущей операции. :?

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Для проверки подключил AutoScript-Sample1.js, так и с ним tileTabs.js падает, хотя и, кажется, пореже...
Причем с последними тестовыми версиями AkelPad'а и Scripts тоже воспроизводится.

P.S. Использовались tileTabs-test.js + timer.js

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Все, кроме вот этого

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"
у меня в наличии. :?
Если попробовать добавить?
А нельзя ли в oSys.RegisterCallback() проверять тип первого аргумента, чтобы все старые скрипты по-прежнему работали?

Code: Select all

try
{
  oSys.RegisterCallback(timerProc);
}
catch ()
{
  oSys.RegisterCallback("timerProc"); 
}
Причем с последними тестовыми версиями AkelPad'а и Scripts тоже воспроизводится.
Как будет возможность, проверю на Win7.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:
Infocatcher wrote:Все, кроме вот этого

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"
у меня в наличии. :?
Если попробовать добавить?
Добавил.
После перезагрузки (пока не перезагрузился, изменений не было) при запуске AkelPad'а стало выводиться вот такое сообщение:
Microsoft Visual Studio Debugger
---------------------------
An exception occurred. Process will be terminated. (Exception address is 00413E6C)
---------------------------
ОК
Выводит его
"C:\Program Files\Common Files\Microsoft Shared\VS7Debug\VS7JIT.EXE" -Embedding
И через какое-то время (секунд через 50) вылезает еще вот такое:
Just-In-Time Debugging
---------------------------
An exception 'Runtime Error' has occurred in Script.

However, no debuggers are registered that can debug this exception. Unable to JIT debug.
---------------------------
ОК
Кстати, без этого ключа в реестре еще и AkelPad при запуске падал.
Если убрать галочку «с начала», то, вроде, вообще ничего визуально не меняется.
Если запускать с правами администратора, то результат точно такой же, только окошко с сообщением об ошибке уже не может перехватить фокус.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FileAndStream_functions.js
Added ability to call IsSupportStreams() function without a parameter or with empty string, for checking the current drive.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
А на работе уже Visual Studio 2005 на борту, при падении предлагает отладку.

Code: Select all

Unhandled exception at 0x003e8b4c in AkelPad.exe: 0xC0000005: Access violation reading location 0x00000182.

No symbols are loaded for any call stack frame. The source code cannot be displayed.

003E8B10  call        003E2C6A 
003E8B15  add         esp,14h 
003E8B18  mov         dword ptr [edi],eax 
003E8B1A  jmp         003E8B20 
003E8B1C  and         dword ptr [esi+28h],0 
003E8B20  xor         eax,eax 
003E8B22  inc         eax  
003E8B23  jmp         003E8B2A 
003E8B25  and         dword ptr [edi],0 
003E8B28  xor         eax,eax 
003E8B2A  pop         edi  
003E8B2B  pop         esi  
003E8B2C  pop         ebx  
003E8B2D  pop         ebp  
003E8B2E  ret         18h  
003E8B31  push        ebp  
003E8B32  mov         ebp,esp 
003E8B34  push        esi  
003E8B35  mov         esi,dword ptr [ebp+8] 
003E8B38  xor         eax,eax 
003E8B3A  test        esi,esi 
003E8B3C  push        edi  
003E8B3D  mov         edi,dword ptr [ebp+1Ch] 
003E8B40  jne         003E8B4C 
003E8B42  mov         esi,dword ptr ds:[3EEF40h] 
003E8B48  test        esi,esi 
003E8B4A  je          003E8BAA 
003E8B4C  cmp         dword ptr [esi+8],1 ; <-- падает вот тут
Так что неплохо бы сборку с отладочными символами и актуальный Sessions (потому как это было на последних тестовых AkelPad и Scripts со старой архитектурой).
Впрочем, можно и без Sessions, но на AutoScript-Sample1.js падает реже.


Upd: Отладка скриптов тут запускается без проблем (но только с галочкой «с начала»), при этом падает там же. Информации о падении не видать, а если в окошке о том, что программа упала, выбрать «Отладка», то выдает
Microsoft Visual Studio
---------------------------
Unable to attach to the crashing process. A debugger is already attached.
---------------------------
ОК
Система, в принципе, такая же: Windows 7 x86 SP1, только корпоративная версия и есть VS 2005.

Upd #2:
(но только с галочкой «с начала»)
Я что-то туплю, без галочки надо было «AkelPad.DebugJIT();» в коде добавить?
Locked