54 * array is ScreenCount(awt_display). The array is "owned" by this |
53 * array is ScreenCount(awt_display). The array is "owned" by this |
55 * module and should be considered by the caller as read-only. |
54 * module and should be considered by the caller as read-only. |
56 */ |
55 */ |
57 |
56 |
58 |
57 |
59 private static Logger log = Logger.getLogger("sun.awt.X11.XMSelection"); |
58 private static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XMSelection"); |
60 /* Name of the selection */ |
59 /* Name of the selection */ |
61 String selectionName; |
60 String selectionName; |
62 |
61 |
63 /* list of listeners to be called for events */ |
62 /* list of listeners to be called for events */ |
64 Vector listeners; |
63 Vector listeners; |
127 XToolkit.awtLock(); |
126 XToolkit.awtLock(); |
128 try { |
127 try { |
129 long display = XToolkit.getDisplay(); |
128 long display = XToolkit.getDisplay(); |
130 synchronized(this) { |
129 synchronized(this) { |
131 setOwner(owner, screen); |
130 setOwner(owner, screen); |
132 if (log.isLoggable(Level.FINE)) log.fine("New Selection Owner for screen " + screen + " = " + owner ); |
131 if (log.isLoggable(PlatformLogger.FINE)) log.fine("New Selection Owner for screen " + screen + " = " + owner ); |
133 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | eventMask); |
132 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | eventMask); |
134 XToolkit.addEventDispatcher(owner, |
133 XToolkit.addEventDispatcher(owner, |
135 new XEventDispatcher() { |
134 new XEventDispatcher() { |
136 public void dispatchEvent(XEvent ev) { |
135 public void dispatchEvent(XEvent ev) { |
137 dispatchSelectionEvent(ev, screen); |
136 dispatchSelectionEvent(ev, screen); |
147 void selectPerScreen(final int screen, long extra_mask) { |
146 void selectPerScreen(final int screen, long extra_mask) { |
148 XToolkit.awtLock(); |
147 XToolkit.awtLock(); |
149 try { |
148 try { |
150 try { |
149 try { |
151 long display = XToolkit.getDisplay(); |
150 long display = XToolkit.getDisplay(); |
152 if (log.isLoggable(Level.FINE)) log.fine("Grabbing XServer"); |
151 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Grabbing XServer"); |
153 XlibWrapper.XGrabServer(display); |
152 XlibWrapper.XGrabServer(display); |
154 |
153 |
155 synchronized(this) { |
154 synchronized(this) { |
156 String selection_name = getName()+"_S"+screen; |
155 String selection_name = getName()+"_S"+screen; |
157 if (log.isLoggable(Level.FINE)) log.fine("Screen = " + screen + " selection name = " + selection_name); |
156 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Screen = " + screen + " selection name = " + selection_name); |
158 XAtom atom = XAtom.get(selection_name); |
157 XAtom atom = XAtom.get(selection_name); |
159 selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection |
158 selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection |
160 setAtom(atom,screen); |
159 setAtom(atom,screen); |
161 long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom()); |
160 long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom()); |
162 if (owner != 0) { |
161 if (owner != 0) { |
163 setOwner(owner, screen); |
162 setOwner(owner, screen); |
164 if (log.isLoggable(Level.FINE)) log.fine("Selection Owner for screen " + screen + " = " + owner ); |
163 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Selection Owner for screen " + screen + " = " + owner ); |
165 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | extra_mask); |
164 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | extra_mask); |
166 XToolkit.addEventDispatcher(owner, |
165 XToolkit.addEventDispatcher(owner, |
167 new XEventDispatcher() { |
166 new XEventDispatcher() { |
168 public void dispatchEvent(XEvent ev) { |
167 public void dispatchEvent(XEvent ev) { |
169 dispatchSelectionEvent(ev, screen); |
168 dispatchSelectionEvent(ev, screen); |
186 |
185 |
187 |
186 |
188 static boolean processClientMessage(XEvent xev, int screen) { |
187 static boolean processClientMessage(XEvent xev, int screen) { |
189 XClientMessageEvent xce = xev.get_xclient(); |
188 XClientMessageEvent xce = xev.get_xclient(); |
190 if (xce.get_message_type() == XA_MANAGER.getAtom()) { |
189 if (xce.get_message_type() == XA_MANAGER.getAtom()) { |
191 if (log.isLoggable(Level.FINE)) log.fine("client messags = " + xce); |
190 if (log.isLoggable(PlatformLogger.FINE)) log.fine("client messags = " + xce); |
192 long timestamp = xce.get_data(0); |
191 long timestamp = xce.get_data(0); |
193 long atom = xce.get_data(1); |
192 long atom = xce.get_data(1); |
194 long owner = xce.get_data(2); |
193 long owner = xce.get_data(2); |
195 long data = xce.get_data(3); |
194 long data = xce.get_data(3); |
196 |
195 |
293 return selectionName; |
292 return selectionName; |
294 } |
293 } |
295 |
294 |
296 |
295 |
297 synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) { |
296 synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) { |
298 if (log.isLoggable(Level.FINE)) log.fine("Selection Changed : Screen = " + screen + "Event =" + ev); |
297 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Selection Changed : Screen = " + screen + "Event =" + ev); |
299 if (listeners != null) { |
298 if (listeners != null) { |
300 Iterator iter = listeners.iterator(); |
299 Iterator iter = listeners.iterator(); |
301 while (iter.hasNext()) { |
300 while (iter.hasNext()) { |
302 XMSelectionListener disp = (XMSelectionListener) iter.next(); |
301 XMSelectionListener disp = (XMSelectionListener) iter.next(); |
303 disp.selectionChanged(screen, this, ev.get_window(), ev); |
302 disp.selectionChanged(screen, this, ev.get_window(), ev); |
304 } |
303 } |
305 } |
304 } |
306 } |
305 } |
307 |
306 |
308 synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) { |
307 synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) { |
309 if (log.isLoggable(Level.FINE)) log.fine("Owner dead : Screen = " + screen + "Event =" + de); |
308 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Owner dead : Screen = " + screen + "Event =" + de); |
310 if (listeners != null) { |
309 if (listeners != null) { |
311 Iterator iter = listeners.iterator(); |
310 Iterator iter = listeners.iterator(); |
312 while (iter.hasNext()) { |
311 while (iter.hasNext()) { |
313 XMSelectionListener disp = (XMSelectionListener) iter.next(); |
312 XMSelectionListener disp = (XMSelectionListener) iter.next(); |
314 disp.ownerDeath(screen, this, de.get_window()); |
313 disp.ownerDeath(screen, this, de.get_window()); |
316 } |
315 } |
317 } |
316 } |
318 } |
317 } |
319 |
318 |
320 void dispatchSelectionEvent(XEvent xev, int screen) { |
319 void dispatchSelectionEvent(XEvent xev, int screen) { |
321 if (log.isLoggable(Level.FINE)) log.fine("Event =" + xev); |
320 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Event =" + xev); |
322 if (xev.get_type() == XConstants.DestroyNotify) { |
321 if (xev.get_type() == XConstants.DestroyNotify) { |
323 XDestroyWindowEvent de = xev.get_xdestroywindow(); |
322 XDestroyWindowEvent de = xev.get_xdestroywindow(); |
324 dispatchOwnerDeath( de, screen); |
323 dispatchOwnerDeath( de, screen); |
325 } |
324 } |
326 else if (xev.get_type() == XConstants.PropertyNotify) { |
325 else if (xev.get_type() == XConstants.PropertyNotify) { |