Как управлять панелью задач из JavaFX через собственный код в LinuxJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как управлять панелью задач из JavaFX через собственный код в Linux

Сообщение Anonymous »

Я пытаюсь получить больше опыта с новой внешней функцией и API памяти в Java 22+. Лучший способ выучить новый API-это использовать его в проекте. Насколько я знаю, в Javafx нет «родной» поддержки. Есть некоторые библиотеки, такие как
fxtaskbarprogressbar < /em>, которые служат цели, но только для ОС Windows. И он использует «старый» нативный интерфейс Java (JNI). < /P>
После короткого исследования я нашел простую библиотеку GO
taskbar < /em>. Эта библиотека вдохновила меня попробовать переносить в Java для javafx.
Сначала я использовал jextract , чтобы получить привязки Java с нативными вызовами библиотеки:

Код: Выделить всё

jextract --output target/generated-sources/jextract -t "taskbar_test.gen" --include-function "XOpenDisplay" --include-function "XChangeProperty" --include-function "XFlush" --include-function "XCloseDisplay" /usr/include/X11/Xlib.h
Затем я создал простое приложение для имитации длительного процесса,
где я пытаюсь обновить прогресс на панели задач, вызывая метод
"XChangeProperty", который я нашел в документации X11:
https://www.x.org/releases/X11R7.7/doc/ ... geProperty
К сожалению, это не работает. Программа не аварийно завершает работу,
задача выполняется в фоновом режиме, но никаких обновлений на панели задач не происходит.
Вот код, который я создал:

Код: Выделить всё

package taskbar_test;

import com.sun.glass.ui.Window;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import taskbar_test.gen.Xlib_h;

import java.lang.foreign.Arena;
import java.lang.foreign.MemorySegment;
import java.lang.foreign.ValueLayout;

public class AppLinuxXlib extends Application {

@Override
public void start(Stage primaryStage) {
Button startButton = new Button("Start Long Running Task");

startButton.setOnAction(event -> {
final long rawHandle = Window.getWindows().getFirst().getRawHandle();
System.out.println(rawHandle);
// Create a long-running task
Task longTask = new Task() {
@Override
protected Void call() throws Exception {
System.out.println("Started");

try (var arena = Arena.ofConfined()) {
var NET_WM_XAPP_PROGRESS = arena.allocateFrom("NET_WM_XAPP_PROGRESS");
//                        var NET_WM_XAPP_PROGRESS_PULSE = arena.allocateFrom("NET_WM_XAPP_PROGRESS_PULSE");

MemorySegment x11Session = Xlib_h.XOpenDisplay(MemorySegment.NULL);
System.out.println(x11Session);

// Prepare the progress data
MemorySegment initData = arena.allocateFrom(ValueLayout.JAVA_INT, 0);
Xlib_h.XChangeProperty(x11Session,                    // display
MemorySegment.ofAddress(rawHandle).address(), // window
NET_WM_XAPP_PROGRESS.address(),               // property
6,                                            // type
32,                                           // format
0,                                            // mode PropModeReplace=0
initData,                                     // data
1);                                           // nelements
Xlib_h.XFlush(x11Session);

System.out.println("Countdown started");

// Set the taskbar progress
for (int i = 0; i 

Подробнее здесь: [url]https://stackoverflow.com/questions/79354536/how-to-manage-taskbar-from-javafx-via-native-code-in-linux[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»