39
40
41
42 class XAWTXSettings extends XSettings implements XMSelectionListener {
43
44 private final XAtom xSettingsPropertyAtom = XAtom.get("_XSETTINGS_SETTINGS");
45
46 private static Logger log = Logger.getLogger("sun.awt.X11.XAWTXSettings");
47
48 /* The maximal length of the property data. */
49 public static final long MAX_LENGTH = 1000000;
50
51 XMSelection settings;
52
53 public XAWTXSettings() {
54 initXSettings();
55
56 }
57
58 void initXSettings() {
59 if (log.isLoggable(Level.FINE)) log.fine("Initializing XAWT XSettings");
60 settings = new XMSelection("_XSETTINGS");
61 settings.addSelectionListener(this);
62 initPerScreenXSettings();
63 }
64
65 public void ownerDeath(int screen, XMSelection sel, long deadOwner) {
66 if (log.isLoggable(Level.FINE)) log.fine("Owner " + deadOwner + " died for selection " + sel + " screen "+ screen);
67 }
68
69
70 public void ownerChanged(int screen, XMSelection sel, long newOwner, long data, long timestamp) {
71 if (log.isLoggable(Level.FINE)) log.fine("New Owner "+ newOwner + " for selection = " + sel + " screen " +screen );
72 }
73
74 public void selectionChanged(int screen, XMSelection sel, long owner , XPropertyEvent event) {
75 log.fine("Selection changed on sel " + sel + " screen = " + screen + " owner = " + owner + " event = " + event);
76 updateXSettings(screen,owner);
77 }
78
79 void initPerScreenXSettings() {
80 if (log.isLoggable(Level.FINE)) log.fine("Updating Per XSettings changes");
81
82 /*
83 * As toolkit cannot yet cope with per-screen desktop properties,
84 * only report XSETTINGS changes on the default screen. This
85 * should be "good enough" for most cases.
86 */
87
88 Map updatedSettings = null;
89 XToolkit.awtLock();
90 try {
91 long display = XToolkit.getDisplay();
92 int screen = (int) XlibWrapper.DefaultScreen(display);
93 updatedSettings = getUpdatedSettings(settings.getOwner(screen));
94 } finally {
95 XToolkit.awtUnlock();
96 }
97 // we must not invoke this under Awt Lock
98 ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
99 }
100
101 private void updateXSettings(int screen, long owner) {
102 final Map updatedSettings = getUpdatedSettings(owner);
103 // this method is called under awt lock and usually on toolkit thread
104 // but parseXSettings() causes public code execution, so we need to transfer
105 // this to EDT
106 EventQueue.invokeLater( new Runnable() {
107 public void run() {
108 ((XToolkit) Toolkit.getDefaultToolkit()).parseXSettings( 0, updatedSettings);
109 }
110 });
111 }
112
113 private Map getUpdatedSettings(final long owner) {
114 if (log.isLoggable(Level.FINE)) log.fine("owner =" + owner);
115 if (0 == owner) {
116 return null;
117 }
118
119 Map settings = null;
120 try {
121 WindowPropertyGetter getter =
122 new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
123 false, xSettingsPropertyAtom.getAtom() );
124 try {
125 int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
126
127 if (status != XlibWrapper.Success || getter.getData() == 0) {
128 if (log.isLoggable(Level.FINE)) log.fine("OH OH : getter failed status = " + status );
129 settings = null;
130 }
131
132 long ptr = getter.getData();
133
134 if (log.isLoggable(Level.FINE)) log.fine("noItems = " + getter.getNumberOfItems());
135 byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
136 if (array != null) {
137 settings = update(array);
138 }
139 } finally {
140 getter.dispose();
141 }
142 }
143 catch (Exception e) {
144 e.printStackTrace();
145 }
146 return settings;
147 }
148
149
150
151 }
|
39
40
41
42 class XAWTXSettings extends XSettings implements XMSelectionListener {
43
44 private final XAtom xSettingsPropertyAtom = XAtom.get("_XSETTINGS_SETTINGS");
45
46 private static Logger log = Logger.getLogger("sun.awt.X11.XAWTXSettings");
47
48 /* The maximal length of the property data. */
49 public static final long MAX_LENGTH = 1000000;
50
51 XMSelection settings;
52
53 public XAWTXSettings() {
54 initXSettings();
55
56 }
57
58 void initXSettings() {
59 if (log.isLoggable(Level.FINE)) {
60 log.fine("Initializing XAWT XSettings");
61 }
62 settings = new XMSelection("_XSETTINGS");
63 settings.addSelectionListener(this);
64 initPerScreenXSettings();
65 }
66
67 public void ownerDeath(int screen, XMSelection sel, long deadOwner) {
68 if (log.isLoggable(Level.FINE)) {
69 log.fine("Owner " + deadOwner + " died for selection " + sel + " screen "+ screen);
70 }
71 }
72
73
74 public void ownerChanged(int screen, XMSelection sel, long newOwner, long data, long timestamp) {
75 if (log.isLoggable(Level.FINE)) {
76 log.fine("New Owner "+ newOwner + " for selection = " + sel + " screen " +screen );
77 }
78 }
79
80 public void selectionChanged(int screen, XMSelection sel, long owner , XPropertyEvent event) {
81 if (log.isLoggable(Level.FINE)) {
82 log.fine("Selection changed on sel " + sel + " screen = " + screen + " owner = " + owner + " event = " + event);
83 }
84 updateXSettings(screen,owner);
85 }
86
87 void initPerScreenXSettings() {
88 if (log.isLoggable(Level.FINE)) {
89 log.fine("Updating Per XSettings changes");
90 }
91
92 /*
93 * As toolkit cannot yet cope with per-screen desktop properties,
94 * only report XSETTINGS changes on the default screen. This
95 * should be "good enough" for most cases.
96 */
97
98 Map updatedSettings = null;
99 XToolkit.awtLock();
100 try {
101 long display = XToolkit.getDisplay();
102 int screen = (int) XlibWrapper.DefaultScreen(display);
103 updatedSettings = getUpdatedSettings(settings.getOwner(screen));
104 } finally {
105 XToolkit.awtUnlock();
106 }
107 // we must not invoke this under Awt Lock
108 ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
109 }
110
111 private void updateXSettings(int screen, long owner) {
112 final Map updatedSettings = getUpdatedSettings(owner);
113 // this method is called under awt lock and usually on toolkit thread
114 // but parseXSettings() causes public code execution, so we need to transfer
115 // this to EDT
116 EventQueue.invokeLater( new Runnable() {
117 public void run() {
118 ((XToolkit) Toolkit.getDefaultToolkit()).parseXSettings( 0, updatedSettings);
119 }
120 });
121 }
122
123 private Map getUpdatedSettings(final long owner) {
124 if (log.isLoggable(Level.FINE)) {
125 log.fine("owner =" + owner);
126 }
127 if (0 == owner) {
128 return null;
129 }
130
131 Map settings = null;
132 try {
133 WindowPropertyGetter getter =
134 new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
135 false, xSettingsPropertyAtom.getAtom() );
136 try {
137 int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
138
139 if (status != XlibWrapper.Success || getter.getData() == 0) {
140 if (log.isLoggable(Level.FINE)) {
141 log.fine("OH OH : getter failed status = " + status );
142 }
143 settings = null;
144 }
145
146 long ptr = getter.getData();
147
148 if (log.isLoggable(Level.FINE)) {
149 log.fine("noItems = " + getter.getNumberOfItems());
150 }
151 byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
152 if (array != null) {
153 settings = update(array);
154 }
155 } finally {
156 getter.dispose();
157 }
158 }
159 catch (Exception e) {
160 e.printStackTrace();
161 }
162 return settings;
163 }
164
165
166
167 }
|