JSplitter v4.2.2 / 3.9.2 [28.09.2026]

Список разделов › foobar2000 › Плагины

Описание: Все о плагинах, компонентах, расширениях

  • 12

Сообщение #1 LUR » 21.03.2018, 05:06

Плагин представляет собой панель, совмещающую функциональность сплиттера (контейнера для панелей других плагинов) и хоста скриптов JavaScript.

Особенности функционала:

1. Панели добавляются в сплиттер в произвольном порядке, где с ними можно работать как с обычными окнами Windows, а именно: перемещать, изменять их размер, сворачивать, разворачивать, закрывать. Т.е. при работе с плагином foobar2000 превращается в приложение с MDI интерфейсом (Multi Document Interface). Для точного позиционирования панелей предусмотрено отображение координат и их редактирование "на лету" в заголовке окна панели (полезно при дизайне интерфейса сборки). Также имеется возможность настраивать цвета и шрифт заголовка окон панелей.
Функциональность сплиттера работает как в DUI, так и в CUI.

1.PNG


2. Поддерживается режим редактирования разметки как в DUI так и в CUI в традиционной для них манере. Поддерживается также управление размещением панелей в сплиттере через стандартный "размещатель" Columns UI.
3. В основе хоста скриптов лежит Spider Monkey Panel от TheQwertiest, соответственно имеет все возможности данной панели + дополнительные расширения API, касающиеся сплиттера. Также в проект активно вносятся изменения из "мода" Spider Monkey Panel за авторством marc2k3
4. Поддерживается управление панелями в сплиттере из скриптов. Возможно программно перемещать, скрывать, изменять размер панелей.
5. Имеется специальное API для быстрого создания кнопок в корне панели и обработки их нажатия.

ПРИМЕЧАНИЕ О ВЕРСИЯХ
Ввиду того, что последней ESR (Extended Support Release) версией движка JavaScript SpiderMonkey, поддерживающей Windows 7, является 102.15.1esr, решено сделать форк основной версии JSplitter и сделать из него ветку 3.x. Все изменения, вносимые в последнюю версию JSplitter (кроме движка), будут добавляться и туда. Единственная разница между веткой 4.x и 3.x в движке JavaScript: В 3.x будет всегда один и тот же движок 102.15.1esr, а в 4.x - самый свежий ESR.

СКАЧАТЬ
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
GITHUB
АНГЛИЙСКАЯ ВЕРСИЯ

Версия 3.9.2 (для пользователей Windows 7)
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
GITHUB
АНГЛИЙСКАЯ ВЕРСИЯ

Краткое руководство
Для добавления панелей в сплиттер можно воспользоваться следующими способами:

1. С помощью контекстного меню панели плагина:

2.PNG


2. С помощью стандартного размещателя Columns UI:

4.PNG


3. С помощью списка панелей, вызываемого из контекстного меню плагина:

10.png


либо окна редактирования скрипта (см. скриншот). Список панелей можно также использовать для добавления, удаления, переупорядочивания панелей, а также изменения их положения и размеров вручную (двойной щелчок по соответствующему полю):

Снимок.PNG


4. В стандартном режиме редактирования разметки (Default UI / Columns UI)

9.png


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

3.PNG


ВНИМАНИЕ! Порядок размещения панелей в сплиттере зависит от глубины их визуального расположения. Самое верхнее окно будет последним в списке. Если вы активируете мышкой какую-либо панель, она переместится в конец списка. Учитывайте это при использовании функции GetPanelByIndex (см. ниже). Чтобы случайных перемещений по списку не происходило, вы можете заблокировать панель (см. ниже)

Show caption - включает/отключает отображение рамки (бордюра) окна панели
Locked - заблокировать панель. С установленной галочкой окно не реагирует на попытки переместить/изменить/закрыть окно.
Show coords - отобразить координаты. В заголовке окна будут отображены координаты окна, которые будут обновляться по мере перемещения/изменения размера окна.
Support pseudo transparency - некоторым окнам необходима поддержка "прозрачности". С включенной опцией плагин будет заменять фон окна панели на содержимое корневого окна плагина. Т.е. например все, что нарисовано в скрипте с помощью on_paint(gr) будет скопировано в окно.

В режиме отображения координат можно вводить необходимые координаты вручную кликнув по нужной координате или изменить название панели:

7.PNG


Настройки внешнего вида окон панелей расположены здесь:

8.png


Show tools menu for panels' caption - включает/отключает меню для заголовка окон панелей.
Move panels with middle button - позволяет перемещать панели при помощи средней кнопки мыши. Полезно когда бордюр окна скрыт (меню Show caption).
Align panels to edges of each other when dragging - выравнивать панели по краям друг друга при перетаскивании окошек. Полезно при построении интерфейса сборки, где панели должны быть расположены плотно друг к другу.
Show scrollbars for out-of-view panels - экспериментальная функция показа полос прокрутки, если панели выходят из зоны видимости. Прокручиваются только панели, содержимое отрисованного окна не меняется и не скроллится.
Hide panels on close - скрывать окна вместо их закрытия. Полезно для временного скрытия панели с помощью кнопки закрытия окна. Вернуть обратно окна можно в размещателе Columns UI сняв галочку Hidden с панели (или из "списка панелей" см. выше):

6.PNG



Программный интерфейс
Базовое API всегда зависит от плагина, на котором основана текущая версия JSplitter. Документация к плагину прилагается. Плюс к этому доступны следующие дополнения для объекта window:

