# Windows Glk 1.32

## Contents

> Overview
> License
> Installation
> Using a Windows Glk Program
> Using Windows Glk with Visual C++
> Using Windows Glk with Cygwin
> Using Windows Glk with other C compilers
> Start-up of a Windows Glk program
> Windows specific Glk functions
> Example Programs
> Graphics and Sound Resources
> Acknowledgements
> Release History

## Overview

### Glk API version 0.7.0, Windows Glk release 1.32

Windows Glk written by David Kinder davidk.kinder@virgin.net
Glk devised by Andrew Plotkin erkyrath@eblong.com

This is a Windows implementation of Andrew Plotkin's Glk library specification, an attempt to define a portable API for text adventures, and more generally, any program with primarily textual input and output. It works with any version of Windows from Windows 95 onwards.

This help file describes the specifics of the Windows version of Glk, and should be read in conjunction with Andrew's Glk specification document. This and other relevant files on Glk can be found at the Interactive Fiction Archive, in the directory

> http://www.ifarchive.org/indexes/if-archiveXprogrammingXglulx.html

and Andrew's Glk web page

> http://www.eblong.com/zarf/glk/

## License

The source code and compiled Glk DLL in this package are copyright 1998-2007 by David Kinder. You may copy and distribute both the source code and the compiled DLL freely, by any means and under any conditions, as long as the code and documentation is not changed. You may also incorporate this code into your own program and distribute that, or modify this code and use and distribute the modified version, as long as you retain a notice in your program or documentation which mentions my name and the Glk web page.

Ogg Vorbis music resources are played using libogg and libvorbis by the Xiph.org Foundation. The license for these libraries is as follows:

> Copyright (c) 2002, Xiph.org Foundation
> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
> - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
> - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
> - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

## Installation

This Windows version of Glk is implemented as a dynamic link library Glk.dll, which should be in the same directory as the Glk application.

### Translations

Windows Glk supports localization into languages other than English. If the appropriate translation DLL (such as GlkEspañol.dll for Spanish) is present for the language Windows is configured to use, then all Glk dialogs and menus are localized.

### Windows XP

Windows Glk is aware of Windows XP's themes, and can display dialogs, etc. appropriately. However, in order for this to happen the Glk application must either have a manifest file with the same name as the executable (For example, for "Foo.exe" the manifest file would be "Foo.exe.manifest") or a manifest included in the application's resources. For a suitable manifest see the example programs.

### Microsoft Speech Engine

Windows Glk can use Microsoft's Speech Engine API 4.0 to speak text. Microsoft's Speech Engine is often included with speech recognition software. If you have not got the engine installed, it can be downloaded from Microsoft:

> http://www.microsoft.com/downloads/release.asp?ReleaseID=26299

Windows Glk does not work with version 5 of Microsoft's Speech Engine API.

## Using a Windows Glk Program

Programs using Windows Glk appear to the user as a single Windows frame window containing child windows that correspond with the Glk definition of windows.

By default, Windows Glk adds a toolbar and menu to the frame window, which allows the user to bring up the options dialog, change font settings and review the previous output shown in text buffer windows. These options can also be accessed from the system menu (this is the menu which appears when single-clicking on the icon at the left of the title bar), which is the only means of access if toolbars and menus have been switched off in the options dialog.

If Microsoft's Speech Engine API 4.0 is installed, Windows Glk can speak the text printed in text buffer windows. If the Speech Engine is installed, a "Speech..." button is available on the Options dialog. This opens a further dialog in which speech can be switched on and a voice chosen for the speech.

## Using Windows Glk with Visual C++

To use Windows Glk with Microsoft Visual C++ (version 4 or later), use the AppWizard accessed by the File/New menu item to create a new Win32 application.

The application should include the file Glk.c and a file winglk_startup.c, which should contain an implementation of the function winglk_startup_code(). An example of this function is given in the example programs.

The application must also be linked with Glk.lib, which is the import library for Glk.dll.

## Using Windows Glk with Cygwin

