Установка свойств окна X11 в Java - PullRequest
0 голосов
/ 02 февраля 2012

Я пишу приложение на Java (я признаю, что я начинающий Java-программист, но у меня есть опыт в других) и мне нужно иметь возможность явно задавать свойства окна X11.В частности, мне нужно иметь возможность установить свойство _NET_WM_STATE, чтобы менеджер окон знал, что дочернее окно является модальным.

Определение этого свойства можно увидеть здесь: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#id2578152

Это приложение имеет для написания на Java и будет работать исключительно на платформе Linux / X11поэтому переносимость даже не должна рассматриваться.При работе на стандартном ПК с Ubuntu модальность окна корректно обрабатывается.

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

Из моего исследования кажется, что Java не хочет устанавливать эти свойства.Я предполагаю, что это так, чтобы он мог обрабатывать модальность в рамках Java, чтобы он был одинаковым на разных платформах.

Я использовал xwininfo и xprop, чтобы увидеть, что Java устанавливает в дочерних окнах, когда они модальные и немодальные.Похоже, что в свойствах окна X11 нет ничего, что отличало бы эти два типа окон.

Вот пример кода создания дочернего окна:

public class ChildDialog extends JDialog {

    static final long serialVersionUID = 2;

    public ChildDialog(JFrame frame, String title, boolean modal) {
        super(frame, title, modal);

        JPanel dgrid = new JPanel();
        dgrid.setLayout(new BoxLayout(dgrid, BoxLayout.Y_AXIS));
        dgrid.setBorder(BorderFactory.createLineBorder(Color.red, 3));
        JLabel label = new JLabel(title);
        JTextArea desc = new JTextArea("This is a child window.");
        desc.setBackground(label.getBackground());

        JButton close = new JButton("Close");
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        dgrid.add(label);
        dgrid.add(desc);
        dgrid.add(close);

        this.setSize(300, 200);
        this.add(dgrid);
        this.setVisible(true);
    }
}

Этот класс создается при нажатии кнопки в главном окне.Как это:

    JButton spawnChild = new JButton("Child Window");
    spawnChild.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            new ChildDialog(getSelf(), "Child Window", false);
        }
    });
    bgrid.add(spawnChild);

    JButton spawnModalChild = new JButton("Child Window (Modal)");
    spawnModalChild.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            new ChildDialog(getSelf(), "Child Window (Modal)", true);
        }
    });
    bgrid.add(spawnModalChild);

Есть идеи?

...