window.GetPanel(caption) - получить объект для доступа к панели по тексту заголовка. Будет возвращена первая панель, совпавшая по тексту с аргументом. Текст панели указывается в заголовке. По умолчанию он имеет значение имени плагина панели, но его можно изменить как напрямую в заголовке окна (Show coords -> Click in caption text), так и в размещателе Columns UI (Use custom title)
window.GetPanelByIndex(index) - получить объект для доступа к панели по индексу. Вообще порядок изначально тот, в котором добавляются панели, но так же порядок можно увидеть в размещателе Columns UI, там же его и изменить.
window.CreateButton(x, y, images, hover_images) - создать кнопку в сплиттере. Кнопка будет создана в корне окна и будет размещена по координатам (x, y). Также функции передаются изображения для задания внешнего вида кнопки. Собственно от количества изображений images, переданных функции, будет зависеть количество состояний, которые может принимать кнопка. hover_images - изображения кнопки, отображающиеся при наведении курсора мыши. Функция достаточно гибкая для создания различного вида кнопок, например:
var path = fb.FoobarPath + "themes\\lur\\black\\bio.png";
var hpath = fb.FoobarPath + "themes\\lur\\black\\bio_on.png";
var a = window.CreateButton(0, 0, path, hpath); - создает обычную кнопку с картинкой bio.png, которая меняется на bio_on.png при наведении курсора мыши
var b = window.CreateButton(0, 0, [path, hpath], null); - создает чекбокс-кнопку. Обычное состояние - bio.png, нажатое (галочка установлена) - bio_on.png. Обратите внимание, что изображения для наведения курсора отсутствуют. Обычно чекбоксам они и не нужны, но можно их установить при желании.
var c = window.CreateButton(0, 0, [path1, path2, path3], [path1_on, path2_on, path3_on]); - можно создать кнопку с тремя (и более) состояниями. Они будут циклически переключаться при нажатии. Текущее состояние кнопки можно будет получить с помощью свойства кнопки State (см. ниже).
Также можно создать группу радио-кнопок (взаимоисключающих) с помощью следующей функции:
window.RadioButtons(buttons) - создает группу радио-кнопок. Принимает в качестве аргумента массив кнопок. Каждая кнопка должна иметь не менее двух состояний, иначе функция свалится. Пример:
var a = window.CreateButton(0, 0, [path, hpath], null);
var b = window.CreateButton(30, 0, [path, hpath], null);
window.RadioButtons([a, b]);
Теперь при нажатии на одну кнопку (состояние 1), другая будет "отключаться" (переходить в состояние 0) и наоборот.
window.GetButton(id) - получить кнопку по значению ее идентификатора (Button.ID)
window.RemoveButton(button) - удаляет кнопку
window.HandOnButtons - переключает курсор мыши для всех кнопок либо на руку, либо на стрелку. Данное свойство также действует на все создаваемые впоследствии кнопки. У каждой кнопки это свойство можно менять индивидуально (см. ниже).

Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Так как JSplitter не получает никакой информации о передвижении мыши над панелями самих плагинов, но иногда это требуется, то введено API для получения данных событий. Перед использованием данного API его необходимо явно разрешить в настройках JSplitter (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)").
window.TrackMouseEnterLeaveOnPanels = true; - включает отслеживание входа/выхода курсора мыши из области панелей. По умолчанию false. Для обработки событий используются следующие функции:
on_panel_mouse_enter(name) - событие входа курсора в область панели, name - имя панели
on_panel_mouse_leave(name) - событие выхода курсора из области панели, name - имя панели
window.TrackMouseMoveOnPanels = true; - включает отслеживание позиции курсора мыши в пределах области панели. По умолчанию false. Для обработки события используется следующая функция:
on_panel_mouse_move(name, x, y, mask) - событие перемещения курсора в пределах области панели, name - имя панели, x,y - координаты точки на панели

Объекты, получаемые при помощи функций, указанных выше, имеют следующие свойства и методы:

ПАНЕЛИ (GetPanel, GetPanelByIndex)
Свойства:
(readonly) String Name;
(read, write) String Text;
(read, write) boolean Hidden;
(read, write) boolean Locked;
(read, write) boolean ShowCaption;
(read, write) boolean SupportPseudoTransparency;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean TopMost;
(read, write) boolean EraseBackground;
Методы:
void Show(show = true);
void Move(x, y, width, height, repaintParent = false);

КНОПКИ (CreateButton, GetButton)
Свойства:
(readonly) ushort ID;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean Hidden;
(read, write) boolean HandOnHover;
(read, write) Function Click;
(read, write) uint State;
Методы:
void Show(show = true);
void Move(x, y);
void Resize(width, height);

Назначение свойств и методов объектов довольно прозрачно. При назначении ширины или высоты кнопки в ноль, ширина и высота автоматически высчитываются (как и просто при создании кнопки) из максимальной ширины и высоты изображений. Отдельного упоминания заслуживает обработка нажатий кнопок. Она осуществляется 2-мя
путями:

1. При помощи задания свойства Click объекта кнопки:
var a = window.CreateButton(0, 0, [path, hpath], null);
a.Click = function() { do_something(); }

2. При помощи специального callback'a, который вызывается при нажатии ВСЕХ кнопок, созданных с помощью window.CreateButton:
function on_button_click(id) - принимает идентификатор кнопки, который можно получить через свойство кнопки ID.
switch(id) {
case a.ID:
do_something();
break;
}


ПРИМЕЧАНИЕ: В отличие от панелей, существующих вне зависимости от скрипта, кнопки создаются только программно с помощью скрипта и всегда уничтожаются при выгрузке скрипта.


ДОКУМЕНТАЦИЯ
https://dima-lur.github.io/jsplitter/

Пример конфигурации
Распаковать в папку с чистым портативным фубаром.
СКАЧАТЬ

Пример от zeremy

