JSplitter v4.4.0 / 3.9.8 [06.11.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.

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

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

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

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.4.0 [06.11.2026]
  • [[url=http://]НОВОЕ[/url]] Добавлен новый API визуализаций, построенный на переиспользуемых источниках аудиоданных и рендерерах. Для правильного и эффективного использования API настоятельно рекомендуется ознакомиться с документацией и входящими в комплект примерами.
  • [ИСПРАВЛЕНИЕ] Исправлены некорректные границы окна при повторном запуске foobar2000 в развёрнутом состоянии с включённым режимом NoBorder. Теперь окно точно вписывается в рабочую область монитора, не выходя за её края.
  • [ИСПРАВЛЕНИЕ] Зона захвата для изменения размеров окна в режиме NoBorder уменьшена до системных значений SM_CXFRAME/SM_CYFRAME с учётом DPI, без дополнительного отступа рамки (обычно 4 px при 96 DPI). Это упрощает доступ к элементам управления у краёв окна.
  • [ИСПРАВЛЕНИЕ] Обработка изменения размеров окна у его краёв в режиме NoBorder больше не мешает текущим действиям мышью, например перетаскиванию ползунка полосы прокрутки. Обработчик больше не перехватывает движение мыши, пока удерживается кнопка мыши или активен захват мыши.
  • [НОВОЕ] Добавлена поддержка ввода положения и размеров дочерних панелей в процентах в диалоге списка панелей и в режиме редактирования заголовков.
  • [ИСПРАВЛЕНИЕ] Исправлено несоответствие полос прокрутки для панелей, выходящих за пределы видимой области, текущей теме foobar2000.
  • [НОВОЕ] Добавлен доступ к отдельному окну Менеджера пакетов из главного меню foobar2000.
  • [ОБНОВЛЕНИЕ] Добавлена поддержка тёмной темы для всплывающих подсказок.
  • [НОВОЕ] Добавлено доступное только для чтения свойство window.HostWindowTitle, возвращающее заголовок ближайшего родительского контейнера с непустым заголовком.
  • [ОБНОВЛЕНИЕ] Расширен список альтернативных названий стран, распознаваемых utils.GetCountryFlag, и добавлена поддержка трёхбуквенных кодов стран ISO 3166-1 alpha-3. Поддерживаемые названия и коды приведены в обновлённом файле countries.json.
  • [НОВОЕ] Добавлен метод utils.TextBox для ввода многострочного текста.
  • [НОВОЕ] Добавлена поддержка ввода через IME с функциями обратного вызова on_ime_start, on_ime_update и on_ime_end.
  • [ИСПРАВЛЕНИЕ] Исправлены инициализация статистики воспроизведения и обработка изменений выражения форматирования заголовков, используемого для идентификации треков. Теперь изменение этого выражения очищает существующую статистику воспроизведения JSplitter при следующем запуске. Само по себе обновление компонента не сбрасывает накопленную статистику.
  • [ИСПРАВЛЕНИЕ] Изменения переменных окружения, передаваемые через WM_SETTINGCHANGE, больше не вызывают лишнее глобальное обновление цветов и шрифтов. Это устраняет сильное мерцание и повторные перерисовки в конфигурациях с большим количеством вложенных панелей JSplitter, не затрагивая обработку других изменений системных параметров.
  • [ОБНОВЛЕНИЕ] Движок JavaScript обновлён до SpiderMonkey 153.6.0esr.
  • [ОБНОВЛЕНИЕ] Движок редактора исходного кода обновлён до Scintilla 5.6.9.

Версия 4.3.4 [07.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлена ошибка инвалидации шрифта GDI+, загруженного с помощью utils.LoadFont. Обращение к свойству GdiFont.Name могло инвалидировать внутренний объект шрифта GDI+ и приводить к падению foobar2000 при последующих операциях рисования GDI+, например GdiGraphics.DrawString.
  • [ИСПРАВЛЕНИЕ] Исправлено падение, которое могло происходить при выходе из foobar2000 во время финализации объектов JavaScript. Реэнтерабельная обработка оконных сообщений при освобождении COM-объектов могла попытаться выполнить ожидающие задания JavaScript после того, как контекст JavaScript уже был уничтожен. Жизненный цикл завершения работы и очистка ресурсов также усилены для защиты от реэнтерабельной финализации.
  • [ОБНОВЛЕНИЕ] Расширен метод MenuObject.SetDefault: теперь в качестве параметра можно передавать не только ID пункта, но и другой объект MenuObject, что позволяет назначить само подменю пунктом по умолчанию.

Версия 4.3.3 [06.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлено некорректное преобразование component-specific locations (например, 3dydfy://) в пути файловой системы в fb.AddLocationsAsync и plman.AddLocations. Относительные пути к файлам по-прежнему разрешаются относительно текущего скрипта, include-файла или файла Worker.
  • [ИСПРАВЛЕНИЕ] Удалён завершающий разделитель пути из %jsplitter_fb2k% и %jsplitter_fb2k_profile%, чтобы они соответствовали ожидаемому синтаксису путей Title Formatting и не создавали двойные разделители при составлении путей.

Версия 4.3.2 [05.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлена визуальная «белая вспышка», которая всегда появлялась при запуске foobar2000 независимо от текущей темы. Теперь JSplitter самостоятельно отрисовывает начальный фон панели в соответствии с текущей темой интерфейса до начала выполнения скрипта.
  • [ОБНОВЛЕНИЕ] Убраны ненужные hit testing и обработка курсора в режиме FbWindow.FrameStyle NoBorder в случаях, когда такое поведение неприменимо (например, когда MinWidth == MaxWidth).
  • [НОВОЕ] Добавлены методы FbTitleFormat.EvalActivePlaylistItem и FbTitleFormat.EvalPlaylistItem для вычисления выражений Title Formatting в контексте плейлиста, включая специфичные для плейлиста поля, такие как %list_index% и %list_total%.
  • [НОВОЕ] Добавлен метод MenuObject.SetDefault для назначения пункта меню по умолчанию, который отображается жирным шрифтом. Пункт по умолчанию можно переназначить повторным вызовом метода с другим ID.

Версия 4.3.1 [03.10.2026]
  • [НОВОЕ] Добавлены две глобальные переменные Title Formatting: %jsplitter_fb2k% и %jsplitter_fb2k_profile%, предоставляющие пути к каталогам установки и профиля foobar2000. Эти же значения доступны в качестве переменных окружения процесса. Добавлен отдельный раздел Title Formatting в документации с описанием всех переменных JSplitter.
  • [ОБНОВЛЕНИЕ] Метод FbWindow.SetPseudoCaption расширен необязательным параметром maximize_on_dblclk, позволяющим разворачивать и восстанавливать главное окно двойным щелчком по области псевдозаголовка.
  • [ОБНОВЛЕНИЕ] Унифицировано разрешение относительных файловых путей во всех поддерживаемых API, принимающих пути к файлам, включая скрипты панелей, подключаемые файлы и Workers. Относительные пути разрешаются относительно расположения вызывающего скрипта с последующим поиском в предусмотренных каталогах.
  • [НОВОЕ] Добавлено свойство window.ScriptInfo.Path, возвращающее полный файловый путь к основному скрипту панели в системном формате или пустую строку для скриптов, загружаемых из памяти.
  • [ИСПРАВЛЕНИЕ] Исправлено возможное падение в fb.ShowPictureViewer при невозможности открыть файл изображения, если его путь содержит фигурные скобки.

Версия 4.3.0 [02.10.2026]
  • [ОБНОВЛЕНИЕ] Движок JavaScript обновлён до SpiderMonkey 153.4.0esr.
  • [НОВОЕ] Добавлена поддержка ES-модулей. Файлы .mjs, выбранные в качестве файловых скриптов панели, теперь загружаются как ES-модули с поддержкой относительных статических импортов, вложенных и циклических зависимостей, именованных экспортов и экспорта по умолчанию, кеширования модулей, import.meta.url, путей с Unicode и корректной передачи ошибок при загрузке, разборе и выполнении модулей.
  • [ОБНОВЛЕНИЕ] foobar2000 SDK обновлён до версии от 2026-10-01.
  • [НОВОЕ] API FbWindow расширен системными командами для управления главным окном foobar2000: Minimize, Maximize, Restore и Close, а также свойствами IsMinimized и IsMaximized для проверки состояния окна.
  • [НОВОЕ] Добавлено свойство window.IsToolbar, позволяющее определить, размещена ли панель JSplitter на панели инструментов Columns UI.

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


  • −

Сообщение #561 LUR » 15.10.2026, 18:45

yeyo:When using the handwriting pad to input text, on_char could not be triggered, resulting in the inability to input letters into the input box.
Thanks for the report. I checked this and handwriting input is already delivered to on_char after the IME composition is committed (for example, by pressing Enter or closing the handwriting panel). What is currently not supported is live IME composition before it is committed. I'll look into whether composition support can be added cleanly.

Добавлено спустя 6 часов 7 минут:
yeyo:I found another problem. When jsplitter is nested with multiple layers of jsplitters and there are many jsplitter panels, even if these panels are all empty without code and the playback is stopped, the CPU will suddenly occupy a lot every few seconds or a period of time (observe the sudden jump in occupation in the task manager). When the default DUI has no jsplitter panels, the CPU basically remains at around 0% occupancy.

I tested a similar setup with many nested, empty JSplitter panels.
I can reproduce noticeable background CPU usage, but only when the panels are using D2D:
Код: Выделить всё
window.DrawMode = 1;
The reason is also clear from Process Explorer: each JSplitter panel running in D2D mode creates its own D2D/D3D device, and on my system each such device adds at least about 40 threads inside the NVIDIA user-mode graphics driver (nvwgf2umx.dll). Depending on the moment, the increase can be considerably higher. With many D2D panels (over 30), the process thread count therefore grows into the thousands, and the accumulated graphics-driver overhead becomes visible as background CPU usage which is hardly surprising for any application that already has over two thousand threads, even if they aren't particularly active and are simply waiting for work.
Anyway, in this case, it's driver activity, not the JSplitter's itself.
In a fresh GDI-only layout, where the panels never enable D2D, CPU usage remains effectively at 0% on my system. So in my tests the issue is specifically tied to having a large number of D2D panels.
BTW switching a panel back to:
Код: Выделить всё
window.DrawMode = 0;
does not destroy an already-created D2D device (cached). The device remains alive for the lifetime of the panel and is released only when the panel itself is destroyed, so the corresponding driver threads and resources remain as well.

So, if the graphics-driver overhead is a concern, I recommend enabling D2D only for panels that actually need it. There is normally no reason for every nested JSplitter panel or simple container panel to use DrawMode = 1. Panels that do not require D2D-specific rendering can remain in the default GDI mode.
What I do not know yet is whether your panels are actually using D2D. Could you please confirm:
  • approximately how many JSplitter panels are present;
  • whether they use window.DrawMode = 1
  • how high the CPU usage rises on your system;
  • and whether the same behavior occurs in a fresh layout where the panels have never enabled D2D.
If it also happens with panels that have only ever used GDI, then it is a different issue.

GDI (30 panels):

GDI.png


D2D (30 panels):

D2D.png
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #562 yeyo » 16.10.2026, 03:07

LUR:committed. I'll look into whether composition support can be added cleanly.
Looking forward to your modifications and improvements
LUR:If it also happens with panels that have only ever used GDI, then it is a different issue.
Thank you for your test. Yes, the same is true for GDI. I cleared all the code in all jsplitter panels (no other component panels were added), but there will still be a jump in CPU usage. I have a laptop with a 6700HQ CPU and a desktop computer with a 11600K CPU. Both have this problem, but the jump on the laptop is easier to see. Sometimes the jump will reach 5%+ usage. Of course, this is just an appearance. It would be best if the reason can be found.
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #563 LUR » 17.10.2026, 03:19

yeyo:Thank you for your test. Yes, the same is true for GDI. I cleared all the code in all jsplitter panels (no other component panels were added), but there will still be a jump in CPU usage. I have a laptop with a 6700HQ CPU and a desktop computer with a 11600K CPU. Both have this problem, but the jump on the laptop is easier to see. Sometimes the jump will reach 5%+ usage. Of course, this is just an appearance. It would be best if the reason can be found.

I could not reproduce this with GDI.
I have already investigated JSplitter's threading model, including its worker threads and thread pools, and with empty GDI panels there is simply no per-panel background activity that should periodically wake up and cause CPU spikes. In my tests, even with around 30 empty GDI JSplitter panels, the process keeps the normal thread set and CPU usage remains effectively at zero.
Because of that, the source of these spikes may be outside JSplitter itself — for example, in another component, the host application, or some interaction specific to the current configuration.
Also, when you say "a jump in CPU usage", please clarify exactly what you mean. Is there a constant elevated CPU load, or is it a short temporary spike that appears from time to time? If it is a spike, how often does it happen, how long does it last, and does it happen while the player is completely idle?
At this point I need a reproducible configuration to investigate further. Please provide the exact setup, including the list of installed components/plugins and the steps needed to reproduce the issue. Even better, if possible, provide a complete portable foobar2000 folder/archive containing the configuration, plugins, and the "empty panel" layout where the issue occurs.
The important part is that I need to know exactly how to reproduce the behavior. Without a reproducible setup or precise reproduction steps, there is currently nothing specific in JSplitter to trace further.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #564 yeyo » 18.10.2026, 04:41

LUR:Also, when you say "a jump in CPU usage", please clarify exactly what you mean. Is there a constant elevated CPU load, or is it a short temporary spike that appears from time to time? If it is a spike, how often does it happen, how long does it last, and does it happen while the player is completely idle?
It is not a continuous high usage, but an irregular spike (a few seconds or tens of seconds), which occurs when the playback is stopped or no songs or media libraries are added at all. I attach a test.fth file (all the default jsplitter panel, in the new When only the jsplitter component is installed on the installed foobar2000, switch with the layout that comes with fb in View-Layout-Quick Setting (observe). This fth may be meaningless to you. If it cannot be reproduced, please ignore this problem.

Добавлено спустя 4 часа 28 минут:
Hi,@LUR
I found the reason. My laptop has i7-6700HQ + GTX960M dual graphics cards. I ran foobar2000 under the integrated graphics, and the CPU stabbing problem disappeared. Running on GTX960M can reproduce the CPU stabbing problem, so this problem should be my case.
Вложения
Test.fth
(14.45 КБ) Скачиваний: 40
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #565 yeyo » Вчера, 15:10

@LUR
The last time I reported on the problem of white background flickering at startup, I had the impression that you used the dark and light colors of foobar2000 for processing. The test found that this would cause another problem. When the window mode is set to "NoBorder", when the window is restored from minimization, the jsplitter panel will be filled with the background color, causing the panel to flicker. It is recommended not to perform any filling and make it transparent, which should avoid this problem, right?

Phenomenon video:
https://drive.google.com/file/d/1Scig6B1OTsGbKJVik1m1uIq5gBqx3BFm/view?usp=sharing

https://drive.google.com/file/d/1uF06BXbEKgxi9ECfSYOHx7EB_Z4m_U9M/view?usp=sharing
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

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

yeyo,
The startup background fill is only meant to hide the initial white flash before the first valid frame. It should not normally be involved in minimize/restore.
However, seeing the foobar2000 background color does not necessarily mean that this fill is the cause. JSplitter is also a window container and handles child-window positioning, layout and repainting, so several parts of the restore sequence can produce the same visible effect.
I’ve already had a repaint-related report where a seemingly small fix actually made the behavior worse in other cases, so I’d rather not change this path based on the visual symptom alone.
Making the panel transparent would not be a safe general fix either, as transparent child windows have their own repaint-order and flicker issues.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #567 LUR » Сегодня, 06:53

Версия 4.4.0 [06.11.2026]

  • [НОВОЕ] Добавлен новый API визуализаций, построенный на переиспользуемых источниках аудиоданных и рендерерах. Для правильного и эффективного использования API настоятельно рекомендуется ознакомиться с документацией и входящими в комплект примерами.
  • [ИСПРАВЛЕНИЕ] Исправлены некорректные границы окна при повторном запуске foobar2000 в развёрнутом состоянии с включённым режимом NoBorder. Теперь окно точно вписывается в рабочую область монитора, не выходя за её края.
  • [ИСПРАВЛЕНИЕ] Зона захвата для изменения размеров окна в режиме NoBorder уменьшена до системных значений SM_CXFRAME/SM_CYFRAME с учётом DPI, без дополнительного отступа рамки (обычно 4 px при 96 DPI). Это упрощает доступ к элементам управления у краёв окна.
  • [ИСПРАВЛЕНИЕ] Обработка изменения размеров окна у его краёв в режиме NoBorder больше не мешает текущим действиям мышью, например перетаскиванию ползунка полосы прокрутки. Обработчик больше не перехватывает движение мыши, пока удерживается кнопка мыши или активен захват мыши.
  • [НОВОЕ] Добавлена поддержка ввода положения и размеров дочерних панелей в процентах в диалоге списка панелей и в режиме редактирования заголовков.
  • [ИСПРАВЛЕНИЕ] Исправлено несоответствие полос прокрутки для панелей, выходящих за пределы видимой области, текущей теме foobar2000.
  • [НОВОЕ] Добавлен доступ к отдельному окну Менеджера пакетов из главного меню foobar2000.
  • [ОБНОВЛЕНИЕ] Добавлена поддержка тёмной темы для всплывающих подсказок.
  • [НОВОЕ] Добавлено доступное только для чтения свойство window.HostWindowTitle, возвращающее заголовок ближайшего родительского контейнера с непустым заголовком.
  • [ОБНОВЛЕНИЕ] Расширен список альтернативных названий стран, распознаваемых utils.GetCountryFlag, и добавлена поддержка трёхбуквенных кодов стран ISO 3166-1 alpha-3. Поддерживаемые названия и коды приведены в обновлённом файле countries.json.
  • [НОВОЕ] Добавлен метод utils.TextBox для ввода многострочного текста.
  • [НОВОЕ] Добавлена поддержка ввода через IME с функциями обратного вызова on_ime_start, on_ime_update и on_ime_end.
  • [ИСПРАВЛЕНИЕ] Исправлены инициализация статистики воспроизведения и обработка изменений выражения форматирования заголовков, используемого для идентификации треков. Теперь изменение этого выражения очищает существующую статистику воспроизведения JSplitter при следующем запуске. Само по себе обновление компонента не сбрасывает накопленную статистику.
  • [ИСПРАВЛЕНИЕ] Изменения переменных окружения, передаваемые через WM_SETTINGCHANGE, больше не вызывают лишнее глобальное обновление цветов и шрифтов. Это устраняет сильное мерцание и повторные перерисовки в конфигурациях с большим количеством вложенных панелей JSplitter, не затрагивая обработку других изменений системных параметров.
  • [ОБНОВЛЕНИЕ] Движок JavaScript обновлён до SpiderMonkey 153.6.0esr.
  • [ОБНОВЛЕНИЕ] Движок редактора исходного кода обновлён до Scintilla 5.6.9.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев