OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [mw/] [doc/] [microwindows_architecture.html] - Blame information for rev 1767

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 673 markom
<html>
2
 
3
<head>
4
<meta http-equiv="Content-Language" content="en-us">
5
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
6
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
7
<meta name="ProgId" content="FrontPage.Editor.Document">
8
<title>MicroWindows Architecture</title>
9
</head>
10
 
11
<body>
12
 
13
<h1 align="left"><img border="0" src="file:///C:/My%20Documents/My%20Webs/myweb2/images/clouds.gif" width="72" height="33">Microwindows Architecture</h1>
14
 
15
<p align="left">1999/12/04 Copyright (c) 1999 Greg Haerr &lt;<a href="mailto:greg@censoft.com">greg@censoft.com</a>&gt; All Rights Reserved.</p>
16
 
17
<p align="left">This is my first cut at getting the architecture and implementation
18
spilled out.&nbsp; Please let me know if there's more detail needed in some areas, or
19
whether you're confused by my explanations.&nbsp; This document is for educational and
20
porting purposes, so please read on.</p>
21
 
22
<h3>Contents</h3>
23
 
24
<p>1. Architecture<br>
25
&nbsp;&nbsp;&nbsp; 1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Layered Design<br>
26
&nbsp;&nbsp;&nbsp; 1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Device Drivers<br>
27
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2.1&nbsp;&nbsp;&nbsp;&nbsp; Screen Driver<br>
28
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2.2&nbsp;&nbsp;&nbsp;&nbsp; Mouse Driver<br>
29
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2.3&nbsp;&nbsp;&nbsp;&nbsp; Keyboard Driver<br>
30
&nbsp;&nbsp;&nbsp; 1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MicroGUI - Device
31
Independent Graphics Engine&nbsp;<br>
32
&nbsp;&nbsp;&nbsp; 1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Applications Programmer
33
Interfaces<br>
34
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.1&nbsp;&nbsp;&nbsp; Microwindows API<br>
35
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.2&nbsp;&nbsp;&nbsp; Nano-X API</p>
36
 
37
<p>2. Device-Independent Engine Features<br>
38
&nbsp;&nbsp;&nbsp; 2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics Engine Features
39
and Implementation<br>
40
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.1&nbsp;&nbsp;&nbsp; Regions<br>
41
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.2&nbsp;&nbsp;&nbsp; Clipping<br>
42
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.3&nbsp;&nbsp;&nbsp; Line Drawing<br>
43
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.4&nbsp;&nbsp;&nbsp; Rectangles, Circles,
44
Ellipses<br>
45
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.5&nbsp;&nbsp;&nbsp; Polygons<br>
46
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.6&nbsp;&nbsp;&nbsp; Area Fills<br>
47
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.7&nbsp;&nbsp;&nbsp; Fonts<br>
48
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.8&nbsp;&nbsp;&nbsp; Text Drawing<br>
49
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.9&nbsp;&nbsp;&nbsp; Color model and
50
palettes<br>
51
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.10&nbsp; Image Drawing<br>
52
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.11&nbsp; Blitting</p>
53
 
54
<p>3. Microwindows API<br>
55
&nbsp;&nbsp;&nbsp; 3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message-passing
56
architecture<br>
57
&nbsp;&nbsp;&nbsp; 3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window creation and
58
destruction<br>
59
&nbsp;&nbsp;&nbsp; 3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window showing, hiding
60
and moving<br>
61
&nbsp;&nbsp;&nbsp; 3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window painting<br>
62
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.1&nbsp;&nbsp;&nbsp; Client and screen
63
coordinates<br>
64
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.2&nbsp;&nbsp;&nbsp; Device contexts<br>
65
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.3&nbsp;&nbsp;&nbsp; Graphics drawing API<br>
66
&nbsp;&nbsp;&nbsp; 3.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Utility functions<br>
67
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.1&nbsp;&nbsp;&nbsp; Setting window focus<br>
68
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.2&nbsp;&nbsp;&nbsp; Mouse capture<br>
69
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.3&nbsp;&nbsp;&nbsp; Rectangle and Region
70
management</p>
71
 
72
<p>4. Nano-X API<br>
73
&nbsp;&nbsp;&nbsp; 4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client/Server model<br>
74
&nbsp;&nbsp;&nbsp; 4.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Events<br>
75
&nbsp;&nbsp;&nbsp; 4.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window creation and
76
destruction<br>
77
&nbsp;&nbsp;&nbsp; 4.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window showing, hiding
78
and moving<br>
79
&nbsp;&nbsp;&nbsp; 4.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drawing to a window<br>
80
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.5.1&nbsp;&nbsp;&nbsp; Graphics contexts<br>
81
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.5.2&nbsp;&nbsp;&nbsp; Graphics drawing API<br>
82
&nbsp;&nbsp;&nbsp; 4.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Utility functions</p>
83
 
84
<h3>1. Architecture</h3>
85
 
86
<h3>1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Layered Design</h3>
87
 
88
<p>Microwindows is essentially a layered design that allows different layers to be used or
89
rewritten to suite the needs of the implementation.&nbsp; At the lowest level, screen,
90
mouse/touchpad and keyboard drivers provide access to the actual display and other
91
user-input hardware.&nbsp; At the mid level, a portable graphics engine is implemented,
92
providing support for line draws, area fills, polygons, clipping and color models.&nbsp;
93
At the upper level, various API's are implemented providing access to the graphics
94
applications programmer.&nbsp; These APIs may or may not provide desktop and/or window
95
look and feel.&nbsp; Currently, Microwindows supports the ECMA APIW and Nano-X APIs.&nbsp;
96
These APIs provide close compatibility with the Win32 and X Window systems, allowing
97
programs to be ported from other systems easily.</p>
98
 
99
<h3>1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Device Drivers</h3>
100
 
101
<p>The device driver interfaces are defined in device.h.&nbsp; A given implementation of
102
Microwindows will link at least one screen, mouse and keyboard driver into the
103
system.&nbsp; The mid level routines in the device-independent graphics engine core then
104
call the device driver directly to perform the hardware-specific operations.&nbsp; This
105
setup allows varying hardware devices to be added to the Microwindows system without
106
affecting the way the entire system works.</p>
107
 
108
<h3>1.2.1&nbsp;&nbsp;&nbsp;&nbsp; Screen Driver</h3>
109
 
110
<p>There are currently screen drivers written for Linux 2.2.x framebuffer systems, as well
111
as 16-bit ELKS and MSDOS drivers for real-mode VGA cards.&nbsp; The real mode drivers
112
(scr_bios.c, vgaplan4.c, mempl4.c, scr_her.c) can be configured to initialize the VGA
113
hardware directly, or utilize the PC BIOS to begin and end graphics mode.&nbsp; The
114
framebuffer drivers (scr_fb.c, fb.c, fblin?.c) have routines for 1, 2, 4 and 8bpp
115
palletized displays, as well as 8, 15, 16, and 32 bpp truecolor displays.&nbsp; The
116
framebuffer system works in Linux by opening /dev/fd0 (or getenv(&quot;FRAMEBUFFER&quot;))
117
and mmap()ing the display memory into a linear buffer in memory.&nbsp; Some display modes,
118
like the VGA 4 planes mode, require that OUT instructions be issued by the screen driver,
119
while packed pixel drivers typically can get away with just reading and writing the
120
framebuffer only.&nbsp; All the graphics mode initialization and deinitialization is
121
handled by the Linux kernel.&nbsp; Getting this set up can be a real pain.</p>
122
 