История версий
Версия 4.2.2 [28.09.2026]
  • [НОВОЕ] Добавлены потоковые API файлового ввода-вывода для обработки больших файлов без загрузки всего их содержимого в память JavaScript. utils.OpenTextReader и utils.OpenTextWriter обеспечивают построчное чтение и запись текста с выбором кодировки, а utils.OpenBinaryReader и utils.OpenBinaryWriter позволяют читать и записывать двоичные данные через повторно используемые буферы Uint8Array. API доступны как в панели, так и в Worker.
  • [ОБНОВЛЕНИЕ] Расширена поддержка кодировок в utils.ReadTextFile и utils.WriteTextFile. Чтение текста теперь единообразно поддерживает UTF-8, UTF-16LE/BE, UTF-32LE/BE и поддерживаемые кодовые страницы Windows, включая автоматическое определение кодировки при соответствующем запросе. WriteTextFile теперь также принимает кодовую страницу для выходного файла вместо ограничения только UTF-8 и может опционально записывать BOM для UTF-8, UTF-16 и UTF-32. Для совместимости существующие значения по умолчанию для UTF-8 не изменены.
  • [НОВОЕ] Добавлен Worker.RunAsync для удобного однократного выполнения фоновой работы без ручного создания и управления постоянным Worker. Каждый вызов создаёт временный полноценный Worker realm/поток, структурно клонирует переданные аргументы в него, выполняет пользовательский синхронный или асинхронный JavaScript callback, структурно клонирует результат обратно в панель и после этого автоматически завершает Worker. Метод предназначен для достаточно крупных изолированных задач, например обработки больших файлов, где отдельный протокол обмена сообщениями с Worker лишь добавлял бы лишний шаблонный код.
  • [НОВОЕ] Добавлен нативный SQLite API, доступный как в панели, так и в Worker, если процесс foobar2000 предоставляет совместимую библиотеку SQLite. utils.OpenDatabase открывает файловые базы данных или базы в памяти и возвращает объект SQLiteDatabase с прямым выполнением SQL, параметризованными запросами, транзакциями и повторно используемыми подготовленными выражениями через SQLiteStatement. Значения JavaScript могут безопасно передаваться как SQL-параметры, строки результата возвращаются как обычные JavaScript-объекты, а значения SQLite BLOB представлены как Uint8Array. Относительные пути к базе используют разрешение путей относительно скрипта JSplitter; также поддерживаются базы :memory:.
  • [НОВОЕ] Добавлен utils.LoadFont для загрузки пользовательских TrueType/OpenType-шрифтов непосредственно из пакетов скриптов без их установки в Windows. Загруженные шрифты являются приватными для процесса foobar2000, становятся доступны API шрифтов GDI и Direct2D и используются совместно панелями и Worker. Относительные пути разрешаются относительно текущего скрипта JSplitter, благодаря чему шрифты можно распространять вместе с основным скриптом, подключаемыми файлами или исходниками Worker. Повторная загрузка одного и того же файла безопасна, а загруженные шрифты остаются доступны на протяжении всего времени работы процесса foobar2000.
  • [НОВОЕ] Добавлен API fb.Window для управления главным окном foobar2000 непосредственно из скриптов панели. API предоставляет текущую позицию и внешний размер окна, позволяет перемещать и изменять его размер, переключаться между стандартной рамкой, режимом без заголовка и режимом без рамки, входить и выходить из полноэкранного режима, а также задавать ограничения минимального и максимального размера. В Default User Interface также можно скрывать и восстанавливать главное меню и строку состояния. Настройки применяются непосредственно к главному окну foobar2000 и могут динамически изменяться во время работы. Начиная с этого выпуска window.FoobarWindowX, window.FoobarWindowY, window.FoobarWindowWidth, window.FoobarWindowHeight и window.MoveFoobarWindow устарели и будут удалены в будущих версиях. В новом коде следует использовать свойства геометрии fb.Window и Move.
  • [ОБНОВЛЕНИЕ] utils.GetWaveformAsync расширен опциональным callback on_progress. Готовые диапазоны огибающей waveform теперь могут передаваться ещё во время декодирования, позволяя интерфейсу waveform появляться постепенно, не дожидаясь завершения декодирования всего трека. Callback получает каждый новый диапазон Float32Array вместе с его смещением в выходном массиве и может вернуть false, чтобы отменить устаревший запрос декодирования. Возвращаемый Promise по-прежнему разрешается полным waveform после нормального завершения декодирования. Добавлен пример.
  • [НОВОЕ] В расширенные настройки JSplitter добавлен параметр «Формат заголовка статистики воспроизведения». Он задаёт выражение Title Formatting, используемое для идентификации треков во внутреннем индексе статистики воспроизведения JSplitter, и позволяет изменить схему сопоставления для библиотек, где стандартного идентификатора $lower(%artist% - %title%) недостаточно. Изменение настройки требует перезапуска foobar2000.
  • [ОБНОВЛЕНИЕ] Расширен fb.ShowPictureViewer. Помимо непосредственного открытия изображения по пути к файлу, теперь он может принимать FbMetadbHandle и опциональный тип обложки альбома. В этом варианте foobar2000 самостоятельно находит и открывает требуемое изображение, включая как встроенные, так и внешние обложки.
  • [НОВОЕ] Добавлены API выбора звуковых потоков для мультимедийных файлов с несколькими потоками. fb.GetAudioStreams перечисляет все звуковые потоки, предоставляемые активным входным декодером, и возвращает для каждого полные данные FbFileInfo вместе с индексом потока, состоянием потока по умолчанию и текущим пользовательским выбором. fb.SetAudioStream сохраняет выбранный поток для трека и, если применяется к воспроизводимому в данный момент элементу, перезапускает воспроизведение так, чтобы новый поток применился немедленно с продолжением примерно с текущей позиции. Выбор потоков использует штатный input stream selector foobar2000, а SetAudioStream требует foobar2000 2.0 или новее.
  • [ИСПРАВЛЕНИЕ] Исправлена обработка сохранённых компоновок JSplitter, содержащих ссылки на UI Elements из компонентов, которые больше не установлены или временно недоступны. Отсутствующие дочерние элементы теперь обрабатываются безопасно и представлены заглушкой UI Element not found вместо неправильного восстановления или инициализации панели.
  • [ИСПРАВЛЕНИЕ] Исправлено периодическое зависание при перезапуске foobar2000 после обновления или удаления используемого в данный момент пакета скриптов. Перезапуск теперь запрашивается только после полного закрытия Package Manager и диалога настройки панели, что предотвращает зависание завершения работы во вложенном модальном цикле сообщений.
  • [ОБНОВЛЕНИЕ] Движок редактора исходного кода обновлён до Scintilla 5.6.7.