To use Windows Glk with Cygwin's version of the GCC compiler (available from http://www.cygwin.com/), open a Cygwin Bash shell and generate an import library to link against:

        dlltool --dllname=Glk.dll --def=Glk.def --output-lib=libglk.a

The application should include the file Glk.c and a file winglk_startup.c, which should contain an implementation of the function winglk_startup_code(). An example of this function is given in the example programs.

The application must also be linked with the library libglk.a; should not use the Cygwin DLL; and should be marked as being a Windows GUI application. For example, the command line to build the example model program under Cygwin is

        gcc model.c winglk_startup.c Glk.c -o model -lglk -L. -mno-cygwin -mwindows

## Using Windows Glk with other C compilers

In general, how Windows Glk is used with other compilers is very dependant on that compiler. However, the following rules must be followed.

The application produced must be a standard Win32 application (not a Win32 console application), whose entry point is the WinMain() function.

The application should include the file Glk.c and a file winglk_startup.c, which should contain an implementation of the function winglk_startup_code(). An example of this function is given in the example programs.

The application must be linked with a suitable import library to ensure dynamic linking with Glk.dll. For most compilers a tool is supplied which takes a dynamic link library and produces a suitable import library (for Microsoft Visual C++ this tool is lib.exe; for Borland C++ it is implib.exe). The supplied import library Glk.lib is for Microsoft Visual C++, but may work with other compilers. For further information, you should consult your compiler documentation.

## Start-up of a Windows Glk program

A Windows Glk program should include the source file Glk.c, which implements the WinMain() entry point into the program. The implementation of WinMain() initializes Glk.dll and checks that the version of Glk is suitable for the program. After this, the function winglk_startup_code() is called. This is a function that must be supplied by the author of the Windows Glk program, though at its simplest the function need not do anything at all.

Experienced Win32 developers may wish to implement their own WinMain() function, bypassing the normal Windows Glk startup code. If you do this, you should make sure that InitGlk() is called before glk_main().

## Windows specific Glk functions

The prototypes for all these functions can be obtained by including the file WinGlk.h. These functions are all implemented by Windows Glk, except for winglk_startup_code().

> ### int winglk_startup_code(const char* cmdline)

> This function must be supplied by the author of the Windows Glk program, and is called before glk_main() in order to allow platform specific initialization. The function should return zero if an error occurred, or a non-zero value if successful. The simplest implementation of the function is

>       int winglk_startup_code(const char* cmdline)
>       {
>         return 1;
>       }

> The cmdline argument passed to winglk_startup_code() is a pointer to the command line with which the program was started up. See the example program WinGlkStart for an example of this routine which sets the application name and window title, then brings up a file dialog to request a file from the user.

> This function is only called from within the WinMain() function in Glk.c. If you decide to write your own WinMain() (only recommended for experienced Win32 developers) then there is no need to supply the winglk_startup_code() function.

> ### void winglk_app_set_name(const char* name)

> Call this function to set the name of the Windows Glk program. This name is used as the title for the main window, and for storing user settings such as font and window size. This function should be called in winglk_startup_code(), e.g.

>       int winglk_startup_code(void)
>       {
>         winglk_app_set_name("Glk Example");
>         return 1;
>       }

> ### void winglk_window_set_title(const char* title)

> Call this function to change the window title. This function can be called at any point, either before or after the main window opens. It should be called after winglk_app_set_name().

> ### void winglk_set_about_text(const char* text)

> Call this function to set the text that appears in the first line of the About dialog box. The text should contain the name and version number of the application.

> ### void winglk_set_menu_name(const char* name)

> Call this function to set the name of the default Glk menu. The short cut key is indicated by a leading ampersand; for example, a name of "&Glulxe" produces the menu name Glulxe. The menu name is also used in the name of the menu item showing the About dialog, and in the text in that dialog.

> ### void winglk_set_help_file(const char* filename)

> Call this function to set the path of a HTMLHelp format help file. Calling this function causes a "Help" item to appear in the menu and a "Help" button on the toolbar.

> ### const char* winglk_get_initial_filename(const char* cmdline, const char* title, const char* filter)