123
<p>The screen driver is the most complex driver in the system, but was designed so that it
124
can be extremely easy to port new hardware to Microwindows.&nbsp; For this reason, there
125
are but a few entry points that must actually talk to the hardware, while other routines
126
are provided that allow just the small set of core routines to be used, if desired.&nbsp;
127
For example, a screen driver must implement ReadPixel, DrawPixel, DrawHorzLine, and
128
DrawVertLine.&nbsp; These routines read and write a pixel from display memory, as well as
129
draw a horizontal and vertical line.&nbsp; Clipping is handled at the device-independent
130
layer.&nbsp; Currently, all mouse movement, text drawing, and bitmap drawing run on top of
131
these low level functions.&nbsp; In the future, entry points will be provided for fast
132
text and bitmap drawing capabilities.&nbsp; If the display is palletized, a SetPalette
133
routine must be included, unless a static palette that matches the system palette is
134
linked into the system.&nbsp; The screen driver, on initialization, returns values telling
135
the system the x,y size of the screen, along with the color model supported.</p>
136
 
137
<p>Two font models are currently provided, to be linked in at your desire.&nbsp; The
138
proportional font model has in-core font tables built from .bdf and other font conversion
139
utilities provided.&nbsp; The rom-based font uses the PC BIOS to find the character
140
generator table address and has routines to draw that fixed-pitch font format.</p>
141
 
142
<p>The screen driver can choose to implement bitblitting, by ORing in PSF_HAVEBLIT into
143
the returned flags field.&nbsp; When present, bit blitting allows Microwindows to perform
144
off-screen drawing.&nbsp; Microwindows allows any graphics operation that can be performed
145
on a physical screen to be performed off-screen, and then copied (bit-blitted) to the
146
physical screen.&nbsp; Implementing a blitting screen driver can be fairly complex.&nbsp;
147
The first consideration in implementing a blitting driver is whether the low-level display
148
hardware can be passed a hardware address for a framebuffer.&nbsp; If so, then the same
149
routines that draw to the physical screen can be used to draw to off-screen buffers.&nbsp;
150
This is the method used for the linear framebuffer drivers provided for Linux packed-pixel
151
displays.&nbsp; The system replaces the mmap()'d physical framebuffer address with a
152
malloc()'d memory address and calls the original screen driver entry point.&nbsp; In the
153
case where the system doesn't use an actual physical memory address, like when running on
154
top of X or MS Windows, then two sets of routines must be written; one to write the the
155
underlying graphics system hardware, and another to write to memory addresses.&nbsp; In
156
addition, the blit entry point must then know how to copy both ways between the two
157
formats.&nbsp; In fact, all four operations, screen-to-memory, memory-to-screen,
158
memory-to-memory, and screen-to-screen are supported by Microwindows and may need to be
159
performed.&nbsp; And of course the bit blitting routine must be _fast_.&nbsp; See the
160
files fblin8.c and mempl4.c for examples of supporting both types of display hardware.</p>
161
 
162
<p>If writing your first screen driver, I would recommend you start with the PC BIOS real
163
mode driver, scr_bios.c, or take a look at the framebuffer driver, scr_fb.c, which is
164
essentially a wrapper around all the fblin?.c routines to read and write various
165
framebuffer formats.&nbsp; Don't set the PSF_HAVEBLIT flag at first, and you won't have to
166
write a bitblit routine from the start.</p>
167
 
168
<p>Note that currently, all SCREENDEVICE function pointers must be filled in to at least a
169
void function.&nbsp; For speed reasons, the system always assumes that the function
170
pointers are valid.&nbsp; Thus, even if not implementing bitblit, a do-nothing bit-blit
171
procedure must be provided.</p>
172
 
173
<h3>1.2.2&nbsp;&nbsp;&nbsp;&nbsp; Mouse Driver</h3>
174
 
175
<p>There are three mouse drivers currently included in Microwindows.&nbsp; A GPM driver
176
for Linux, mou_gpm.c, as well as a serial port mouse driver for Linux and ELKS,
177
mou_ser.c.&nbsp; For MSDOS, an int33 driver mou_dos.c is provided.&nbsp; The provided
178
mouse drivers decode MS, PC and Logitech mice formats.&nbsp; A mouse driver's basic
179
function is to decode the mouse data and return either relative or absolute data for the
180
mouse position and buttons.</p>
181
 
182
<p>In addition, Brad LaRonde has written a touch panel driver mou_tp.c, which masquerades
183
as a mouse driver.&nbsp; It returns the value of x, y value of the pen on the display
184
surface, and can be used like a mouse.</p>
185
 
186
<p>Under Linux, the main loop of Microwindows is a select() statement, with file
187
descriptors for the mouse and keyboard driver always passed in.&nbsp; If the system that
188
Microwindows is running on doesn't support select() or doesn't pass mouse data through a
189
file descriptor, a Poll() entry point is provided.</p>
190
 
191
<h3>1.2.3&nbsp;&nbsp;&nbsp;&nbsp; Keyboard Driver</h3>
192
 
193
<p>There are two keyboard drivers provided.&nbsp; The first, kbd_tty.c, is used for Linux
194
and ELKS systems where the keyboard is opened and read as through a file descriptor.&nbsp;
195
The second, kbd_bios.c, read the PC BIOS for keystrokes and is used in MSDOS real
196
mode.&nbsp; The keyboard driver currently returns 8-bit data from the keyboard, but
197
doesn't decode multi-character function key codes. This functionality will need to be
198
added soon, by reading termcap files or the like.</p>
199
 
200
<h3>1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MicroGUI - Device Independent Graphics
201
Engine</h3>
202
 
203
<p>&nbsp;The core graphics functionality of Microwindows resides in the device independent
204
graphics engine, which calls the screen, mouse and keyboard drivers to interface with the
205
hardware.&nbsp; User applications programs never all the core graphics engine routines
206
directly, but rather through the programmer API's, discussed in the next sections.&nbsp;
207
The core engine routines are separated from the applications API's is for a variety of
208
reasons.&nbsp; The core routines will always reside on the server in a client/server
209
environment.&nbsp; Also, the core routines use internal text font and bitmap formats that
210
are designed for speed and may or may not be the same as the structures used in standard
211
API's.&nbsp; In addition, the core routines always use pointers, never ID's, and can then
212
be used together to implement more complex functions without always converting handles,
213
etc.</p>
214
 
215
<p>In Microwindows, the core routines all begin as GdXXX() functions, and are concerned
216
with graphics output, not window management.&nbsp; In addition, all clipping and color
217
conversion is handled within this layer.&nbsp; The following files comprise the core
218
modules of Microwindows:</p>
219
 
220
<p>&nbsp;&nbsp;&nbsp; devdraw.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Core graphics
221
routines for line, circle, polygon draw and fill, text and bitmap drawing, color
222
conversion</p>
223
 
224
<p>&nbsp;&nbsp;&nbsp; devclip.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Core
225
clipping routines.&nbsp; (devclip2.c is the new y-x-banding algorithm, devclip1.c an older
226
method)</p>
227
 
228
<p>&nbsp;&nbsp;&nbsp; devrgn.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
229
New dynamically allocated routines for intersect/union/subtract/xor region creation.</p>
230
 
231
<p>&nbsp;&nbsp;&nbsp; devmouse.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Core routines for keeping
232
the mouse pointer updated or clipped from the screen.</p>
233
 
234
<p>&nbsp;&nbsp;&nbsp; devkbd.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Core
235
keyboard handling routines.</p>
236
 
237
<p>&nbsp;&nbsp;&nbsp; devpalX.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linked in
238
static palettes for 1, 2, 4 and 8bpp palletized systems.</p>
239
 
240
<p>Section 2 following discusses the MicroGUI graphics engine routines in detail.</p>
241
 
242
<h3>1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Applications Programmer Interfaces</h3>
243
 
244
<p>Microwindows currently supports two different application programming interfaces.&nbsp;
245
This set of routines handles client/server activity, window manager activities like
246
drawing title bars, close boxes, etc, as well as, of course, handling the programmer's
247
requests for graphics output.&nbsp; Both the API's run on top of the core graphics engine
248
routines and device drivers. </p>
249
 
