LGI is a GUI framework for abstracting out all the operating system dependencies
that you can produce portable code. It handles all the graphical interface functions,
threading and semaphores, network connectivity and lots of other bits and peices to
help build small, fast and reliable applications.
The strengths of LGI is that it's a small enough library that one person can understand
it all. Also it's not too much of a burden on an application, both in increased download
time and memory footprint. LGI at the moment compresses to about 300kb, which while not
insignificant is quite a bit smaller than the other options.
Ultimately however size is a secondary consideration to the core feature of LGI and that
is portability. Currently 3 serious ports exist: Win32, Mac and Linux. There is also a
legacy BeOS port which is unsupported.
I have completed some basic documentation for the
library and scripting language,
and there are a number of apps with source code available on sourceforge.
Related Information:
Latest Trunk Code:
svn checkout https://svn.code.sf.net/p/lgi/code/trunk Lgi/trunk
Releases:
Version: v3.4.0
[Stable]
Version: v3.3.0
[Stable]
Version: v3.2.1
[Stable]
Version: v3.2.0
[Stable]
Version: v3.02
[Stable]
Version: v3.01
[Stable]
Version: v3.00
[Stable]
Version: v2.20
[Stable]
Version: v2.10
[Stable]
Version: v2.00
[Stable]
Version: v1.99
[Stable]
|
Ports Status
Ordered by maturity:
- Win32 (XP/Vista/Win7)
This is the most stable and featured port, as it's the plaform I use the most.
Everything works in Windows, and it's the fastest due to the speed of the Win32
Graphical Subsystem. I longer support or test on any version of windows before XP.
- Mac OS X (>=10.5.0)
The newest port of Lgi, most things are working but there are less used areas that need implementing
or fixing. The GUI code is fairly complete and solid, although some more optimization is needed.
Threads, sockets etc all work too.
- Linux/Gtk+ (>=2.6)
This is currently being rewritten to target Gtk+ as I simply
do not have to time to frig with XCB/XLIB to make it work. There is some basic code working
but lots of things still need to be done to make a large application run well.
- MingW
I ported the win32 code to gcc/MingW and there is working makefiles. The code isn't extensively
tested but the IDE runs ok, YMMV. The underlying Win32 code is very
good, so there would only be problems that Cygwin/GCC introduced.
- BeOS (Zeta)
This is an old old port from the r5 days that I recently updated to work on Zeta for v2. Most of the
basic functionality works to put windows on the screen. But lots of little quirks still exist
or things arent implemented. However that said some of the design concepts for Lgi came
straight out of BeOS, so that BeOS port often is the "cleanest" of the implementations,
having a direct mapping to the native API instead of convoluted hacks to make things work.
Currently the BeOS port doesn't run very well on Zeta, there is some problem with locks getting
stuck in really weird places. I consider this port deprecated at the moment.
|
- File system abstraction (GFile, GDirectory)
- Basic windows (GView, GWindow, GLayout, GDialog). GView is the base
window class and handles all the basic window API calls and events. GView
API looks like:
| virtual Events
| Properties (Get/Set)
|
- int OnEvent(GMessage *Msg);
- void OnMouseClick(GMouse &m);
- void OnMouseEnter(GMouse &m);
- void OnMouseExit(GMouse &m);
- void OnMouseMove(GMouse &m);
- void OnKey(GKey &k);
- void OnMouseWheel(double Lines);
- void OnCreate();
- void OnDestroy();
- void OnFocus(bool Has);
- void OnPulse();
- void OnPosChange();
- bool OnRequestClose();
- int OnHitTest(int x, int y);
- int OnNotify(GView *Ctrl, int Flags);
- void OnChildrenChanged(GView *Wnd, bool Attaching);
- int OnCommand(int Cmd, int Event, OsView Wnd);
- void OnPaint(GSurface *pDC);
- bool OnViewKey(GView *v, GKey &k);
|
- char *Name();
- int Value();
- GRegion &GetPos();
- int GetId();
- bool Enabled();
- bool Visible();
- bool Focus();
- bool DropTarget();
- bool Sunken();
- bool Flat();
- bool Raised();
- GView *GetParent();
- GView *GetNotify();
- bool Capture(bool c); // mouse capture
|
- Widgets (Most are XP - owner drawn)
- GEdit - Edit control (Win32: Native, Linux: GTextView3)
- GCheckBox - On/Off
- GText - Label
- GRadio/GRadioGroup - One of many.
- GCombo - Combo box
- GList - List control
- GTree - Tree control
- GBitmap - Bitmap
- GProgress - Progress meter
- GSlider - Slider control
- GSplitter - Split 2 panes
- GTabView - Tabbed control
- GTextView3 - Unicode text editor.
- GToolBox - Toolbar control.
- GStatusBar - Status bar.
- GMenu / GSubMenu / GMenuItem - Menu controls.
- GPopup
- Internally all text is Utf-8
- Unicode font support (GFont, GFontType). Tools for converting to/from
native OS text and other codepages are provided. iso-8859-x and
windows-12xx codepage support is native, other codepages supported via
the iconv library.
- Multi-threading (GThread, GSemaphore)
- Graphics library (GSurface, GMemDC, GScreenDC, GPrintDC)
- Supports internally, all the basic primitives: Line, Circle, Rect,
Blt, Flood, Polygon, Ellipse etc. No OS support required.
- Bit depth conversion for bitmaps and colours.
- Palette management.
- Alpha blending.
- Vector art library, anti-aliased rasterisation of primitives & text.
Includes TTF -> path capability.
- Graphic file format support (GIF, TIFF, JPEG(dll), PNG(dll), BMP, ICO).
- Recursive file search.
- Full file open/save dialog (ie. not from the OS libraries). There is also
support for the Win32 file open/save dialog - API compatible.
- Mime type detection/app lookup API.
- Platform independant XML resource file format for strings, dialogs and
menus. All fully multi-lingual.
LgiRes is a graphical
editor for this format.
- Cross-platform. Runs on Win32 (dep: '98 or better, may run on '95) and
Linux/X11 (dep: xlib, pthreads, xrender). There is a legacy port to BeOS
but that is unmaintained and won't work out of the box.
- Clipboard IO for text and bitmaps.
- Drag'n'drop events/API.
- Commonly used dialogs (GInput, MsgBox, GAlert, GFindReplace, GFileSelect).
- Date time handling (GDateTime). Date subtraction/addition, conversion
to/from native format, conversion to/from strings.
- Container classes (List<>, StringPipe).
- Network abstraction (GNetwork, GSocket).
- Network protocol client classes:
- FTP (IFtp)
- HTTP (IHttp)
- SMTP (MailSmtp)
- POP (MailPop3)
- IMAP (MailIMap)
- DNS (IDns)
- Xml parser (GXml - being deprecated), XML DOM parser (GXmlTree).
- String tokenization (GToken);
- 192k packed/zipping redistributable, 268k installed (at the time of writing this).
- Simple HTML control. Support for charsets, CSS classes/styles, tables (colspan etc),
Tags (p/ul/li/div/span/font/a/img/br/i/b/u/table/tr/td/meta/style).
Building LGI
First check out the source:
svn checkout https://svn.code.sf.net/p/lgi/code/trunk Lgi/trunk
Windows
Support Libraries
For full graphics and charset support download (or check you already have)
iconv,
libpng,
zlib and
libjpeg;
then add their include paths to your compilers include paths. Or find the defineds
in Lgi.h for the various libraries and set them to 0.
Visual Studio 6,2005,2008,2010
Install a supported version of Visual Studio. Build the appropriate workspace:
- vc6: Lgi.dsw
- vs2005: Lgi_vc8.sln
- vs2008: Lgi_vc9.sln
- vs2010: Lgi_vc10.sln
Adding build folders to the shared library path:
Add this to your path:
- [install_path]/Lgi/trunk/Lib
| Mac
Install XCode
Go to the Apple Developer site and grab XCode
Build
Open Lgi.xcodeproj in XCode and run the build command.
| Linux
Building on Ubuntu 10.4:
sudo apt-get install subversion
sudo apt-get install g++
sudo apt-get install libgtk2.0-dev
svn co https://lgi.svn.sourceforge.net/svnroot/lgi Lgi
cd Lgi/trunk
ln -s Makefile.linux makefile
make
Adding build folders to the shared library path:
cd /usr/local/lib
sudo ln -s [install_path]/Lgi/trunk/DebugX/liblgid.so liblgid.so
sudo ln -s [install_path]/Lgi/trunk/ReleaseX/liblgi.so liblgi.so
|
M$ VC++ 6 Tip
Add this to your Common/MsDev98/Bin/AUTOEXP.DAT file to show various LGI types inline:
; LGI types
GRect=<x1>,<y1>,<x2>,<y2>
GMessage=msg=<Msg,wm>,<a>,<b>
GDateTime=<_Year>/<_Month>/<_Day> <_Hours>:<_Minutes>:<_Seconds>
GAutoPtr<*>=<Ptr>
History:
3.4.0 [Stable]
Accumulation of fixes and features to date.