> This function is designed to simplify writing startup code for a Windows Glk program. It examines the cmdline argument (which will usually be the cmdline argument passed to winglk_startup_code()) and attempts to extract a file name from it. If you don't want a command line string to be processed, just pass NULL for cmdline.

> If a file name cannot be extracted from cmdline, a file dialog appears prompting the user for a file. The title argument will be used as the title of the file dialog, and the filter argument used as the file dialog's filter.

> The filter string contains pairs of strings, the first part of which is the text describing the file type and the second is the actual filter. Each part is separated by a vertical bar and the end of the filter indicated by two vertical bars. For example, the filter string in Windows Glulxe is

> >     "Glulx Files (.ulx;.blb;.blorb;.glb;.gblorb)|*.ulx;*.blb;*.blorb;*.glb;*.gblorb|All Files (*.*)|*.*||"

> The function returns a pointer to the file name if successful, or NULL. If the function does not return NULL, it will also use the filename to set the default filenames for calls to glk_fileref_create_by_prompt().

> See the example program WinGlkStart for an example of this routine.

> ### void winglk_set_resource_directory(const char* dir)

> Call this function to change the directory from which Glk.dll will attempt to load resources. The default is the current directory for the program.

> ### void winglk_set_gui(unsigned int id)

> Call this function in winglk_startup_code() to set up any or all of a custom menu, a custom toolbar and a custom icon for the application's window. The function takes the numeric identifier of the menu, toolbar and icon in your application, e.g.

>       winglk_set_gui(IDR_EXAMPLE);

> When setting up menus and toolbars, you should keep resource identifiers below 0x7500 and command identifiers below 0xD000. This is not usually a problem as most development environments generate identifiers well below these values.

> If the user selects a menu item or clicks on a toolbar button, your application will receive an event of type winglk_evtype_GuiInput. val1 will be the command identifier, and val2 zero.

> See the example program WinGlkStart for an example of this routine.

> ### void winglk_load_config_file(const char* gamename)

> Call this function to load a Windows Glk configuration file appropriate to the given game file name. For example, if the function is passed an argument of "Photopia.blb", it will attempt to load a configuration file called "Photopia.cfg".

> The configuration file is a text file where each line contains a key name, followed by an equals sign, then a value, e.g. "WindowBorders=no". Possible keys are:

> WindowBorders=[yes/no] | Turns on or off borders between Glk windows.
> WindowFrame=[yes/no] | Turns on or off the Glk application window frame, that is, the title bar and the border around the whole window.
> WindowMask=[number] | Uses the given Blorb resource number to set the mask for the window from the graphic. If a particular pixel in the graphic is white then the window is transparent at that point, else it is opaque. This key only takes effect if "WindowFrame=no".
> WindowWidth=[width] | Sets the width of the Glk application window so that a single, full-size Glk window will have a width of the given value.
> WindowHeight=[height] | Sets the height of the Glk application window so that a single, full-size Glk window will have a height of the given value.
> FontName=[font] | Sets the font used for proportional text to the given font name, e.g. "Times New Roman".
> FontSize=[size] | Sets the size of the font used for proportional text to the given value, measured in points.
> FixedFontName=[font] | Sets the font used for fixed width text to the given font name.
> FixedFontSize=[size] | Sets the size of the font used for fixed width text to the given value.

> ### strid_t winglk_stream_open_resource(const char* name, const char* type, glui32 rock)

> This function opens a Glk memory stream using a resource. The first two arguments specify the name and type of the resource. For example, if data has been stored in the resources of the executable as "EXAMPLE" in the resource type "DATA", then the stream could be opened with rock value 1 by the following call:

>       strid_t str = winglk_stream_open_resource("EXAMPLE","DATA",1);

> ### void* winglk_get_resource_handle(void)

> This function returns a handle to the resource module being used by Glk.dll. This is the resource handle of Glk.dll itself unless a translation is being used, in which case it is the resource handle of the translation DLL.

> ### frefid_t winglk_fileref_create_by_name(glui32 usage, char *name, glui32 rock, int validate)