250
<p>The basic model of any API on top of Microwindows is to hang in initialize the screen,
251
keyboard and mouse drivers, then hang in a select() loop waiting for an event.&nbsp; When
252
an event occurs, if it's a system event like keyboard or mouse activity, then this
253
information is passed to the user program converted to an expose event, paint message,
254
etc.&nbsp; If it's a user requesting a graphics operation, then the parameters are decoded
255
and passed to the appropriate GdXXX engine routine.&nbsp; Note that the concept of a
256
window versus raw graphics operations are handled at this API level.&nbsp; That is, the
257
API defines the concepts of what a window is, what the coordinate systems are, etc, and
258
then the coordinates are all converted to &quot;screen coordinates&quot; and passed to the
259
core GdXXX engine routines to do the real work.&nbsp; This level also defines graphics or
260
display contexts and passes that information, including clipping information, to the core
261
engine routines.</p>
262
 
263
<p>Currently, the Microwindows API code is in win*.c, while the Nano-X API code is in
264
nanox/srv*.c.</p>
265
 
266
<h3>1.4.1&nbsp;&nbsp;&nbsp; Microwindows API</h3>
267
 
268
<p>The Microwindows API tries to be compliant with the European ECMA APIW standard.&nbsp;
269
Currently, there is support for most of the graphics drawing and clipping routines, as
270
well as automatic window title bar drawing and dragging windows for movement. The
271
Microwindows API is message-based, and allows programs to be written without regard to the
272
eventual window management policies implemented by the system.&nbsp; The Microwindows API
273
is not currently client/server, and will be discussed in more detail in section 4.</p>
274
 
275
<h3>1.4.2&nbsp;&nbsp;&nbsp; Nano-X API</h3>
276
 
277
<p>The Nano-X API is modeled after the mini-x server written initially by David Bell,
278
which was a reimplementation of X on the MINIX operating system.&nbsp; It loosely follows
279
the X Window System Xlib API, but the names all being with GrXXX() rather than
280
X...().&nbsp; Currently, the Nano-X API is client/server, but does not have any provisions
281
for automatic window dressings, title bars, or user window moves.&nbsp; There are several
282
groups writing widget sets currently, which will provide such things.&nbsp; Unfortunately,
283
the user programs must also then write only to a specific widget set API, rather than
284
using the Nano-X API directly, which means that only the functionality provided by the
285
widget set will be upwardly available to the applications programmer.&nbsp; (Although this
286
could be considerable, in the case that, say Gdk was ported.)</p>
287
 
288
<h3>2. Device-Independent Engine Features</h3>
289
 
290
<p>This section discusses in the capabilities and implementation of Microwindows' core
291
graphics engine in detail.&nbsp; It's purpose is both educational and to allow extending
292
an API by understanding how the engine works.</p>
293
 
294
<h3>&nbsp;&nbsp;&nbsp; 2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics Engine
295
Features and Implementation</h3>
296
 
297
<p>These routines concern themselves with drawing operations to off-screen or screen
298
surfaces.&nbsp; Each routine starts with Gd... and is passed a pointer to the SCREENDEVICE
299
structure (PSD) as it's first parameter.&nbsp; The PSD parameter specifies the low level
300
display details, like the x, y size of the device and the color model used by the
301
hardware, for example.&nbsp; In addition, the actual routines to perform drawing are
302
function pointers in this structure.&nbsp; All screen coordinates are of type COORD, and
303
specified in device coordinates, that is, offsets from the upper left corner of the
304
screen.</p>
305
 
306
<p>Colors are always specified as an RGB COLORVAL value into the graphics engine.&nbsp;
307
They are then possibly converted to palette indices and sent to the display hardware as
308
PIXELVAL values.&nbsp; In the case of 32bpp truecolor displays, no conversion is
309
required.&nbsp; The color model will be discussed in detail below.</p>
310
 
311
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.1&nbsp;&nbsp;&nbsp; Regions</h3>
312
 
313
<p>Regions are used to describe arbitrary sets of pixels on the screen.&nbsp; A simple,
314
square region of pixels can be described by a single rectangle.&nbsp; More complex sets of
315
pixels require more complex data structures.&nbsp; In Microwindows, regions are described
316
by an array of non-overlapping rectangles.&nbsp; Currently, there are two different
317
implementations of regions in Microwindows, as I've been enhancing the capabilities in
318
this area.&nbsp; The original design used a single static array of CLIPRECTs to describe
319
complex regions.&nbsp; Any point within any rectangle in the array was considered to be in
320
the region.&nbsp; The array wasn't sorted in any particular order, but was always
321
guaranteed to contain non-overlapping rectangles.&nbsp; Another global variable,
322
clipcount, specified the number of rectangles in the array.&nbsp; This original design had
323
no engine entry points for region management, the entire array was passed to the clipping
324
functions, described below. </p>
325
 
326
<p>In the new design, any number of regions can be created, as the regions (CLIPREGION *)
327
are stored as dynamically allocated arrays of rectangles.&nbsp; In this implementation,
328
the non-overlapping rectangles are always kept in &quot;y-x&quot; sorted bands, such that
329
each band's y height is the same for all rectangles in the band.&nbsp; This means that
330
only the x position and width of the rectangles in each band varied.&nbsp; Because of
331
this, it is easier to create a set of functions for combining regions, since effectively
332
only a single dimension had to be compared for each region operation.&nbsp; The new region
333
handling routines allow for creating and destroying regions, as well as combining
334
rectangles and regions with regions using Intersection, Union, Subtraction, and Exclusive
335
Or.&nbsp; This model allows regions to be implemented apart from the clipping routines,
336
unlike the first version.&nbsp; Following are the new region routines:</p>
337
 
338
<p>&nbsp;&nbsp;&nbsp;
339
GdAllocRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
340
- Create a region<br>
341
&nbsp;&nbsp;&nbsp;
342
GdDestroyRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
343
- Destroy a region<br>
344
&nbsp;&nbsp;&nbsp;
345
GdCopyRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
346
- Copy a region<br>
347
&nbsp;&nbsp;&nbsp; GdUnionRectWithRegion&nbsp;&nbsp;&nbsp;&nbsp; - Union a rectangle with
348
a region<br>
349
&nbsp;&nbsp;&nbsp;
350
GdIntersectRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
351
- Create a region from the intersection of two regions<br>
352
&nbsp;&nbsp;&nbsp;
353
GdSubtractRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
354
- Create a region from the difference of two regions<br>
355
&nbsp;&nbsp;&nbsp;
356
GdUnionRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
357
- Create a region from the union of two regions<br>
358
&nbsp;&nbsp;&nbsp;
359
GdXorRegion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
360
- Create a region from the XOR of two regions<br>
361
&nbsp;&nbsp;&nbsp; </p>
362
 
363
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.2&nbsp;&nbsp;&nbsp; Clipping</h3>
364
 
365
<p>Clipping in Microwindows is closely tied to the region management code.&nbsp; At any
366
point in time, the graphics engine has a single clipping region, that is a set of
367
rectangles, defined for any graphics operation.&nbsp; A point is drawn if it is
368
&quot;inside&quot; any of the current set of clip rectangles.&nbsp; Two slightly modified
369
versions of the clipping algorithm are supplied, devclip1.c for the original, static
370
rectangle array, and devclip2.c for the newer dynamically allocated array.&nbsp; A single
371
entry point GdSetClipRects, takes the passed region and specifies it's use for all
372
subsequent graphics operations.&nbsp; All the drawing routines then use the two additional
373
routines to determine whether or not to draw.&nbsp; GdClipPoint takes an x,y point in
374
screen coordinates and returns TRUE if the point can be drawn, that is, the point is
375
within one of the region rectangles.&nbsp; GdClipArea takes an upper left and lower right
376
point, and returns one of the following: CLIP_VISIBLE, if the specified area is completely
377
within the region, CLIP_INVISIBLE, if the area is completely not in the region, which
378
means that no drawing should be performed, or CLIP_PARTIAL, if a part but not the whole
379
area is within the region.&nbsp; A typical graphics primitive will call the screen driver
380
with unmodified passed inputs if CLIP_VISIBLE is returned, or return if CLIP_INIVISIBLE is
381
returned.&nbsp; In the CLIP_PARTIAL case, the primitive must break up the original request
382
into areas that are within the clip region before calling the screen driver.&nbsp; This
383
slows down the operation considerably.</p>
384
 
