112 }
113
114
115 public int getNumberOfScreens() {
116 return numScreens;
117 }
118
119 void select(long extra_mask) {
120 eventMask = extra_mask;
121 for (int screen = 0; screen < numScreens ; screen ++) {
122 selectPerScreen(screen,extra_mask);
123 }
124 }
125
126 void resetOwner(long owner, final int screen) {
127 XToolkit.awtLock();
128 try {
129 long display = XToolkit.getDisplay();
130 synchronized(this) {
131 setOwner(owner, screen);
132 if (log.isLoggable(Level.FINE)) log.fine("New Selection Owner for screen " + screen + " = " + owner );
133 XlibWrapper.XSelectInput(display, owner, XlibWrapper.StructureNotifyMask | eventMask);
134 XToolkit.addEventDispatcher(owner,
135 new XEventDispatcher() {
136 public void dispatchEvent(XEvent ev) {
137 dispatchSelectionEvent(ev, screen);
138 }
139 });
140
141 }
142 } finally {
143 XToolkit.awtUnlock();
144 }
145 }
146
147 void selectPerScreen(final int screen, long extra_mask) {
148 XToolkit.awtLock();
149 try {
150 try {
151 long display = XToolkit.getDisplay();
152 if (log.isLoggable(Level.FINE)) log.fine("Grabbing XServer");
153 XlibWrapper.XGrabServer(display);
154
155 synchronized(this) {
156 String selection_name = getName()+"_S"+screen;
157 if (log.isLoggable(Level.FINE)) log.fine("Screen = " + screen + " selection name = " + selection_name);
158 XAtom atom = XAtom.get(selection_name);
159 selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection
160 setAtom(atom,screen);
161 long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom());
162 if (owner != 0) {
163 setOwner(owner, screen);
164 if (log.isLoggable(Level.FINE)) log.fine("Selection Owner for screen " + screen + " = " + owner );
165 XlibWrapper.XSelectInput(display, owner, XlibWrapper.StructureNotifyMask | extra_mask);
166 XToolkit.addEventDispatcher(owner,
167 new XEventDispatcher() {
168 public void dispatchEvent(XEvent ev) {
169 dispatchSelectionEvent(ev, screen);
170 }
171 });
172 }
173 }
174 }
175 catch (Exception e) {
176 e.printStackTrace();
177 }
178 finally {
179 if (log.isLoggable(Level.FINE)) log.fine("UnGrabbing XServer");
180 XlibWrapper.XUngrabServer(XToolkit.getDisplay());
181 }
182 } finally {
183 XToolkit.awtUnlock();
184 }
185 }
186
187
188 static boolean processClientMessage(XEvent xev, int screen) {
189 XClientMessageEvent xce = xev.get_xclient();
190 if (xce.get_message_type() == XA_MANAGER.getAtom()) {
191 if (log.isLoggable(Level.FINE)) log.fine("client messags = " + xce);
192 long timestamp = xce.get_data(0);
193 long atom = xce.get_data(1);
194 long owner = xce.get_data(2);
195 long data = xce.get_data(3);
196
197 XMSelection sel = getInstance(atom);
198 if (sel != null) {
199 sel.resetOwner(owner,screen);
200 sel.dispatchOwnerChangedEvent(xev,screen,owner,data, timestamp);
201 }
202 }
203 return false;
204 }
205
206 static boolean processRootEvent(XEvent xev, int screen) {
207 switch (xev.get_type()) {
208 case XlibWrapper.ClientMessage: {
209 return processClientMessage(xev, screen);
210 }
211 }
278
279 synchronized long getOwner(int screen) {
280 if (owners != null) {
281 return owners[screen];
282 }
283 return 0;
284 }
285
286 synchronized void setOwner(long owner, int screen) {
287 if (owners != null) {
288 owners[screen] = owner;
289 }
290 }
291
292 synchronized String getName() {
293 return selectionName;
294 }
295
296
297 synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) {
298 if (log.isLoggable(Level.FINE)) log.fine("Selection Changed : Screen = " + screen + "Event =" + ev);
299 if (listeners != null) {
300 Iterator iter = listeners.iterator();
301 while (iter.hasNext()) {
302 XMSelectionListener disp = (XMSelectionListener) iter.next();
303 disp.selectionChanged(screen, this, ev.get_window(), ev);
304 }
305 }
306 }
307
308 synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) {
309 if (log.isLoggable(Level.FINE)) log.fine("Owner dead : Screen = " + screen + "Event =" + de);
310 if (listeners != null) {
311 Iterator iter = listeners.iterator();
312 while (iter.hasNext()) {
313 XMSelectionListener disp = (XMSelectionListener) iter.next();
314 disp.ownerDeath(screen, this, de.get_window());
315
316 }
317 }
318 }
319
320 void dispatchSelectionEvent(XEvent xev, int screen) {
321 if (log.isLoggable(Level.FINE)) log.fine("Event =" + xev);
322 if (xev.get_type() == XlibWrapper.DestroyNotify) {
323 XDestroyWindowEvent de = xev.get_xdestroywindow();
324 dispatchOwnerDeath( de, screen);
325 }
326 else if (xev.get_type() == XlibWrapper.PropertyNotify) {
327 XPropertyEvent xpe = xev.get_xproperty();
328 dispatchSelectionChanged( xpe, screen);
329 }
330 }
331
332
333 synchronized void dispatchOwnerChangedEvent(XEvent ev, int screen, long owner, long data, long timestamp) {
334 if (listeners != null) {
335 Iterator iter = listeners.iterator();
336 while (iter.hasNext()) {
337 XMSelectionListener disp = (XMSelectionListener) iter.next();
338 disp.ownerChanged(screen,this, owner, data, timestamp);
339 }
340 }
341 }
|
112 }
113
114
115 public int getNumberOfScreens() {
116 return numScreens;
117 }
118
119 void select(long extra_mask) {
120 eventMask = extra_mask;
121 for (int screen = 0; screen < numScreens ; screen ++) {
122 selectPerScreen(screen,extra_mask);
123 }
124 }
125
126 void resetOwner(long owner, final int screen) {
127 XToolkit.awtLock();
128 try {
129 long display = XToolkit.getDisplay();
130 synchronized(this) {
131 setOwner(owner, screen);
132 if (log.isLoggable(Level.FINE)) {
133 log.fine("New Selection Owner for screen " + screen + " = " + owner );
134 }
135 XlibWrapper.XSelectInput(display, owner, XlibWrapper.StructureNotifyMask | eventMask);
136 XToolkit.addEventDispatcher(owner,
137 new XEventDispatcher() {
138 public void dispatchEvent(XEvent ev) {
139 dispatchSelectionEvent(ev, screen);
140 }
141 });
142
143 }
144 } finally {
145 XToolkit.awtUnlock();
146 }
147 }
148
149 void selectPerScreen(final int screen, long extra_mask) {
150 XToolkit.awtLock();
151 try {
152 try {
153 long display = XToolkit.getDisplay();
154 if (log.isLoggable(Level.FINE)) {
155 log.fine("Grabbing XServer");
156 }
157 XlibWrapper.XGrabServer(display);
158
159 synchronized(this) {
160 String selection_name = getName()+"_S"+screen;
161 if (log.isLoggable(Level.FINE)) {
162 log.fine("Screen = " + screen + " selection name = " + selection_name);
163 }
164 XAtom atom = XAtom.get(selection_name);
165 selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection
166 setAtom(atom,screen);
167 long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom());
168 if (owner != 0) {
169 setOwner(owner, screen);
170 if (log.isLoggable(Level.FINE)) {
171 log.fine("Selection Owner for screen " + screen + " = " + owner );
172 }
173 XlibWrapper.XSelectInput(display, owner, XlibWrapper.StructureNotifyMask | extra_mask);
174 XToolkit.addEventDispatcher(owner,
175 new XEventDispatcher() {
176 public void dispatchEvent(XEvent ev) {
177 dispatchSelectionEvent(ev, screen);
178 }
179 });
180 }
181 }
182 }
183 catch (Exception e) {
184 e.printStackTrace();
185 }
186 finally {
187 if (log.isLoggable(Level.FINE)) {
188 log.fine("UnGrabbing XServer");
189 }
190 XlibWrapper.XUngrabServer(XToolkit.getDisplay());
191 }
192 } finally {
193 XToolkit.awtUnlock();
194 }
195 }
196
197
198 static boolean processClientMessage(XEvent xev, int screen) {
199 XClientMessageEvent xce = xev.get_xclient();
200 if (xce.get_message_type() == XA_MANAGER.getAtom()) {
201 if (log.isLoggable(Level.FINE)) {
202 log.fine("client messags = " + xce);
203 }
204 long timestamp = xce.get_data(0);
205 long atom = xce.get_data(1);
206 long owner = xce.get_data(2);
207 long data = xce.get_data(3);
208
209 XMSelection sel = getInstance(atom);
210 if (sel != null) {
211 sel.resetOwner(owner,screen);
212 sel.dispatchOwnerChangedEvent(xev,screen,owner,data, timestamp);
213 }
214 }
215 return false;
216 }
217
218 static boolean processRootEvent(XEvent xev, int screen) {
219 switch (xev.get_type()) {
220 case XlibWrapper.ClientMessage: {
221 return processClientMessage(xev, screen);
222 }
223 }
290
291 synchronized long getOwner(int screen) {
292 if (owners != null) {
293 return owners[screen];
294 }
295 return 0;
296 }
297
298 synchronized void setOwner(long owner, int screen) {
299 if (owners != null) {
300 owners[screen] = owner;
301 }
302 }
303
304 synchronized String getName() {
305 return selectionName;
306 }
307
308
309 synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) {
310 if (log.isLoggable(Level.FINE)) {
311 log.fine("Selection Changed : Screen = " + screen + "Event =" + ev);
312 }
313 if (listeners != null) {
314 Iterator iter = listeners.iterator();
315 while (iter.hasNext()) {
316 XMSelectionListener disp = (XMSelectionListener) iter.next();
317 disp.selectionChanged(screen, this, ev.get_window(), ev);
318 }
319 }
320 }
321
322 synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) {
323 if (log.isLoggable(Level.FINE)) {
324 log.fine("Owner dead : Screen = " + screen + "Event =" + de);
325 }
326 if (listeners != null) {
327 Iterator iter = listeners.iterator();
328 while (iter.hasNext()) {
329 XMSelectionListener disp = (XMSelectionListener) iter.next();
330 disp.ownerDeath(screen, this, de.get_window());
331
332 }
333 }
334 }
335
336 void dispatchSelectionEvent(XEvent xev, int screen) {
337 if (log.isLoggable(Level.FINE)) {
338 log.fine("Event =" + xev);
339 }
340 if (xev.get_type() == XlibWrapper.DestroyNotify) {
341 XDestroyWindowEvent de = xev.get_xdestroywindow();
342 dispatchOwnerDeath( de, screen);
343 }
344 else if (xev.get_type() == XlibWrapper.PropertyNotify) {
345 XPropertyEvent xpe = xev.get_xproperty();
346 dispatchSelectionChanged( xpe, screen);
347 }
348 }
349
350
351 synchronized void dispatchOwnerChangedEvent(XEvent ev, int screen, long owner, long data, long timestamp) {
352 if (listeners != null) {
353 Iterator iter = listeners.iterator();
354 while (iter.hasNext()) {
355 XMSelectionListener disp = (XMSelectionListener) iter.next();
356 disp.ownerChanged(screen,this, owner, data, timestamp);
357 }
358 }
359 }
|