> This function is the same as glk_fileref_create_by_name(), except that it takes an extra validate argument. If validate is non-zero then the name argument is validated to remove directory separator characters; if it is zero then the name argument is not checked.

> ### void winglk_show_game_dialog(void)

> This function tells Glk.dll to show the "About This Game" dialog when a Blorb file is set by a call to giblorb_set_resource_map(), provided that the Blorb file contains an "IFmd" chunk, and that the dialog has not been shown for this game before. If the "IFmd" chunk is present, an "About This Game" menu item is also added to the application's menu, the game's title is included in the title of the Windows Glulxe window, and an option to control whether the dialog is shown initially appears in the options dialog.

> ### void sglk_set_basename(char *s)

> This function sets the default filenames for calls to glk_fileref_create_by_prompt(), which may be useful if you do not use winglk_get_initial_filename() in your startup code. This function is part of L. Ross Raszewski's (the maintainer of DOS Glk) suggested additions to Glk.

## Example Programs

The Examples directory contains three example programs. Model and Multiwin are generic Glk example programs written by Andrew Plotkin. WinGlkStart is a Windows Glk specific example, which demonstrates the common requirement of asking the user for a file name at startup.

If you have Visual C++, load up the workspace Examples.dsw, which contains each example as a separate project.
If you are not using Visual C++, then for each example you need to compile the following source files:

> Model | model.c, winglk_startup.c, Glk.c
> Multiwin | multiwin.c, winglk_startup.c, Glk.c
> WinGlkStart | WinGlkStart.c, Glk.c

where Glk.c is the standard Windows Glk source file in the main Glk directory. To create executables you will need to link all the source files in each example together and link along with a suitable import library for Glk.dll.

For example, with Cygwin, the command to build the model example would be:

        gcc model.c winglk_startup.c Glk.c -o model -lglk -L. -mno-cygwin -Wl,--subsystem,windows

## Graphics and Sound Resources

Windows Glk supports resources stored either in Blorb files or as separate files.

If a Glk program is to use resources from a Blorb file, the standard Blorb function giblorb_set_resource_map() (which is part of Glk.dll) must be called with the identifier of a stream opened on the Blorb file. If this is done then Windows Glk will first look for resources in the Blorb file.

If Windows Glk cannot find a requested resource in the Blorb file (or no Blorb file has been set up), it will look for a suitably named file in the current directory (or the directory specified by a call to winglk_set_resource_directory(), if such a call has been made).

If a resource was found in either the Blorb file or in a directory, it will be loaded. The resource formats currently supported are shown below, along with the filename for which Windows Glk will look if the resource is not in the Blorb file (as an example, the filename is for resource number 1):

> Format | Type | Example Filename
> PNG | image | pic1.png
> JPEG | image | pic1.jpg
> AIFF | sound | snd1.aif or snd1.aiff
> MOD | music | mus1.mod
> OGGV | music | mus1.ogg

If PNG images have an alpha channel or transparency information, Windows Glk will use it. In graphics windows PNG images are alpha blended with the graphic window bitmap; in text buffer windows PNG images are alpha blended with the default background colour.

## Acknowledgements

The user interface for Windows Glk has been translated into Spanish by Javier San José, and into Italian by Tommaso Caldarola.

Windows Glk uses the following libraries:

> jpeglib by the Independent JPEG Group.
> libpng by Guy Eric Schalnat, Andreas Dilger, Glenn Randers-Pehrson, and others.
> zlib by Jean-loup Gailly and Mark Adler.
> ModPlug by Olivier Lapicque.
> libogg and libvorbis by the Xiph.org Foundation.

Windows Glk also contains source code written by Chris Maunder and Eran Yariv. The code that handles Ogg Vorbis music resources is based on code submitted by David Moreno.

## Release History

### 1.32

- Updated to the latest version of ModPlug, which is now compiled into the library.
- glk_fileref_create_by_name() now removes directory separator characters from its file name argument, replacing them with dashes. The Windows Glk only function winglk_fileref_create_by_name() is available if the old behaviour is required.
- The name set by winglk_set_menu_name() is also used in the text of the menu item that shows the About dialog, and in the text in that dialog.
- Added the winglk_show_game_dialog() function.

