/* Copyright (c) 2008 Stefan Endrullis, All Rights Reserved * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * <p/> * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package jnacontrib.x11.demos; import jnacontrib.x11.api.X; import javax.swing.*; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; /** * Demonstrates some possibilities on your X Window System. * * @author Stefan Endrullis */ public class XDesktopDemo extends JFrame { public static void main(String[] args) throws X.X11Exception { new XDesktopDemo(); } private X.Display display = new X.Display(); private JList desktopList; private JTable windowTable; private JButton refreshButton; private JButton moveWindowToDesktopButton; private JButton goToDesktopButton; private JButton moveWindowAndGoToDesktopButton; private JButton closeWindowButton; private JButton goToWindowButton; private JButton showDesktop; public XDesktopDemo() throws X.X11Exception { super("XDesktopDemo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initGui(); refreshDesktopsAndWindows(); pack(); addListeners(); setVisible(true); printWmInfo(); } private void printWmInfo() throws X.X11Exception { X.Window wm = display.getWindowManagerInfo(); System.out.println("wm.getTitle() = " + wm.getTitle()); System.out.println("wm.getWindowClass() = " + wm.getWindowClass()); System.out.println("wm.getPID() = " + wm.getPID()); } private void addListeners() { refreshButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { try { refreshDesktopsAndWindows(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); goToDesktopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { int desktopNr = desktopList.getSelectedIndex(); if (desktopNr >= 0) { try { display.switchDesktop(desktopNr); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } } }); goToWindowButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { X.Window window = getSelectedWindow(); try { window.activate(); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); showDesktop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { try { display.showingDesktop(true); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); moveWindowToDesktopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { X.Window window = getSelectedWindow(); try { window.moveToDesktop(desktopList.getSelectedIndex()); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); moveWindowAndGoToDesktopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { X.Window window = getSelectedWindow(); try { window.moveToDesktop(desktopList.getSelectedIndex()); window.activate(); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); closeWindowButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { X.Window window = getSelectedWindow(); try { window.close(); display.flush(); } catch (X.X11Exception e) { e.printStackTrace(); } } }); } private X.Window getSelectedWindow() { WindowTableModel tableModel = (WindowTableModel) windowTable.getModel(); return tableModel.getWindow(windowTable.getSelectedRow()); } private void refreshDesktopsAndWindows() throws X.X11Exception { // update desktop list X.Desktop[] desktops = display.getDesktops(); ArrayList list = new ArrayList(desktops.length); for (int i = 0; i < desktops.length; i++) { list.add(desktops[i].name); } desktopList.clearSelection(); desktopList.setModel(new SimpleListModel(list)); // select active desktop int activeDesktop = display.getActiveDesktopNumber(); desktopList.setSelectedIndex(activeDesktop); // update window list int activeWindowId = display.getActiveWindow().getID(); int activeWindowNumber = -1; X.Window[] windows = display.getWindows(); String[] head = new String[]{ "ID", "Desktop", "Title", "X", "Y", "Width", "Height" }; String[][] data = new String[windows.length][head.length]; for (int i = 0; i < windows.length; i++) { X.Window window = windows[i]; X.Window.Geometry geo = window.getGeometry(); int windowId = window.getID(); data[i][0] = String.format("0x%08X", new Object[]{new Integer(windowId)}); data[i][1] = "" + window.getDesktop(); data[i][2] = window.getTitle(); data[i][3] = "" + geo.x; data[i][4] = "" + geo.y; data[i][5] = "" + geo.width; data[i][6] = "" + geo.height; if (windowId == activeWindowId) { activeWindowNumber = i; } } windowTable.setModel(new WindowTableModel(head, data, windows)); if (activeWindowNumber >= 0) { windowTable.getSelectionModel().setSelectionInterval(activeWindowNumber, activeWindowNumber); } } private void initGui() { JPanel mainPanel = new JPanel(); mainPanel.setLayout(new GridBagLayout()); final JPanel panel1 = new JPanel(); panel1.setLayout(new GridBagLayout()); GridBagConstraints gbc; gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 0.8; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(panel1, gbc); panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), "Desktops")); desktopList = new JList(); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; panel1.add(desktopList, gbc); final JPanel panel2 = new JPanel(); panel2.setLayout(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(panel2, gbc); panel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), "Windows")); final JScrollPane scrollPane1 = new JScrollPane(); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; panel2.add(scrollPane1, gbc); windowTable = new JTable(); windowTable.setEnabled(true); scrollPane1.setViewportView(windowTable); final JPanel panel3 = new JPanel(); panel3.setLayout(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 2; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(panel3, gbc); panel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), "Actions")); goToDesktopButton = new JButton(); goToDesktopButton.setText("go to desktop"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(goToDesktopButton, gbc); refreshButton = new JButton(); refreshButton.setText("refresh"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(refreshButton, gbc); goToWindowButton = new JButton(); goToWindowButton.setText("go to window"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 2; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(goToWindowButton, gbc); moveWindowAndGoToDesktopButton = new JButton(); moveWindowAndGoToDesktopButton.setText("move window and go to desktop"); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 2; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(moveWindowAndGoToDesktopButton, gbc); closeWindowButton = new JButton(); closeWindowButton.setText("close window"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 3; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(closeWindowButton, gbc); moveWindowToDesktopButton = new JButton(); moveWindowToDesktopButton.setText("move window to desktop"); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 1; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(moveWindowToDesktopButton, gbc); showDesktop = new JButton(); showDesktop.setText("show desktop"); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; panel3.add(showDesktop, gbc); // more attributes desktopList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); windowTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setContentPane(mainPanel); } /** * A simple ListModel managing a list of objects. */ public static class SimpleListModel extends AbstractListModel { private ArrayList list; public SimpleListModel(ArrayList list) { this.list = list; } public int getSize() { return list.size(); } public Object getElementAt(int i) { return list.get(i); } } /** * A simple TableModel managing an array of Strings. */ public static class WindowTableModel implements TableModel { private String[] head; private String[][] data; private X.Window[] windows; public WindowTableModel(String[] head, String[][] data, X.Window[] windows) { this.head = head; this.data = data; this.windows = windows; } public int getRowCount() { return data.length; } public int getColumnCount() { return head.length; } public String getColumnName(int columnIndex) { return head[columnIndex]; } public Class getColumnClass(int columnIndex) { return String.class; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public Object getValueAt(int rowIndex, int columnIndex) { return data[rowIndex][columnIndex]; } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { } public void addTableModelListener(TableModelListener l) { } public void removeTableModelListener(TableModelListener l) { } public X.Window getWindow(int rowIndex) { return windows[rowIndex]; } } }