Версия 4.2.1 [21.09.2026]
  • [НОВОЕ] Добавлен API BroadcastChannel для асинхронного обмена данными между панелями JSplitter и Worker. Экземпляры с одинаковым именем канала могут обмениваться сообщениями с использованием structured clone, не разделяя между realm живые JavaScript-значения. Для нового кода BroadcastChannel рекомендуется вместо устаревшего синхронного механизма window.NotifyOthers; существующий API сохранён для совместимости.
  • [НОВОЕ] Добавлен utils.IsOS64Bit для определения того, является ли сама Windows 64-битной, независимо от архитектуры запущенного процесса foobar2000.
  • [НОВОЕ] Добавлен utils.SystemInfo, возвращающий снимок системной информации: название и номер сборки Windows, архитектуру ОС, общий и доступный объём физической памяти, использование private working set процессом foobar2000, а также информацию о dedicated/local video memory графического адаптера, наиболее активно используемого процессом foobar2000. Информация о VRAM включает имя выбранного адаптера, объём выделенной видеопамяти, текущий video-memory budget Windows для процесса и текущее использование local video memory процессом.
  • [НОВОЕ] Добавлены API с повторно используемыми PCM-буферами для обработки аудио в реальном времени. FbAudioChunk.CopyDataTo копирует аудиосэмплы в предоставленный вызывающей стороной Float32Array, а fb.GetAudioChunkTo записывает данные визуализации непосредственно в повторно используемый Float32Array, не создавая промежуточный FbAudioChunk или JavaScript-массив сэмплов. Поведение существующих fb.GetAudioChunk и FbAudioChunk.Data не изменено для сохранения совместимости. Новые API значительно уменьшают количество временных аллокаций и нагрузку на сборщик мусора в постоянно работающих визуализаторах, например анализаторах спектра.
  • [НОВОЕ] Добавлен utils.GetWaveformAsync для асинхронного декодирования аудиотрека в амплитудную огибающую фиксированного размера. Можно анализировать как весь трек, так и заданный временной диапазон. Метод возвращает линейные значения амплитуды 0.0..1.0 в виде Float32Array и доступен как в панели, так и в Worker. Точки waveform вычисляются из усреднённых локальных пиков сэмплов без нормализации результата относительно самого громкого участка трека.
  • [ИСПРАВЛЕНО] Переработан backend таймеров с удалением синхронных ожиданий при координации timer thread. Такие ожидания могли без необходимости блокировать выполнение и в некоторых случаях приводить к заметным задержкам или зависаниям во время инициализации панели, завершения её работы и других операций, связанных с таймерами. Планирование и остановка таймеров теперь выполняются без блокировки вызывающего потока.
  • [ИСПРАВЛЕНО] Исправлен учёт выделений памяти, используемый сборщиком мусора. Восстановлен триггер GC по количеству аллокаций и добавлен запас безопасности при приближении к лимиту heap, уменьшающий риск резкого превышения заданного максимального размера heap до того, как сборщик мусора успеет отработать.
  • [ИСПРАВЛЕНО] Исправлена обработка параметров по умолчанию при создании объектов D2DStrokeStyle. Явное создание теперь использует те же значения по умолчанию, что и сокращённая форма задания stroke style.
  • [ОБНОВЛЕНИЕ] Команды Open component folder и Open documentation в скрытом разделе JSplitter главного меню теперь всегда доступны, даже если в данный момент ни одна панель JSplitter не имеет клавиатурного фокуса.

Версия 1.0 [20.03.2018]
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев


  • −

Сообщение #521 clip » 12.08.2026, 19:49

LUR:Вроде читает...
А вы попрбуйте удалить рейтинг или поставить новый - %smp_rating% - это база , где хозяин SMP панель, а нам нужна своя , например - %jsplitter_rating%

Т. е. через %smp_rating% вы прочитали рейтинг, записанный в БД JSpitter ?
Проведите простой эксперимент, через плагин "flowin" ( у них всех есть "rating.js") - в foo_jscript_panel есть рабочая база %jsp_rating%, в foo_spider_monkey_panel есть рабочая база %smp_rating%, а в JSplitter - ее нет ?
clip
Репутация: 1
С нами: 5 лет 7 месяцев

  • −

Сообщение #522 LUR » 12.08.2026, 21:52

clip:Т. е. через %smp_rating% вы прочитали рейтинг, записанный в БД JSpitter ?
ну я не юзал этот функционал просто. не забывайте, что JSplitter основан на SMP, так что это просто его наследие. возможно переименую переменные.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #523 clip » 13.08.2026, 10:16

LUR:возможно переименую переменные
Главное - не забыть зарегистрировать в ядре переменную TitleFormat, если конечно появиться желание исправить этот баг
clip
Репутация: 1
С нами: 5 лет 7 месяцев

  • −

Сообщение #524 LUR » 21.08.2026, 14:05

Версия 4.1.14 [21.08.2026]

  • [ОШИБКА] СЕРЬЕЗНЫЕ ИЗМЕНЕНИЯ!!! Переименованы переменные %smp_*% в %jspliter_*% (как в самом компоненте, так и в примерах), чтобы избежать конфликта со Spider Monkey Panel, а именно:
    smp_playcount → jsplitter_playcount
    smp_loved → jsplitter_loved
    smp_first_played → jsplitter_first_played
    smp_last_played → jsplitter_last_played
    smp_rating → jsplitter_rating
  • [ОШИБКА] Документация: исправлена ​​функция vol2pos в Helpers.js
  • [ОШИБКА] Документация: уточнено поведение активного устройства fb.GetOutputDevices
  • [ОБНОВЛЕНИЕ] Обновлен движок JS до SpiderMonkey 140.14.0esr
  • [ОБНОВЛЕНИЕ] Обновлен редактор исходного кода до Scintilla 5.6.6
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #525 LUR » 27.08.2026, 20:03