### 1.31

- Minor improvements to the interpreter's appearance under Windows Vista.
- Fixed a long-standing bug in glk_window_set_arrangement() when changing the direction of the window sizing constraint.
- Fixed the incorrect clipping of italic text.
- Pressing a key in any window will now clear any pending [More] prompts in any other windows, rather than requiring the user to select the affected window.
- Changed the default values of a few options: window borders are now off by default, and the default indentation in text buffer windows is one unit, rather than zero.

### 1.30

- Updated to Glk 0.7.0, which adds Unicode support to Glk.

### 1.27

- Added support for Ogg Vorbis music resources, based on code submitted by David Moreno.
- The file extensions .blorb, .glb and .gblorb can be used for Blorb files. The latter two indicate that the Blorb file contains a Glulx game.

### 1.26

- The input caret is now correctly restored after a save or restore file dialog.
- The mouse cursor now changes to the correct image over hyperlinks when a translation DLL is in use.
- Pressing Ctrl+V with the focus on a text buffer window that is waiting for input now pastes the contents of the clipboard into the input line.
- Changed the logic that sets up non-rectangular windows to work with Windows Git.
- The WindowWidth and WindowHeight keys in a configuration file now refer to the size of a single, full-size Glk window, rather than the entire window of the application.
- The WindowMask key in a configuration file now only takes effect if the WindowFrame key is set to "no".

### 1.25

- Images are now scaled with a bilinear filter, resulting in greatly improved appearance of scaled images.
- Added the winglk_set_help_file() function.
- If a configuration file is loaded that specifies a window size, whether or not the window was previously maximized is now ignored: the window always appears with the specified size.
- Text grid windows in which the game asks for input don't now steal the focus from text buffer windows in which the game is also asking for input.
- Images in the left or right margins of text buffer windows are now displayed correctly after a flow break.
- The AIFF decoder now correctly handles chunks that are an odd number of bytes long.

### 1.24

- Fixed a serious resource leak under Windows 95/98/Me.
- Pressing the Pause/Break key causes any windows blocking on a [More] prompt to update, regardless of whether or not they are the active window.

### 1.23

- The speed at which the text to speech output is spoken can now be set from the options dialog.
- The scrollback dialog now opens at the end of the text, not the start.
- Added winglk_set_about_text() and winglk_set_menu_name() functions.
- Added information to this document about compiling Glk applications with the Cygwin environment, which includes a port of the GCC C++ compiler.

### 1.22

- Fixed the annoying cursor flickering visible when games request timer events faster than about 100ms.
- Added support for SONG music resources. The SONG format is essentially the same as MOD, only with the music samples stored as separate AIFF sample resources.
- Added an Italian translation of Windows Glk, by Tommaso Caldarola.
- Updated Glk.dll for Windows XP. In order to get XP style dialogs each Glk application needs a manifest file or a manifest in its resources.
- Switched to Visual C++ .NET. Glk.dll now statically links to MFC and the CRT. This makes the DLL larger but means that there are no dependencies on the new DLLs that come with .NET.

### 1.21

- Added a Spanish translation of Windows Glk, by Javier San José. If GlkEspañol.dll is present on a PC with the language set to Spanish, all Glk dialogs and menus are localized into Spanish.
- The scrollback buffer is no longer emptied when a text buffer window is cleared.
- winglk_set_gui() will now set the window's icon, if one is available with the given resource id.
- Added winglk_load_config_file(), which allows a configuration file to be loaded to set various Windows Glk display properties.
- Added winglk_get_resource_handle(), which allows access to Glk.dll's resources.
- Updated Windows Glk to use the latest version of MODPlug's mppsdk.dll.
- Fixed a problem which could lead to glk_select_poll() discarding some events, especially timer events.
- Fixed a problem with the speech routines excluding accented characters.

### 1.20