385
<p>Because the clipping code is called constantly before drawing operations, Microwindows
386
keeps a global cache rectangle of the last rectangle checked with GdClipArea, for speed
387
and also to allow the mid level to quickly calculate how partial drawing lengths.</p>
388
 
389
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.3&nbsp;&nbsp;&nbsp; Line Drawing</h3>
390
 
391
<p>Line drawing is the simplest of graphics operations.&nbsp; Microwindows supports
392
GdPoint to draw a point, and GdLine to draw a horizontal, vertical or diagonal (using
393
Bresenham algorithm) line.&nbsp; Just before any call to the screen driver, a call to
394
GdCheckCursor assures that the software cursor is removed prior to drawing.&nbsp;
395
GdFixCursor restores the cursor if previously visible.</p>
396
 
397
<p>There is a tricky part to line drawing that had to be added during the support for
398
multiple API's.&nbsp; This has to do with whether or not the last point in specified line
399
segment is drawn or not.&nbsp; There are two schools of thought on this, and to make it
400
short, Microwindows supports both of them.&nbsp; The last parameter to GdLine specifies
401
whether or not to draw the last point.&nbsp; The Microwindows API doesn't draw the last
402
point, but the Nano-X API does.</p>
403
 
404
<p>Most drawing functions, including line drawing draw using the &quot;current&quot;
405
foreground color, specified using GdSetForeground.&nbsp; In addition a drawing mode,
406
currently either MODE_SET or MODE_XOR can be specified using GdSetMode.</p>
407
 
408
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.4&nbsp;&nbsp;&nbsp; Rectangles,
409
Circles, Ellipses</h3>
410
 
411
<p>Rectangles, circles and ellipses are drawn using the GdRect and GdEllipse
412
routines.&nbsp; A circle is an ellipse with the same x and y radius.&nbsp; As with lines,
413
rectangles and ellipses are drawn using the current foreground color and mode.</p>
414
 
415
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.5&nbsp;&nbsp;&nbsp; Polygons</h3>
416
 
417
<p>Microwindows supports polygon drawing by specifying an array of x, y points.&nbsp; The
418
points are then connected using the GdLine function.&nbsp; The current foreground color,
419
drawing mode, and clip region is used during output.</p>
420
 
421
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.6&nbsp;&nbsp;&nbsp; Area Fills</h3>
422
 
423
<p>Microwindows supports filled rectangular areas using the GdFillRect function.&nbsp; The
424
rectangle's outline and contents are filled using the current foreground color.&nbsp;
425
Filled circles and ellipses are performed with GdFillEllipse, and polygon fills with
426
GdFillPoly.&nbsp; Area filling is implemented through successive calls to the DrawHorzLine
427
in the screen driver, and are much faster if fully not clipped.</p>
428
 
429
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.7&nbsp;&nbsp;&nbsp; Fonts</h3>
430
 
431
<p>Both fixed pitch and proportional fonts are supported in Microwindows.&nbsp; Because of
432
potentially large differences in display hardware, the actual font format is known only to
433
the screen driver, although a set of standard functions are supplied for dealing with
434
converted .bdf fonts and Microsoft Windows fonts, if you have a license.&nbsp; The engine
435
function GdSetFont specifies a font number that is passed to the driver and used to index
436
a static array of linked in fonts.&nbsp; Screen driver entry points GetTextSize return the
437
font height and width for a passed string, and GetTextBits returns an individual character
438
bitmap.&nbsp; The engine layer uses these values to calculate a clipping region for text
439
drawing, as well as to draw the character as a monochrome bitmap.</p>
440
 
441
<p>The screen drivers currently supplied implement both fixed pitch PC ROM based fonts, as
442
well as a proportional font format that is linked into the screen driver.&nbsp; A few
443
conversion programs allow conversion of fonts from different formats to the driver
444
format.&nbsp; Bdftobogl converts X Window System .bdf files to Microwindows format.&nbsp;
445
Convfnt32 converts raster and truetype Microsoft Windows fonts, if you have a license, to
446
Microwindows format.&nbsp; Convrom converts PC ROM bios fonts.</p>
447
 
448
<p>A number of free fonts are supplied with the system, a heavier proportional 14x16
449
system font, and a sans-serif 11x13 font for title bar and edit box displays.&nbsp; Any
450
number of fonts can be linked into the system, and it's fairly easy to dynamically load
451
fonts if one writes the routines for it.</p>
452
 
453
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.8&nbsp;&nbsp;&nbsp; Text Drawing</h3>
454
 
455
<p>Text output is performed by first selecting the desired font with GdSetFont, and then
456
calling the GdText function.&nbsp; Full text clipping is performed, although currently
457
there is no &quot;fast&quot; text output entry point in the screen driver, so each
458
character bitmap is grabbed using the GetTextBits entrypoint and then drawn using
459
Drawpixel.&nbsp; While this will have to remain the same for partially clipped text, a
460
screen driver entry point to draw fast text will probably be required shortly.</p>
461
 
462
<p>Text is drawn using the current foreground color.&nbsp; The background is drawn if the
463
current &quot;use background&quot; mode set via GdUseBackground is TRUE.&nbsp; In this
464
case the background is drawn using the current background color set via
465
GdSetBackground.&nbsp; The GdText function also takes a bottomAlign parameter that
466
specifies whether the text is to be bottom or top aligned, to help with differing API's.</p>
467
 
468
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.9&nbsp;&nbsp;&nbsp; Color model and
469
palettes</h3>
470
 
471
<p>The Microwindows graphics engine requires all colors to be specified as either 24-bit
472
RGB color values, or in rare cases, as palette indices for speed.&nbsp; The palette index
473
method will only work on systems that have hardware palettes, so it's not
474
recommended.&nbsp; All of the upper-level color parameters are specified to the engine
475
routines using a COLORVAL value, which is a long containing the desired RGB color, created
476
using the RGB() macro.&nbsp; The engine then converts the COLORVAL to a PIXELVAL value,
477
which is normally a long also, but on some smaller systems can be compiled as an unsigned
478
char.&nbsp; The PIXELVAL value is the actual value passed to any screen driver entry point
479
requiring a color.&nbsp; So the mid level routines all work with RGB COLORVALs, while the
480
device driver routines all work with PIXELVALs.&nbsp; The graphics engine converts these
481
values using two routines, GdFindColor and GdFindNearestColor, described below.</p>
482
 
483
<p>GdFindColor takes a hardware independent RGB value and converts it to a hardware
484
dependent PIXELVAL pixel value.&nbsp; In the case of 32bpp display drivers, no conversion
485
is required.&nbsp; Otherwise for truecolor systems, Microwindows converts the RGB value to
486
a 5/5/5 15-bit or 5/6/5 16 bit truecolor value.&nbsp; For 8bpp truecolor displays, the RGB
487
value is converted to 3/3/2.&nbsp; For palletized displays, the GdFindNearestColor
488
function is called to convert the RGB color to the nearest palette index in the current
489
system palette.&nbsp; GdFindNearestColor uses a weighted distance-cubed method to find the
490
palette value nearest to the requested color, and returns it.&nbsp; Standard palettes for
491
1, 2, 4 and 8bpp are included in the files devpal1, devpal2, devpal4 and devpal8.c.&nbsp;
492
These palettes associate an RGB value with an index, but may be overwritten.</p>
493
 