Версия 4.1.15 [27.08.2026]

  • [ОШИБКА] ВАЖНОЕ ИЗМЕНЕНИЕ!!! plman.MovePlaylistSelection и plman.MovePlaylistSelectionV2 больше не создают резервную копию для отмены действия. Скрипты, требующие поддержки отмены, должны явно вызывать plman.UndoBackup перед перемещением элементов плейлиста, что соответствует другим действиям изменения содержимого плейлиста.
  • [ФУНКЦИЯ] Добавлен plman.ReorderPlaylistItems
  • [ФУНКЦИЯ] Добавлены gdi.PushClip/PopClip и d2d.PushClip/PopClip
  • [ФУНКЦИЯ] Диалог utils.ColourPicker расширен дополнительными элементами управления:
    • HEX: значение цвета RRGGBB
    • Alpha: альфа-компонент
    • Copy ARGB: кнопка для копирования текущего значения цвета в формате 0xAARRGGBB
  • [ФУНКЦИЯ] Добавлен window.external.dialogWindow для HTML-диалогов, созданных с помощью utils.ShowHtmlDialog, что позволяет использовать собственный хэндл окна диалога с вложенными модальными диалогами.
  • [ФУНКЦИЯ] Обновлена ​​обработка владения модальными диалогами для utils.ColourPicker, utils.FontPicker, utils.InputBox и utils.ShowHtmlDialog. Параметр window_id теперь используется в качестве собственного хэндла окна-владельца (HWND) вместо игнорирования, что позволяет диалоговым окнам, открытым из utils.ShowHtmlDialog, корректно принадлежать HTML-диалогу через window.external.dialogWindow.
  • [ФУНКЦИЯ] Добавлен utils.RecyclePath для перемещения файлов и каталогов в корзину (см. документацию)
  • [ФУНКЦИЯ] Переход на новый генератор документации и публикация API онлайн по адресу https://dima-lur.github.io/jsplitter/.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #526 LUR » 30.08.2026, 19:40

Версия 4.1.16 [30.08.2026]

  • [ОШИБКА] Исправлено падение при вычислении статистических полей JSplitter (например, %jsplitter_rating%) в параллельном title formatting. Причиной была гонка при ленивой инициализации внутреннего объекта title format.
  • [ФУНКЦИЯ] Добавлен необязательный параметр window_id для указания нативного окна-владельца (HWND) в:
  • [ФУНКЦИЯ] Добавлены FbMetadbHandleList.Reverse и FbMetadbHandleList.Shuffle для перестройки коллекции хэндлов в обратном и случайном порядке
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • 1

Сообщение #527 LUR » 03.09.2026, 19:50

Версия 4.1.17 [03.09.2026]

  • [ОШИБКА] Исправлена работа вложенных gdi.PushClip/PopClip и d2d.PushClip/PopClip. Состояния clipping теперь хранятся в стеке и корректно восстанавливаются при вложении нескольких областей отсечения.
  • [ФУНКЦИЯ] Добавлены GdiBitmap.GetThemeColourSchemeJSON и D2DBitmap.GetThemeColourSchemeJSON. Метод анализирует цвета bitmap с помощью взвешенного K-means++ в OKLab и возвращает согласованную цветовую схему интерфейса из пяти ролей: фон, текст, фон/акцент воспроизводимого трека, рамка фокуса и фон выделения. Размер палитры может быть задан вызывающей стороной.
  • [ОБНОВЛЕНИЕ] Переработан API performance для более точного соответствия поведению Web Performance / User Timing / Performance Timeline. Добавлены стандартные формы и опции mark и measure, поддержка повторяющихся mark/measure entries, упорядоченные запросы к timeline, улучшено поведение PerformanceObserver и добавлено статическое свойство PerformanceObserver.supportedEntryTypes, при этом существующие расширения JSplitter сохранены для совместимости. Добавлен пример использования Performance API.
  • [ФУНКЦИЯ] Добавлены нативные функции для работы с файловой системой (с примером):
  • [ФУНКЦИЯ] Добавлен fb.GetLibraryRoots, возвращающий уникальные корневые пути Media Library, определённые по текущему содержимому библиотеки, без необходимости реконструировать их в JavaScript.
  • [ОБНОВЛЕНИЕ] Расширен пример utils.ShowHtmlDialog: теперь он демонстрирует передачу данных и callback-функций между JavaScript панели и HTML-диалогом, включая использование window.external.dialogWindow для корректного назначения владельца нативным диалогам, открываемым из HTML.
  • [ОБНОВЛЕНИЕ] Улучшена генерируемая документация API: добавлено постоянное сворачиваемое дерево навигации по членам API и глобальный поиск по API.
  • [ОБНОВЛЕНИЕ] JS-движок обновлён до SpiderMonkey 140.15.0esr
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • 1

Сообщение #528 LUR » 16.09.2026, 08:06

