5100701: Toolkit.getLockingKeyState() does not work on XToolkit, but works on Motif
Summary: Does not work on Motif but works on XToolkit now; implemented using XQueryPointer.
Reviewed-by: anthony
/*
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.awt.X11;
import java.util.*;
/**
* Helper class to ease the work with the lists of atoms.
*/
class XAtomList {
Set<XAtom> atoms = new HashSet<XAtom>();
/**
* Creates empty list.
*/
public XAtomList() {
}
/**
* Creates instance of XAtomList and initializes it with
* the contents pointer by <code>data</code>.
* Uses default display to initialize atoms.
*/
public XAtomList(long data, int count) {
init(data, count);
}
private void init(long data, int count) {
for (int i = 0; i < count; i++) {
add(new XAtom(XToolkit.getDisplay(), XAtom.getAtom(data+count*XAtom.getAtomSize())));
}
}
/**
* Creates instance of XAtomList and initializes it with
* the arrays of atoms. Array can contain null atoms.
*/
public XAtomList(XAtom[] atoms) {
init(atoms);
}
private void init(XAtom[] atoms) {
for (int i = 0; i < atoms.length; i++) {
add(atoms[i]);
}
}
/**
* Returns contents of the list as array of atoms.
*/
public XAtom[] getAtoms() {
XAtom[] res = new XAtom[size()];
Iterator<XAtom> iter = atoms.iterator();
int i = 0;
while (iter.hasNext()) {
res[i++] = iter.next();
}
return res;
}
/**
* Returns contents of the list as pointer to native data
* The size of the native data is size of the list multiplied by
* size of the Atom type on the platform. Caller is responsible for
* freeing the data by Unsafe.freeMemory when it is no longer needed.
*/
public long getAtomsData() {
return XAtom.toData(getAtoms());
}
/**
* Returns true if this list contains the atom <code>atom</code>
*/
public boolean contains(XAtom atom) {
return atoms.contains(atom);
}
/**
* Add atom to the list. Does nothing if list already contains this atom.
*/
public void add(XAtom atom) {
atoms.add(atom);
}
/**
* Removes atom from the list. Does nothing if arrays doesn't conaint this atom.
*/
public void remove(XAtom atom) {
atoms.remove(atom);
}
/**
* Returns size of the list
*/
public int size() {
return atoms.size();
}
/**
* Returns a subset of a list which is intersection of this set and set build by mapping <code>mask</code> in
* <code>mapping</code>.
*/
public XAtomList subset(int mask, Map<Integer, XAtom> mapping) {
XAtomList res = new XAtomList();
Iterator<Integer> iter = mapping.keySet().iterator();
while (iter.hasNext()) {
Integer bits = iter.next();
if ( (mask & bits.intValue()) == bits.intValue() ) {
XAtom atom = mapping.get(bits);
if (contains(atom)) {
res.add(atom);
}
}
}
return res;
}
/**
* Returns iterator for items.
*/
public Iterator<XAtom> iterator() {
return atoms.iterator();
}
/**
* Merges without duplicates all the atoms from another list
*/
public void addAll(XAtomList atoms) {
Iterator<XAtom> iter = atoms.iterator();
while(iter.hasNext()) {
add(iter.next());
}
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("[");
Iterator iter = atoms.iterator();
while (iter.hasNext()) {
buf.append(iter.next().toString());
if (iter.hasNext()) {
buf.append(", ");
}
}
buf.append("]");
return buf.toString();
}
}