494
<p>The GdSetPalette function determines whether there are any free entries in the system
495
palette (discussed shortly) and if so, adds entries to the system palette, and calls the
496
screen driver SetPalette entry point to set the hardware palette.&nbsp; There is a single
497
global variable, gr_firstuserpalentry, that contains the index of the next available
498
system palette entry.&nbsp; Initially, this is set to 24.&nbsp; Thus, systems with less
499
than 24 total palette entries will never have an available palette entry to remap.&nbsp;
500
On systems that do, like 256 color systems, then images requiring more color entries keep
501
calling GdSetPalette until the system palette is full.&nbsp; To reset marker, the function
502
GdResetPalette is called.&nbsp; This allows upper level API's to distinguish between
503
different images and force the system palette to be rewritten.</p>
504
 
505
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.10&nbsp; Image Drawing</h3>
506
 
507
<p>Microwindows supports two styles of images, monochrome and palettized.&nbsp; Monochrome
508
images are specified with an IMAGEBITS structure, which is an array of words with 1 bits
509
specifying the foreground color and 0 bits the background.&nbsp; The IMAGEBITS bits are
510
short-word padded to the width of the bitmap.&nbsp; The GdBitmap routine draws monochrome
511
bitmaps, similar to GdText, by drawing all the 1 bits in the foreground color, and the 0
512
bits in the background color if the &quot;use background&quot; set by GdUseBackground is
513
TRUE.</p>
514
 
515
<p>Color bitmaps are specified using a 1, 4 or 8bpp image palette, and an array of indices
516
into this palette, all stuffed into an IMAGEHDR structure, and drawn via
517
GdDrawImage.&nbsp; First, the system creates a conversion palette by calling
518
GdMakePaletteConversionTable, which converts the images' palette entries into system
519
indices.&nbsp; At the same time, the system attempts to increase the system palette if
520
necessary by calling the GdSetPalette function described above.&nbsp; At the end of this
521
operation, the image has a converted palette which necessarily corresponds to the system
522
palette.&nbsp; In the case of truecolor hardware, the image's palette entries are
523
converted to hardware truecolor pixel values, and output directly.</p>
524
 
525
<p>After converting the image color entries the GdDrawImage determines the whether the
526
image is clipped, and outputs the image, pixel by pixel.&nbsp; In the future, a blitting
527
routine could be used for faster image drawing.</p>
528
 
529
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.11&nbsp; Blitting</h3>
530
 
531
<p>Blitting functionality is required in the screen driver for offscreen drawing
532
capability, discussed earlier in the screen drivers section.&nbsp; The engine function
533
GdBlit allows upper level APIs to implement copy operations from offscreen memory to the
534
display, or vice versa.&nbsp; The blit format is driver specific, and generally only works
535
for memory images created by the screen driver during runtime.&nbsp; The upper level APIs
536
implement this by allocating a new SCREENDRIVER structure, copying an existing
537
SCREENDRIVER structure into it, replacing the address field with a malloc()'d value, and
538
setting the PSF_MEMORY bit, which indicates to the display driver that this is now an
539
offscreen surface.&nbsp; Any subsequent calls to the engine routines then draw onto this
540
surface.&nbsp; When it is desired to copy the offscreen surface back to the physical
541
display, the GdBlit routine is called.&nbsp; Currently, only SRCCOPY operations are
542
performed, but future plans will add blitting opcodes.</p>
543
 
544
<p>&nbsp;</p>
545
 
546
<h3>3. Microwindows API</h3>
547
 
548
<h3>&nbsp;&nbsp;&nbsp; 3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message-passing
549
architecture</h3>
550
 
551
<p>The fundamental communications mechanism in the Microwindows API is the message.&nbsp;
552
A message consists of a well-known message number, and two parameters, known as wParam and
553
lParam.&nbsp; Messages are stored in an application's message-queue, and retrieved via the
554
GetMessage function.&nbsp; The application blocks while waiting for a message.&nbsp; There
555
are messages that correspond to hardware events, like WM_CHAR for keyboard input or
556
WM_LBUTTONDOWN for mouse button down.&nbsp; In addtiion, events signaling window creation
557
and destruction WM_CREATE and WM_DESTROY are sent.&nbsp; In most cases, a message is
558
associated with a window, identified as an HWND.&nbsp; After retrieving the message, the
559
application sends the message to the associated window's handling procedure using
560
DispatchMessage.&nbsp; When a window class is created, it's associated message handling
561
procedure is specified, so the system knows where to send the message.</p>
562
 
563
<p>The message-passing architecture allows the core API to manage many system functions by
564
sending messages on all sorts of events, like window creation, painting needed, moving,
565
etc.&nbsp; By default, the associated window handling function gets a &quot;first
566
pass&quot; at the message, and then calls the DefWindowProc function, which handles
567
default actions for all the messages.&nbsp; In this way, all windows can behave the same
568
way when dragged, etc, unless specifically overridden by the user.&nbsp; Major window
569
management policies can be redefined by merely re-implementing DefWindowProc, rather than
570
making changes throughout the system.</p>
571
 
572
<p>The following functions deal with messages directly:</p>
573
 
574
<p>&nbsp;&nbsp;&nbsp;
575
SendMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
576
Send a message directly to a window<br>
577
&nbsp;&nbsp;&nbsp;
578
PostMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
579
Queue a message on the application's message queue for later dispatch<br>
580
&nbsp;&nbsp;&nbsp; PostQuitMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
581
Queue a WM_QUIT message telling the application to terminate when read<br>
582
&nbsp;&nbsp;&nbsp;
583
GetMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
584
Block until a message is queued for this application<br>
585
&nbsp;&nbsp;&nbsp; TranslateMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
586
Translate up/down keystrokes to WM_CHAR messages<br>
587
&nbsp;&nbsp;&nbsp;
588
DispatchMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send a
589
messages to it's associated window procedure</p>
590
 
591
<p>A Microwindows application's entry point is the function WinMain, rather than main.</p>
592
 
593
<h3>&nbsp;&nbsp;&nbsp; 3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window creation and
594
destruction</h3>
595
 
596
<p>The basic unit of screen organization in Microwindows API is the window.&nbsp; Windows
597
describe an area of the screen to draw onto, as well as an associate &quot;window
598
procedure&quot; for handling messages destined for this window.&nbsp; Applications
599
programmers can create windows from pre-defined classes, like buttons, edit boxes, and the
600
like, or define their own window classes.&nbsp; In both cases, the method of creating and
601
communicating with the windows remains exactly the same.&nbsp; The following functions
602
deal with window registration, creation, and destruction:</p>
603
 
604
<p>&nbsp;&nbsp;&nbsp;
605
RegisterClass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
606
Define a new window class name and associated window procedure<br>
607
&nbsp;&nbsp;&nbsp;
608
UnRegisterClass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Undefine
609
a window class<br>
610
&nbsp;&nbsp;&nbsp; CreateWindowEx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create
611
an instance of a window of a certain class<br>
612
&nbsp;&nbsp;&nbsp;
613
DestroyWindow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Destroy a
614
window instance</p>
615
 
616
<p>The WM_CREATE message is just after window creation, before returning from
617
CreateWindowEx.&nbsp; The WM_DESTROY message is sent just before destroying a window with
618
DestroyWindow. </p>
619
 
620
<p>When a window is registered, extra bytes can be allocated to the window structure when
621
created.&nbsp; The GetWindowLong, GetWindowWord, SetWindowLong and SetWindowWord
622
manipulate these bytes.&nbsp; In addition, a fixed number of extra bytes per window class
623
can be allocated on registration and retrieved via the GetClassLong function.</p>
624
 
625
<h3>&nbsp;&nbsp;&nbsp; 3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window showing,
626
hiding and moving</h3>
627
 
628
<p>The ShowWindow function allows windows to be made visible or hidden.&nbsp; In addition,
629
this can be specified during the creation of the window, through CreateWindowEx.&nbsp;
630
MoveWindow is called to change a window's position or size.&nbsp; A WM_MOVE message is
631
sent if the window's position changes, and WM_SIZE is sent on size changes.</p>
632
 
633
<h3>&nbsp;&nbsp;&nbsp; 3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window painting</h3>
634
 
