41 private volatile boolean available; 42 private final XMSelection selection = new XMSelection("_NET_SYSTEM_TRAY"); 43 44 private static final int SCREEN = 0; 45 private static final String SYSTEM_TRAY_PROPERTY_NAME = "systemTray"; 46 private static final XAtom _NET_SYSTEM_TRAY = XAtom.get("_NET_SYSTEM_TRAY_S" + SCREEN); 47 private static final XAtom _XEMBED_INFO = XAtom.get("_XEMBED_INFO"); 48 private static final XAtom _NET_SYSTEM_TRAY_OPCODE = XAtom.get("_NET_SYSTEM_TRAY_OPCODE"); 49 private static final XAtom _NET_WM_ICON = XAtom.get("_NET_WM_ICON"); 50 private static final long SYSTEM_TRAY_REQUEST_DOCK = 0; 51 52 XSystemTrayPeer(SystemTray target) { 53 this.target = target; 54 peerInstance = this; 55 56 selection.addSelectionListener(this); 57 58 long selection_owner = selection.getOwner(SCREEN); 59 available = (selection_owner != XConstants.None); 60 61 log.fine(" check if system tray is available. selection owner: " + selection_owner); 62 } 63 64 public void ownerChanged(int screen, XMSelection sel, long newOwner, long data, long timestamp) { 65 if (screen != SCREEN) { 66 return; 67 } 68 if (!available) { 69 available = true; 70 firePropertyChange(SYSTEM_TRAY_PROPERTY_NAME, null, target); 71 } else { 72 removeTrayPeers(); 73 } 74 createTrayPeers(); 75 } 76 77 public void ownerDeath(int screen, XMSelection sel, long deadOwner) { 78 if (screen != SCREEN) { 79 return; 80 } 81 if (available) { 82 available = false; 89 } 90 91 public Dimension getTrayIconSize() { 92 return new Dimension(XTrayIconPeer.TRAY_ICON_HEIGHT, XTrayIconPeer.TRAY_ICON_WIDTH); 93 } 94 95 boolean isAvailable() { 96 return available; 97 } 98 99 void dispose() { 100 selection.removeSelectionListener(this); 101 } 102 103 // *********************************************************************** 104 // *********************************************************************** 105 106 void addTrayIcon(XTrayIconPeer tiPeer) throws AWTException { 107 long selection_owner = selection.getOwner(SCREEN); 108 109 log.fine(" send SYSTEM_TRAY_REQUEST_DOCK message to owner: " + selection_owner); 110 111 if (selection_owner == XConstants.None) { 112 throw new AWTException("TrayIcon couldn't be displayed."); 113 } 114 115 long tray_window = tiPeer.getWindow(); 116 long data[] = new long[] {XEmbedHelper.XEMBED_VERSION, XEmbedHelper.XEMBED_MAPPED}; 117 long data_ptr = Native.card32ToData(data); 118 119 _XEMBED_INFO.setAtomData(tray_window, data_ptr, data.length); 120 121 sendMessage(selection_owner, SYSTEM_TRAY_REQUEST_DOCK, tray_window, 0, 0); 122 } 123 124 void sendMessage(long win, long msg, long data1, long data2, long data3) { 125 XClientMessageEvent xev = new XClientMessageEvent(); 126 127 try { 128 xev.set_type(XConstants.ClientMessage); 129 xev.set_window(win); | 41 private volatile boolean available; 42 private final XMSelection selection = new XMSelection("_NET_SYSTEM_TRAY"); 43 44 private static final int SCREEN = 0; 45 private static final String SYSTEM_TRAY_PROPERTY_NAME = "systemTray"; 46 private static final XAtom _NET_SYSTEM_TRAY = XAtom.get("_NET_SYSTEM_TRAY_S" + SCREEN); 47 private static final XAtom _XEMBED_INFO = XAtom.get("_XEMBED_INFO"); 48 private static final XAtom _NET_SYSTEM_TRAY_OPCODE = XAtom.get("_NET_SYSTEM_TRAY_OPCODE"); 49 private static final XAtom _NET_WM_ICON = XAtom.get("_NET_WM_ICON"); 50 private static final long SYSTEM_TRAY_REQUEST_DOCK = 0; 51 52 XSystemTrayPeer(SystemTray target) { 53 this.target = target; 54 peerInstance = this; 55 56 selection.addSelectionListener(this); 57 58 long selection_owner = selection.getOwner(SCREEN); 59 available = (selection_owner != XConstants.None); 60 61 if (log.isLoggable(PlatformLogger.FINE)) { 62 log.fine(" check if system tray is available. selection owner: " + selection_owner); 63 } 64 } 65 66 public void ownerChanged(int screen, XMSelection sel, long newOwner, long data, long timestamp) { 67 if (screen != SCREEN) { 68 return; 69 } 70 if (!available) { 71 available = true; 72 firePropertyChange(SYSTEM_TRAY_PROPERTY_NAME, null, target); 73 } else { 74 removeTrayPeers(); 75 } 76 createTrayPeers(); 77 } 78 79 public void ownerDeath(int screen, XMSelection sel, long deadOwner) { 80 if (screen != SCREEN) { 81 return; 82 } 83 if (available) { 84 available = false; 91 } 92 93 public Dimension getTrayIconSize() { 94 return new Dimension(XTrayIconPeer.TRAY_ICON_HEIGHT, XTrayIconPeer.TRAY_ICON_WIDTH); 95 } 96 97 boolean isAvailable() { 98 return available; 99 } 100 101 void dispose() { 102 selection.removeSelectionListener(this); 103 } 104 105 // *********************************************************************** 106 // *********************************************************************** 107 108 void addTrayIcon(XTrayIconPeer tiPeer) throws AWTException { 109 long selection_owner = selection.getOwner(SCREEN); 110 111 if (log.isLoggable(PlatformLogger.FINE)) { 112 log.fine(" send SYSTEM_TRAY_REQUEST_DOCK message to owner: " + selection_owner); 113 } 114 115 if (selection_owner == XConstants.None) { 116 throw new AWTException("TrayIcon couldn't be displayed."); 117 } 118 119 long tray_window = tiPeer.getWindow(); 120 long data[] = new long[] {XEmbedHelper.XEMBED_VERSION, XEmbedHelper.XEMBED_MAPPED}; 121 long data_ptr = Native.card32ToData(data); 122 123 _XEMBED_INFO.setAtomData(tray_window, data_ptr, data.length); 124 125 sendMessage(selection_owner, SYSTEM_TRAY_REQUEST_DOCK, tray_window, 0, 0); 126 } 127 128 void sendMessage(long win, long msg, long data1, long data2, long data3) { 129 XClientMessageEvent xev = new XClientMessageEvent(); 130 131 try { 132 xev.set_type(XConstants.ClientMessage); 133 xev.set_window(win); |