- Completely rewrote the sound code. Windows Glk now uses DirectSound directly. AIFFs no longer require Windows MediaPlayer, and MODs use mppsdk.dll rather than npmod32.dll (although both are part of MODPlug). This allows AIFF samples and MOD music to be played simultaneously.
- The text printed in text buffer windows can now be spoken using Microsoft's Speech Engine.
- Fixed the graphics scaling to produce better results.
- Fixed a bug in gi_dispa.c which caused glk_fileref_does_file_exist() to not return a useful result when called through the dispatch layer (i.e. by Glulxe). Note that at the time of writing this bug is present in all implementations of Glk.
- Calling glk_stream_open_file(filemode_ReadWrite) will now create the file if it does not already exist.
- The current style for a window is now set to its previous value after line input, rather than reverting to style_Normal.

### 1.17

- Converted this document to HTML format.
- Added winglk_set_gui(), which allows a custom menu and toolbar to be used.
- winglk_get_initial_filename() now remembers the directory of the file chosen, so that the next time the application is opened, it will start in that directory.
- Added a check box to the options dialog to determine if stylehints set by the Glk program override user settings or not.
- Added support for hyperlinks in text grid windows.
- The size of text in text grid windows is now determined by the size style hint for the text grid window's normal style.
- The JPEG and PNG decoding routines have been moved into Glk.dll, so the support DLLs GlkJPEG.dll and GlkPNG.dll are no longer required.
- Fixed style hints for text grid windows being stored as user changes.

### 1.16

- The background colour for text buffer and text grid windows now defaults to the background colour for the "Normal" style. As a result of this, the option to set a background colour has been removed from the options dialog as it is no longer necessary.
- Previously, if the program set style hints then the style hint acted exactly as if the user had edited the style in the options dialog, resulting in the style hint being saved with the user settings. Now if the Glk program sets a style hint then the style can no longer be edited by the user and is not saved in the user settings.
- Added sglk_set_basename(), which sets the default filenames for calls to glk_fileref_create_by_prompt(). This function is part of L. Ross Raszewski's (maintainer of DOS Glk) suggested additions to Glk.
- Fixed a problem with the JPEG decoder which caused some JPEGs to not appear.
- Fixed a bug which resulted in style hints set before any window opened being ignored.

### 1.15

- Updated to Glk 0.61.
- Added support for MOD music resources, which are played using Olivier Lapicque's ModPlug player.
- winglk_get_initial_filename() now sets the default filenames for calls to glk_fileref_create_by_prompt().

### 1.14

- Added support for menus, toolbars and status bars. By default these are on, but can be turned off in the options dialog.
- PNG pictures with transparency and alpha channels are now supported. If an alpha channel is supplied, WinGlk will alpha blend the picture with whatever is underneath it.
- AIFF sound resources can have the file extension ".aiff", as well as ".aif".
- winglk_startup_code() now takes an argument, which is a pointer to the command line passed by Windows to the program at startup.
- Added winglk_get_initial_filename(). This function takes a string (usually the program's command line arguments) and attempts to extract a file name. If this fails, a file dialog appears from which the user can select a file. Hopefully this will stop Windows Glk developers from having to cope with the arcane complexities of the Win32 GetOpenFileName() function when writing startup code.

### 1.13

- Updated to Glk 0.60.
- Added an example showing how to use Window's file dialog at the start of a Glk program.

### 1.12

- Recompiled Glk.dll to use mfc42.dll, rather than statically linking to MFC.
- Improved handling of indentation style hints.
- Stopped Glk from using CPU time while waiting for input.
- Various other bug fixes.

### 1.11

- Added support for AIFF sound resources.

### 1.10

- Updated to Glk 0.52.
- Completely rewrote the text buffer window routines from scratch. Text buffer windows now fully support all style hints (e.g. different text sizes within a single paragraph) as well as margin and in-line graphics.
- Added winglk_set_resource_directory() function.
- Added support for JPEG images.
- Included all the style hint settings in the options dialog.

### 1.03

- Implemented graphics in graphics windows.
- Added winglk_window_set_title() function.
- Implemented fully justified text in text buffer windows.

### 1.02

- Updated to Glk 0.51.
- Various bugs have been fixed.

### 1.01

- Updated to Glk 0.5.

### 1.00

- First Windows release.