Версия 4.2.0 beta 1[16.09.2026]

  • [НОВОЕ] Добавлен API Worker для выполнения JavaScript в фоновых потоках. Worker'ы поддерживают обмен сообщениями, существующие API JSplitter там, где это применимо, внеэкранный рендеринг GDI/Direct2D, structured clone и передачу владения объектами, загрузку внешних файлов скриптов и include. Чтобы эффективно использовать новый API, настоятельно рекомендуется внимательно ознакомиться с документацией.
  • [ОБНОВЛЕНИЕ] НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ! Полностью переработан window.JsMemoryStats: введена новая модель статистики памяти, переименованы поля и добавлена информация об использовании памяти Worker'ами текущей панели.
  • [ОБНОВЛЕНИЕ] Переработаны настройки сборки мусора в разделе Advanced > Performance > GC. Автоматическая настройка в зависимости от доступной системной памяти удалена; теперь лимиты heap и параметры GC задаются явно и имеют фиксированные значения по умолчанию: Main thread maximum heap size — 1024 MB, Worker maximum heap size — 256 MB на каждый Worker, Heap growth before GC — 64 MB, External memory growth before GC — 256 MB. Благодаря этому ограничения памяти и поведение GC становятся предсказуемыми, а при необходимости каждый параметр можно настраивать независимо. Параметры роста heap и external memory применяются как к главному потоку, так и отдельно к каждому Worker.
  • [НОВОЕ] Добавлена опция Use high-resolution timers в разделе Advanced > Performance, по умолчанию отключённая. При её включении короткие задержки setTimeout и setInterval могут планироваться значительно ближе к запрошенным значениям вместо ограничения стандартной гранулярностью таймеров Windows. Это может улучшить плавность анимаций на мониторах с высокой частотой обновления и работу другого кода, чувствительного к точности таймингов. При этом существующие скрипты, неявно рассчитывающие на более грубую гранулярность таймеров, могут вести себя иначе после включения этой опции, поскольку callback-и станут способны выполняться заметно чаще, чем раньше. Например, анимация или другое состояние, изменяемое на каждом callback-е, а не на основе реально прошедшего времени, может начать развиваться быстрее, а нагрузка на CPU — увеличиться. Поэтому при высокой нагрузке поток рендеринга (main thread) может испытывать заметные тормоза, а существующему коду может потребоваться адаптация под этот backend таймеров. Поддерживается только начиная с Windows 10 версии 1803.
  • [НОВОЕ] Добавлено read-only свойство utils.HighResolutionTimersEnabled, доступное как в panel, так и в Worker realm. Оно позволяет скриптам определить, действительно ли активен backend высокоточных таймеров, и при необходимости адаптировать стратегию планирования и yield. Значение основано на настройке Advanced Preferences > Performance > Use high-resolution timers, но отражает фактическое состояние во время выполнения, а не только состояние флажка: свойство возвращает true только если опция включена и текущая версия Windows поддерживает high-resolution waitable timers; во всех остальных случаях возвращается false.
  • [НОВОЕ] on_paint расширен фактическим прямоугольником обновления: on_paint(gr, x, y, width, height). Существующие обработчики on_paint(gr) остаются полностью совместимыми. Это особенно полезно для панелей с единым host'ом, содержащих несколько неперекрывающихся областей интерфейса: скрипт может не отрисовывать части панели, которые не пересекаются с текущим прямоугольником обновления.
  • [НОВОЕ] В главное меню добавлен скрытый раздел JSplitter, доступный через Shift+Click по меню File. Раздел содержит почти все команды из контекстного меню JSplitter и действует на панель JSplitter, которая в данный момент имеет клавиатурный фокус. Поскольку это обычные команды главного меню, им также можно назначать произвольные горячие клавиши в настройках foobar2000.
  • [НОВОЕ] Добавлен window.ShowPanelList для открытия списка дочерних панелей текущей панели.
  • [НОВОЕ] Добавлен window.IsFocused, позволяющий определить, имеет ли текущая панель JSplitter клавиатурный фокус.
  • [НОВОЕ] Добавлено свойство utils.Is64Bit для определения архитектуры текущего процесса — x86 или x64.
  • [ИСПРАВЛЕНИЕ] Исправлено отсутствие визуального бейджа на JSplitter при импорте темы в DUI.
  • [ИСПРАВЛЕНИЕ] Регрессия из v4.1.15: скрытые панели DUI не получали уведомление о необходимости обновить своё содержимое.
  • [ИСПРАВЛЕНИЕ] Из документации удалено описание API плагина UIHacks (foo_ui_hacks), поскольку этот API не является частью API JSplitter.
  • [ОБНОВЛЕНИЕ] Удалено сообщение D2D initialization SUCCESS из консоли.
  • [ОБНОВЛЕНИЕ] Улучшен пример complete/musicbrainz: добавлено ручное обновление, более надёжное кэширование MusicBrainz и обработка асинхронных запросов, ограничение частоты запросов, а также более устойчивый разбор релизов и ссылок.
  • [НОВОЕ] Добавлена поддержка переиспользуемых стилей линий Direct2D с настройкой концов линий, соединений сегментов, типа штриха, miter limit, смещения штриха и пользовательских штриховых шаблонов. Все существующие методы рисования Direct2D, ранее принимавшие стиль линии, теперь могут использовать общий объект D2DStrokeStyle. Документация обновлена и добавлен новый наглядный пример.
  • [ОБНОВЛЕНИЕ] JavaScript-движок обновлён до SpiderMonkey 140.16.0esr.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #529 clip » 16.09.2026, 15:21

LUR, приветствую
После установки JSplitter 3.9.0 (русская) в фубар 2.25 (с интегрированным в ядро UI Hacks - в общем ваш .exe - файл) - стали вылетать панели с аналогичной ошибкой, например в строке

gr.DrawString(this.date, gdi.Font("Rain Tungsten Medium",38,1), RGB(103,140,167), year_x, grp_y-8, year_w, group.nbrows*row.h-1, lc_stringformat);

Font failed:
WinAPI error:
CreateFont failed with error (0x57):
The parameter is incorrect.

File: <main>
Line: 1189, Column: 46
Stack trace:
item/this.draw@<main>:1189:46
on_paint@<main>:2271:28

До последней версии JSplitter Все работало без проблем
P.S. Да и UI Hacks все шрифты загружает нормально
clip
Репутация: 1
С нами: 5 лет 7 месяцев

  • −

Сообщение #530 LUR » 17.09.2026, 11:01

clip, версия Windows какая? какая разрядность? пришлите мне свою конфигурацию полностью куда-нибудь. у меня такое не выскакивает нигде
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #531 clip » 17.09.2026, 13:06

LUR:у меня такое не выскакивает

Оно вот так просто и не выскакивает. Строка, приведенная мной для примера с ошибкой, взята из плейлиста. Панель вылетает, например, при активном скроллинге плейлиста. И там похоже после обновления по разному реагирует на разные шрифты
INFO
https://www.upload.ee/files/19762838/INFO.png.html
clip
Репутация: 1
С нами: 5 лет 7 месяцев

  • −

Сообщение #532 yeyo » 17.09.2026, 13:15

LUR:Версия 4.2.0 beta 1[16.09.2026]
If you continue to play for several hours or longer, the memory usage will become larger and larger.
Memory reclamation doesn't seem to work?
yeyo
Репутация: 1
С нами: 4 года

  • −

Сообщение #533 LUR » 17.09.2026, 21:53

clip, я ж попросил "пришлите мне свою конфигурацию полностью куда-нибудь". мне нужно воспроизвести, а так я тыкаю пальцем в небо. я даже скачал этот шрифт, у меня он рисуется и все.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #534 LUR » 18.09.2026, 06:50

yeyo:If you continue to play for several hours or longer, the memory usage will become larger and larger.
I think I found the cause; it will be fixed in the next version.

