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;
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 {
|
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.Level.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;
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.Level.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 {
|