635
<p>The Microwindows system determines when a window needs to be initially painted or
636
repainted as the result of other window movement, and a WM_PAINT message is sent to the
637
associated window procedure.&nbsp; At this point, it's up the the application to use the
638
graphics primitives available to paint the window, described below.&nbsp; Microwindows
639
keeps track of a windows' &quot;update&quot; region, and sends WM_PAINT whenever the
640
region is non-empty.&nbsp; For speed reasons, the WM_PAINT message is only sent when there
641
are no other messages in the application's queue.&nbsp; This allows the application to
642
repaint in one, rather than possibly many, steps.&nbsp; To force a repaint rather than
643
waiting, the UpdateWindow function can be called.&nbsp; The InvalidateRect function
644
specifies a rectangle to add to the update region, causing a subsequent WM_PAINT.</p>
645
 
646
<p>The window title is automatically painted and is set with the SetWindowText function,
647
and retrieved with the GetWindowText function.</p>
648
 
649
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.1&nbsp;&nbsp;&nbsp; Client and screen
650
coordinates</h3>
651
 
652
<p>Every window is drawn on the screen using the device global screen coordinate system
653
for absolute reference to any pixel on the screen.&nbsp; The Microwindows API allows
654
applications programmers to be concerned with only the relative coordinates from the upper
655
left portion of their window, not including the title bar and 3d effects.&nbsp; This
656
coordinate system is called &quot;client coordinates.&quot;&nbsp; As will be explained
657
below, the Microwindows programmer has the option of getting a device context in either
658
screen or client coordinates.&nbsp; If device coordinates are specified, then the
659
coordinate system is device-based and includes the title area and 3d areas of the
660
window.&nbsp; Otherwise, the drawable region is clipped to just that&nbsp; area that is
661
reserved by the system for the application's drawing.&nbsp; The GetClientRect and
662
GetWindowRect functions return client or screen coordinates for the passed window.&nbsp;
663
ClientToScreen and ScreenToClient can be called to translate between window coordinate
664
systems.</p>
665
 
666
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.2&nbsp;&nbsp;&nbsp; Device contexts</h3>
667
 
668
<p>An applications programmer must obtain a &quot;device context&quot; before calling any
669
graphics drawing API functions.&nbsp; As explained above, this specifies to the system
670
which window and what coordinate system are desired, so that these don't have to be passed
671
to every graphics function.&nbsp; In addition, various other attributes like foreground
672
and background color are also set in a device context, so that these parameters don't have
673
to be specified for every graphics operation.&nbsp; The device context selects the
674
appropriate clipping region based on the window specified and the coordinate system.&nbsp;
675
When a device context is obtained, various graphics values are set to default values.</p>
676
 
677
<p>To obtain a client device context, call GetDC.&nbsp; To obtain a screen device context,
678
required when drawing onto title bars and the like, call GetWindowDC.&nbsp; In addition,
679
fancy clipping operations and child/sibling window clipping can be specified if GetDCEx is
680
called.&nbsp; When finished drawing, the ReleaseDC function must be called to deallocate
681
the DC.</p>
682
 
683
<p>On receipt of the WM_PAINT message, two special calls, BeginPaint and EndPaint are
684
called, that serve as replacements to the GetDC/ReleaseDC functions.&nbsp; These functions
685
essentially allocate a DC but also validate the update region so that no subsequent
686
WM_PAINT messages are generated.&nbsp; BeginPaint also combines the update region and the
687
clipping region so that user output will only occur where previously invalidated.</p>
688
 
689
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.3&nbsp;&nbsp;&nbsp; Graphics drawing
690
API</h3>
691
 
692
<p>There are many graphics drawing API's in the Microwindows API.&nbsp; Following is a
693
list, most of these match up to the engine GdXXX functions discussed in section 2.</p>
694
 
695
<p>&nbsp;&nbsp;&nbsp;
696
SetTextColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
697
Set the foreground text color in a DC<br>
698
&nbsp;&nbsp;&nbsp;
699
SetBkColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
700
Set the background color in a DC<br>
701
&nbsp;&nbsp;&nbsp;
702
GetSysColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
703
Get the system color defined for the current look and feel scheme<br>
704
&nbsp;&nbsp;&nbsp;
705
SetBkMode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
706
Set the use background flag in a DC<br>
707
&nbsp;&nbsp;&nbsp;
708
SetROP2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
709
Set the drawing mode (XOR, SET, etc) for drawing<br>
710
&nbsp;&nbsp;&nbsp;
711
SetPixel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
712
Draw a pixel in the current fg color<br>
713
&nbsp;&nbsp;&nbsp;
714
MoveToEx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
715
Prepare to draw a line<br>
716
&nbsp;&nbsp;&nbsp;
717
LineTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
718
Draw a line from the last location to this one in the current fg color<br>
719
&nbsp;&nbsp;&nbsp;
720
Rectangle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
721
Draw a rectangle in the current pen color<br>
722
&nbsp;&nbsp;&nbsp;
723
FillRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
724
Fill a rectangle with the current brush color<br>
725
&nbsp;&nbsp;&nbsp;
726
TextOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
727
Draw text in the current fg/bg color<br>
728
&nbsp;&nbsp;&nbsp;
729
ExtTextOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
730
Draw text in the current fg/bg color<br>
731
&nbsp;&nbsp;&nbsp;
732
DrawText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
733
Draw text or compute text height and width sizes<br>
734
&nbsp;&nbsp;&nbsp;
735
DrawDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
736
Draw a color bitmap<br>
737
&nbsp;&nbsp;&nbsp;
738
SelectObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
739
Select a pen, brush or font to use in a DC<br>
740
&nbsp;&nbsp;&nbsp;
741
GetStockObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
742
Get a predefined standard pen, brush or font<br>
743
&nbsp;&nbsp;&nbsp;
744
CreatePen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
745
Create a pen of a certain color<br>
746
&nbsp;&nbsp;&nbsp;
747
CreateSolidBrush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
748
Create a brush of a certain color<br>
749
&nbsp;&nbsp;&nbsp; CreateCompatibleBitmap&nbsp; Create an offscreen area to draw onto<br>
750
&nbsp;&nbsp;&nbsp;
751
DeleteObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
752
Delete a pen, brush or bitmap<br>
753
&nbsp;&nbsp;&nbsp; CreateCompatibleDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create an
754
offscreen DC<br>
755
&nbsp;&nbsp;&nbsp;
756
DeleteDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
757
Delete an offscreen DC<br>
758
&nbsp;&nbsp;&nbsp;
759
BitBlit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
760
Copy from one bitmap in a DC to another<br>
761
&nbsp;&nbsp;&nbsp; GetSystemPaletteEntries&nbsp;&nbsp;&nbsp; Get the currently in-use
762
system palette entries<br>
763
&nbsp;&nbsp; </p>
764
 
765
<h3>&nbsp;&nbsp;&nbsp; 3.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Utility functions</h3>
766
 
767
<p>A number of routines are provided for various purposes, described below.&nbsp; In
768
addition, Microwindows currently exports some helper routines, named WndXXX, that are
769
useful but subject to change.&nbsp; These are detailed following:</p>
770
 
771
<p>&nbsp;&nbsp;&nbsp;
772
WndSetDesktopWallpaper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
773
Set the desktop background image<br>
774
&nbsp;&nbsp;&nbsp;
775
WndSetCursor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
776
Set the cursor for a window<br>
777
&nbsp;&nbsp;&nbsp;
778
WndRaiseWindow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
779
Raise a window's z-order<br>
780
&nbsp;&nbsp;&nbsp;
781
WndLowerWindow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
782
Lower a window's z-order<br>
783
&nbsp;&nbsp;&nbsp;
784
WndGetTopWindow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
785
Return the topmost window's handle<br>
786
&nbsp;&nbsp;&nbsp;
787
WndRegisterFdInput&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
788
Register to send a message when file descriptor has read data available<br>
789
&nbsp;&nbsp;&nbsp;
790
WndUnregisterFdInput&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
791
Unregister file descriptor for read data messages</p>
792
 