Добавлено спустя 11 минут 44 секунды:
clip:Оно вот так просто и не выскакивает.
Все, до меня дошло, что происходит. Вам придется изменить скрипт и вынести создание gdi.Font из on_paint. Во-первых это тупо плохой паттерн создавать GDI объекты в on_paint, тут однозначно версия с исчерпанием GDI handles и она вполне серьезная, у меня как-то был баг в JSplitter самом, что я на каждое рисование создавал GDI объект (регион) и не освобождал его, так потом народ ловил баги с исчерпанием дескрипторов, это может проявляться разными способами, например как у вас: просто нельзя создать объект. Это сейчас у вас выстрелило только потому, что в 4.2.0 изменился коренным образом учет используемой памяти. Раньше был один триггер для сборки мусора по количеству выделений памяти, и в 4.2.0 он не попал ошибочно. Исправлю в следующей версии, скорее всего и ваша ошибка уйдет, но все равно лучше перенесите создание шрифта.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #535 LUR » 21.09.2026, 05:20

Версия 4.2.1 [21.09.2026]

  • [НОВОЕ] Добавлен API BroadcastChannel для асинхронного обмена данными между панелями JSplitter и/или Worker. Экземпляры с одинаковым именем канала могут обмениваться сообщениями с использованием structured clone, не разделяя между realm живые JavaScript-значения. Для нового кода BroadcastChannel рекомендуется вместо устаревшего синхронного механизма window.NotifyOthers; существующий API сохранён для совместимости.
  • [НОВОЕ] Добавлен utils.IsOS64Bit для определения того, является ли сама Windows 64-битной, независимо от архитектуры запущенного процесса foobar2000.
  • [НОВОЕ] Добавлен utils.SystemInfo, возвращающий снимок системной информации: название и номер сборки Windows, архитектуру ОС, общий и доступный объём физической памяти, использование private working set процессом foobar2000, а также информацию о dedicated/local video memory графического адаптера, наиболее активно используемого процессом foobar2000. Информация о VRAM включает имя выбранного адаптера, объём выделенной видеопамяти, текущий video-memory budget Windows для процесса и текущее использование local video memory процессом.
  • [НОВОЕ] Добавлены API с повторно используемыми PCM-буферами для обработки аудио в реальном времени. FbAudioChunk.CopyDataTo копирует аудиосэмплы в предоставленный вызывающей стороной Float32Array, а fb.GetAudioChunkTo записывает данные визуализации непосредственно в повторно используемый Float32Array, не создавая промежуточный FbAudioChunk или JavaScript-массив сэмплов. Поведение существующих fb.GetAudioChunk и FbAudioChunk.Data не изменено для сохранения совместимости. Новые API значительно уменьшают количество временных аллокаций и нагрузку на сборщик мусора в постоянно работающих визуализаторах, например анализаторах спектра.
  • [НОВОЕ] Добавлен utils.GetWaveformAsync для асинхронного декодирования аудиотрека в амплитудную огибающую фиксированного размера. Можно анализировать как весь трек, так и заданный временной диапазон. Метод возвращает линейные значения амплитуды 0.0..1.0 в виде Float32Array и доступен как в панели, так и в Worker. Точки waveform вычисляются из усреднённых локальных пиков сэмплов без нормализации результата относительно самого громкого участка трека.
  • [ИСПРАВЛЕНО] Переработан backend таймеров с удалением синхронных ожиданий при координации timer thread. Такие ожидания могли без необходимости блокировать выполнение и в некоторых случаях приводить к заметным задержкам или зависаниям во время инициализации панели, завершения её работы и других операций, связанных с таймерами. Планирование и остановка таймеров теперь выполняются без блокировки вызывающего потока.
  • [ИСПРАВЛЕНО] Исправлен учёт выделений памяти, используемый сборщиком мусора. Восстановлен триггер GC по количеству аллокаций и добавлен запас безопасности при приближении к лимиту heap, уменьшающий риск резкого превышения заданного максимального размера heap до того, как сборщик мусора успеет отработать.
  • [ИСПРАВЛЕНО] Исправлена обработка параметров по умолчанию при создании объектов D2DStrokeStyle. Явное создание теперь использует те же значения по умолчанию, что и сокращённая форма задания stroke style.
  • [ОБНОВЛЕНИЕ] Команды Open component folder и Open documentation в скрытом разделе JSplitter главного меню теперь всегда доступны, даже если в данный момент ни одна панель JSplitter не имеет клавиатурного фокуса.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • 1

Сообщение #536 clip » 23.09.2026, 13:22

LUR:вынести создание gdi.Font из on_paint
LUR, для отчетности
3.9.0 - после выноса gdi.Font из on_paint ошибка ушла
3.9.1 - ошибки нет хоть с выносом gdi.Font, хоть без выноса
clip
Репутация: 1
С нами: 5 лет 7 месяцев

  • −

Сообщение #537 LUR » 25.09.2026, 23:38

clip:3.9.0 - после выноса gdi.Font из on_paint ошибка ушла
3.9.1 - ошибки нет хоть с выносом gdi.Font, хоть без выноса
Да, все как и ожидалось. Спасибо.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев

  • −

Сообщение #538 yeyo » Вчера, 13:17

@LUR
Can you add the fb method of “Stream Selector”, which looks like: fb.GetOutputDevices and fb.SetOutputDevice.
This allows selection in the script menu without showing the selection on the toolbar.
Вложения
Stream Selector.mp4
(686.29 КБ) Скачиваний: 5
yeyo
Репутация: 1
С нами: 4 года

  • −

Сообщение #539 LUR » Вчера, 15:22

