src/solaris/classes/sun/awt/X11/XMSelection.java

Print this page




 111     }
 112 
 113 
 114     public int getNumberOfScreens() {
 115         return numScreens;
 116     }
 117 
 118     void select(long extra_mask) {
 119         eventMask = extra_mask;
 120         for (int screen = 0; screen < numScreens ; screen ++) {
 121             selectPerScreen(screen,extra_mask);
 122         }
 123     }
 124 
 125     void resetOwner(long owner, final int screen) {
 126         XToolkit.awtLock();
 127         try {
 128             long display = XToolkit.getDisplay();
 129             synchronized(this) {
 130                 setOwner(owner, screen);
 131                 if (log.isLoggable(PlatformLogger.FINE)) {
 132                     log.fine("New Selection Owner for screen " + screen + " = " + owner );
 133                 }
 134                 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | eventMask);
 135                 XToolkit.addEventDispatcher(owner,
 136                         new XEventDispatcher() {
 137                             public void dispatchEvent(XEvent ev) {
 138                                 dispatchSelectionEvent(ev, screen);
 139                             }
 140                         });
 141 
 142             }
 143         } finally {
 144             XToolkit.awtUnlock();
 145         }
 146     }
 147 
 148     void selectPerScreen(final int screen, long extra_mask) {
 149         XToolkit.awtLock();
 150         try {
 151             try {
 152                 long display = XToolkit.getDisplay();
 153                 if (log.isLoggable(PlatformLogger.FINE)) {
 154                     log.fine("Grabbing XServer");
 155                 }
 156                 XlibWrapper.XGrabServer(display);
 157 
 158                 synchronized(this) {
 159                     String selection_name = getName()+"_S"+screen;
 160                     if (log.isLoggable(PlatformLogger.FINE)) {
 161                         log.fine("Screen = " + screen + " selection name = " + selection_name);
 162                     }
 163                     XAtom atom = XAtom.get(selection_name);
 164                     selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection
 165                     setAtom(atom,screen);
 166                     long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom());
 167                     if (owner != 0) {
 168                         setOwner(owner, screen);
 169                         if (log.isLoggable(PlatformLogger.FINE)) {
 170                             log.fine("Selection Owner for screen " + screen + " = " + owner );
 171                         }
 172                         XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | extra_mask);
 173                         XToolkit.addEventDispatcher(owner,
 174                                 new XEventDispatcher() {
 175                                         public void dispatchEvent(XEvent ev) {
 176                                             dispatchSelectionEvent(ev, screen);
 177                                         }
 178                                     });
 179                     }
 180                 }
 181             }
 182             catch (Exception e) {
 183                 e.printStackTrace();
 184             }
 185             finally {
 186                 if (log.isLoggable(PlatformLogger.FINE)) {
 187                     log.fine("UnGrabbing XServer");
 188                 }
 189                 XlibWrapper.XUngrabServer(XToolkit.getDisplay());
 190             }
 191         } finally {
 192             XToolkit.awtUnlock();
 193         }
 194     }
 195 
 196 
 197     static boolean processClientMessage(XEvent xev, int screen) {
 198         XClientMessageEvent xce = xev.get_xclient();
 199         if (xce.get_message_type() == XA_MANAGER.getAtom()) {
 200             if (log.isLoggable(PlatformLogger.FINE)) {
 201                 log.fine("client messags = " + xce);
 202             }
 203             long timestamp = xce.get_data(0);
 204             long atom = xce.get_data(1);
 205             long owner = xce.get_data(2);
 206             long data = xce.get_data(3);
 207 
 208             XMSelection sel = getInstance(atom);
 209             if (sel != null) {
 210                 sel.resetOwner(owner,screen);
 211                 sel.dispatchOwnerChangedEvent(xev,screen,owner,data, timestamp);
 212             }
 213         }
 214         return false;
 215     }
 216 
 217     static  boolean processRootEvent(XEvent xev, int screen) {
 218         switch (xev.get_type()) {
 219             case XConstants.ClientMessage: {
 220                 return processClientMessage(xev, screen);


 289 
 290     synchronized long getOwner(int screen) {
 291         if (owners != null) {
 292             return owners[screen];
 293         }
 294         return 0;
 295     }
 296 
 297     synchronized void setOwner(long owner, int screen) {
 298         if (owners != null) {
 299             owners[screen] = owner;
 300         }
 301     }
 302 
 303     synchronized String getName() {
 304         return selectionName;
 305     }
 306 
 307 
 308     synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) {
 309         if (log.isLoggable(PlatformLogger.FINE)) {
 310             log.fine("Selection Changed : Screen = " + screen + "Event =" + ev);
 311         }
 312         if (listeners != null) {
 313             Iterator iter = listeners.iterator();
 314             while (iter.hasNext()) {
 315                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 316                 disp.selectionChanged(screen, this, ev.get_window(), ev);
 317             }
 318         }
 319     }
 320 
 321     synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) {
 322         if (log.isLoggable(PlatformLogger.FINE)) {
 323             log.fine("Owner dead : Screen = " + screen + "Event =" + de);
 324         }
 325         if (listeners != null) {
 326             Iterator iter = listeners.iterator();
 327             while (iter.hasNext()) {
 328                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 329                 disp.ownerDeath(screen, this, de.get_window());
 330 
 331             }
 332         }
 333     }
 334 
 335     void dispatchSelectionEvent(XEvent xev, int screen) {
 336         if (log.isLoggable(PlatformLogger.FINE)) {
 337             log.fine("Event =" + xev);
 338         }
 339         if (xev.get_type() == XConstants.DestroyNotify) {
 340             XDestroyWindowEvent de = xev.get_xdestroywindow();
 341             dispatchOwnerDeath( de, screen);
 342         }
 343         else if (xev.get_type() == XConstants.PropertyNotify)  {
 344             XPropertyEvent xpe = xev.get_xproperty();
 345             dispatchSelectionChanged( xpe, screen);
 346         }
 347     }
 348 
 349 
 350     synchronized void dispatchOwnerChangedEvent(XEvent ev, int screen, long owner, long data, long timestamp) {
 351         if (listeners != null) {
 352             Iterator iter = listeners.iterator();
 353             while (iter.hasNext()) {
 354                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 355                 disp.ownerChanged(screen,this, owner, data, timestamp);
 356             }


 111     }
 112 
 113 
 114     public int getNumberOfScreens() {
 115         return numScreens;
 116     }
 117 
 118     void select(long extra_mask) {
 119         eventMask = extra_mask;
 120         for (int screen = 0; screen < numScreens ; screen ++) {
 121             selectPerScreen(screen,extra_mask);
 122         }
 123     }
 124 
 125     void resetOwner(long owner, final int screen) {
 126         XToolkit.awtLock();
 127         try {
 128             long display = XToolkit.getDisplay();
 129             synchronized(this) {
 130                 setOwner(owner, screen);
 131                 if (log.isLoggable(PlatformLogger.Level.FINE)) {
 132                     log.fine("New Selection Owner for screen " + screen + " = " + owner );
 133                 }
 134                 XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | eventMask);
 135                 XToolkit.addEventDispatcher(owner,
 136                         new XEventDispatcher() {
 137                             public void dispatchEvent(XEvent ev) {
 138                                 dispatchSelectionEvent(ev, screen);
 139                             }
 140                         });
 141 
 142             }
 143         } finally {
 144             XToolkit.awtUnlock();
 145         }
 146     }
 147 
 148     void selectPerScreen(final int screen, long extra_mask) {
 149         XToolkit.awtLock();
 150         try {
 151             try {
 152                 long display = XToolkit.getDisplay();
 153                 if (log.isLoggable(PlatformLogger.Level.FINE)) {
 154                     log.fine("Grabbing XServer");
 155                 }
 156                 XlibWrapper.XGrabServer(display);
 157 
 158                 synchronized(this) {
 159                     String selection_name = getName()+"_S"+screen;
 160                     if (log.isLoggable(PlatformLogger.Level.FINE)) {
 161                         log.fine("Screen = " + screen + " selection name = " + selection_name);
 162                     }
 163                     XAtom atom = XAtom.get(selection_name);
 164                     selectionMap.put(Long.valueOf(atom.getAtom()),this); // add mapping from atom to the instance of XMSelection
 165                     setAtom(atom,screen);
 166                     long owner = XlibWrapper.XGetSelectionOwner(display, atom.getAtom());
 167                     if (owner != 0) {
 168                         setOwner(owner, screen);
 169                         if (log.isLoggable(PlatformLogger.Level.FINE)) {
 170                             log.fine("Selection Owner for screen " + screen + " = " + owner );
 171                         }
 172                         XlibWrapper.XSelectInput(display, owner, XConstants.StructureNotifyMask | extra_mask);
 173                         XToolkit.addEventDispatcher(owner,
 174                                 new XEventDispatcher() {
 175                                         public void dispatchEvent(XEvent ev) {
 176                                             dispatchSelectionEvent(ev, screen);
 177                                         }
 178                                     });
 179                     }
 180                 }
 181             }
 182             catch (Exception e) {
 183                 e.printStackTrace();
 184             }
 185             finally {
 186                 if (log.isLoggable(PlatformLogger.Level.FINE)) {
 187                     log.fine("UnGrabbing XServer");
 188                 }
 189                 XlibWrapper.XUngrabServer(XToolkit.getDisplay());
 190             }
 191         } finally {
 192             XToolkit.awtUnlock();
 193         }
 194     }
 195 
 196 
 197     static boolean processClientMessage(XEvent xev, int screen) {
 198         XClientMessageEvent xce = xev.get_xclient();
 199         if (xce.get_message_type() == XA_MANAGER.getAtom()) {
 200             if (log.isLoggable(PlatformLogger.Level.FINE)) {
 201                 log.fine("client messags = " + xce);
 202             }
 203             long timestamp = xce.get_data(0);
 204             long atom = xce.get_data(1);
 205             long owner = xce.get_data(2);
 206             long data = xce.get_data(3);
 207 
 208             XMSelection sel = getInstance(atom);
 209             if (sel != null) {
 210                 sel.resetOwner(owner,screen);
 211                 sel.dispatchOwnerChangedEvent(xev,screen,owner,data, timestamp);
 212             }
 213         }
 214         return false;
 215     }
 216 
 217     static  boolean processRootEvent(XEvent xev, int screen) {
 218         switch (xev.get_type()) {
 219             case XConstants.ClientMessage: {
 220                 return processClientMessage(xev, screen);


 289 
 290     synchronized long getOwner(int screen) {
 291         if (owners != null) {
 292             return owners[screen];
 293         }
 294         return 0;
 295     }
 296 
 297     synchronized void setOwner(long owner, int screen) {
 298         if (owners != null) {
 299             owners[screen] = owner;
 300         }
 301     }
 302 
 303     synchronized String getName() {
 304         return selectionName;
 305     }
 306 
 307 
 308     synchronized void dispatchSelectionChanged( XPropertyEvent ev, int screen) {
 309         if (log.isLoggable(PlatformLogger.Level.FINE)) {
 310             log.fine("Selection Changed : Screen = " + screen + "Event =" + ev);
 311         }
 312         if (listeners != null) {
 313             Iterator iter = listeners.iterator();
 314             while (iter.hasNext()) {
 315                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 316                 disp.selectionChanged(screen, this, ev.get_window(), ev);
 317             }
 318         }
 319     }
 320 
 321     synchronized void dispatchOwnerDeath(XDestroyWindowEvent de, int screen) {
 322         if (log.isLoggable(PlatformLogger.Level.FINE)) {
 323             log.fine("Owner dead : Screen = " + screen + "Event =" + de);
 324         }
 325         if (listeners != null) {
 326             Iterator iter = listeners.iterator();
 327             while (iter.hasNext()) {
 328                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 329                 disp.ownerDeath(screen, this, de.get_window());
 330 
 331             }
 332         }
 333     }
 334 
 335     void dispatchSelectionEvent(XEvent xev, int screen) {
 336         if (log.isLoggable(PlatformLogger.Level.FINE)) {
 337             log.fine("Event =" + xev);
 338         }
 339         if (xev.get_type() == XConstants.DestroyNotify) {
 340             XDestroyWindowEvent de = xev.get_xdestroywindow();
 341             dispatchOwnerDeath( de, screen);
 342         }
 343         else if (xev.get_type() == XConstants.PropertyNotify)  {
 344             XPropertyEvent xpe = xev.get_xproperty();
 345             dispatchSelectionChanged( xpe, screen);
 346         }
 347     }
 348 
 349 
 350     synchronized void dispatchOwnerChangedEvent(XEvent ev, int screen, long owner, long data, long timestamp) {
 351         if (listeners != null) {
 352             Iterator iter = listeners.iterator();
 353             while (iter.hasNext()) {
 354                 XMSelectionListener disp = (XMSelectionListener) iter.next();
 355                 disp.ownerChanged(screen,this, owner, data, timestamp);
 356             }