793
<p>&nbsp;&nbsp;&nbsp;
794
GetTickCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
795
Return # milliseconds elapsed since startup<br>
796
&nbsp;&nbsp;&nbsp;
797
Sleep&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
798
Delay processing for specified milliseconds</p>
799
 
800
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.1&nbsp;&nbsp;&nbsp; Setting window
801
focus</h3>
802
 
803
<p>The SetFocus routine is used to pass keyboard focus from one window to another.&nbsp;
804
Keystrokes are always sent to the window with focus.&nbsp; The WM_SETFOCUS and
805
WM_KILLFOCUS messages are sent to windows just receiving and losing focus.&nbsp; The
806
GetActiveWindow routines returns the first non-child ancestor of the focus window, which
807
is the window that is currently highlighted.&nbsp; The GetDesktopWindow routine returns
808
the window handle of the desktop window.</p>
809
 
810
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.2&nbsp;&nbsp;&nbsp; Mouse capture</h3>
811
 
812
<p>Normally, Microwindows sends WM_MOUSEMOVE messages to the window the mouse is currently
813
moving over.&nbsp; If desired, the 7applications programmer can &quot;capture&quot; the
814
mouse and receive all mouse move messages by calling SetCapture.&nbsp; ReleaseCapture
815
returns the processing to normal.&nbsp; In addition, the GetCapture function will return
816
the window with capture, if any.</p>
817
 
818
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.3&nbsp;&nbsp;&nbsp; Rectangle and
819
Region management</h3>
820
 
821
<p>There are a number of functions that are used for rectangles and regions.&nbsp;
822
Following is the group:</p>
823
 
824
<p>&nbsp;&nbsp;&nbsp;
825
SetRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
826
Define a rectangle structure<br>
827
&nbsp;&nbsp;&nbsp;
828
SetRectEmpty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
829
Define an empty rectangle<br>
830
&nbsp;&nbsp;&nbsp;
831
CopyRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
832
Copy a rectangle<br>
833
&nbsp;&nbsp;&nbsp;
834
IsRectEmpty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
835
Return TRUE if empty rectangle<br>
836
&nbsp;&nbsp;&nbsp;
837
InflateRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
838
Enlarge a rectangle<br>
839
&nbsp;&nbsp;&nbsp;
840
OffsetRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
841
Move a rectangle<br>
842
&nbsp;&nbsp;&nbsp;
843
PtInRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
844
Determine if a point is in a rectangle<br>
845
&nbsp;&nbsp; </p>
846
 
847
<p>A large number of region management routines are defined and declared in the winrgn.c
848
file. </p>
849
 
850
<p>&nbsp;</p>
851
 
852
<h3>4. Nano-X API</h3>
853
 
854
<p>The Nano-X API was originally designed by David Bell, with his mini-x package for the
855
MINIX operating system.&nbsp; Nano-X is now running on top of the core graphics engine
856
routines discussed in section 2.&nbsp; Nano-X was designed for a client/server
857
environment, as no pointers to structures are passed to the API routines, instead a call
858
is made to the server to get an ID, which is passed to the API functions and is used to
859
reference the data on the server.&nbsp; In addition, Nano-X is not message-oriented,
860
instead modeled after the X protocol which was designed for speed on systems where the
861
client and server machines were different.</p>
862
 
863
<h3>&nbsp;&nbsp;&nbsp; 4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client/Server model</h3>
864
 
865
<p>In Nano-X, there are two linking mechanisms that can be used for applications
866
programs.&nbsp; In the client/server model, the application program is linked with a
867
client library that forms a UNIX socket connection with the Nano-X server, a separate
868
process.&nbsp; Each application then communicates all parameters over the UNIX
869
socket.&nbsp; For speed and debugging, it is sometimes desirable to link the application
870
directly with the server.&nbsp; In this case, a stub library is provided that just passes
871
the client routines parameters to the server function.</p>
872
 
873
<p>The Nano-X naming convention uses GrXXX to designate client side callable routines,
874
with a marshalling layer implemented in the files nanox/client.c, nanox/nxproto.c, and
875
nanox/srvnet.c. &nbsp; The client/server network layer currently uses a fast approach to
876
marshalling the data from the Gr routine into a buffer, and sent all at once to the
877
receiving stubs in nanox/srvnet.c, before calling the server drawing routines in
878
nanox/srvfunc.c.&nbsp; In the linked application scenario, the Nano-X client links
879
directly with the functions in nanox/srvfunc.c, and the nanox/client.c and nanox/srvnet.c
880
files are not required.</p>
881
 
882
<p>A Nano-X application must call GrOpen before calling any other Nano-X function, and
883
call GrClose before exiting.&nbsp; These functions establish a connection with the server
884
when running the client/server model, and return an error status if the server can't be
885
found or isn't currently running.</p>
886
 
887
<p>The main loop in a Nano-X application is to create some windows, define the events you
888
want with GrSelectEvents, and then wait for an event with GrGetNextEvent.&nbsp; If it is
889
desired to merely check for an event, but not wait if there isn't one, GrCheckNextEvent
890
can be used.&nbsp; GrPeekEvent can be used to examine the next event without removing it
891
from the queue.</p>
892
 
893
<p>When running Nano-X programs in the client/server model, it's currently necessary to
894
run the server first in a shell script, then wait a second, then run the
895
application.&nbsp; Some rewriting is needed to fire up the server when an application
896
requires it, I believe.</p>
897
 
898
<h3>&nbsp;4.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Events</h3>
899
 
900
<p>Nano-X applications specify which events they would like to see on a per-window basis
901
using GrSelectEvents.&nbsp; Then, in the main loop, the application calls GrGetNextEvent
902
and waits for one of the event types selected for in any of the windows.&nbsp; Typically,
903
a switch statement is used to determine what to do after receiving the event.&nbsp; This
904
is similar to the Microwindows's API GetMessage/DispatchMessage loop, except that in
905
Microwindows API, DispatchMessage is used to send the event to the window's handling
906
procedure, typically located with the window object.&nbsp; In Nano-X, all the event
907
handling code for each of the windows must be placed together in the main event loop,
908
there is no automatic dispatching.&nbsp; Of course, widget sets serve to provide
909
object-orientation, but this is in addition to the Nano-X API.</p>
910
 
911
<p>Following are the event types that Nano-X programs can recieve:</p>
912
 
913
<p>&nbsp;&nbsp;&nbsp; GR_EVENT_TYPE_NONE, ERROR, EXPOSURE, BUTTON_DOWN, BUTTON_UP,
914
MOUSE_ENTER, MOUSE_EXIT, MOUSE_MOTION, MOUSE_POSITION, KEY_UP, KEY_DOWN, FOCUS_IN,
915
FOCUS_OUT, FDINPUT</p>
916
 
917
<p>Note that Nano-X API provides mouse enter and exit events whereas Microwindows API does
918
not.&nbsp; Also, the exposure events are calculated and sent immediately by the server,
919
and not combined and possibly delayed for better paint throughput as in the Microwindows
920
API.</p>
921
 
922
<h3>&nbsp;4.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window creation and destruction</h3>
923
 
924
<p>Windows are created in Nano-X with the GrNewWindow function.&nbsp; Windows can be
925
specified to be input-only, in which case the GrNewInputWindow function is used.&nbsp; The
926
window border and color is specified in these calls, but will have to be rewritten when
927
fancier window dressings are required.&nbsp; The return value from these functions is an
928
ID that can be used in later calls to get a graphics context or perform window
929
manipulation.</p>
930
 
931
<h3>&nbsp;&nbsp;&nbsp; 4.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window showing,
932
hiding and moving</h3>
933
 
