81 }
82
83 public void selectionChanged(int screen, XMSelection sel, long owner , XPropertyEvent event) {
84 if (log.isLoggable(PlatformLogger.Level.FINE)) {
85 log.fine("Selection changed on sel " + sel + " screen = " + screen + " owner = " + owner + " event = " + event);
86 }
87 updateXSettings(screen,owner);
88 }
89
90 void initPerScreenXSettings() {
91 if (log.isLoggable(PlatformLogger.Level.FINE)) {
92 log.fine("Updating Per XSettings changes");
93 }
94
95 /*
96 * As toolkit cannot yet cope with per-screen desktop properties,
97 * only report XSETTINGS changes on the default screen. This
98 * should be "good enough" for most cases.
99 */
100
101 Map updatedSettings = null;
102 XToolkit.awtLock();
103 try {
104 long display = XToolkit.getDisplay();
105 int screen = (int) XlibWrapper.DefaultScreen(display);
106 updatedSettings = getUpdatedSettings(settings.getOwner(screen));
107 } finally {
108 XToolkit.awtUnlock();
109 }
110 // we must not invoke this under Awt Lock
111 ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
112 }
113
114 private void updateXSettings(int screen, long owner) {
115 final Map updatedSettings = getUpdatedSettings(owner);
116 // this method is called under awt lock and usually on toolkit thread
117 // but parseXSettings() causes public code execution, so we need to transfer
118 // this to EDT
119 EventQueue.invokeLater( new Runnable() {
120 public void run() {
121 ((XToolkit) Toolkit.getDefaultToolkit()).parseXSettings( 0, updatedSettings);
122 }
123 });
124 }
125
126 private Map getUpdatedSettings(final long owner) {
127 if (log.isLoggable(PlatformLogger.Level.FINE)) {
128 log.fine("owner =" + owner);
129 }
130 if (0 == owner) {
131 return null;
132 }
133
134 Map settings = null;
135 try {
136 WindowPropertyGetter getter =
137 new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
138 false, xSettingsPropertyAtom.getAtom() );
139 try {
140 int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
141
142 if (status != XConstants.Success || getter.getData() == 0) {
143 if (log.isLoggable(PlatformLogger.Level.FINE)) {
144 log.fine("OH OH : getter failed status = " + status );
145 }
146 settings = null;
147 }
148
149 long ptr = getter.getData();
150
151 if (log.isLoggable(PlatformLogger.Level.FINE)) {
152 log.fine("noItems = " + getter.getNumberOfItems());
153 }
154 byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
|
81 }
82
83 public void selectionChanged(int screen, XMSelection sel, long owner , XPropertyEvent event) {
84 if (log.isLoggable(PlatformLogger.Level.FINE)) {
85 log.fine("Selection changed on sel " + sel + " screen = " + screen + " owner = " + owner + " event = " + event);
86 }
87 updateXSettings(screen,owner);
88 }
89
90 void initPerScreenXSettings() {
91 if (log.isLoggable(PlatformLogger.Level.FINE)) {
92 log.fine("Updating Per XSettings changes");
93 }
94
95 /*
96 * As toolkit cannot yet cope with per-screen desktop properties,
97 * only report XSETTINGS changes on the default screen. This
98 * should be "good enough" for most cases.
99 */
100
101 Map<String, Object> updatedSettings = null;
102 XToolkit.awtLock();
103 try {
104 long display = XToolkit.getDisplay();
105 int screen = (int) XlibWrapper.DefaultScreen(display);
106 updatedSettings = getUpdatedSettings(settings.getOwner(screen));
107 } finally {
108 XToolkit.awtUnlock();
109 }
110 // we must not invoke this under Awt Lock
111 ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
112 }
113
114 private void updateXSettings(int screen, long owner) {
115 final Map<String, Object> updatedSettings = getUpdatedSettings(owner);
116 // this method is called under awt lock and usually on toolkit thread
117 // but parseXSettings() causes public code execution, so we need to transfer
118 // this to EDT
119 EventQueue.invokeLater( new Runnable() {
120 public void run() {
121 ((XToolkit) Toolkit.getDefaultToolkit()).parseXSettings( 0, updatedSettings);
122 }
123 });
124 }
125
126 private Map<String, Object> getUpdatedSettings(final long owner) {
127 if (log.isLoggable(PlatformLogger.Level.FINE)) {
128 log.fine("owner =" + owner);
129 }
130 if (0 == owner) {
131 return null;
132 }
133
134 Map<String, Object> settings = null;
135 try {
136 WindowPropertyGetter getter =
137 new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
138 false, xSettingsPropertyAtom.getAtom() );
139 try {
140 int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
141
142 if (status != XConstants.Success || getter.getData() == 0) {
143 if (log.isLoggable(PlatformLogger.Level.FINE)) {
144 log.fine("OH OH : getter failed status = " + status );
145 }
146 settings = null;
147 }
148
149 long ptr = getter.getData();
150
151 if (log.isLoggable(PlatformLogger.Level.FINE)) {
152 log.fine("noItems = " + getter.getNumberOfItems());
153 }
154 byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
|