Zune is a free MUI clone (MUI is an AmigaOS GUI toolkit)
License
dlecorfec/zune99
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
*** before attempting to compile, read the paragraph "Files needed from the original MUI distribution" *** Zune 0.1 Disclaimer (ripped from Mesa 3.1) ========== Zune is a GUI library with an API and look&feel which are very similar to those of MUI*. However, the author makes no claim that Zune is in any way a compatible replacement for MUI or associated with Stefan Stuntz. This software is distributed under the terms of the GNU Library General Public License, see the COPYING file for details. While Zune is an unofficial MUI implementation, it is currently aimed as being as close as possible, but no closer :) For gratuitous incompatibilities and other things, see the doc/incompatibilities.txt file included in this distribution. * MUI is Copyright (C) 1993-1997 Stefan Stuntz. -- See COPYING for the license terms. See INSTALL for basic installation help. See NEWS for the current state of Zune. -- Description: MUI (Magic User Interface) originated from the Amiga, where it was considered as one of the best shareware ever. It provides benefits for the user, by allowing him to customize his applications look, and for the developer, who can write easily a resizeable, font-sensitive GUI. What is the goal of Zune ? I don't know :) Perhaps it's to gain some fame/celebrity/money/women. (this is currently a one man work, with much code reused from other projects, though. I hope it will change, else Zune will die, whatever I do. One-man projects always die. Bazaar rules :) Perhaps it's to make a MUI demo to those who haven't seen it on Amiga, or cannot run UAE. That's way nicer than Athena widgets, no ? :) Perhaps it's to show yet other GUI programming idioms. You knew Lesstif, Qt, and GTK+. Now you HAVE to learn MUI :) As an implementation curiosity, there's only one toplevel window per MUI_Window. All widgets are gadgets : they do not have associated X windows. I thought it was equivalent to the Amiga, but on a second thought, X windows may be equivalent to Layers. Anyway, I never needed Layers on Amiga (but I didn't code many things on Amiga either :) (to be honest, the gadget focus is drawn with 4 other X windows). -- Implementation credits: For portability and ease of writing issues, Zune uses the GLib and GDK libs. Some parts are reusing GTK+ code (mainly window-level event dispatch and main loop - though Zune main loop looks quite different in an API user point of view). Pictures handling is done by gdk_imlib. It's a well spread library, supporting many render formats, and, the definite plus, linking against it doesn't require you to link against all the format libraries (jpeg, png ...). Nice plugin system ! If you don't like it, implement the code between the WITH_IMLIB defines with your own equivalent. AmigaOS functions were mainly took from AROS, by Matthias Fleisher and others. See www.aros.org. I wrote an usable TagItem library from scratch years ago, but I think the current one comes from AROS (I trust them better than me). Sorry if I reformated and eventually modified the code to fit in Zune (like removing german comments, or replacing assert with g_assert). Zune implementation is based on MUI autodocs, MUIdev.guide, MUI examples, MUIUndoc, OOPExample, and examining MUI screenshots. A special regard for Alessandro Zummo, author of MUIUndoc, and Maik Schreiber, author of OOPExample. And greetings to the other MUI activists around the world, especially custom classes writers (hint: porting mcc's to Zune is easy, consider contributing free mcc's :) I could forget anybody but Stefan "Stuntzi" Stuntz, the author of MUI. What a great work ! I hope Zune that Zune 1.0.0 (soon :) won't give a wrong picture of the original MUI. Contributions are welcome. For docs, see in the mui38dev.lha archive (download info in the following section). Especially Docs/MUIdev.guide and the C/Examples/psi.c are helpful, as well as all the Class* examples. This includes per-class autodocs in ASCII format, HTML is available at the SASG site, both online and archived (you may need an lzx desarchiver, is there one freely available ?). -- Files needed from the original MUI distribution: Zune needs mui.h (constants, macros, tags ...) and muimaster_protos.h (functions declarations from muimaster.library) They have to be copied in "$(srcdir)/include/zune/" and will be installed in "$(includedir)/zune/" along with other public Zune includes during a normal installation (but not if installing with a DESTDIR to avoid redistribution). You can also copy them directly in "$(includedir)/zune/". You can find them in mui38dev.lha (as long as other goodies). This archive is freely available in all Aminet mirrors (try <yourCountryCode>.aminet.net) under util/libs/, or directly at the MUI site, http://www.sasg.com/mui/download.html (but using your nearest Aminet mirror is always better) MUI/C/Include/libraries/mui.h (126905) MUI/C/Include/clib/muimaster_protos.h (3177) The latest public class tree is drawn at the beginning of mui.h. -- Notes on TagItem usage : a TagItem is key/value pair: struct TagItem { ULONG ti_Tag; ULONG ti_Data; }; Many functions in Zune, as their Amiga counterparts, accept a TagItem array as argument. Often there is a varargs stub, called like this: Foo(fixed_arg, TAG1, (ULONG)data1, TAG2, (ULONG)data2, TAG3, (ULONG)data3, TAG_DONE); * Only pointers and ULONG integers are permitted as data. Pass other types (float and double) as pointers to these other types. * Always cast datas to ULONG, especially numeric constants (using (ULONG)42 seems more portable than 42L) * Always construct your own tags with TAG_USER: #define MY_TAG (TAG_USER | 0x1234) * Always (*always*) end a TagItem vector with {TAG_DONE, (ULONG)O} or end a variable parameter list with TAG_DONE. -- Notes on Zune (un)portability : (don't run away screaming :) * Zune is not very consistent in its choice argument types, between glib and amiga types or between int/long. Current types work with gcc on ix86-linux, and probably on m68k too, (ie. sizeof(int) = sizeof(long) = sizeof(char *) = 4) ULONG must be large enough to hold either a value or a pointer. It may be a problem on more exotic hardware I don't have under the hands. I doubt I'm gonna support any 16 bits system, but we WILL step on 64 bits systems one day or another ! * Zune relies heavily on variable argument lists, though it does not use va_arg(), and sometimes not even va_start()/va_end(). 1. It assumes variable arguments are ordered in the order they are given: first vararg being vector[0], second vector[1] ... int fooA (int *vect); int foo (int tag1, ...) { return fooA (&tag1); } 2. It assumes that after the call to va_start(), the va_list is just a pointer to the first variable argument. int barA (char *foofoo, int *vect); int bar (char *foofoo, ...) { va_list args; va_start(args, foofoo); return barA (foofoo, (int *)args); va_end(args); } (and it seems better than "barA (foofoo, (int *)(foofoo+1));" :) Most of the faulty functions are in src/muimaster/[am]*.c Grep for "\.\.\." there :) It works on m68k-amigaos and ix86-linux. Other architectures may encounter problems. If the tests fail at initialization time, this means that slower code involving varargs copy in an array should be conditionnaly compiled instead of the current code. Unfortunately, such code is not yet designed/developed. Feel free if you need it ...
About
Zune is a free MUI clone (MUI is an AmigaOS GUI toolkit)
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published