934
<p>Windows are shown by calling the GrMapWindow function, and hidden using
935
GrUnmapWindow.&nbsp; Mapping a window is required for all ancestors of a window in order
936
for it to be visible.&nbsp; The GrRaiseWindow call is used to raise the Z order of a
937
window, while GrLowerWindow is used to lower the Z order.&nbsp; GrMoveWindow is used to
938
change the position of a window, and GrResizeWindow is used to resize a window.</p>
939
 
940
<h3>&nbsp;&nbsp;&nbsp; 4.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drawing to a window</h3>
941
 
942
<p>Nano-X requires both a window ID and a graphics context ID in order to draw to a
943
window.&nbsp; Nano-X sends expose events to the application when a window needs to be
944
redrawn.&nbsp; Unlike the Microwindows API, Nano-X clients are typically required to
945
create their drawing graphics contexts early on and keep them for the duration of the
946
application.&nbsp; Like Microwindows though, the graphics contexts record information like
947
the current background and foreground colors so they don't have to be specified in every
948
graphics API call.</p>
949
 
950
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.5.1&nbsp;&nbsp;&nbsp; Graphics contexts</h3>
951
 
952
<p>To allocate a graphics context for a window, call GrNewGC.&nbsp; On termination, call
953
GrDestroyGC.&nbsp; GrCopyGC can be used to copy on GC to another.&nbsp; GrGetGCInfo is
954
used to retrieve the settings contained in a GC.&nbsp; After creating a graphics context,
955
the server returns a graphics context ID.&nbsp; This is then used as a parameter in all
956
the graphics drawing API functions.&nbsp; In Nano-X programs, the current clipping region
957
and window coordinate system aren't stored with the GC, as they are in Microwindows'
958
DCs.&nbsp; This is because, first, Nano-X doesn't support dual coordinate systems for
959
drawing to the &quot;window dressing&quot; area versus the &quot;user&quot; area of the
960
window (window and client coordinates in Microwindows).&nbsp; User programs can't draw the
961
border area of the window, only a single color and width can be specified.&nbsp; Although
962
resembling X, this will have to change, so that widget sets can specify the look and feel
963
of all aspects of the windows they maintain.&nbsp; Since the clipping region isn't
964
maintained with the graphics context, but instead with the window data structure, Nano-X
965
applications must specify both a window ID and a graphics context ID when calling any
966
graphics API function.&nbsp; Because of this, many Nano-X applications allocate all
967
graphics contexts in the beginning of the program, and hold them throughout execution,
968
since the graphics contexts hold only things like foreground color, etc, and no window
969
information.&nbsp; This cannot be done with Microwindows API because the DC's contain
970
window clipping information and must be released before processing the next message.</p>
971
 
972
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.5.2&nbsp;&nbsp;&nbsp; Graphics drawing
973
API</h3>
974
 
975
<p>Following are the graphics drawing functions available with Nano-X.&nbsp; Like
976
Microwindows API, these all match up eventually to the graphics engine GdXXX routines.</p>
977
 
978
<p>&nbsp;&nbsp;&nbsp;
979
GrGetGCTextSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
980
Return text width and height information<br>
981
&nbsp;&nbsp;&nbsp;
982
GrClearWindow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
983
Clear a window to it's background color<br>
984
&nbsp;&nbsp;&nbsp;
985
GrSetGCForeground&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
986
Set the foreground color in a graphics context<br>
987
&nbsp;&nbsp;&nbsp;
988
GrSetGCBackground&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
989
Set the background color in a graphics context<br>
990
&nbsp;&nbsp;&nbsp; GrSetGCUseBackground&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
991
Set the &quot;use background color&quot; in a graphics context<br>
992
&nbsp;&nbsp;&nbsp;
993
GrSetGCMode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
994
Set the drawing mode<br>
995
&nbsp;&nbsp;&nbsp;
996
GrSetGCFont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
997
Set the font<br>
998
&nbsp;&nbsp;&nbsp;
999
GrPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1000
Draw a point in the passed gc's foreground color<br>
1001
&nbsp;&nbsp;&nbsp;
1002
GrLine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1003
Draw a line in the passed gc's foreground color<br>
1004
&nbsp;&nbsp;&nbsp;
1005
GrRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1006
Draw a rectangle in passed gc's foreground color<br>
1007
&nbsp;&nbsp;&nbsp;
1008
GrFillRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1009
Fill a rectangle with the passed gc's foreground color<br>
1010
&nbsp;&nbsp;&nbsp;
1011
GrEllipse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1012
Draw a circle or ellipse with the passed gc's foreground color<br>
1013
&nbsp;&nbsp;&nbsp;
1014
GrFillEllipse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1015
Fill a circle or ellipse with the passed gc's foreground color<br>
1016
&nbsp;&nbsp;&nbsp;
1017
GrPoly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1018
Draw a polygon using the passed gc's foreground color<br>
1019
&nbsp;&nbsp;&nbsp;
1020
GrFillPoly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1021
Fill a polygon using the passed gc's foreground color<br>
1022
&nbsp;&nbsp;&nbsp;
1023
GrText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1024
Draw a text string using the foreground and possibly background colors<br>
1025
&nbsp;&nbsp;&nbsp;
1026
GrBitmap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1027
Draw an image using a passed monocrhome bitmap, use fb/bg colors<br>
1028
&nbsp;&nbsp;&nbsp;
1029
GrArea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1030
Draw a rectangular area using the passed device-dependent pixels<br>
1031
&nbsp;&nbsp;&nbsp;
1032
GrReadArea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1033
Read the pixel values from the screen and return them<br>
1034
&nbsp;&nbsp;&nbsp; GrGetSystemPaletteEntries&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get
1035
the currently in-use system palette entries<br>
1036
&nbsp;&nbsp;&nbsp; GrFindColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1037
Translate an RGB color value to a PIXELVAL pixel value<br>
1038
</p>
1039
 
1040
<h3>&nbsp;&nbsp; 4.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Utility functions</h3>
1041
 
1042
<p>Various functions serve as utility functions to manipulate windows and provide other
1043
information.&nbsp; These include the following:</p>
1044
 
1045
<p>&nbsp;&nbsp;&nbsp;
1046
GrSetBorderColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1047
Set the border color of a window.&nbsp; Not suitable for 3d look and feel.<br>
1048
&nbsp;&nbsp;&nbsp;
1049
GrSetCursor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1050
Set the cursor bitmap for the window.<br>
1051
&nbsp;&nbsp;&nbsp;
1052
GrMoveCursor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1053
Move the cursor to absolute screen coordinates.<br>
1054
&nbsp;&nbsp;&nbsp;
1055
GrSetFocus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1056
Set the keyboard input focus window.<br>
1057
&nbsp;&nbsp;&nbsp;
1058
GrRedrawScreen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1059
Redraw the entire screen.<br>
1060
&nbsp;&nbsp;&nbsp;
1061
GrGetScreenInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1062
Return information about the size of the physical display.<br>
1063
&nbsp;&nbsp;&nbsp;
1064
GrGetWindowInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1065
Return information about the passed window.<br>
1066
&nbsp;&nbsp;&nbsp;
1067
GrGetGCInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1068
Return information about the passed graphics context.<br>
1069
&nbsp;&nbsp;&nbsp;
1070
GrGetFontInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1071
Return information about the passed font number.<br>
1072
&nbsp;&nbsp;&nbsp;
1073
GrRegisterInput&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1074
Register a file descriptor to return an event when read data available<br>
1075
&nbsp;&nbsp;&nbsp; GrPrepareSelect
1076
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1077
Prepare the fd_set and maxfd variables for using Nano-X as a passive library<br>
1078
&nbsp;&nbsp;&nbsp; GrServiceSelect
1079
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1080
Callback the passed GetNextEvent routine when Nano-X has events requiring processing<br>
1081
&nbsp;&nbsp;&nbsp; GrMainLoop
1082
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1083
A convenience routine for a typical Nano-X application main loop</p>
1084
</body>
1085
</html>

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.