1 | <?xml version="1.0" encoding="UTF-8"?>
|
---|
2 | <?xml-stylesheet type="text/css"
|
---|
3 | href="eclipseos2-xxe.css"
|
---|
4 | ?>
|
---|
5 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
---|
6 | "xhtml1-strict.dtd">
|
---|
7 | <html>
|
---|
8 | <head>
|
---|
9 | <link href="eclipseos2.css" rel="stylesheet" type="text/css" />
|
---|
10 |
|
---|
11 | <title>Eclipse for OS/2 Transitional Project Notes</title>
|
---|
12 | </head>
|
---|
13 |
|
---|
14 | <body>
|
---|
15 | <h1>Known differences between Windows and OS/2 ports of Eclipse</h1>
|
---|
16 |
|
---|
17 | <p>OS/2 port of Eclipse is based on the code of Windows port because of
|
---|
18 | similarity of their APIs. But of course, they are not identical, so there
|
---|
19 | is a number of differences in the behavior of OS/2 and Windows
|
---|
20 | implementations that is not covered by the Eclipse/SWT public API (which
|
---|
21 | is completely identical) and can lead to various side effects. These
|
---|
22 | differences are mentioned here.</p>
|
---|
23 |
|
---|
24 | <h2>SWT differences</h2>
|
---|
25 |
|
---|
26 | <table>
|
---|
27 | <thead>
|
---|
28 | <tr>
|
---|
29 | <th>#</th>
|
---|
30 |
|
---|
31 | <th>Windows</th>
|
---|
32 |
|
---|
33 | <th>OS/2</th>
|
---|
34 |
|
---|
35 | <th>Remarks</th>
|
---|
36 | </tr>
|
---|
37 | </thead>
|
---|
38 |
|
---|
39 | <tr>
|
---|
40 | <td>001</td>
|
---|
41 |
|
---|
42 | <td>In Windows, if a top level (frame) window is created with the
|
---|
43 | <code>CW_USEDEFAULT</code> constant as its size and position, it
|
---|
44 | doesn't receive the <code>WM_SIZE</code> message until it is shown for
|
---|
45 | the first time or explicitly resized/moved, while
|
---|
46 | <code>GetWindowRect()</code> (i.e. <code>Shell.getBounds()</code>)
|
---|
47 | already reports these default size and position, but not zeros. This
|
---|
48 | has one side effect: the <code>Shell</code> widget receives
|
---|
49 | <code>SWT.Resize/Move</code> events not right after creation but only
|
---|
50 | after the first <code>open()</code>, <code>setVisible()</code> or
|
---|
51 | <code>setBounds()</code> call. In turn, this allows to implicitly do
|
---|
52 | the <code>Shell</code> layout upon the first <code>open()</code>
|
---|
53 | without an explicit call to <code>layout()</code> since the layout is
|
---|
54 | done automatically during <code>WM_SIZE</code> message handling.</td>
|
---|
55 |
|
---|
56 | <td>Although we can acquire nearly the same behavior in OS/2 by
|
---|
57 | specifying the <code>FS_SHELLPOSITION</code> flag during the frame
|
---|
58 | creation, the actual size/position of the window remains zero until it
|
---|
59 | is shown for the first time. This leads, for example, to the
|
---|
60 | impossibility to center the <code>Shell</code> widget before a call to
|
---|
61 | its <code>open()</code> method, which (as we think) breaks the SWT
|
---|
62 | API. So, we set the default <code>Shell</code> size/position (as told
|
---|
63 | us by the system through <code>WinQueryTaskSizePos()</code> call)
|
---|
64 | explicitly after widget creation and use <code>FS_SHELLPOSITION</code>
|
---|
65 | only to distinguish that the widget is being shown for the first time
|
---|
66 | and we need to do the "implicit" layout to emulate Windows behavior.
|
---|
67 | This has the side effect such as the <code>Shell</code> widget
|
---|
68 | receives <code>SWT.Resize/Move</code> events right after its creation,
|
---|
69 | not after the first open as in Windows. We don't see any reason to
|
---|
70 | emulate this thing too because it is logically more correct and either
|
---|
71 | behavior is not explicitly specified by the SWT API.</td>
|
---|
72 |
|
---|
73 | <td></td>
|
---|
74 | </tr>
|
---|
75 |
|
---|
76 | <tr>
|
---|
77 | <td>002</td>
|
---|
78 |
|
---|
79 | <td><code>GC.drawRoundRectangle()</code> and
|
---|
80 | <code>GC.fillRoundRectangle()</code> for some reason (a bug?) draw
|
---|
81 | rectangles 1 pixel narrower both in horizontal and vertical than their
|
---|
82 | nonrounded versions with the same width and height
|
---|
83 | arguments.<br /><br />Also rectangles with the negative width or
|
---|
84 | height are drawn not with the same width and height as when these
|
---|
85 | arguments are positive.</td>
|
---|
86 |
|
---|
87 | <td>Rounded and nonrounded rectangles are drawn with the same width
|
---|
88 | and height provided they are passed the same width and height
|
---|
89 | arguments.<br /><br />Rectangles of negative width/height are drawn
|
---|
90 | with the same size as with positive ones.</td>
|
---|
91 |
|
---|
92 | <td>See also <a href="swt003.html#GraphicPrimitives">here</a>.</td>
|
---|
93 | </tr>
|
---|
94 |
|
---|
95 | <tr>
|
---|
96 | <td><a name="003">003</a> - eliminated</td>
|
---|
97 |
|
---|
98 | <td><code>GC.drawFocus()</code> draws the focus rectangle following
|
---|
99 | the rules of <code>fillRectangle()</code>-- width and height arguments
|
---|
100 | specify rectangle's width and height but not the position of right and
|
---|
101 | bottom borders as in <code>drawRectangle()</code>, although the
|
---|
102 | javadoc says that the latter is used to draw the focus on platforms
|
---|
103 | that do not support such a notion (so we get different width and
|
---|
104 | height on that platforms)</td>
|
---|
105 |
|
---|
106 | <td><code>GC.drawFocus()</code> follows the same rules as
|
---|
107 | <code>drawRectangle()</code>.</td>
|
---|
108 |
|
---|
109 | <td></td>
|
---|
110 | </tr>
|
---|
111 |
|
---|
112 | <tr>
|
---|
113 | <td>004</td>
|
---|
114 |
|
---|
115 | <td></td>
|
---|
116 |
|
---|
117 | <td>Iconify / deiconify... different order of appearance of these
|
---|
118 | events...</td>
|
---|
119 |
|
---|
120 | <td></td>
|
---|
121 | </tr>
|
---|
122 |
|
---|
123 | <tr>
|
---|
124 | <td>005</td>
|
---|
125 |
|
---|
126 | <td>When drawing on a palette-based image using <code>GC</code> its
|
---|
127 | <code>getForeground()</code> and <code>getBackground()</code> methods
|
---|
128 | do not always return actual RGB color values from the image's palette
|
---|
129 | that are used to assign colors to new pixels drawn by <code>GC</code>
|
---|
130 | methods. Instead, they return exactly the same RGB values as they were
|
---|
131 | passed before to <code>setForeground()/setBackground()</code> methods.
|
---|
132 | The difference between these values takes place when an RGB value for
|
---|
133 | a color specified in the <code>set...</code> method is absent in the
|
---|
134 | image's palette -- in this case Windows automatically selects the
|
---|
135 | closest match (which can differ seriously) as the color, but the RGB
|
---|
136 | value stored in the <code>GC</code> internal data (the device context
|
---|
137 | data) is the original one (not matched) and it will be used to return
|
---|
138 | a color when the <code>get...</code> method is called.</td>
|
---|
139 |
|
---|
140 | <td>Under OS/2 also the closest match is selected from the image's
|
---|
141 | palette and used for drawing pixels when drawing on a palette-based
|
---|
142 | image. But the color returned by <code>GC.getForeground()</code> and
|
---|
143 | <code>getBackground()</code> methods always contains the actual
|
---|
144 | (matched) RGB value used for drawing.</td>
|
---|
145 |
|
---|
146 | <td>Example. Suppose that we have an image that doesn't have a pure
|
---|
147 | red (255, 0, 0) in its palette. We create a red <code>Color</code> on
|
---|
148 | a direct-color <code>Display</code>, a <code>GC</code> on this image,
|
---|
149 | then call <code>GC.setForeground (red_color)</code> and
|
---|
150 | <code>GC.drawOval()</code>. The circle is drawn not in red but in the
|
---|
151 | color closest to red in the image's palette, as expected. In Windows,
|
---|
152 | a subsequent call to <code>GC.getForeground()</code> will always
|
---|
153 | return a color with the (255,0,0) RGB value while in OS/2 the RGB
|
---|
154 | value will be the closest match chosen from the image's palette and
|
---|
155 | used for drawing. See also the <code>SWT006_01</code> testcase.</td>
|
---|
156 | </tr>
|
---|
157 |
|
---|
158 | <tr>
|
---|
159 | <td>006</td>
|
---|
160 |
|
---|
161 | <td><code>Image.setBackground()</code> doesn't work for direct color
|
---|
162 | images.</td>
|
---|
163 |
|
---|
164 | <td><code>Image.setBackground()</code> changes the transparent pixel
|
---|
165 | on direct color images as well as on palette-based.</td>
|
---|
166 |
|
---|
167 | <td></td>
|
---|
168 | </tr>
|
---|
169 |
|
---|
170 | <tr>
|
---|
171 | <td><a name="007">007</a></td>
|
---|
172 |
|
---|
173 | <td>When the system is in 256-color mode, we can still get the image
|
---|
174 | data in its original color depth and palette after the image has been
|
---|
175 | loaded/created. This is true for direct color images also (this
|
---|
176 | probably false for icons only, where we get data converted to 8-bit,
|
---|
177 | regardless of the original).</td>
|
---|
178 |
|
---|
179 | <td>When the system is in 256-color mode, all bitmaps are converted
|
---|
180 | and internally stored in 8-bit depth using the current palette,
|
---|
181 | regardless of their original depth and/or palette. This means it's
|
---|
182 | impossible to get back the same image data from the system as we
|
---|
183 | provided creating the bitmap (for example, when calling
|
---|
184 | <code>Image.getImageData()</code>) -- we always get data in the
|
---|
185 | converted form.</td>
|
---|
186 |
|
---|
187 | <td>This is the unchangeable behavior of OS/2 (we don't know any
|
---|
188 | acceptable solution for this). Taking into account that the usage of
|
---|
189 | 256-color mode is rare in our days we decided to leave things as they
|
---|
190 | are for the present.</td>
|
---|
191 | </tr>
|
---|
192 |
|
---|
193 | <tr>
|
---|
194 | <td>008</td>
|
---|
195 |
|
---|
196 | <td></td>
|
---|
197 |
|
---|
198 | <td>Potential problem with icons... (OS/2 supports only 32/16 px and
|
---|
199 | 40/20 px icons...)</td>
|
---|
200 |
|
---|
201 | <td></td>
|
---|
202 | </tr>
|
---|
203 |
|
---|
204 | <tr>
|
---|
205 | <td>009</td>
|
---|
206 |
|
---|
207 | <td>When the window is not visible setting its maximized state to true
|
---|
208 | will not actually resize the window to the maximum size (because
|
---|
209 | windows cannot be maximized when invisible). This leads to the number
|
---|
210 | of hidden problems such as the <code>Shell</code>'s children having
|
---|
211 | zero size after adding them to a newly created <code>Shell</code>,
|
---|
212 | setting its layout and maximizing it but before calling the
|
---|
213 | <code>Shell.open()</code> method.</td>
|
---|
214 |
|
---|
215 | <td>When the window is not visible setting its maximized state to true
|
---|
216 | will resize it as if it would be visible. This does not lead to any
|
---|
217 | problems except that we have to keep in mint the compatibility with
|
---|
218 | SWT for other platforms.</td>
|
---|
219 |
|
---|
220 | <td></td>
|
---|
221 | </tr>
|
---|
222 |
|
---|
223 | <tr>
|
---|
224 | <td>010</td>
|
---|
225 |
|
---|
226 | <td>When the <code>SWT.RADIO</code> button is selected and all other
|
---|
227 | radio buttons in the group are automatically deselected, these
|
---|
228 | deselected buttons receive the <code>SWT.Selection</code> event
|
---|
229 | <b>before</b> the selected button.</td>
|
---|
230 |
|
---|
231 | <td>Deselected radio buttons receive the <code>SWT.Selection</code>
|
---|
232 | event <b>after</b> the selected one receives it.</td>
|
---|
233 |
|
---|
234 | <td>This seems not to essential.</td>
|
---|
235 | </tr>
|
---|
236 | </table>
|
---|
237 |
|
---|
238 | <h2>Other differences</h2>
|
---|
239 |
|
---|
240 | <p>[Haven't been started yet -- SWT part must be finished first]</p>
|
---|
241 | </body>
|
---|
242 | </html>
|
---|