Версия 4.2.2 [28.09.2026]

  • [НОВОЕ] Добавлены потоковые API файлового ввода-вывода для обработки больших файлов без загрузки всего их содержимого в память JavaScript. utils.OpenTextReader и utils.OpenTextWriter обеспечивают построчное чтение и запись текста с выбором кодировки, а utils.OpenBinaryReader и utils.OpenBinaryWriter позволяют читать и записывать двоичные данные через повторно используемые буферы Uint8Array. API доступны как в панели, так и в Worker.
  • [ОБНОВЛЕНИЕ] Расширена поддержка кодировок в utils.ReadTextFile и utils.WriteTextFile. Чтение текста теперь единообразно поддерживает UTF-8, UTF-16LE/BE, UTF-32LE/BE и поддерживаемые кодовые страницы Windows, включая автоматическое определение кодировки при соответствующем запросе. WriteTextFile теперь также принимает кодовую страницу для выходного файла вместо ограничения только UTF-8 и может опционально записывать BOM для UTF-8, UTF-16 и UTF-32. Для совместимости существующие значения по умолчанию для UTF-8 не изменены.
  • [НОВОЕ] Добавлен Worker.RunAsync для удобного однократного выполнения фоновой работы без ручного создания и управления постоянным Worker. Каждый вызов создаёт временный полноценный Worker realm/поток, структурно клонирует переданные аргументы в него, выполняет пользовательский синхронный или асинхронный JavaScript callback, структурно клонирует результат обратно в панель и после этого автоматически завершает Worker. Метод предназначен для достаточно крупных изолированных задач, например обработки больших файлов, где отдельный протокол обмена сообщениями с Worker лишь добавлял бы лишний шаблонный код.
  • [НОВОЕ] Добавлен нативный SQLite API, доступный как в панели, так и в Worker. utils.OpenDatabase открывает файловые базы данных или базы в памяти и возвращает объект SQLiteDatabase с прямым выполнением SQL, параметризованными запросами, транзакциями и повторно используемыми подготовленными выражениями через SQLiteStatement. Значения JavaScript могут безопасно передаваться как SQL-параметры, строки результата возвращаются как обычные JavaScript-объекты, а значения SQLite BLOB представлены как Uint8Array. Относительные пути к базе используют разрешение путей относительно скрипта JSplitter; также поддерживаются базы :memory:.
  • [НОВОЕ] Добавлен utils.LoadFont для загрузки пользовательских TrueType/OpenType-шрифтов непосредственно из пакетов скриптов без их установки в Windows. Загруженные шрифты являются приватными для процесса foobar2000, становятся доступны API шрифтов GDI и Direct2D и используются совместно панелями и Worker. Относительные пути разрешаются относительно текущего скрипта JSplitter, благодаря чему шрифты можно распространять вместе с основным скриптом, подключаемыми файлами или исходниками Worker. Повторная загрузка одного и того же файла безопасна, а загруженные шрифты остаются доступны на протяжении всего времени работы процесса foobar2000.
  • [НОВОЕ] Добавлен API fb.Window для управления главным окном foobar2000 непосредственно из скриптов панели. API предоставляет текущую позицию и внешний размер окна, позволяет перемещать и изменять его размер, переключаться между стандартной рамкой, режимом без заголовка и режимом без рамки, входить и выходить из полноэкранного режима, а также задавать ограничения минимального и максимального размера. В Default User Interface также можно скрывать и восстанавливать главное меню и строку состояния. Настройки применяются непосредственно к главному окну foobar2000 и могут динамически изменяться во время работы. Начиная с этого выпуска window.FoobarWindowX, window.FoobarWindowY, window.FoobarWindowWidth, window.FoobarWindowHeight и window.MoveFoobarWindow устарели и будут удалены в будущих версиях. В новом коде следует использовать свойства геометрии fb.Window и Move.
  • [ОБНОВЛЕНИЕ] utils.GetWaveformAsync расширен опциональным callback on_progress. Готовые диапазоны огибающей waveform теперь могут передаваться ещё во время декодирования, позволяя интерфейсу waveform появляться постепенно, не дожидаясь завершения декодирования всего трека. Callback получает каждый новый диапазон Float32Array вместе с его смещением в выходном массиве и может вернуть false, чтобы отменить устаревший запрос декодирования. Возвращаемый Promise по-прежнему разрешается полным waveform после нормального завершения декодирования. Добавлен пример.
  • [НОВОЕ] В расширенные настройки JSplitter добавлен параметр «Формат заголовка статистики воспроизведения». Он задаёт выражение Title Formatting, используемое для идентификации треков во внутреннем индексе статистики воспроизведения JSplitter, и позволяет изменить схему сопоставления для библиотек, где стандартного идентификатора $lower(%artist% - %title%) недостаточно. Изменение настройки требует перезапуска foobar2000.
  • [ОБНОВЛЕНИЕ] Расширен fb.ShowPictureViewer. Помимо непосредственного открытия изображения по пути к файлу, теперь он может принимать FbMetadbHandle и опциональный тип обложки альбома. В этом варианте foobar2000 самостоятельно находит и открывает требуемое изображение, включая как встроенные, так и внешние обложки.
  • [НОВОЕ] Добавлены API выбора звуковых потоков для мультимедийных файлов с несколькими потоками. fb.GetAudioStreams перечисляет все звуковые потоки, предоставляемые активным входным декодером, и возвращает для каждого полные данные FbFileInfo вместе с индексом потока, состоянием потока по умолчанию и текущим пользовательским выбором. fb.SetAudioStream сохраняет выбранный поток для трека и, если применяется к воспроизводимому в данный момент элементу, перезапускает воспроизведение так, чтобы новый поток применился немедленно с продолжением воспроизведения с текущей позиции. Выбор потоков использует штатный input stream selector плеера и требует foobar2000 2.0 или новее.
  • [ИСПРАВЛЕНИЕ] Исправлена обработка сохранённых layout JSplitter, содержащих ссылки на компоненты, которые больше не установлены или временно недоступны. Отсутствующие дочерние элементы теперь обрабатываются безопасно и представлены заглушкой UI Element not found вместо неправильного восстановления или инициализации панели.
  • [ИСПРАВЛЕНИЕ] Исправлено периодическое зависание при перезапуске foobar2000 после обновления или удаления используемого в данный момент пакета скриптов. Перезапуск теперь запрашивается только после полного закрытия Package Manager и диалога настройки панели, что предотвращает зависание завершения работы во вложенном модальном цикле сообщений.
  • [ОБНОВЛЕНИЕ] Движок редактора исходного кода обновлён до Scintilla 5.6.7.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 435
С нами: 13 лет 10 месяцев