1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-03-11 03:55:53 +01:00

1 Commits

Author SHA1 Message Date
scottc
d5c88d5afa GNUstep X Window Manager 1998-09-29 22:36:29 +00:00
835 changed files with 81097 additions and 238467 deletions

View File

@@ -1,8 +0,0 @@
Makefile Makefile.in
aclocal.m4
configure config.log config.cache config.guess config.status config.sub
libtool ltconfig ltmain.sh
autom4te.cache
.psrc .inslog2 tca.map tca.log pchdir *.rpt
update
WindowMaker*.tar.gz

View File

@@ -1,6 +0,0 @@
#
# You can add here extra email addresses (one per line) where notifications
# should be sent on cvs commit.
# This is easier than to modify CVSROOT/loginfo to add extra addresses there.
# Lines that start with # or empty lines are ignored.
#

101
AUTHORS
View File

@@ -2,7 +2,7 @@ Information about locale translators is at src/po/README and
Library/WindowMaker/README
Many thanks to the following people who have contributed
patches, bug fixes and other stuff for Window Maker:
patches, bug fixes and other stuff for WindowMaker:
ABE Shige <sabe@ibm.net>
I18N support, diagonal and vertical gradient, cosmetic additions to
@@ -13,12 +13,9 @@ restart, dock bug fixes
Andrea Arcangeli <arcangeli@mbox.queen.it>
Fix for cascade window placement
Dmitry Astapov <adept@dimail.alpline.mao.kiev.ua>
Fix and some additions on XKB lock language status.
Peter Bentley <pete@sorted.org>
Peter Bentley <peter.bentley@nomura.co.uk>
fixed WM_STATE handling bug, fixed some memory leaks, made application menus
be mapped near the windows for non-click-to-focus modes, timer bug
be mapped near the windows for non-click-to-focus modes.
Ulf Betlehem <flu@iki.fi>
Window resize with Meta-Click3, fixed OpaqueMove to send only 1 synth.
@@ -27,20 +24,11 @@ ConfigureNotify
Olly Betts <olly@muscat.co.uk>
shaded window indication in window list
Tudor Bosman <tudorb@caltech.edu>
autoraise bugfix
Rob Clark <rclark@turing.cs.hmc.edu>
Text input field, 15bpp support
George Clernon <clernong@tinet.ie>
bug fix in browser widget
Omar Cornut / Zoop <cornut@capway.com>
SteelBlueSilk theme
Sylvain CORRE <sylvain.corre@wanadoo.fr>
bug fix for MkLinux/PPC
bug fix for MkLinux/PPC, bug fix for cpixmap in wmsetbg
Frederic Devernay <devernay@istar.fr>
dock fix for openwindows, made asclock be friendlier with colorcell impaired
@@ -65,54 +53,36 @@ Documentation help, autoconf cleanup
Mark 'segfault' Guzman <root@lsd.pbx.org>
Various bugfixes
Ullrich Hafner <hafner@bigfoot.de>
Better detection of gfx libraries, added IconTitleColor/IconTitleBack
Matthew Hawkins <matt@mh.dropbear.id.au>
former temporary project maintainer
Ullrich Hafner <hafner@informatik.uni-wuerzburg.de>
Better detection of gfx libraries
Greg Hayes <sdc@choice.net>
Twisted miniaturization animation
Alban Hertroys <dalroi@wit401310.student.utwente.nl>
WINGs color panel
HIDEKI Fujimoto <hideki70@osk2.threewebnet.or.jp>
FreeBSD portability, icon arrangement fixes, dock initialization bug fix,
some I18N related fixes
Pascal Hofstee <daeron@wit401305.student.utwente.nl>
WINGs bug fixes, WINGs color panel
Robert A. Holak <panthar@tradeservices.com>
bug fix
Michael Hokenson <logan@dct.com>
wkde2menu.pl script
IKARASHI Akira <ikarashi@itlb.te.noda.sut.ac.jp>
Workspace change bug fix
Sudish Joseph <sj@eng.mindspring.net>
Modifier binding fix and other bug fixes
Luke Kendall <luke@research.canon.com.au>
menu format converter, various enhancements to wxcopy and wxpaste
Bradley M Keryan <keryan@andrew.cmu.edu>
EMACS/keypad like cursor movement for WINGs textfield
Jim Knoble <jmknoble@pobox.com>
made autoarrange icons a runtime option, SHADOW_RESIZEBAR c-time option,
no workspace switch to the same workspace, dashed icon selection,
misclellaneous bug fixes, definable cursors, --no-polling command line option.
misclellaneous bug fixes
The JED Text Editor <xjed@windowmaker.org>
Alfredo K. Kojima <kojima@inf.ufrgs.br>
Project maintainer
Alfredo K. Kojima <kojima@windowmaker.org>
The guy who types random keys to feed JED with the necessary entropy
Jay Kominek <jkominek@xtn.net>
smart and random placement
@@ -122,20 +92,20 @@ Move/resize code fixes, button press/release fix
Ryan Land <rland@bc1.com>
workspace "layers"
Largo <largo@current.nu>
wm.current.nu maintainer, FAQ co-maintainer
Largo <largo@gnu.net>
wm.gnu.net maintainer, FAQ maintainer
Stuart Luppescu <s-luppescu@uchicago.edu>
Documentation help
Marcelo E. Magallon <mmagallo@efis.ucr.ac.cr>
CPP search path improvement, man pages, bug fixes
CPP search path improvement, man pages
Tim Malone <mrgone@eskimo.com>
bug fix, jpeg bug fix
bug fix
MANOME Tomonori <manome@itlb.te.noda.sut.ac.jp>
I18N bug fixes and japanese locale, wsetfont script
I18N bug fixes and japanese locale
Brian Alexander Martin <brian@goober.wireless.ucsc.edu>
PIPE_MENU
@@ -146,13 +116,13 @@ Andrea Mistrali <andre@ulmo.aleph.it>
Jeff Meininger <jeffm@boxybutgood.com>
Fix for unassociated alpha tiff
Craig Nellist <crn@ozemail.com.au>
selection in textfield
Dan Pascu <dan@windowmaker.org>
Dan Pascu <dan@services.iiruc.ro>
dock ghost (superfluous mode) fix, enhancement for scrollable menus,
clip, numerous other stuff, project maintainer
Kenneth W. Persinger Jr. <Kenn_Persinger@sector7.com>
tcl/tk dockit
Biagio Pippa <1993s017@educ.disi.unige.it>
fixed miniaturization with transient window
@@ -164,11 +134,7 @@ Initial code for clip's collapse feature.
Ture Pelsson <ture@lysator.liu.se>
various portability fixes, replaced busy wait with select() in event
handling code, fixed problem with some misbehaved kids after a fork(),
some other bug fixes, support for poll() in event handling code
Toby Sargeant <?>
menu format converter
handling code, fixed problem with some misbehaved kids after a fork().
Carsten Schaar <nhadcasc@fs-maphy.uni-hannover.de>
SCO portability, german locale, autoconf enhancements
@@ -179,14 +145,8 @@ REDUCE_APPICON/single-icon
Chong Shang Shan <chongsha@sps.nus.edu.sg>
flipping iconification animation
Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>
SGI "black dialogs" bug fix
Paul D. Smith <psmith@BayNetworks.COM>
SunOS portability, configure fixes
Phillip Smith <teknix@alloy.net>
FTP, WWW, mailing list site provider/maintainer (Net logistics)
FTP and WWW site provider/maintainer
Lauri Tarkkala <ltarkkal@cs.hut.fi>
SIGHUP unblock bug fix
@@ -195,19 +155,10 @@ Sam Varner <varner@nmr.physics.wm.edu>
many fixes and enhancements for move, resize and window placement code.
Marco van Hylckama Vlieg <fatal@global.uibk.ac.at>
house icon for WINGs file dialogs, defaultAppIcon and Clip xpm tchX.tiff
Plus the following icons:
DefaultAppIcon.tiff GNUterm.tiff clip2.tiff defaultterm.tiff draw.tiff
linuxterm.tiff mixer.tiff notepad.tiff pdf.tiff ps.tiff real.tiff sgiterm.tiff
sound.tiff staroffice2.tiff timer.tiff wilber.tiff write.tiff xdvi.tiff
xv.tiff
house icon for WINGs file dialogs, defaullAppIcon and Clip xpm icon
David Wang <dwang@cisco.com>
edge resistance, 8bpp balloon bug fix, other 8bpp related fixes
Franck Wolff <frawolff@club-internet.fr>
various fixes/enhancements to WINGs
edge resistance
Yoav Yerushalmi <yoav@mit.edu>
Fixed -visualid for screens that can do multiple depths. Another fix in
@@ -216,17 +167,11 @@ libproplist. Chooses best depth in screen.
FRBall <frb@umr.edu>
dgradient fix
"]d" <id@windowmaker.org>
Window list menu miniaturized/hidden hints, XDE support, XKB lock
language status, WINGs enhancements, bug fixes, window commands menu
enhancement, window move/resize by keyboard. GNUstepGlow.tiff icon,
WINGs color panel, Appearance section icon(s)
"]d" <mhz@gpf.or.th>
Window list menu miniaturized/hidden hints
Trae Mc Combs <x@themes.org>
BlueWaves.jpeg background image in BlueWaves theme.
And a special thanks to Martin Eskildsen for giving me his
copy of NEXTSTEP :-)

18
BUGFORM
View File

@@ -3,12 +3,10 @@
---------------------------
If you find a bug please fill this form and send it to
developers@windowmaker.org Please, USE THIS FORM!!!
You can also report a bug in the WWW bug tracker at
http://windowmaker.org/cgi-bin/bugs or by sending this report
to bugs@windowmaker.org
If you find a bug please fill this form and send it to
developers@windowmaker.org
You can also report a bug in the WWW bug tracker at
http://windowmaker.org/cgi-bin/bugs
0. Before reporting this bug I already:
@@ -34,8 +32,10 @@ to bugs@windowmaker.org
4. Configure time options you specified:
[ ] --enable-kanji
[ ] --disable-shape
[ ] --disable-xpm
[ ] --disable-tiff
[ ] --disable-png
[ ] --enable-single-icon
[ ] --enable-modelock
[ ] Others: .......................
@@ -68,8 +68,4 @@ X Server Vendor: ...................... Color Depth: .................
WindowMaker Version (run "wmaker -version"): .........................
11. backtrace if the bug made Window Maker crash. PLEASE SEND THE
BACKTRACE. Your bug report might be of not much use without one.
strace/truss outputs are usually not usefull for crashes, so you can
skip it. The README file has instructions to make one.

30
BUGS
View File

@@ -1,24 +1,10 @@
Newly added
- after a crash, wmaker will forget the hidden state of the apps and just
show their windows minimized. normal restart is unaffected
- after a crash, wmaker will completely mess the window's saved geometries
and maximizing will have weird results. restart is unaffected
- wmaker will not stop managing a screen even if another window manager
requests that, through the ICCCM 2.0 manager selection stuff
- the app menu does not update after a style/theme change without restart.
- the animation of shade puts ImageMagick/display in a weird state
- during startup, transient windows should be miniaturized with their owners
not in their own icons
- shaped windows don't resize very well
- stacking code is buggy (or XFree is buggy)
- WINGs has problems in some platforms (SGI, Sun etc.) Anyone on these
systems want to fix it?
- save session doesnt work on some platforms (Alpha and Sparc)
- texture pixmaps are being incorrectly freed somewhere. Either
fix bug (to support broken MetroX servers) or remove all useless references
to the Pixmap (to save memory and drop bug compatibility).
- host information is not saved/honored by the dock or save session stuff.
It should at least check if the host is the local machine and only save it
in the session/allow docking it if yes.
- the SHELL environment variable support in the apps menu was removed
because of a problem with tcsh. If ~/.tcshrc contains "stty erase ^H",
it will block and the cmd will not be executed.
- mouse grab being done in client window (in wWindowResetMouseGrabs())
instead of the frame window. If grab is done in frame, titlebar buttons
dont work well
- mysterious mess in dock icons (specially netscape)
- GNUSTEP_WM_ATTR in WINGs has problems on Alpha boxes

View File

@@ -1,91 +0,0 @@
OpenContent License (OPL)
Version 1.0, July 14, 1998.
This document outlines the principles underlying the OpenContent
(OC) movement and may be redistributed provided it remains
unaltered. For legal purposes, this document is the license under
which OpenContent is made available for use.
The original version of this document may be found at
http://www.opencontent.org/opl.shtml
LICENSE
Terms and Conditions for Copying, Distributing, and Modifying
Items other than copying, distributing, and modifying the Content
with which this license was distributed (such as using, etc.) are
outside the scope of this license.
1. You may copy and distribute exact replicas of the OpenContent
(OC) as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any
warranty; and give any other recipients of the OC a copy of this
License along with the OC. You may at your option charge a fee for
the media and/or handling involved in creating a unique copy of the
OC for use offline, you may at your option offer instructional
support for the OC in exchange for a fee, or you may at your option
offer warranty in exchange for a fee. You may not charge a fee for
the OC itself. You may not charge a fee for the sole service of
providing access to and/or use of the OC via a network (e.g. the
Internet), whether it be via the world wide web, FTP, or any other
method.
2. You may modify your copy or copies of the OpenContent or any
portion of it, thus forming works based on the Content, and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified content to carry prominent notices
stating that you changed it, the exact nature and content of the
changes, and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the OC or any part
thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License, unless otherwise permitted
under applicable Fair Use law.
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the OC, and
can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work
based on the OC, the distribution of the whole must be on the terms
of this License, whose permissions for other licensees extend to
the entire whole, and thus to each and every part regardless of who
wrote it. Exceptions are made to this requirement to release
modified works free of charge under this license only in compliance
with Fair Use law where applicable.
3. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to copy,
distribute or modify the OC. These actions are prohibited by law if
you do not accept this License. Therefore, by distributing or
translating the OC, or by deriving works herefrom, you indicate
your acceptance of this License to do so, and all its terms and
conditions for copying, distributing or translating the OC.
NO WARRANTY
4. BECAUSE THE OPENCONTENT (OC) IS LICENSED FREE OF CHARGE, THERE
IS NO WARRANTY FOR THE OC, TO THE EXTENT PERMITTED BY APPLICABLE
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE OC "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE ENTIRE RISK OF USE OF THE OC IS WITH YOU.
SHOULD THE OC PROVE FAULTY, INACCURATE, OR OTHERWISE UNACCEPTABLE
YOU ASSUME THE COST OF ALL NECESSARY REPAIR OR CORRECTION.
5. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MIRROR AND/OR REDISTRIBUTE THE OC AS PERMITTED ABOVE, BE LIABLE TO
YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE OC, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

View File

@@ -1,54 +0,0 @@
The following artwork were created by Banlu Kemiyatorn and
are distributed through the license in this file:
GNUstepGlow.tiff
GNUstepGlow.xpm
Magnify.tiff
Magnify.xpm
Terminal.tiff
Terminal.xpm
TerminalGNUstep.tiff
TerminalGNUstep.xpm
TerminalLinux.tiff
TerminalLinux.xpm
tiff/msty1.tiff
tiff/msty2.tiff
tiff/msty3.tiff
xpm/msty1.xpm
xpm/msty2.xpm
xpm/msty3.xpm
WPrefs.tiff
WPrefs.xpm
tiff/tdel.tiff
tiff/tedit.tiff
tiff/textr.tiff
tiff/tnew.tiff
xpm/tdel.xpm
xpm/tedit.xpm
xpm/textr.xpm
xpm/tnew.xpm
inside Resources/Images.tiff "the little house", "the trash can",
"the folder", "the floppies"
Ear.png
Ftp.png
ICQ.png
Jabber.png
Mozilla.png
Pen.png
Pencil.png
Shell.png
Speaker.png
XChat.png
do What The Fuck you want to Public License
Version 1.0, March 2000
Copyright (C) 2000 Banlu Kemiyatorn (]d).
136 Nives 7 Jangwattana 14 Laksi Bangkok
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Ok, the purpose of this license is simple
and you just
DO WHAT THE FUCK YOU WANT TO.

1030
ChangeLog

File diff suppressed because it is too large Load Diff

1473
FAQ

File diff suppressed because it is too large Load Diff

View File

@@ -8,13 +8,6 @@ If I18N support does not work for you, check these:
can check if your locale is supported by X's locale emulation.
See "/usr/X11R6/lib/X11/locale/locale.alias"
- Check if you're using appropriate fonts for the locale you
chose. If you're using a font set that has a different
encoding than the one used by Xlib or libc, bad things can
happen. Try specifically putting the encoding in the LANG
variable, like ru_RU.KOI8-R. Again, see
"/usr/X11R6/lib/X11/locale/locale.alias"
- if your OS doesn't support any locale or if your OS doesn't
support a locale for your language, you can use X Window System's
locale emulation feature instead of OS's locale. To use this
@@ -32,35 +25,24 @@ If I18N support does not work for you, check these:
here:
ftp://ftp.linux.or.jp/pub/RPM/glibc
- if you'd like to display multibyte characters, wmaker have to
be compiled with multibyte character support. Add this option
to the configure, "--enable-kanji".
- the fonts you're using support your locale. if your font
setting on $HOME/GNUstep/Defaults/WindowMaker is like..
WindowTitleFont = "Trebuchet MS:bold:pixelsize=12";
MenuTitleFont = "Trebuchet MS:bold:pixelsize=12";
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
......................................................
then you can't display asian language (ja,ko,ch) characters using
Trebuchet MS. A font that is guaranteed to work for any language is
sans (or sans-serif). sans is not a font itself, but an alias which
points to multiple fonts and will load the first in that list that
has the ability to show glyphs in your language. If you don't know
a font that is suited for you language you can always set all your
fonts to something like:
then you can't display non iso8859-x charcters by helvetica.
so quick way to display various languages' font is to change
all the font settings into:
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
"sans:pixelsize=12"
However, please note that if your font is something like:
"Trebuchet MS,Luxi Sans,sans:pixelsize=12"
this will not be able to display asian languages if any of the
previous fonts before sans are installed. This is because unlike
the proper font pickup that sans guarantees for your language,
this construct only allows a font fallback mechanism, which tries
all the fonts in the list in order, until it finds one that is
available, even if it doesn't support your language.
Also you need to change font settings in style files in
and also you need to change font settings in style files in
the "$HOME/Library/WindowMaker/Style" directory.
- the LC_CTYPE environment variable is unset or it has the correct

View File

@@ -1,64 +0,0 @@
Často kladené otázky na podporu místního nastavení
==================================================
Pokud vám nefunguje podpora I18N, tak zkontrolujte tato nastavení:
- systémová proměnná LANG musí být nastavená tak, aby odpovídala vašemu
místnímu nastavení (čeština = czech), vaše místní nastavení musí být
podporovatelné vaším operačním systémem nebo X emulací. Všechny
podporovatelné lokalizace zobrazíte příkazem "locale -a". Měli byste
také zkontrolovat, zda-li je vaše místní nastavení podporované
X emulací. Soubor: "/usr/X11R6/lib/X11/locale/locale.alias" by měl
obsahovat podobnou sekvenci (podpora pro češtinu):
cs cs_CZ.ISO8859-2
cs_CS cs_CZ.ISO8859-2
cs_CS.ISO8859-2 cs_CZ.ISO8859-2
cs_CZ cs_CZ.ISO8859-2
cs_CZ.iso88592 cs_CZ.ISO8859-2
cz cz_CZ.ISO8859-2
cz_CZ cz_CZ.ISO8859-2
- zkontrolujte použití správných fontů pro vaše místní nastavení.
Pokud nepoužíváte správné fonty s kódováním, které je nastaveno v
Xlib nebo libc, tak se můžou dít "dost divné věci". Zkuste explicitně
zadat kování do proměnné LANG: LANG=cs_CS.ISO8859-2 nebo
LANG=cs_CZ.iso88592 a znovu zkontrolujte:
"/usr/X11R6/lib/X11/locale/locale.alias"
- pokud váš operační systém nepodporuje místní nastavení (locales), nebo
pokud váš OS nepodporuje místní nastavení pro váš jazyk, můžete
použít emulaci místního nastavení X Window Systému. Zprovoznit tuto
emulaci je možné spuštěním ./configure s volbou "--witn-x-locale".
Pokud používáte nějaký komerční systém jako je například IRIX, AIX,
Solaris, ...,tak asi X emulaci nebudete potřebovat. Ovšem pokud je
vaším operačním systémem Linux, NetBSD nebo jiný užasný, volně
šiřitelný operační systém, tak je možné, že vaše místní nastavení
zatím není podporované. Potom použijte volbu "--witn-x-locale".
Pozn: Aby jste mohli používat X emulaci místních nastavení, tak vaše
Xlib musí být zkompilované s touto podporou. Xlib v RedHat 5.0
tak zkompilované nejsou (RH4.x jsou OK). Překompilované Xlib
s podporou pro emulací místních nastavení pro RH5.0 jsou
dostupné na adrese:
ftp://ftp.linux.or.jp/pub/RPM/glibc
- fonty, které používáte by měli být podporované vaším místním nastavením.
Jestliže vaše nastavení fontů v souboru ~/GNUstep/Defaults/WindowMaker
vypadá takto:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*"; ,
nemůžete zobrazovat znaky jiné než iso8859-x ve fontu helvetica.
Jednoduchý způsob, jak zobrazovat znaky různých jazyků, je nastavit všechny
fonty takto:
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
Také je nutné změnit nastavení fontů v souborech stylů v adresáři:
~/Library/WindowMaker/Style.
- pokud si nejste jisti, zda-li systémová proměnná LC_TYPE správnou
hodnotu, tak ji nenastavujte.

View File

@@ -1,57 +0,0 @@
(Toto je len preklad dosť starého súboru! Ak by ste mali skutočne problémy
s Window Makerom a slovenčinou a v tomto súbore by ste nenašli pomoc,
pošlite popis problému na adresu <judas@linux.sk>.)
Ak vám nefunguje podpora miestnych nastavení, skontrolujte nasledujúce:
- premenná LANG je nastavená na vaše miestne nastavenia a tieto
sú podporované vašim OS alebo X emuláciou. Zoznam podporovaných
miestnych nastavení získate príkazom "locale -a". Zoznam
miestnych nastvení podporovaných X emuláciou sa nachádza v
súbore "/usr/X11R6/lib/X11/locale/locale.alias".
- používate správne fonty pre svoje miestne nastavenia. Ak
používate font s odlišným kódovaním ako je nastavené v Xlib
alebo libc, môžu sa diať čudné veci. Skúste explicitne zadať
kókovanie do premennej LANG, teda sk_SK.ISO-8859-2. Znovu,
pozrite si súbor "/usr/X11R6/lib/X11/locale/locale.aliax".
- ak váš OS nepodporuje žiadne miestne nastavenia alebo váš OS
nepodporuje vaše miestne nastavenia, môžete použiť emuláciu
podpory miestnych nastavení X Window Systému. To urobíte
voľbou "--with-x-locale" skriptu configure. Ak používate
komerčný OS ako Solaris, IRIX, AIX, ..., pravdepodobne
nepotrebujete použiť X emuláciu miestnych nastavení. Ale ak
je váš OS Linux alebo NetBSD alebo ..., je možné, že vaše
miestne nastavenia ešte nie sú podporované. Vtedy použite
"--with-x-locale".
Pozor: aby ste mohli používať X emuláciu miestnych nastvení,
vaša Xlib musí byť skompilovaná s touto podporou.
Xlib v Linux RedHat5.0 tak skompilovaná nie je.
(RH4.x je v poriadku). Prekompilovaná Xlib pre
RH5.0 s podporou emulácie miestnych nastavení je
dostupná na adrese
ftp://ftp.linux.or.jp/pub/RPM/glibc
- fonty, ktoré používate, podporujú vaše miesne nastavenia.
Ak vaše nastavenia fontov v ~/GNUstep/Defaults/WindowMaker
vyzerajú takto:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
......................................................
potom nemôžete zobrazovať znaky iné ako iso8859-x vo fonte
helvetica. Jednoduchý spôsob ako zobrazovať znaky rôznych
jazykov je nastaviť všetky fonty takto:
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
a tiež potrebujete zmeniť nastavenia fontov v súboroch štýlov
v adresári ~/Library/WindowMaker/Style.
- premenná LC_CTYPE nie je nastavená alebo má správnu hodnotu. Ak
si nie ste istí, nenastavujte ju.

451
INSTALL
View File

@@ -1,5 +1,5 @@
Installation Instructions for Window Maker
Installation Instructions for WindowMaker
@@ -7,87 +7,55 @@ SUPPORTED PLATFORMS
===================
(ie: I've heard someone has compiled it on...)
- Intel GNU/Linux Conectiva 5.9 (beta)
- Intel GNU/Linux Slackware
- Intel GNU/Linux Debian
- Intel GNU/Linux other distributions
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- Intel/Linux RedHat 4.2 (primary platform)
- Intel/Linux other distributions
- Sparc/Linux RedHat 5.1
- PowerPC/MkLinux
- Alpha/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- Solaris 2.8 on Ultra Sparc 10 and E450
- SCO Unix
- SGI Irix 5.x, 6.5
- SGI Irix
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 over MacOS
- Amiga 3000 running RedHat Linux 5.1 (Rawhide)
- IBM S/390 running Linux
- IBM S/390 running Conectiva Linux (experimental)
- iBook running Darwin
- Darwin PPC / Macos X
- Windows NT with Cygwin/XFree86
- Sony PlayStation2 running Linux
All registered trademarks are registered by their owners. (duh)
Patches to make it work on other platforms are welcome.
Patches to make it work on other platforms are welcome.
REQUIREMENTS:
=============
The following software is required to use Window Maker:
The following software is required to use WindowMaker
- X11R6.x
Window Maker can be compiled in older versions of X, like X11R5
WindowMaker can be compiled in older versions of X, like X11R5
(Solaris) or X11R4 (OpenWindows) but it will not work 100% correctly.
In such servers there will not be application icons and you'll have
trouble using the dock. Upgrading the client libraries (Xlib, Xt etc)
will help if you can't upgrade the server.
trouble using the dock.
The following is required to build Window Maker:
- Basic obvious stuff
gcc (or some other ANSI C compiler)
glibc development files (usually glibc-devel in Linux distributions)
X development files (XFree86-devel or something similar)
- autoconf, automake and libtool
autoconf 2.54
automake 1.4
libtool 1.4.2
- Xft2
and its dependencies (such as freetype2 and fontconfig)
You will also need the development files for it (xft2-devel)
If you will build WindowMaker, make sure you have gcc and the X header files
installed. Specially for newbie Linux users: you must install all X development
packages and the gcc suite. Otherwise you won't be able to build any X program,
including WindowMaker.
OPTIONAL:
=========
These libraries are not required to make Window Maker work, but they
These libraries are not required to make WindowMaker work, but they
are supported in case you want to use them. Version numbers are those
that I have (and therefore, guraranteed to work), but other versions
might work too.
might work too. Tell me if you made wmaker work with some library
with a version older than the stated here.
- libXPM 4.7 or newer
- libXPM 4.7
Older versions may not work!!!
Available at ftp://sunsite.unc.edu/pub/Linux/libs/X/
@@ -96,199 +64,142 @@ might work too.
- libpng 0.96 or newer and zlib
For PNG image support.
http://www.cdrom.com/pub/png/
- libtiff 3.4 or newer
For TIFF image support.
You can get it at ftp://ftp.sgi.com/graphics/tiff
- libjpeg 6.0.1 or newer
- libjpeg 6.0.1
For JPEG image support
http://www.ijg.org/
- libgif 2.2 or libungif
For GIF image support
ftp://prtr-13.ucsc.edu/pub/libungif/
For GIF image support
- GNU xgettext
If you want to use translated messages, you will need GNU gettext.
Other versions of gettext are not compatible and will not work.
Get the GNU version from ftp://ftp.gnu.org
Get the GNU version from ftp://prep.ai.mit.edu
Most of these can be get from ftp.uu.net/pub/graphics
CONFIGURE OPTIONS:
==================
These options can be passed to the configure script to enable/disable
some Window Maker features. Example:
some WindowMaker features. Example:
./configure --enable-modelock --disable-gif
./configure --enable-kanji
will configure Window Maker with modelock supported and disable gif support.
Normally, you won't need any of them.
will configure WindowMaker with kanji characters support compiled in.
To get a list of other options, run ./configure --help
--with-libs-from
specify additional paths for libraries to be searched.
The -L flag must precede each path, like:
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--disable-xpm disables use of the XPM library even if it is available on
your system.
--with-incs-from
specify additional paths for header files to be searched.
The -I flag must precede each paths, like:
--with-incs-from="-I/opt/headers -I/usr/local/include"
--disable-png disables use of PNG library
--disable-shm
disable use of the MIT shared memory extension. This will slow down
texture generation a little bit, but in some cases it seems to be
necessary due to a bug that manifests as messed icons and textures.
--disable-tiff disable use of TIFF library
--disable-motif
disable support for mwm window manager hints
--disable-gif disable use of GIF library
--enable-lite
remove things that are already supported in desktop environments,
like KDE and GNOME. Disabled things are: window list, root
applications menu, multiple window selection. Note that you will not
be able to exit Window Maker from itself anymore; you will have to
use kill with the SIGTERM signal or exit it from KDE. It is not
advisable to enable it.
--disable-jpeg disable use of JPEG library
--enable-modelock
XKB language status lock support. If you don't know what it is you
probably don't need it.
--disable-shape disables shaped windows (for oclock, xeyes etc.)
--disable-xpm
disables use of the XPM library even if it is available on your
system.
--enable-debug adds extra debugging information. Do not use it
unless you're debugging WindowMaker.
--enable-kanji support to display Kanji characters, Korean, Chinese
and other languagues that require special characters.
--disable-png
disables use of PNG library
--disable-tiff
disable use of TIFF library
--disable-gif
disable use of GIF library
--disable-jpeg
disable use of JPEG library
--disable-shape
disables shaped windows (for oclock, xeyes etc.)
--enable-single-icon enables the collapsing of all appicons of the
WM_CLASS+WM_INSTANCE into a single one. This feature is not
supported at all by the developers. If you have some trouble with it,
contact it's author: Christopher Seawood <cls@seawood.org>
PLATFORM SPECIFIC NOTES:
========================
- DEC/Alpha machines
#>>>>>>>>>>>
From: Anton Ivanov <aivanov@eu.level3.net>
To: Marcelo E. Magallon <mmagallo@debian.org>
Subject: Re: Is the WindowMaker package working ok on Alpha?
> Hi,
>
> I was reading some docs on the WindowMaker tarball, and found this:
>
> | - DEC/Alpha machines
> | You might need to pass the --disable-shm flag to configure,
> | like ./configure --disable-shm
>
> is anyone having problems with WindowMaker on Alpha? Can someone
> please test this? Should the flag be passed when building on Alpha?
Disclaimer: alphas under my command have never run X and are least likely to
suddenly start running it anytime soon.
Alpha used to have some ridiculously low amount of shared memory
configured.
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
Check where is yours at the moment and raise it to a more appropriate
value by either catting to the appropriate /proc entry or changing the
/usr/src/linux/include/asm/shmparam.h.
Otherwise the shared memory on alpha should be fully functional and I
see no reason to disable it. Mine are bumped up to 32 or more on most
machines.
And If I recall correctly the comments in that file are actually
wrong. Value is not bytes, but in machine size word. For alpha *8.
As I said - I do not run X on them so all #include "stdisclaimer.h"
apply.
#<<<<<<<<<<<<
- SCO Unix - run configure like
CFLAGS="-belf -DANSICPP" ./configure
- SunOS, Solaris
If you have gcc installed, run configure as:
CPP_PATH="gcc -E -x c" ./configure
Sun's cpp lacks some features needed by Window Maker and it can
If you have gcc installed, after running configure, edit
src/config.h and change the #define CPP_PATH line to
#define CPP_PATH "gcc -E -x c"
Sun's cpp lacks some features needed by WindowMaker and it can
cause problems when parsing the config files.
You also might need to use the --with-libs-from and --with-incs-from
to supply the directory where libtiff is located.
Someone mailed me that you also must make /usr/local/lib be the
first path in LD_LIBRARY_PATH to make it work.
If you have a Ultra Creator 3D or some other machine with high-end
graphics, be sure to start the X server with the default visual
set to 24bpp or you might experience problems with mangled colors.
This is a wmaker bug and will be fixed.
- GNU/Linux in general
Make sure you have /usr/local/lib in /etc/ld.so.conf and that you
run ldconfig after installing.
Uninstall any packaged version of Window Maker before installing a new
version.
- RedHat GNU/Linux
RedHat systems have several annoying problems. If you use it,
be sure to follow the steps below or Window Maker will not work:
* if you installed the Window Maker that comes with RedHat, uninstall
it before upgrading;
* make sure you don't have the LANG and LINGUAS environment variables
set to en_RN;
* make sure you have /usr/local/bin in your PATH environment
variable;
* make sure you have /usr/local/lib in /etc/ld.so.conf before running
ldconfig;
- RedHat Linux
Make sure you don't have the LANG and LINGUAS environment variables
set to en_RN. Also, make sure you have /usr/local/bin in your
PATH environment variable, as for some mysterious reason the folks
at RedHat did not include it in the default configuration files
in RH 5.{0,1}.
- PowerPC MkLinux
You will need to have the latest version of Xpmac. Older versions
seem to have bugs that cause the system to hang.
- Debian GNU/Linux
- Debian Linux
If you want JPEG and TIFF support, make sure you have libtiff-dev
and libjpeg-dev installed.
- SuSE GNU/Linux
If you installed the Window Maker package from SuSE,
uninstall it before trying to compile wmaker or you
might have problems.
- MetroX (unknown version)
MetroX has a bug that corrupts pixmaps that are set as window
backgrounds. If you use MetroX and has weird problems with
textures, do not use textures in titlebars. Or use a different
X server.
INSTALLATION:
=============
Build Window Maker
------------------
For a quick start, type the following in your shell prompt:
Unpack WindowMaker-data.tar.gz and move the pixmaps directory in it
to /usr/local/share/pixmaps
You can get the file at ftp://ftp.windowmaker.org. This file is not strictly
necessary, but contains some additional nice icons and other things.
autoconf and automake
---------------------
autoconf and automake are not required, but if you have them installed,
make sure you have autoconf 2.12 and automake 1.3 or newer. If you have
an older version, disable them by temporarily renaming them to something
else or uninstalling them from your system.
Build libPropList
-----------------
Note: You only need to build libPropList if you don't have it installed
in your system.
libPropList is included with the distribution, so you don't
need to download it anywhere (some people have asked me this...)
But if you already have libPropList installed on you system you
can skip this step, since configure will detect that and use the
installed version first if available.
To build libPropList, simply type the following at the shell prompt:
gunzip -c libPropList.tar.gz | tar xf -
cd libPropList
./configure
make
then, login as root and type:
make install
Build WindowMaker
-----------------
If this is the first time you're building WindowMaker, you can
simply type:
./configure
make
@@ -296,15 +207,13 @@ Build Window Maker
then, login as root and type:
make install
ldconfig
or if you want to strip the debugging symbols from the binaries and make them
or if you want to strip the binaries from debugging symbols and make them
smaller, you can instead type:
make install-strip
ldconfig
This will build and install Window Maker with default parameters.
This will build and install WindowMaker with default parameters.
If you want to customize some compile-time options, you can do the
following.
@@ -316,94 +225,86 @@ following.
to get a complete listing of other options that are available.
2. Run configure with the options you want. For example, if you
want to use the --enable-modelock option, type:
Note that the WPrefs.app installation path is configured
in a different way. Look at WPrefs/README for information.
./configure --enable-modelock
2. Run configure with the options you want. For example, if you
want to use the --enable-kanji option, type:
./configure --enable-kanji
3. (optional) Edit src/wconfig.h with your favorite text editor
and browse through it for some options you might want to change.
4. Compile. Just type:
4. Compile WindowMaker. Just type:
make
5. Login as root (if you can't do that, read the "I don't have the
root password :-(" section) and install Window Maker in your system:
root password :-(" section) and install WindowMaker in your system.
Again, type:
su root
make install
User specific configuration
---------------------------
These instructions do not need to be followed when upgrading Window Maker
These instructions do not need to be followed when upgrading WindowMaker
from an older version, unless stated differently in the NEWS file.
Every user on your system that wishes to run Window Maker must do the
Every user on your system that wishes to run WindowMaker must do the
following:
1. Install Window Maker configuration files in your home directory.
1. Install WindowMaker configuration files in your home directory.
Type:
wmaker.inst
wmaker.inst will install Window Maker configuration files and will
setup X to automatically launch Window Maker at startup.
wmaker.inst will install WindowMaker configuration files and will
setup X to automatically launch WindowMaker at startup.
That's it!
You can type "man wmaker" to get some general help for configuration
and other stuff.
That's it! The configuration file where you can edit your preferences
is $HOME/GNUstep/Defaults/WindowMaker.
The $HOME/GNUstep/Defaults/WMWindowAttributes file is where you assign
icons to applications and edit some other attributes for windows. This can
be also edited from the "Attributes Panel". To access it, click the titlebar
of the window with the Right mouse button and select "Attributes...".
Read the User Guide for a more in-depth explanation of Window Maker.
The $HOME/GNUstep/Library/WindowMaker/menu file is the definition of
the root menu. Edit it according to the applications you have installed.
Read the User Guide for a more in depth explanation of WindowMaker.
The User Guide is avaiable at http://windowmaker.org
You might want to take a look at the FAQ too.
Installing the extras package
-----------------------------
Unpack WindowMaker-extra-<version-number>.tar.gz in /usr/local/share
You can get the file at ftp://ftp.windowmaker.org. This file is optional
and only have a few icons, and themes. Look for the latest <version-number>
available.
Also there is a WindowMaker-extra.readme to instruct you where that package
should go.
I don't have the root password :(
---------------------------------
If you can't get superuser privileges (can't be root) you can install
wmaker in your own home directory. For that, supply the --prefix option
when running configure in step 2 of building Window Maker. You will
also need to supply the --with-appspath option, to specify the path for
WPrefs.app Example:
when running configure in step 2 of building WindowMaker . Example:
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
./configure --prefix=/home/jshmoe
If you use national language support, you must also supply the --with-nlsdir
option, as:
Then make /home/jshmoe/bin be included in your search PATH, add
/home/jshmoe/lib to your LD_LIBRARY_PATH environment variable and run
./configure --prefix=/home/jshmoe --with-nlsdir=/home/jshmoe/lib/locale
Then make /home/jshmoe/bin be included in your search path and run
bin/wmaker.inst
Of course, /home/jshmoe is supposed to be replaced with your actual home
directory path.
UPGRADING
=========
If you are upgrading from an older version of Window Maker:
1. Configure and build Window Maker as always
2. Install Window Maker (but do not run wmaker.inst)
3. Read the NEWS file and update your configuration files if necessary.
If you are upgrading from an older version of WindowMaker:
1. Configure and build WindowMaker as always
2. Install WindowMaker (but do not run wmaker.inst)
3. Read the NEWS file and update your configuration files,
if necessary.
TROUBLESHOOTING
===============
@@ -413,34 +314,36 @@ like not being able to use a graphic format library you think you have
installed, look at the config.log file for clues of the problem.
== Error with loading fonts, even if they exist.
== When I try to start X after installing wmaker, I get this:
exec: wmaker: not found
Try rebuilding without NLS support.
You probably are using a brain-damaged distribution. Add /usr/local/bin
into your path environment variable (editing .cshrc or .profile)
== Error when configuring
== Error during build of libPropList
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
make: *** No rule to make target `libPropList.a.c', needed by
`libPropList.a.o'. Stop.
remove the --no-reexec option from aclocal.m4 and reconfigure
Also make sure the autoconf and automake versions you have installed are:
autoconf 2.13
automake 1.4
libtool 1.3
Make sure the autoconf and automake versions you have installed are at
least:
autoconf 2.12
automake 1.3
Note that it must not be libtool 1.2b, it must be libtool 1.3,
from the GNU sites.
If you are using the RPM's that come with RedHat 4.x, don't use them.
It is broken. Uninstall the RPM and reinstall a fresh package from
You can get them from ftp://prep.ai.mit.edu or any mirror.
== configure doesn't detect libtiff, or other graphic libraries.
Delete config.cache, then rerun configure adding the following options to
configure (among the other options you use):
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
--with-gfx-libs="-L/usr/local/lib"
--with-gfx-incs="-I/usr/local/include -I/usr/local/include/tiff"
Put the paths where your graphic libs and their corresponding header files are
located. You can put multiple paths in any of these options, as the example
of --with-incs-from shows. Just put a space between them.
of --with-gfx-incs shows. Just put a space between them.
== configure doesn't detect libXpm.
@@ -464,21 +367,17 @@ If you're not sure, try renaming ~/GNUstep to ~/GNUtmp and then run wmaker.inst
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
* Window Maker is not finding cpp (the C preprocessor). If your cpp is
* WindowMaker is not finding cpp (the C preprocessor). If your cpp is
not located in /lib/cpp, edit src/config.h and correct the path in
CPP_PATH.
== checking lex output file root... configure: error: cannot find output from true; giving up
* Read the REQUIREMENTS section of this file.
LOCALES/INTERNATIONALIZATION
============================
Window Maker has national language support. To enable national language
support, you must compile Window Maker with some additional parameters.
WindowMaker has national language support.
To enable national language support, you must compile
WindowMaker with some additional parameters.
0 - You must have the GNU gettext package installed. It can be
obtained at ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
@@ -504,10 +403,9 @@ Read po/README if you wish to translate and maintain locale files
for other languages.
2 - Additionally, if your language uses multi-byte characters, such
as Japanese or Korean, you must set the MultiByteText option to YES
in ~/GNUstep/Defaults/WMGLOBAL
as Japanese or Korean, you must supply the --enable-kanji flag to configure.
3 - Configure, build and install Window Maker normally.
3 - Configure, build and install WindowMaker normally.
4 - To select a particular locale at runtime you must set the LANG
environment variable to the locale you want. For example, if you want to set
@@ -524,7 +422,7 @@ in Bourne sh and similars
Note: If you have the LC_CTYPE environment variable set, you must
unset it before running wmaker.
For menu definition files, Window Maker searches for them in the
For menu definition files, WindowMaker searches for them in the
following order (for brazilian portuguese, in this case):
menu.pt_BR
@@ -532,3 +430,26 @@ menu.pt
menu
5 - If you chose a language that uses multi-byte characters, you must
configure the fonts appropriately. Read the manual page for XCreateFontSet
to have more details about it. You must change the ~/G/D/WindowMaker file
for fonts used in titlebars, menus and other things. For fonts used in
dialog windows, change ~/G/D/WMGLOBAL. Note that at the moment you can only
supply a single font in WMGLOBAL. The %d in the font names must not be
removed.
For example, you can specify the following in ~/G/D/WindowMaker:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
and in ~/G/D/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";

View File

@@ -1,604 +0,0 @@
Instrukce pro instalaci okenního manažera Window Maker
PODPOROVANÉ PLATFORMY
=====================
("Podporované" znamená, že to na dané platformě někdo zprovoznil...)
- Intel GNU/Linux Conectiva 5.9 (beta)
- Intel GNU/Linux Slackware
- Intel GNU/Linux Debian
- Intel GNU/Linux ostatní distribuce
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- SCO Unix
- SGI Irix 5.x, 6.5
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 over MacOS
- Amiga 3000 running RedHat Linux 5.1 (Rawhide)
- IBM S/390 s Linuxem
- iBook s OS Darwin
Patche pro rozběhání na jiných platformách jsou vítané.
POŽADAVKY
=========
Následující software je potřebný/nezbytný pro běh Window Makeru:
- X11R6.x
Window Maker může být zkompilován na starších verzích X, jako
je X11R5 (Solaris) nebo X11R4 (OpenWindows), ale nebude to pracovat
100% spolehlivě. Na těchto systémech nebudou fungovat ikony
aplikací a budete mít problémy s používáním doku. Upgrade
uživatelských knihoven (Xlib, Xt atd.) zlepší tyto problémy pokud
nemůžete aktualizovat váš X server.
Následující software je potřebný ke zkompilování Window Makeru:
- Zákládní běžné věci
Když budete komplivat Window Maker, tak se ujistěte, že máte gcc
(nebo jiný ANCI C kompilátor) a nainstalované hlavičkové soubory
pro X. Hlavně pro začátečníky v Linuxu: musíte nainstalovat všechny
X-devel balíky a gcc. Jinak nebudete schopni zkompilovat žádný
program s grafickým rozhraním, tedy ani Window Maker.
- autoconf, automake a libtool
Tyto nástroje NEJSOU POTŘEBA, ale když máte jeden nebo dva nebo
všechny tři nainstalované, tak se UJISTĚTE, že máte přesně
následující VERZE:
autoconf 2.54
automake 1.4
libtool 1.4.2
Máte-li odlišnou verzi, tak ji dočasně přejmenujte, nebo ji rovnou
odinstalujte z vašeho systému. Pokud nebudete programovat, tak ji
stejně nebudete potřebovat, takže ji můžete bezpečně odinstalovat.
Pozn. libProblist není potřeba ke zkompilování Window Makeru, protože
libProblist byl přímo zabudován do WINGs. Z toho důvodu není
potřeba ani lex (flex) a yacc (nebo bison).
NEPOVINNÉ
=========
Tyto knihovny nejsou nutné pro běh Windo Makeru, ale jsou podporované, když
je budete chtít použít. Tyto verze jsou používané vývojovým týmem, který
garantuje, že budou fungovat. Ostatní verze by měli fungovat také.
- libXPM 4.7 nebo novější
Starší verze nemusí fungovat!!!
Dostupné na ftp://sunsite.unc.edu/pub/Linux/libs/X/
Je zde zabudovaná podpora pro soubory XPM, ale nenačte obrázky s
nestandardním formátem kódování.
- libpng 0.96 nebo novější a zlib
Pro podporu PNG obrázků
http://www.cdrom.com/pub/png/
- libtiff 3.4 nebo novější
Pro podporu TIFF obrázků
Dostupné na ftp://ftp.sgi.com/graphics/tiff
- libjpeg 6.0.1 nebo novější
Pro podporu JPEG obrázků
http://www.ijg.org/
- libgif 2.2 nebo libungif
Pro podporu GIF obrázků
Dostupné na ftp://prtr-13.ucsc.edu/pub/libungif/
-GNU xgettxt
Když chcete používat češtinu nebo jiné jazyky kromě angličtiny,
tak potřebujete GNU xgettext.
Ostatní verze nejsou kompatibilní a nebudou fungovat
GNU verze je dostupná na ftp://ftp.gnu.org
KONFIGURAČNÍ NASTAVENÍ
======================
Tyto volby mohou být předané konfiguračnímu skriptu jako argumenty za
účelem povolení/zakázání určité vlastnosti Window Makera.
Příklad:
./configura --enable-kde --enable-gnome
nakonfiguruje Window Maker s podporou KDE a GNOME
Seznam ostatních možností dostanete spuštěním ./configure --help
--with-libs-from
specifikuje, které další adresáře s knihovnami se mají
prohledávat. Řetězec -L musí předcházet každému adresáři,
např:
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--with-incs-from
určuje, které další adresáře s hlavičkovými soubory se mají
prohledat. Řetězec -I musí předcházet každému adresáři,
např:
--with-incs-from="-I/opt/headers -I/usr/local/include"
--enable-single-icon
umožňuje skrýt všechny ikony aplikací WM_CLASS+WM_INSTANCE
do jedné jediné. Tato vlastnost není podporovaná ze strany vývojářů.
Když budete mít s touto funkcí problémy, tak se obraťte na jejího
autora: Christopher Seawood <cls@seawood.org>
--disable-shm
zakáže používání zdílené paměti MIT. To trochu zpomalí generování
textur, ale v některých případech se to jeví jako nezbytnost z důvodu
chyby, která způsobuje špatné zobrazování ikon a textur.
--disable-motif
zakáže podporu pokynů pro okenní manažer mwm.
--enable-lite
odstraní nástroje a funkce, které jsou dostupné v desktopových
prosředích KDE a GNOME. Odstraní se: seznam oken, menu aplikací,
výběr více oken. Uvědomte si, že takto nebudete schopni ukončit
samotný Window Maker pomocí aplikačního menu. Budete muset zabít Window
Maker z textové konzole nebo ho ukončit z KDE nebo GNOME.
Nedoporučuje se povolit tuto vlastnost.
--enable-modelock
podpora pro XKB nastavení jazyka. Když nevíte, o co jde, tak to
pravděpodobně nebudete potřebovat.
--enable-sound
povolí podporu modulu zvukových efektů.
--disable-xpm
zakáže podporu knihovny XPM, pokud je dostupná na vašem systému.
--disable-png
zakáže podporu knihovny PNG.
--disable-tiff
zakáže podporu knihovny TIFF.
--disable-gif
zakáže podporu knihovny GIF.
--disable-jpeg
zakáže podporu knihovny JPEG.
--disable-shape
zakáže tvarovaná okna (pro oclock, xeyes, atd.).
POŽADAVKY PRO SPECIFICKÉ PLATFORMY
==================================
-DEC/Alpha
Následující mail není přeložen, ale hovoří se v něm, že pravděpodobně
není potřeba konfigurovat Window Maker na Alphě s volbou --disable-shm.
-------------------------------------------------------------------------------
From: Anton Ivanov <aivanov@eu.level3.net>
To: Marcelo E. Magallon <mmagallo@debian.org>
Subject: Re: Is the WindowMaker package working ok on Alpha?
> Hi,
>
> I was reading some docs on the WindowMaker tarball, and found this:
>
> | - DEC/Alpha machines
> | You might need to pass the --disable-shm flag to configure,
> | like ./configure --disable-shm
>
> is anyone having problems with WindowMaker on Alpha? Can someone
> please test this? Should the flag be passed when building on Alpha?
Disclaimer: alphas under my command have never run X and are least likely to
suddenly start running it anytime soon.
Alpha used to have some ridiculously low amount of shared memory
configured.
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
Check where is yours at the moment and raise it to a more appropriate
value by either catting to the appropriate /proc entry or changing the
/usr/src/linux/include/asm/shmparam.h.
Otherwise the shared memory on alpha should be fully functional and I
see no reason to disable it. Mine are bumped up to 32 or more on most
machines.
And If I recall correctly the comments in that file are actually
wrong. Value is not bytes, but in machine size word. For alpha *8.
As I said - I do not run X on them so all #include "stdisclaimer.h"
apply.
-------------------------------------------------------------------------------
- SCO Unix - configure spusťte takto:
CFLAGS="-belf -DANSICPP" ./configure
- SunOS, Solaris
Když máte naistalovaný gcc, tak configure spusťte takto:
CPP_PATH="gcc -E -x c" ./configure
Preprocesoru cpp od Sunu chybějí některé vlastnosti, které Window Maker
potřebuje, a to může způsobit problémy během parsování konfiguračních
souborů. Je možné, že budete muset použít --with-libs-from a
--with-incs-from k nahrazení adresáře s libtiff.
Někdo doporučuje použít /usr/local/lib jako první cestu v LD_LIBRARY_PATH.
Když máte Ultra Creator 3D nebo jinou high-end grafickou kartu, tak se
ujistěte, že X server startuje s 24 bitovou barevnou hloubkou, jinak
můžete mít problémy s pomícháním barev. Toto je chyba Window Makeru,
která bude odstraněna.
- GNU/Linux obecně
Ujistěte se, že soubor /etc/ld.so.conf obsahuje řádek "/usr/local/lib".
Odinstalujte jakoukoliv starší verzi balíčku Window Makeru před instalací
novější verze.
Nezapomeňte spustit ldconfig po instalaci Window Makeru.
- RedHat GNU/Linux
RedHat několik obtěžujících chyb. Pokud ho používáte dodržujte několik
následujících kroků, jinak vám Window Maker nebude fungovat.
* pokud máte nainstalovaný Window Maker z distribuce RedHat, tak ho před
upgradem odinstalujte
* ujistěte se, že nemáte systémové proměnné LANG a LINGUAS nastavené
na en_RN
* ujistěte se, že vaše systémová proměnná PATH obsahuje položku
/usr/local/bin
* ujistěte se, že soubor /etc/ld.so.conf obsahuje řádek "/usr/local/lib"
před tím, než spustíte ldconfig (na konci instalace)
* pokud máte problémy, které se projevují chybovou hláškou, která
obsahuje text --no-reexec, tak odinstalujte libtool-1.2b a nainstalujte
si novější verzi libtool-1.3. libtool-1.3 můžete nalézt na adrese:
ftp.gnu.org . Přečtěte si také odstavec ŘEŠENÍ PROBLÉMÚ.
* pokud máte nainstalovaný balíček Window Maker od RedHatu a nyní
instalujete novou verzi "ručně" (kompilováním zdrojových kódů), tak
nejprve odinstalujte stávající balíček.
* ujistěte se, že se na vašem systému nachází symbolický link z
/usr/include/X11 na /usr/X11R6/include/X11. Pokud tomu tak není, tak
na příkazovou řádku napište:
ln -s /usr/X11R6/include/X11 /usr/include/X11
* ujistěte se, že máte symbolický link /lib/cpp ukazující na cpp
program
Pokud pochybujete o nějakém z předcházejích kroků, tak neváhejte
kontaktovat uživatelskou podporu distribuce RedHat. Oni vám laskavě
zodpoví všechny vaše dotazy zohledňující váš systém. Oni vědí
mnohem více o vašem (jejich) systému než my (my nepoužíváme
RedHat).
- PowerPC MkLinux
Budete potřebovat poslední verzi Xpma. Starší verze pravděpodobně
obsahují chybu, která způsobuje zamrznutí systému.
- Debian GNU/Linux
Pokud chcete podporu JPEG a TIFF, tak se ujistěte, že máte nainstalovány
balíčky libtiff-dev a libjpeg-dev.
- SuSE GNU/Linux
Pokud máte již nainstalován baliček Window Maker od SuSE, tak ho
odstraňte než se pustíte do kompilace Window Makeru. když tak
neučiníte, budete mít problémy.
- MetroX (neznámá verze)
Metrox obsahuje chybu, která zapřičiňuje, že obrázky, které jsou
nastaveny jako pozadí, jsou poškozeny. Pokud používáte Metrox a
máte podivné problémy s texturami, tak nepoužívejte textury v
titulcích nebo používejte jiný X server.
INSTALACE
=========
Nejjednodušší způsob, jak nainstalovat Window Maker, je spustit skript
Install nebo Install.cs (ten s vámi komunikuje česky). Oba skripty
vás jednoduše provedou celou instalací.
su
Install.cs
Poznámka: tato metoda neposkytuje všechny možnosti konfigurace a pokud
se setkáte s nějakými problémy, tak stejně budete muset
použít následující způsob kompilace.
Kompilace Window Makeru
-----------------------
Pro osvědčený způsob zadejte následující příkazy v shellu:
./configure
make
pak se přihlašte jako root a zadejte:
make install
ldconfig
pokud nejste programátor a nebudete ladit Window Maker, tak se můžete zbavit
ladících symbolů v binárních souborech a zmenšit jejich velikost:
make install-strip
ldconfig
Takto zkompilujete a nainstalujete Window Maker se standartními parametry.
Pokud chcete upravit některé vlastnosti, tak musíte učinit následující:
1. (volitelné) Podívejte se na část MOŽNOSTI KONFIGURACE, kde jsou
uvedené možnosti konfigurace. Nebo spusťte:
./configure --help
tak dostanete kompletní seznam všech dostupných možností konfigurace.
2. Spusťte ./configure s možností, kterou jste si vybrali. Například,
pokud chcete použít možnost --enable-kde, tak zadejte:
./configure --enable-kde
3. (volitelné) Otevřete soubor ./src/wconfig.h vaším oblíbeným editorem
a upravte některé možnosti, které si přejete změnit.
4. Kompilace. Zadejte pouze:
make
5. Přihlaste se jako root (pokud tak nemůžetet učinit, tak si přečtěte
část "Nemám rootovské helso :-(") a nainstalujte Window Maker na váš
systém:
su root
make install
Nastavení specifické pro uživatele
----------------------------------
Tyto instrukce nejsou povinné, pokud upgradujete Window Maker ze starší
verze na novější a pokud není uvedeno jinak v souboru NEWS.
Každý uživatel na vašem systému, který si přeje používat Window Maker musí
udělat následující:
1. Nainsatlovat konfigurační soubory Window Makeru do jeho domovského
adresáře:
wmaker.inst
wmaker.inst nainstaluje konfigurační soubory a nastaví X server tak,
aby automaticky spouštěl Window Maker při jejich spuštění.
To je všechno, přátelé.
Informace o konfiguraci a spoustě ostatních věcí vám poskytne:
man wmaker
Pro hlubší úvod do Window Makeru si přečtěte Uživatelskou příručku (User Guide).
Měli byste se také podívat na FAQ (Frequently Asked Questions = často kladené
otázky), pokud budete mít nějaké problémy/potíže jak při samotné kompilaci,
tak s užíváním Window Makeru.
Instalování speciálního balíčku
-------------------------------
Rozbalte WindowMaker-extra-<číslo_verze>.tar.gz v adresáři /usr/local/share
Tento soubor si můžete sehnat na adrese: ftp://ftp.windowmaker.org. Instalace
tohoto souboru vůbec není nutná. tento balíček obsahuje několik ikon a témat.
Hledejte poslední dostupnou verzi. V balíčku také naleznete soubor
WindowMaker-extra.readme, který vám poradí, co máte udělat.
Nemám rootovské helso :-(
-------------------------
Pokud nemáte superuživatelská privilegia (nemůžete se přihlásit jako root),
tak nezoufejte, protože můžete nainstalovat Window Maker do vašeho vlastního
domovského adresáře. K tomu musíte použít volbu --prefix při spuštění
./configure. Také musíte použít volbu --with-appspath, která specifikuje
cestu pro WPrefs.app.
Příklad:
./configure --prefix=/home/karel --with-appspath=/home/karel/GNUstep/Applications
Potom přidejte adresář /home/karel/bin do systémové proměnné PATH a adresář
/home/karel/lib do sytémové proměnné LD_LIBRARY_PATH a nakonec spusťte
~/bin/wmaker.inst.
Samozřejmě, že adresář /home/karel bude ve vašem případě nahrazen vaším
vlastním domovským adresářem.
UPGRADE
=======
Pokud upgradujete ze starší verze Window Makeru:
1. Nakonfigurujte a zkompilujte Window Maker jako obvykle.
2. Nainstalujte Window Maker (ale nespouštějte wmaker.inst).
3. Přečtěte si soubor NEWS a aktualizujte vaše konfigurační soubory,
pokud je to nezbytné.
ŘEŠENÍ PROBLÉMÚ
===============
Pokud máte nějaké problémy během konfigurace (když běží configure), jako
například neschopnost použít knihovnu grafického formátu, o kterém víte, že
ho máte nainstalován, tak se podívejte do souboru config.log. Možná zde
najdete příčinu svých problémů.
== Error with loading fonts, even if they exist.
Zkuste kompilaci bez podpory NLS (národního prostředí).
== Error when configuring
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
odstraňte volbu --no-reexec ze souboru aclocal.mc a spusťte znovu configure.
Také zkontrolujte, zda verze autoconfu a automaku, které máte nainsatlované
odpovídají níže uvedeným hodnotám:
autoconf 2.13
automake 1.4
libtool 1.3
Poznámka: nemůže to být libtool 1.2b, ale musí to být libtool 1.3 ze stránek
GNU.
== configure doesn't detect libtiff, or other graphic libraries.
Smažte soubor config.cache, pak znovu spusťte configure s následujícími
volbami (a jinými, které používáte):
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
Na příslušná místa vložte cesty k vaším grafickým knihovnám a odpovídajícím
hlavičkovým souborům. Můžete zadat několik cest do těchto voleb, jako je to
ve výše uvedeném příkladě --with-incs-from. Jenom je nezapomeňte oddělit
mezerou.
== configure doesn't detect libXpm.
* Zkontrolujte, jestli máte symbolický link ze souboru libXpm.so.4.9 na
soubor libXpm.so
== Segmentation fault on startup
* Zkontrolujte, jestli verze knihovny libXPM je vyšší než 4.7
* Zkontrolujte, zda-li máte upravenou verzi ~/GNUstep/Defaults/WindowMaker
Pokud si nejste jisti, tak zkuste přejmenovat ~/GNUstep na ~/GNUtmp a
spusťte wmaker.inst
== "...: your machine is misconfigured. gethostname() returned (none)"
* Jméno vašeho počítače je nastaveno nesprávně, protože začíná uvozovkami.
Spusťte man hostname a zde se dozvíte, jak změnit jméno vašeho počítače.
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
* Window Maker nemůže nalézt cpp (preprocesor jazyka C). Pokud se váš cpp
nenachází v /lib/cpp, tak otevřte soubor src/config.h a nastavte správně
cestu CPP_PATH.
== checking lex output file root... configure: error: cannot find output from true; giving up
* Přečtěte si odstavec POŽADAVKY na začátku tohoto souboru.
MÍSTNÍ NASTAVENÍ / INTERNACIONALIZACE
=====================================
Window Maker podporu národních jazyků. Aby jste ji povolili, tak
musíte zkompilovat Window Maker s několika dalšími parametry.
Seznam podporovaných jazyků naleznete v souboru ./po/README.
0 - Musíte mít nainstalovaný balíček GNU gettextu. Tento balíček
můžete nalézt na ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
Kroky 1,2 a 3 můžete vynechat, pokud používáte skript Install.cs nebo
skript Install.
1 - Vyberte si jazyky, které budete chtít používat. Zadejte seznam
těchto jazyků do systémové proměnné LINGUAS. Angličtina je
podporována vždy. Příklady
C - shell:
setenv LINGUAS "pt ja de"
Bash(sh):
export LINGUAS
LINGUAS="pt ja de"
Přečtěte si soubor po/README pokud chcete přeložit Window Maker
pro nějaký další jazyk.
2 - Navíc, pokud váš jazyk používá multi-byte znaky, například Japonština
nebo Korejština, tak musíte nastavit volbu the MultiByteText na YES
v souboru ~/GNUstep/Defaults/WMGLOBAL
3 - Nakonfigurujte, zkompilujte a nainstalujte Window Maker jako obvykle.
4 - Národní prostředí si můžete změnit i za běhu Window Makeru. Systémovou
proměnnou LANG nastavíte na vámi zvolenou hodnotu. Například, pokud
chcete použít portugalské prostředí, musíte spustit:
C - shell:
setenv LANG pt
Bourne shell a podobné:
export LANG
LANG=pt
Nakonec musíte restartovat/spustit Window Maker.
Poznámka: Když máte nastavenou systémovou proměnnou LC_TYPE, tak
musíte zrušit před spuštěním Window Makeru.
Window Maker hledá soubory s definicí menu v tomto pořadí (pro
brazilskou portugalštinu):
menu.pt_BR
menu.pt
menu
5 - Pokud si vyberete jazyk, který používá multi-byte znaky, tak musíte
příslušným způsobem nastavit fonty. Přečtěte si manuálové stránky
o XCreateFontSet k získání většího množství informací o daném
problému. Musíte změnit v souboru ~/GNUstep/Default/WindowMaker
nastavení fontů pro titulky, menu, atd. Fonty pro dialogy nastavíte
v souboru ~/GNUstep/Default/WMGLOBAL. Řetězce %d ve jménech fontů
nemusí být odstraněné. Také můžete použít skript wsetfont, který
toto vše učiní za vás. Pokud se ho rozhodnote použít, tak si k němu
přečtěte instrukce tak, že spustíte wsetfont bez argumentů.
Příklad části souboru ~/GNUstep/Default/WindowMaker:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
a souboru ~/GNUstep/Default/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
Tyto dva fonty jsou používány v aplikacích, které používají WINGs (WindowMaker a
WPrefs.app).
Skript wsetfont vám umožní nastavit fonty mnohem jednoduším způsobem. Podívejte
se na jeho manuálové stránku k získání bližších informací.

View File

@@ -1,594 +0,0 @@
Instrucciones de Instalación para Window Maker
PLATAFORMAS SOPORTADAS
======================
(obs: Alguien me mencionó que lo compiló en...)
- Intel GNU/Linux Conectiva 5.9 (beta)
- Intel GNU/Linux Slackware
- Intel GNU/Linux Debian
- Intel GNU/Linux other distributions
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- SCO Unix
- SGI Irix 5.x, 6.5
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 over MacOS
- Amiga 3000 running RedHat Linux 5.1 (Rawhide)
- IBM S/390 running Linux
- iBook running Darwin
- Windows NT with Cygwin/XFree86
- Sony PlayStation2 running Linux
Todas las marcas registradas están registradas por sus dueños. (duh)
Los parches que lo hagan funcionar en otras plataformas son bienvenidos.
REQUERIMIENTOS:
==============
El siguiente software se necesita para usar Window Maker:
- X11R6.x
Window Maker puede ser compilado en versiones más antiguas de X,
como X11R5 (Solaris) o X11R4 (OpenWindows) pero no funcionará 100%
correctamente.
En tales servidores no habrá íconos de aplicación y tendrá problemas
usando el dock. Actualizar las bibliotecas cliente (Xlib, Xt, etc)
ayudará si no puede actualizar el servidor.
Lo siguiente se necesita para compilar Window Maker:
- Requerimientos básicos y obvios
Si compila Window Maker, asegúrese de tener gcc (u algún otro
compilador ANSI C) y los archivos header de X instalados. Especialmente
para los usuarios de Linux principiantes: debe instalar todos los paquetes
de desarrollo de X y la suite gcc. De lo contrario no será capaz de
compilar ningún programa X, incluyendo Window Maker.
- libPropList
Esta biblioteca se puede encontrar en ftp://ftp.windowmaker.org/pub/libs
o en ftp://ftp.gnome.org/pub/libPropList
Instálela antes de compilar Window Maker.
- autoconf, automake y libtool
Estas herramientas NO son necesarias, pero SI tiene una o más de ellas
instaladas, asegúrese de tener TODO lo siguiente con estas versiones
exactas:
autoconf 2.54
automake 1.4
libtool 1.4.2
Si tiene una versión distinta, desactívelas temporalemte renombrándolas
a otras cosa o desinstalándolas desde su sistema. Si no desarrolla
software no las necesita, así que puede desinstalarla sin peligro.
- lex (o flex) y yacc (o bison)
Estas son usadas por libPropList. lex en realidad no se necesita ya que
su archivo de salida está incluido, pero o yo o automake es tonto,
causando que el script configure para libPropList simplemente
aborte sin ningún motivo si lex no es encontrado.
OPCIONAL:
=========
Estas bibliotecas no son necesarias para hacer que Window Maker funcione,
pero están soportadas en caso de que quiera usarlas. Los números de versión
son aquellos que yo tengo (y por lo tanto, garantizo que funciona), pero
otras versiones podría funcionar también.
- libXPM 4.7 o más actual.
Versiones antiguas pueden no funcionar!!!
Disponible en ftp://sunsite.unc.edu/pub/Linux/libs/X/
Hay soporte nativo para archivos XPM, pero no cargará imagenes de
algunos formatos poco comunes.
-libpng 0.96 o más actual y zlib
Para soporte de imágenes PNG.
http://www.cdrom.com/pub/png/
- libtiff 3.4 o más actual.
Para soporte de imaen TIFF.
Puede obtenerla en ftp://ftp.sgi.com/graphics/tiff
- libjpeg 6.0.1 o más actual
Para soporte de imagen JPEG
http://www.ijg.org/
- libgif 2.2 o libungif
Para soporte de imagen GIF.
ftp://prtr-13.ucsc.edu/pub/libungif/
- GNU xgettext
Si quiere usar mensajes traducidos, necesitará GNU gettext.
Otras versiones de gettext no son compatibles y no funcionarán.
Obtenga la versión GNU desde ftp://ftp.gnu.org
OPCIONES DE CONFIGURACIÓN:
=========================
Estas opciones pueden ser pasadas al script configure para activar/desactivar
algunas opciones de Window Maker. Ejemplo:
./configure --enable-kde --enable-gnome
configurará Window Maker para que sea compilado con soporte para KDE y GNOME.
Para obtener una lista de otras opciones, ejecute ./configure --help
--with-libs-from
especifica rutas adicionales por donde se debe buscar bibliotecas.
El -L flag debe preceder a cada ruta, tal como:
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--with-incs-from
especifica rutas adicionales para la búsqueda de archivos header.
El parámetro -I debe preceder a cada ruta, tal como:
--with-incs-from="-I/opt/headers -I/usr/local/include"
--enable-single-icon
activa el agrupamiento de todos los appicons (iconos de aplicaciones)
del WM_CLASS+WM_INSTANCE en uno solo. Esta característica no es soportada
por todos los desarrolladores. Si tiene algún problema con ella, contacte
a su autor: Christopher Seawood <cls@seawood.org>
--disable-shm
desactiva el uso de la extensión MIT de memoria compartida. Esto
ralentizará la generación de texturas un poco, pero en algunos casos
parecerá necesario debido a un error que se manifiesta como íconos y
texturas desordenadas.
--disable-motif
desactiva el soporte para el gestor de ventanas mwm.
--enable-lite
quita cosas que ya están soportadas en los entornos de escritorio,
tal como KDE y Gnome. Desactiva cosas como: lista de ventanas,
menú de aplicaciones raíz, selección de ventanas múltiple. Note
que no podrá salir más desde dentro de Window Maker; tendrá que usar
kill con la señal SIGTERM o salir de KDE. No aconsejo activarlo.
--enable-modelock
Soporte para bloqueo de estado de lenguaje XKB. Si no sabe que es esto
probablemente no lo necesite.
--enable-sound
activa el soporte del módulo para efectos sonoros.
--disable-xpm
desactiva el uso de la biblioteca XPM aunque este disponible en su
sistema.
--disable-png
desactiva el uso de la biblioteca PNG.
--disable-tiff
desactiva el uso de la biblioteca TIFF.
--disable-gif
desactiva el uso de la biblioteca GIF.
--disable-jpeg
desactiva el uso de la biblioteca JPEG.
--disable-shape
desactiva la forma de ventanas (para oclock, xeyes etc.)
NOTAS ESPECÍFICAS A LA PLATAFORMA:
=================================
- máquinas DEC/Alpha
#>>>>>>>>>>>
From: Anton Ivanov <aivanov@eu.level3.net>
To: Marcelo E. Magallon <mmagallo@debian.org>
Subject: Re: El paquete WindowMaker funciona bien en Alpha?
> Hola,
>
> Estuve leyendo algunos documentos en el tarball de WindowMaker,
> y encontré esto:
>
> | - máquinas DEC/Alpha
> | podría necesitar pasar el parámetro --disable-shm a configure,
> | así ./configure --disable-shm
>
> alguien está teniendo problemas con WindowMaker en Alpha? Puede alguien
> por favor probar esto? Debería el parámetro ser pasado al compilar
> en Alpha?
Descargo de responsabilidad: alphas bajo mi mando nunca han ejecutado X
y es poco probable de que las ejecute repentinamente en algún momento.
Alpha suele tener alguna ridícula poca cantidad de memoria compartida
configurada.
Así que muchísimas aplicaciones suelen to barf. Concretamente - cdrecord, mysql server, etc.
Verifique donde está el suyo en este momento y súbalo a un valor más adecuado catting la entrada
adecuada de /proc o cambiando el /usr/src/linux/include/asm/shmparam.h.
De lo contrario la memoria compartida en alpha debiera ser completamente funcional y no veo razón
para desactivarla. Las mías están aumentadas a 32 o más en muchas máquinas.
Y si recuerdo correctamente los comentarios en aquél archivo están en realidad mal.
El valor no está en bytes, pero si en palabra de tamaño máquina. Para alpha *8.
Como dije - no ejecuto X en ellas asi que apliqué a todas #include "stdisclaimer.h".
#<<<<<<<<<<<<
- SCO Unix - ejecute configure así
CFLAGS="-belf -DANSICPP" ./configure
-SunOS, Solaris
Si tiene gcc instalado, ejecute configure como:
CPP_PATH="gcc -E -x c" ./configure
Sun cpp le falta algunas características que necesita Window Maker y
puede causarle problemas al analizar sintacticamente los archivos config.
También podría necesitar usar el --with-libs-from y --with-incs-from para
suministrarle el directorio donde libtiff se aloja.
Alguien me envió un mensaje diciéndome que también debe hacer que /usr/local/lib
sea la primera ruta en LD_LIBRARY_PATH para que funcione.
Si tiene un Ultra Creator 3D o alguna otra máquina con gráficos high-end,
asegúrese de iniciar el servidor X con el valor visual por defecto a 24bpp o
podría experimentar problemas con colores destrozados.
Este es un error de wmaker y será reparado.
- GNU/Linux en general
Asegúrese de tener /usr/local/lib en /etc/ld.so.conf y de ejecutar
ldconfig después de instalar.
Desinstale cualquier versión empaquetada de Window Maker antes de
instalar una nueva versión.
- RedHat GNU/Linux
Los sistemas RedHat tienen varios problemas molestos. Si lo usa,
asegúrese de seguir los pasos de más abajo o Window Maker no funcionará:
* si instaló el Window Maker que viene con RedHat, desinstálelo antes de
actualizar;
*asegúrese que no tiene las variables de entorno LANG y LINGUAS establecidas a
en_RN;
*asegúrese de tener /usr/local/bin en su variable de entorno PATH;
* asegúrese de tener /usr/local/lib en /etc/ld.so.conf antes de ejecutar
ldconfig;
*si tiene problemas que mencionan un menaje de error con --no-reexec
desinstale libtool-1.2b e instale libtool-1.3 en su lugar. libtool-1.3
se puede encontrar en ftp.gnu.org. También lea la sección TROUBLESHOOTING
(PROBLEMAS);
* si instaló el paquete Window Maker desde RedHat y está instalando una
nueva versión de WM a mano (compilandolo usted mismo), desinstale antes el
paquete desde RedHat.
*asegúrese de tener un enlace simbólico desde /usr/include/X11 hacia
/usr/X11R6/include/X11 (si no, tipee ln -s /usr/X11R6/include/X11 /usr/include/X11)
* asegúrese de tener /lib/cpp apuntando al programa cpp.
Si tiene alguna duda en cuanto a hacer algunas de las cosas de arriba,
por favor no dude en contactar el soporte para usuarios de RedHat. Ellos
responderán amablemente a todas sus preguntas en lo que respecta a su sistema.
Ellos también conocen mucho más acerca de su propio sistema que nosotros
(nosotros no usamos RedHat).
- PowerPC MkLinux
Necesitará tener la última version de Xpmac. Las versiones más antiguas
parecen tener errores que producen el cuelgue del sistema.
- Debian GNU/Linux
Si quiere soporte JPEG y TIFF, asegúrese de tener libtiff-dev y
libjpeg-dev instalados.
- SuSE GNU/Linux
Si instaló el paquete Window Maker desde SuSE,
desinstálelo antes de instentar compilar wmaker o podría
tener problemas.
- MetroX (version desconocida)
MetroX tiene un error que corrompe pixmaps que se establecen como
fondos de ventana. Si usa MetroX y tuvo problemas raros con texturas, no use
texturas en las barras de títulos. O use un servidor X distinto.
INSTALACIÓN:
=============
Compilando Window Maker
------------------
Para un comienzo rápido, tipee lo siguiente en el prompt del shell:
./configure
make
luego, regístrese como root y tipee:
make install
ldconfig
o si quiere remover los símbolos de depuración desde los binarios y hacerlos más
pequeños, puede tipear:
make install-strip
ldconfig
Esto compilará e instalará Window Maker con los parámetros por defecto.
Si quiere personalizar algunas opciones de compilación, puede hacer lo siguiente.
1. (opcional)Mire en la sección OPCIONES DE CONFIGURACIÓN para ver las
opciones disponibles. También ejecute:
./configure --help
para obtener un listado completo de otras opciones que están disponibles.
2. Ejecute configure con las opciones que quiera. Por ejemplo, si quiere
usar la opción --enable-kde, tipee:
./configure --enable-kde
3. (opcional) Edite src/wconfig.h con su editor de texto favorito y
echele un vistazo por algunas opciones que podría querer cambiar.
4. Compile. Solo tipee:
make
5. Regístrese como root (si no puede hacerlo, lea la sección "No tengo la contraseña de root" :-()
e instale Window Maker en su sistema:
su root
make install
Configuración específica del usuario
------------------------------------
Estas instrucciones no necesitan ser seguidas al actualizar Window Maker
desde una versión más antigua, a menos que se indique de otra forma en el archivo
NEWS.
Todo usuario en su sistema que desee ejecutar Window Maker debe hacer lo siguiente:
1. Instale los archivos de configuración de Window Maker en su directorio home.
Tipee:
wmaker.inst
wmaker.inst instalará los archivos de configuración de Window Maker y
configurará X para que automáticamente lance Window Maker al inicio.
Eso es todo!
Puede tipear "man wmaker" para obtener algo de ayuda general para la
configuración y otras cosas.
Lea la Guia de Usuario para una explicación más a fondo de Window Maker.
Podría querer dar una mirada a la FAQ también.
Instalando el paquete extras
----------------------------
Desempaquete WindowMaker-extra-<número-de-versión>.tar.gz en /usr/local/share
Puede obtener el archivo en ftp://ftp.windowmmaker.org. Este archivo es optativo
y solo tiene unos pocos íconos, y temas. Busque el último <número-de-versión>
disponible.
También hay un WindowMaker-extra.readme que le enseña donde vería ir ese paquete.
No tengo la contraseña de root :(
--------------------------------
Si no puede obtener privilegios de superusuario (no puede ser root) puede
instalar wmaker en su propio directorio home. Para esto, proporcione la
opción --prefix al ejecutar configure en el paso 2 de compilando Window Maker.
También necesitará proporcionar la opción --with-appspath, para especificar la ruta
para WPrefs.app. Ejemplo:
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
Luego haga /home/jshmoe/bin para que se lo incluya en su ruta de búsqueda, agregue
/home/jshmoe/lib a su variable de entorno LD_LIBRARY_PATH y ejecute bin/wmaker.inst
Por supuesto, /home/jshmoe se supone que va a ser reemplazado con la ruta a su
directorio home real.
ACTUALIZANDO
============
Si está actualizando desde una versión antigua de Window Maker:
1. Configure y compile Window Maker como siempre.
2. Instale Window Maker (pero no ejecute wmaker.inst)
3. Lea el archivo NEWS y actualice sus archivos de configuración,
si es necesario.
PROBLEMAS
=========
Cuando tenga alguno problemas durante la configuración (al ejecutar configure),
tal como no poder usar una biblioteca de formato gráfico que piensa tener instalada,
mire en el archivo config.log para obtener ideas sobre el problema.
== Error al cargar las fuentes, siempre que existan.
Intente recompilar sin el soporte NLS.
== Error al configurar
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
quite la opción --no-reexec desde aclocal.m4 y libPropList/aclocal.m4 y
reconfigure.
También asegúrese que las versiones de autoconf y automake que tenga instaladas son:
autoconf 2.13
automake 1.4
libtool 1.3
Note que ella no debe ser libtool 1.2b, debe ser libtool 1.3,
desde los sitios GNU.
== No puedo encontrar proplist.h o libPropList.something
Baje e instale libPropList desde los lugares ya citados en algún lugar
de este archivo.
== configure no detecta libtiff, u otras bibliotecas gráficas.
Elimine config.cache, luego vuelva a ejecutar configure añadiendo las siguientes
opciones a configure (entre sus otras opciones):
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
Sustituya las rutas donde están localizadas sus bibliotecas gráficas y sus
correspondientes archivos header. Puede colocar rutas múltiples en cualquiera de
estas opciones, como se muestra en el ejemplo de --with-incs-from . Solo coloque
un espacio entre ellas.
== configure no detecta libXpm.
* Verifique si tiene un enlace simbólico desde libXpm.so.4.9 a libXpm.so
== Segmentation fault al inicio.
* Verifique si la versión de libXPM que tiene es por lo menos la 4.7
* Verifique si tiene una versión actualizada de ~/GNUstep/Defaults/WindowMaker
Si no está seguro, intente renombrar ~/GNUstep a ~/GNUtmp y luego ejecute wmaker.inst
== "...: your machine is misconfigured. gethostname() returned (none)"
* el hostname de su máquina está definido a algo inválido, como comenzar con
un paréntesis. Haga un man hostname para obtener información acerca de como definirlo.
== El menú raíz contiene solo 2 entradas. ("XTerm" y "Exit...")
* Window Maker no está encontrando cpp (el preprocesador de C). Si su
cpp no está ubicado en /lib/cpp, edite src/config.h y corrija la ruta en
CPP_PATH.
== checking lex output file root... configure: error: cannot find output from true; giving up
* Lea la sección REQUERIMIENTOS de este archivo.
LOCALES/INTERNACIONALIZACIÓN
============================
Window Maker tiene soporte de idioma nacional. Para activar este soporte,
debe compilar Window Maker con algunos parámetros adicionales.
0 - Debe tener el paquete GNU gettext instalado. Puede obtenerse en
ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
Los pasos 1 al 3 pueden saltearse si usa el script Install.
1 - Debe seleccionar los idiomas que quiere soportar. Defina el
LINGUAS a la lista de locales que quiera. El Inglés siempre está
soportado. Ejemplo:
setenv LINGUAS "pt ja de"
en csh
o
export LINGUAS;LINGUAS="pt ja de"
en sh
La lista de locales soportados se pueden encontrar en po/README.
El Inglés es el idioma pr defecto.
Lea po/README si desea traducir y mantener archivos locale para otros
idiomas.
2 - Adicionalmente, si su idioma usa caracteres multi-byte, tal como
Japonés o Coreano, debe definir la opción MultiByteText a YES
en ~/GNUstep/Defaults/WMGLOBAL
3 - Configure, compile e instale Window Maker normalmente.
4 - Para seleccionar un locale particular en tiempo de ejecución debe definir la
variable de entorno LANG al locale que quiera. Por ejemplo, si quiere definir
el locale portugués, debe ejecutar
setenv LANG pt
en csh o
export LANG; LANG=pt
en Bourne sh y similares
Nota: Si tiene definida la variable de entorno LC_CTYPE, debe
indefinirla antes de ejecutar wmaker.
Window Maker busca los archivos de definición de menú en el siguiente orden:
(para portugués brasileño, en este caso):
menu.pt_BR
menu.pt
menu
5 - Si elige un idioma que usa caracteres multi-byte, debe configurar
las fuentes adecuadamente. Lea la página del manual para XCreateFontSet
para obtener más detalles sobre esto. Debe cambiar el archivo ~/G/D/Windowmaker
para las fuentes usadas en barras de título, menús y otras cosas. Para las fuentes
usadas en ventanas de diálogo, cambie ~/G/D/WMGLOBAL. El %d en los nombres de las
fuentes no debe ser quitado. Puede también usar el script wsetfont proporcionado para
esta tarea. Lea el mismo script para obtener instrucciones.
Por ejemplo, puede especificar lo siguiente en ~/G/D/WindowMaker:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
y en ~/G/D/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
Las 2 fuentes de arriba son usadas únicamente por aplicaciones que usan WINGs
(WindowMaker y WPrefs.app)
El script wsetfont que se proporciona le permitirá cambiar las definiciones de fuentes
de una manera fácil. De una mirada al script para detalles de uso.
traducido por Efraín Maximiliano Palermo <max_drake2001@yahoo.com.ar>

View File

@@ -1,631 +0,0 @@
Instructions pour l'installation de Window Maker
PLATEFORMES SUPPORTÉES
======================
(c.à.d. : j'ai entendu dire que la compilation a été réalisée avec succès sur..)
- Intel GNU/Linux Conectiva 5.9 (beta)
- Intel GNU/Linux Slackware
- Intel GNU/Linux Debian
- Intel GNU/Linux (autres)
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- Solaris 2.8 sur Ultra Sparc 10 et E450
- SCO Unix
- SGI Irix 5.x, 6.5
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 sous MacOS
- Amiga 3000 sous RedHat Linux 5.1 (Rawhide)
- IBM S/390 sous Linux
- IBM S/390 sous Conectiva Linux (experimental)
- iBook sous Darwin
- Windows NT sous Cygwin/XFree86
- Sony PlayStation2 sous Linux
Toutes les marques déposées sont la propriété de leur propriétaire.
Tout patch qui pourrait faciliter l'adaptation à d'autres plateformes
est le bienvenu.
PRÉ-REQUIS
==========
Les logiciels suivants sont nécessaires à l'utilisation de Window Maker :
- X11R6.x
Window Maker peut être compilé avec des versions plus anciennes de X,
comme X11R5 (Solaris) ou X11R4 (OpenWindows), mais il ne fonctionnera
pas correctement à 100%.
Avec ces serveurs X, les icônes des applications n'apparaîtrons pas,
et vous aurez des problèmes à l'utilisation du dock. La mise à jour
des librairies côté client (Xlib, Xt, etc.) pourront améliorer les
choses si vous ne pouvez pas mettre à jour le serveur.
Les éléments suivants sont nécessaires à la compilation de Window Maker :
- pré-requis de base
Pour compiler Window Maker, assurez-vous que gcc (ou tout autre
compilateur de C ANSI) ainsi que les fichiers d'en-têtes de X sont
installés. Débutants sous Linux : vous devez installer les paquetages
de développement de X ainsi que ceux de la suite gcc. Le cas contraire,
vous ne pourrez jamais compiler aucun programme prévu pour X, y compris
Window Maker.
- autoconf, automake et libtool
Ces outils ne sont pas indispensables, mais si au moins l'un d'eux
est installé sur votre système, assurez-vous que TOUS le sont, et
que les versions de ces outils sont exactement :
autoconf 2.54
automake 1.4
libtool 1.4.2
Si les versions installées sur votre système différent, désactivez-les
provisoirement, par exemple en les renommant, ou en les désinstallant
de votre système. Si vous ne développez ni de compilez de logiciels,
vous n'en avez pas besoin et leur désinstallation n'est donc pas un
problème.
OPTIONNEL
=========
Ces librairies ne sont pas nécessaires pour utiliser Window Maker, mais
elles sont supportées, au cas où vous souhaiteriez les utiliser. Les
versions ci-dessous sont celles dont je dispose (et du coup, il est
garanti qu'elles fonctionnent), mais des versions différentes peuvent
fonctionner aussi bien.
- libXPM 4.7 ou plus récent
Les versions plus anciennes peuvent ne pas fonctionner !!!
Disponible sur ftp://sunsite.unc.edu/pub/Linux/libs/X/
Le support des fichiers XPM est intégré, mais il ne prendra
pas en compte les images dont le format est exotique.
- libpng 0.96 ou plus récent, et zlib
Pour pouvoir utiliser les images au format PNG.
http://www.cdrom.com/pub/png/
- libtiff 3.4 ou plus récent
Pour pouvoir utiliser les images au format TIFF.
Vous trouverez ça ici : ftp://ftp.sgi.com/graphics/tiff
- libjpeg 6.0.1 ou plus récent
Pour pouvoir utiliser les images au format JPEG.
http://www.ijg.org/
- libgif 2.2 ou libungif
Pour pouvoir utiliser les images au format GIF.
ftp://prtr-13.ucsc.edu/pub/libungif/
- GNU xgettext
Si vous voulez disposer des traductions en d'autres langues, GNU gettext
est nécessaire. Les autres versions de gettext sont incompatibles et ne
fonctionneront pas.
Vous trouverez la version GNU sur ftp://ftp.gnu.org
OPTIONS DE CONFIGURATION
========================
Ces options peuvent être passées au script de configuration afin d'activer
ou désactiver des fonctionnalités de Window Maker. Par exemple :
./configure --enable-kde --enable-gnome
configurera Window Maker avec le support intégré pour KDE et GNOME.
Afin d'obtenir la liste des autres options, exécutez ./configure --help
--with-libs-from
ajoute des chemins d'accès pour la recherche des librairies.
L'option -L doit précéder chaque chemin d'accès, comme suit :
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--with-incs-from
ajoute des chemins d'accès pour la recherche des fichiers d'en-tête.
L'option -I doit précéder chaque chemin d'accès, comme suit :
--with-incs-from="-I/opt/headers -I/usr/local/include"
--enable-single-icon
active le regroupement des toutes les appicons des WM_CLASS et WM_INSTANCE
en une seule icône. Aucun support n'est offert par les développeurs pour
cette fonctionnalité. Si vous avez des problèmes avec celle-ci, contactez
son auteur :
Christopher Seawood <cls@seawood.org>
--disable-shm
désactive l'utilisation de l'extension "MIT shared memory". Cela ralentira
un petit peu la génération des textures, mais il semble que cela soit
nécessaire dans certains cas pour éviter un bogue se manifestant au niveau
des icônes et des textures.
--disable-motif
désactive le support pour les fonctionnalités en rapport avec le gestionnaire
de fenêtres mwm.
--enable-lite
désactive des fonctionnalités déjà prises en compte par les gestionnaires de
bureau tels que KDE et GNOME. Celà concerne : la liste de fenêtres, le menu
des applications, la sélection multiple de fenêtres. Attention : vous ne
pourrez plus sortir de Window Maker autrement qu'en utilisant kill avec le
signal SIGTERM ou en quittant à l'aide de KDE. Il n'est pas conseillé
d'utiliser cette option.
--enable-modelock
active le support pour le verrouillage du "XKB language status". Si vous ne
savez pas de quoi il retourne, c'est probablement que vous n'en avez pas
utilité.
--enable-sound
active le support pour le module de gestion des effets sonores.
--disable-xpm
désactive l'utilisation de la librairie XPM même si elle est présente
sur votre système.
--disable-png
désactive l'utilisation de la librairie PNG.
--disable-tiff
désactive l'utilisation de la librairie TIFF.
--disable-gif
désactive l'utilisation de la librairie GIF.
--disable-jpeg
désactive l'utilisation de la librairie JPEG.
--disable-shape
désactive l'utilisation de "shaped windows" (pour oclock, xeyes, etc.).
NOTES SPÉCIFIQUES AUX PLATEFORMES
=================================
- machines DEC/Alpha
#>>>>>>>>>>>
De : Anton Ivanov <aivanov@eu.level3.net>
A : Marcelo E. Magallon <mmagallo@debian.org>
Sujet : Re : Est-ce que le paquetage WindowMaker fonctionne correctement sur Alpha?
> Salut,
>
> Je lisais la doc contenue dans l'archive de WindowMaker, quand je suis
> tombé sur ça :
>
> | - machines DEC/Alpha
> | Il est possible que vous deviez utiliser l'option --disable-shm pour
> | configurer la compilation, comme suit :
> | ./configure --disable-shm
>
> est-ce que quelqu'un a eu des problèmes avec WindowMaker sur Alpha? Est-ce
> que quelqu'un peut tester cela? Doit-on vraiment utiliser cette option
> pour compiler sur Alpha?
Notez bien : les Alphas dont je me sers ne sont jamais sous X et ne sont pas près
de l'être.
Bien souvent, la configuration des Alphas n'inclut qu'un volume ridiculement
petit de mémoire partagée. Aussi il n'est pas étonnant qu'un grand nombre
d'applications comme cdrecord ou mysql server plantent carrément.
Vérifiez ces réglages sur votre système et modifiez-les en conséquent :
pour cela, manipulez l'entrée appropriée dans /proc ou modifiez le fichier
/usr/src/linux/include/asm/shmparam.h.
En dehors de ce cas, la mémoire partagée sous Alpha est sensée ne pas
poser de problème et je ne vois aucune raison de la désactiver.
Pour ma part, elle est à 32 ou plus sur la pluspart des machines.
De plus, si ma mémoire est exacte, les commentaires dans ce fichier
sont tout à fait inexacts. La valeur n'est pas exprimée en octets, mais en
mots, dépendant de la machine. Pour les Alphas, c'est donc *8.
Je rappelle que je n'utilise pas X sur ces machines, donc ce que j'indique
est soumis à toutes les réserves habituelles. (#include "standard_disclaimer.h")
#<<<<<<<<<<<<
- SCO Unix
Lancez configure comme suit :
CFLAGS="-belf -DANSICPP" ./configure
- SunOS, Solaris
Si gcc est installé, lancez configure comme suit :
CPP_PATH="gcc -E -x c" ./configure
Le cpp de Sun ne dispose pas de certaines fonctionnalités nécessaire pour
Window Maker et cela peut occasionner des problèmes avec l'utilisation des
fichiers de configuration.
Il peut être aussi nécessaire d'indiquer le chemin d'accès à la librairie
libtiff en utilisant les options --with-libs-from et --with-incs-from
avec configure.
Quelqu'un m'a rapporté qu'il est nécessaire de faire figurer /usr/local/lib
en premier dans la variable d'environnement LD_LIBRARY_PATH.
Si vous utilisez un Ultra Creator 3D ou une autre machine graphique
de haut niveau, faites en sorte de démarrer le serveur X avec le mode
graphique par défaut à 24bpp sinon vous pourriez constaer des problèmes
au niveau des couleurs.
C'est une bogue répertorié au niveau de Window Maker, il sera corrigé.
- GNU/Linux en général
Assurez-vous que /usr/local/lib figure dans /etc/ld.so.conf et que vous
avez lancé ldconfig après l'installation.
Désinstallez tout précédent paquetage de Window Maker avant d'installer
une nouvelle version.
- RedHat GNU/Linux
Il peut y avoir plusieurs problèmes ennuyeux sur les systèmes RedHat.
Voici la marche à suivre sous peine de ne pouvoir utiliser Window Maker
sur ces systèmes :
* si la version de Window Maker livrée avec RedHat est installée,
désinstallez-la avant de mettre à jour votre système;
* assurez-vous que ni la variable d'environnement LANG ni LINGUAS ne
contiennent "en_RN";
* vérifiez que /usr/local/bin est présent dans votre variable d'environnement
PATH;
* il faut que /usr/local/lib soit dans /etc/ld.so.conf avant de lancer
ldconfig;
* si vous rencontrez des messages d'erreur en rapport avec "--no-reexec",
désinstallez libtool-1.2b et installez libtool-1.3.
libtool-1.3 peut être trouvé sur ftp.gnu.org.
Consultez aussi la section PROBLÈMES;
* si vous aviez auparavant installé le paquetage de Window Maker livré
avec RedHat et que vous voulez installer maintenant manuellement une nouvelle
version, vous devez au préalable désinstaller le paquetage provenant de la
RedHat;
* assurez-vous qu'il existe un lien symbolique de from /usr/include/X11 vers
/usr/X11R6/include/X11 (le cas échéant, lancez cette commande :
ln -s /usr/X11R6/include/X11 /usr/include/X11);
* assurez-vous que /lib/cpp pointe bien vers le programme cpp
Si vous avez un doute concernant quoi que ce soit de relatif à l'installation
de Window Maker sur une RedHat, n'hésitez pas à contacter le support
utilisateur de RedHat. Ils vous renseigneront toujours et tenteront de vous
dépanner dans l'utilisation et la configuration de votre système RedHat.
D'un autre côté, ils sont plus au fait que nous pour tout ce qui est relatif
aux RedHat (nous n'en utilisons pas).
- PowerPC MkLinux
Installez la version la plus récente de Xpmac. Les versions plus
anciennes semblent contenir un bogue qui est susceptible de bloquer
le système.
- Debian GNU/Linux
Si vous voulez bénéficier du support des fichier JPEG et TIFF,
assurez-vous que les paquetages libtiff-dev et libjpeg-dev sont installés.
- SuSE GNU/Linux
Désinstallez tout précédent paquetage de Window Maker avant d'installer
une nouvelle version. Le cas échéant, vous pourriez rencontrer des
problèmes.
- MetroX (version indéterminée)
MetroX contient un bogue qui corrompt les pixmaps utilisées en fond
de fenêtres. Si vous utilisez MetroX et rencontrer des problèmes
avec les textures, n'utilisez pas les textures dans les barres de titre,
ou bien utilisez un autre serveur X.
INSTALLATION
============
Compiler Window Maker
---------------------
Pour aller vite, tapez ce qui suit dans un prompt shell :
./configure
make
puis, loguez-vous en tant que root and tapez :
make install
ldconfig
ou, si vous voulez ôter les infos de débogage des exécutables et ainsi les
rendre plus petits, tapez plutôt :
make install-strip
ldconfig
Tout ceci compile et installe Window Maker avec les réglages par défaut.
Maintenant, si vous voulez personnaliser des options de compilation, vous
pouvez faire :
1. (optionnel) Consulter la section OPTIONS DE CONFIGURATION
dans ce même fichier. Exécutez aussi :
./configure --help
pour avoir la liste des autres options disponibles.
2. Lancez configure avec les options choisies. Par exemple, si vous voulez
utiliser l'option --enable-kde, tapez :
./configure --enable-kde
3. (optionnel) Éditez src/wconfig.h avec votre éditeur de texte favori et
et modifiez sont contenu à votre guise.
4. Compilez. Il faut juste taper :
make
5. Loguez-vous en tant que root (si vous ne pouvez pas le faire, lisez le
paragraphe "Je n'ai pas le mot de passe de root :-(") et installez
Window Maker sur votre système :
su root
make install
Réglages pour un utilisateur
----------------------------
Ces instructions suivantes ne sont pas nécessaires si vous mettez à jour
Window Maker à partir d'une version plus ancienne, à moins que ce soit
précisé dans le fichier NEWS.
Chaque utilisateur qui veut utiliser Window Maker sur votre système doit
faire ce qui suit :
1. Installer les fichiers de configuration de Window Maker dans son
répertoire personnel.
Pour ceci, il doit taper :
wmaker.inst
wmaker.inst installera les fichiers de configuration de Window Maker
pour l'utilisateur et configurera ses paramètres de X de façon à ce que
Window Maker soit automatiquement lancé au démarrage de X.
C'est tout!
Vous pouvez aussi taper "man wmaker" afin d'obtenir plus de renseignements
sur la configuration et d'autres sujets.
Consultez le Guide de l'utilisateur afin d'obtenir des informationss plus
en détail sur Window Maker.
Pourquoi ne pas aussi jeter un oeil aux FAQs..
Installation du paquetage additionnel
-------------------------------------
Décompressez WindowMaker-extra-<version-number>.tar.gz dans /usr/local/share
Vous trouverez le fichier sur ftp://ftp.windowmaker.org. Ce paquetage est optionnel,
il contient des icônes et des thèmes supplémentaires. Vérifiez que vous avez
bien la derniere version de ce paquetage.
Il y a aussi un fichier WindowMaker-extra.readme qui indique comment procéder à
l'installation de ce paquetage.
Je n'ai pas le mot de passe de root :-(
---------------------------------------
Si vous n'avez pas acc-s aux privilèges du super-utilisateur (root), vous pouvez
installer Window Maker dans votre répertoire personnel. Pour ce faire, ajoutez
l'option --prefix correctement renseignée au moment de l'exécution de ./configure
(étape 2 de la compilation de Window Maker).
Il est aussi nécessaire d'utiliser l'option --with-appspath, afin de préciser
le chemin d'accès à WPrefs.app. Par exemple :
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
Puis, faites en sorte que /home/jshmoe/bin soit inclus dans votre PATH, ajoutez
/home/jshmoe/lib à votre variable d'environnement LD_LIBRARY_PATH puis lancez
bin/wmaker.inst
Bien sûr, /home/jshmoe est supposé être remplacé par votre répertoire personnel.
MISE À JOUR
===========
Si vous mettez à jour une version plus ancienne de Window Maker :
1. Configurez et compilez Window Maker comme d'habitude
2. Installez Window Maker (mais n'exécutez pas wmaker.inst)
3. Consultez le fichier NEWS et mettez à jour vos fichiers de configuration
si nécessaire.
PROBLÈMES
=========
Si vous rencontrez des problèmes pendant la phase de configuration, comme par
exemple l'impossibilité d'utiliser une librairie de manipulation de format
graphique alors que vous pensez qu'elle est installée, jetez un oeil au contenu
du fichier config.log, vous y trouverez peut-être des indices pour résoudre
ce problème.
== erreur de chargement de polices, alors qu'elles existent
Essayez de recompiler sans le support pour le NLS.
== erreur à la configuration
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
Otez l'option --no-reexec du fichier aclocal.m4 et relancer la configuration.
Assurez vous aussi que les versions d'autoconf et d'automake correspondent bien
aux pré-requis :
autoconf 2.13
automake 1.4
libtool 1.3
Notez bien que ce ne doit PAS être libtool 1.2b, mais libtool bien 1.3,
disponible sur les sites GNU.
== configure ne trouve pas libtiff ou une autre librairie graphique
Effacez le fichier config.cache, et exécutez à nouveau configure avec les options
suivantes (en plus des options que vous utilisiez déjà) :
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
Insérez les chemins d'accès aux librairies graphiques et à leurs fichiers d'en-tête.
Plusieurs chemins d'accès peuvent être ajoutés pour chacune de ces options,
comme montré pour --with-incs-from. Séparez-les juste par un espace.
== configure ne trouve pas libXpm
* Vérifiez que vous avez un lien sympbolique de libXpm.so.4.9 vers libXpm.so
== segmentation fault au démarrage
* Vérifiez que la version de libXPM qui est installée est au moins 4.7.
* Vérifiez que votre fichier ~/GNUstep/Defaults/WindowMaker est à jour.
Si vous n'en êtes pas sûr, renommez ~/GNUstep en ~/GNUtmp et lancez wmaker.inst.
== "...: your machine is misconfigured. gethostname() returned (none)"
* Le nom d'hôte de votre machine n'est pas indiqué ou est invalide (il commence
par une parenthèse par exemple). Consultez les pages du manuel (man hostname) pour
savoir comment le positionner correctement.
== Le menu des applications ne contient que 2 entrées ("XTerm" et "Exit...")
* Window Maker ne trouve pas cpp (le preprocesseur de C). Si votre cpp n'est pas situé
dans /lib/cpp, editez src/config.h et modifiez le chemin d'accès dans CPP_PATH en conséquent.
== checking lex output file root... configure: error: cannot find output from true; giving up
* Consultez la section PRE-REQUIS dans ce même fichier.
LOCALES/INTERNATIONALISATION
============================
Window Maker supporte les langues étrangères. Pour activer cette fonctionalité,
vous devez compiler Window Maker avec des paramètres supplémentaires.
0 - GNU gettext doit être installé. Il peut être trouvé ici :
ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
Vous pouvez passer à l'étape 4 si vous utilisez le script Install.
1 - Il vous faut choisir les langues que vous voulez rendre disponible. Modifiez
pour cela la liste des codes de nationalité dans LINGUAS. L'anglais est inclus
de façon implicite dans cette liste. Par exemple :
setenv LINGUAS "pt ja de"
sous csh
ou
export LINGUAS;LINGUAS="pt ja de"
sous sh
La liste de tous les codes de nationalité peut être trouvée dans po/README.
L'anglais est la langue par défault.
Lisez po/README si vous souhaitez traduire ou maintenir les fichiers propres
à d'autres adaptations nationales.
2 - De plus, si votre langue utilise des caractères multi-octets, comme
le japonais ou le coréen, vous devez vous assurer que l'option MultiByteText est à YES
dans ~/GNUstep/Defaults/WMGLOBAL.
3 - Configurez, compilez et installez Window Maker normalement.
4 - Pour choisir une langue particulière à l'exécution, vous devez positionner la variable
d'environnement LANG avec la valeur correspondant au code de nationalité adéquat.
Par exemple, si vous voulez utiliser le portugais, vous devez faire :
setenv LANG pt
sous csh ou
export LANG; LANG=pt
sous Bourne sh et apparentés
Note : si la variable d'environnement LC_CTYPE est positionnée, vous devez l'ôter de
l'environnement (unset LC_CTYPE), avant d'exécuter Window Maker.
En ce qui concerne les fichiers de configuration des menus, Window Maker procède
à une recherche suivant cet ordre (pour le portugais brésilien, dans ce cas) :
menu.pt_BR
menu.pt
menu
5 - Si vous choisissez une langue qui utilise les caractères multi-octets, vous
devez configurer les polices de façon adéquate. Consultez pour cela les pages
de manuel de XCreateFontSet. Vous devez modifier dans votre fichier ~/G/D/WindowMaker
les polices utilisées dans les titres, menus et autres. En ce qui concerne les polices
utilisées dans les boîte de dialogue, modifiez ~/G/D/WMGLOBAL.
Le %d dans la définition des polices ne doit PAS être enlevé. Vous pouvez aussi utiliser
le script wsetfont, fourni à ces fins.
Consultez le script lui-même pour en connaître les instructions.
Par exemple, vous pouvez mettre ceci dans ~/G/D/WindowMaker :
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
et dans ~/G/D/WMGLOBAL :
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
Les 2 polices ci-dessus sont uniquement utilisées par les applications qui utilisent
WINGs (Window Maker et WPrefs.app).
Le script wsetfont inclus vous permettra de changer les réglages des polices de
façon plus aisée. Consultez-le afin d'obtenir plus d'informations.

View File

@@ -1,557 +0,0 @@
Instruções de Instalação do Window Maker
PLATAFORMAS SUPORTADAS
======================
(obs: fiquei sabendo que conseguiram compilar nesses sistemas...)
- Intel GNU/Linux Slackware 3.5 (plataforma primária)
- outras distribuições do Intel GNU/Linux
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- SCO Unix
- SGI Irix 5.x, 6.5
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 em MacOS
- Amiga 3000 rodando RedHat Linux 5.1 (Rawhide)
Patches que possibilitem a execução em outras plataformas serão bem-vindos.
Se a última versão não funcionou para você, tente a 0.53.0,
que é conhecida por ser bastante estável em várias plataformas.
REQUERIMENTOS
=============
Os softwares a seguir são necessários para o uso do Window Maker:
- X11R6.x
O Window Maker pode ser compilado em versões mais antigas do X, como X11R5
(Solaris) ou X11R4 (OpenWindows) mas não funcionará 100% corretamente. Em
tais servidores não existirão ícones de aplicações e você terá problemas
usando o dock. Fazer upgrades das bibliotecas (Xlib Xt etc) ajudará se você
não pode fazer upgrade do servidor.
Para compilar o Window Maker você precisará do seguinte:
- Requerimentos básicos e óbvios
Se você vai compilar o Window Maker, tenha certeza de que você possui o gcc
(ou outro compilador ANSI) e os arquivos headers do X. Especialmente para
os iniciantes em Linux: você deve instalar todos os pacotes de desenvolvimento
do X e a suite gcc. Do contrário você não será capaz de compilar nenhum
programa X, incluindo o Window Maker.
- libPropList
Você pode achar esta biblioteca em ftp://ftp.windowmaker.org/pub/libs ou
ftp://ftp.gnome.org/pub/libPropList. Você deve instalar corretamente
esta biblioteca antes de instalar o Window Maker.
- autoconf, automake and libtool
Estes pacotes não são necessários, mas se você tiver um ou mais deles instalados,
verifique se todos eles são das seguintes versões:
autoconf 2.54
automake 1.4
libtool 1.4.2
Se você possui uma versão diferente, desative-os mudando os nomes dos arquivos
para outra coisa ou removendo-os do seu sistema. Se você não desenvolve
software você não precisa deles, logo, você pode desinstalá-los com segurança.
- lex (ou flex) e yacc (ou bison)
São usados pelo libPropList. O lex não seria necessário, já que o seu
arquivo de saída é incluído, mas como ou eu ou o automake é um pouco
burro, o script de configuração para o libPropList simplesmente
abortará sem motivo caso o lex não seja achado.
OPCIONAL:
=========
Estas bibliotecas não são necessárias para que o Window Maker funcione, mas elas
são suportadas caso você deseje usá-las. Os números das versões são os que eu
possuo (e portanto quase certamente funcionarão), mas outras versões devem funcionar
também.
- libXPM 4.7 ou mais atual
Versões antigas podem não funcionar.
Disponível em ftp://sunsite.unc.edu/pub/Linux/libs/X/
Há suporte nativo para arquivos XPM, mas ele não carregará imagens em
algumas formatos incomuns.
- libpng 0.96 ou mais atual e zlib
Para suporte a imagens PNG.
- libtiff 3.4 ou mais atual
Para suporte a imagens TIFF. Você pode baixar o libtiff em
ftp://ftp.sgi.com/graphics/tiff.
- libjpeg 6.0.1 ou mais atual
Para suporte a imagens JPEG.
- libgif 2.2 ou libungif
Para suporte a imagens tipo GIF.
- GNU xgettext
Se você deseja usar mensagens traduzidas, será necessário o GNU gettext. Outras
versões do gettext não são compatíveis e não funcionarão. Baixe a versão
GNU através do site ftp://ftp.gnu.org
A maioria dos pacotes citados pode ser encontrado em ftp.uu.net/pub/graphics
OPÇÕES DE CONFIGURAÇÃO
======================
Estas opções podem ser passadas ao script de configuração para ativar/desativar algumas
opções do Window Maker. Exemplo:
./configure --enable-kde --enable-gnome
irá configurar o Window Maker para que seja compilado com suporte ao KDE e GNOME.
Para obter uma lista com outras opcoes, execute ./configure --help:
--with-libs-from
Especifica diretórios (paths) adicionais onde se deve achar as bibliotecas.
A flag -L deve preceder cada caminho, tal como:
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--with-incs-from
Especifica diretórios adicionais para os arquivos de cabeçalho (header files)
que serão procurados. A flag -l deve preceder cada caminho descrito, tal como:
--with-incs-from="-I/opt/headers -I/usr/local/include"
--enable-single-icon
Permite o agrupamento de todas as aplicações com a mesma WM_CLASS+WM_INSTANCE em
uma só. Esta opção não é suportada por todos os desenvolvedores. Se você tiver algum
problema com essa opção, escreva para o seu autor: Christopher Seawood
<cls@seawood.org>
--disable-shm
Desativa o uso da extensão de memória compartilhada do MIT. Isto reduzirá
um pouco a geração de texturas, mas em alguns casos se mostrará necessário
em virtude de um bug que se manifesta quando manipulam-se ícones e texturas.
--disable-motif
Desativa compatibilidade com gerenciador de janelas mwm.
--enable-lite
Remove coisas que já são suportadas em ambientes desktops como o KDE
e o GNOME. As opções desativadas são: lista de janelas (window list), menu de
aplicações root (root applications menu), seleção múltipla de janelas
(multiple window selection). Note que não será mais possível sair do Window
Maker de dentro; você terá que usar o kill com o sinal SIGTERM ou sair do KDE.
Não é aconselhado ativar essa opção.
--enable-modelock
Suporte ao bloqueio de status de linguagem do XKB. Se você não sabe o que
é isto, você provavelmente não precisa.
--enable-sound
Ativa o suporte ao módulo de efeitos sonoros.
--disable-xpm
Desativa o uso da biblioteca XPM mesmo se esta estiver disponível no seu sistema.
--disable-png
Desativa o uso da biblioteca PNG
--disable-tiff
Desativa o uso da biblioteca TIFF
--disable-gif
Desativa o uso da biblioteca GIF
--disable-jpeg
Desativa o uso da biblioteca JPEG
--disable-shape
Desativa o uso das shaped windows (para oclock, xeyes etc.).
--enable-debug
Não use esta opção a não ser que saiba realmente o que está fazendo
NOTAS ESPECÍFICAS PARA AS PLATAFORMAS
=====================================
- máquinas DEC/Alpha
Você provavelmente precisará usar a flag --disable-shm para configurar,
como ./configure --disable-shm
- SCO Unix - execute o configure tal como
CFLAGS="-belf -DANSICPP" ./configure
- SunOS, Solaris
Se você possui o gcc instalado, execute o configure como abaixo:
CPP_PATH="gcc -E -x c" ./configure
O cpp da Sun não possui agumas funções necessárias ao Window Maker e pode
causar problemas quando analisados os arquivos de configuração.
Você pode ainda precisar usar --with-libs-from e --with-incs-from
para fornecer o diretório onde a libtiff está localizada.
Alguem me mandou um email dizendo que você precisará deixar o /usr/local/lib
como primeiro caminho (path) no LD_LIBRARY_PATH para que funcione.
Se você tem uma Ultra Creator 3D ou outra máquina com gráficos high-end,
certifique-se de iniciar o servidor X com o visual padrão definido em 24bpp
ou você poderá ter problemas com cores desfiguaradas. Isto é um bug do
wmaker e será consertado.
- GNU/Linux em geral
Confira se você possui /etc/local/lib no /etc/ld.so.conf e rode ldconfig
após a instalação.
Remova qualquer versão em pacote do Window Maker antes de instalar uma versão
mais atual.
- RedHat GNU/Linux
Os sistemas RedHat apresentam vários incômodos. Se você usa, certifique-se
de seguir os passos abaixo ou o Window Maker não funcionará:
* se você instalou o Window Maker que vem junto com o Red Hat, desinstale-o
antes de instalar uma versão mais atual.
* certifique-se de que você não possui as variáveis de ambiente LANG e LINGUAS
configuradas como en_RN;
* certifique-se de que você possui /usr/local/bin na variável PATH;
* certifique-se de que você tem /usr/local/lib no /etc/ld.conf.so antes de
executar o ldconfig;
* se você tiver problemas que mencionem uma mensagem de erro com o
--no-reexec, remova a libtool-1.2b e instale a libtool-1.3. A libtool-1.3
pode ser encontrada em ftp.gnu.org. Também leia a seção TROUBLESHOOTING;
* se você instalou o pacote Window Maker do RedHat e está instalando uma
nova versão na mão (você mesmo está compilando), remova o pacote Window
Maker do seu sistema RedHat antes.
* certifique-se de que você possua o vínculo simbólico do /usr/include/X11
ao /usr/X11R6/include/X11 (se não, digite ln -s /usr/X11R6/include/X11
/usr/include/X11)
* certifique-se de que você tem o /lib/cpp apontando para o programa cpp.
Se você possui alguma dúvida quanto a realizar qualquer uma das tarefas acima,
por favor não hesite em contatar o suporte ao usuário RedHat. Eles gentilmente
irão responder a todas as suas dúvidas relacionadas ao sistema. Eles sabem
muito mais sobre o sistema deles do que nós (nós não usamos RedHat).
- PowerPC MkLinux
Você terá que possuir a última versão do Xpmac. Versões mais antigas
parecem ter bugs que fazem com que o sistema trave.
- Debian GNU/Linux
Se você deseja suporte a JPEG e TIFF, certifique-se que no seu sistema estão
instaladas as bibliotecas libtiff-dev e libjpeg-dev.
- SuSE GNU/Linux
Se você instalou o pacote Window Maker do SuSE, certifique-se de
removê-lo do seu sistema antes de compilar o wmaker ou você poderá
ter problemas.
- MetroX (versão desconhecida)
O MetroX possui uma falha que corrompe os pixmaps que são definidos
como backgrounds de janelas. Se você usa MetroX e está tendo problemas
estranhos com texturas, não use texturas nas titlebars. Ou use
um servidor X diferente.
INSTALAÇÃO:
===========
Desempacote o WindowMaker-extra-<numero-da-versao>.tar.gz no /usr/local/share.
Você pode pegar o arquivo no site ftp://ftp.windowmaker.org. Este arquivo
é opcional e possui alguns ícones e temas. Procure pelo último <número-da-versão>
disponível.
Ainda há o WindowMaker-extra.readme para instruí-lo sobre onde o pacote deve ir.
Compilando o Window Maker
-------------------------
Se você quer fazer de modo rápido e simples, digite o seguinte no seu prompt:
./configure
make
depois entre como root e digite:
make install
ldconfig
ou se você quiser remover os símbolos de depuração dos seus binários para
que eles se tornem menores, você pode digitar:
make install-strip
ldconfig
Estes comandos irão compilar e instalar o Window Maker com parâmetros padrões.
Se você deseja configurar algumas opções de compilação, você pode fazer o seguinte:
1.(opcional) Olhe na seção OPÇÕES DE CONFIGURAÇÃO acima para ver as
opções disponíveis. Execute também:
./configure --help
para obter uma lista completa das outras opções.
2. Rode o configure com as opções que você deseja. Por exemplo, se
deseja usar a opção --enable-kde, você deve digitar:
./configure --enable-kde
3. (opcional) Edite o arquivo src/wconfig.h com seu editor de texto
preferido e procure por alguma opção que deseja mudar
4. Compile. Só digite:
make
5. Entre como root (se você não pode fazer isso, leia a seção "Eu não tenho a
senha de root") e instale o Window Maker no seu sistema:
su root
make install
Configurações Específicas
-------------------------
Estas instruções não precisam ser seguidas quando for feito o upgrade do
Window Maker em cima de uma versão antiga, a menos que o arquivo NEWS diga
algo diferente.
Todo usuário no seu sistema que desejar rodar o Window Maker deverá fazer o seguinte:
1. Instalar os arquivos de configuração do Window Maker no diretório home.
Digite:
wmaker.inst
wmaker.inst vai instalar os arquivos de configuração do Window Maker e fazer
com que o X rode o Window Maker quando executado.
É isso!
Você pode digitar "man wmaker" para ver uma ajuda geral sobre configuração
e outras coisas.
Leia o Manual do Usuário para explicações mais profundas sobre o Window Maker.
Você deve dar uma olhada no FAQ também.
Eu não tenho a senha de root
----------------------------
Se você não pode obter privilégios de super-usuário (não pode ser root) você
pode instalar o wmaker no seu diretório home. Para isso, forneça a opção
--prefix quando for rodar o configure, como explicado no passo 2 da seção
Compilando o Window Maker.
Você ainda precisará fornecer a opção --with-appspath, para especificar o
caminho do WPrefs.app. Exemplo:
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
Depois faça com que /home/jshome/bin seja incluído na variável PATH, adicione
/home/jshome/lib na variável de ambiente LD_LIBRARY_PATH e rode bin/wmaker.inst
É claro, substitua /home/jshome com o seu diretório home.
UPGRADE
=======
Se você está fazendo um upgrade de uma versão antiga do Window maker:
1. Configure e compile o Window Maker como sempre
2. Instale o Window Maker (mas não rode o wmaker.inst)
3. Leia o arquivo NEWS e atualize seus arquivos de configuração,
se necessário.
TROUBLESHOOTING
===============
Quando você tiver problemas na configuração (enquanto roda o configure),
tal como não conseguir usar uma biblioteca de gráficos que você acha que tem
instalada, olhe no arquivo config.log para obter dicas sobre o que pode estar
errado.
== Erro ao carregar as fontes, mesmo quando elas existem
Tente reconstruir sem suporte NLS.
== Erro ao configurar
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
remova a opção --no-reexec do aclocal.m4 e da libPropList/aclocal.m4
e reconfigure.
Também verifique se as versões do autoconf e do automake que você tem
instaladas são:
autoconf 2.13
automake 1.4
libtool 1.3
Note que não deve ser libtool 1.2b, deve ser libtool 1.3.
== Não acha a proplist.h ou libPropList.algumacoisa
Baixe e instale a libPropList dos sites já citados neste arquivo.
== o configure não detecta a libtiff, ou outras bibliotecas gráficas.
Delete o config.cache, depois rode de novo o configure adicionando as
seguintes opções ao configure (e as outras opções que você usa):
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
Substitua o caminho para onde estão localizadas as suas bibliotecas gráficas
e os correspondentes arquivos de cabeçalho. Você pode colocar caminhos múltiplos
em qualquer uma dessas opções, como no exemplo do --with-incs-from. Só ponha um
espaço entre eles.
== o configure não detecta libXpm.
* Confira se você possui um vínculo simbólico da libXpm.so.4.9 para libXpm.so
== Segmentation fault na inicialização
* Confira se a versão da libXPM é a 4.7 ou mais atual
* Confira se você tem uma versão atualizada do ~/GNUstep/Defaults/WindowMaker
Se você não tem certeza, tente renomear ~/GNUstep para ~/GNUtmp e depois rode
o wmaker.inst
== "...: your machine is misconfigured. gethostname() returned (none)"
* o hostname da sua máquina está definido incorretamente. Execute um man hostname
para obter informações de como resolver isto.
== O menu do root possui só 2 entradas. ("XTerm" e "Exit...")
* O Window Maker não está achando o cpp (o pré-processador C). Se o seu cpp
não está localizado em /lib/cpp, edite src/config.h e corrija o caminho
no CPP_PATH.
== checking lex output file root... configure: error: cannot find output from
true; giving up
* Leia a seção REQUERIMENTOS deste arquivo.
LOCALES/INTERNACIONALIZAÇÃO
===========================
o Window Maker tem suporte a linguagem nacional. Para ativar esse suporte,
você precisa compilar o Window Maker com parâmetros adicionais.
0 - Você deve Ter o pacote do GNU gettext instalado. Este pode ser obtido
pelo ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
Os passos 1,2 e 3 podem ser pulados se você usa o script Install.
1 - Você deve selecionar as linguagens que deseja suportar. Defina a LINGUAS
para a lista dos locales que você deseja. O Inglês é sempre suportado. Exemplo:
setenv LINGUAS "pt ja de"
na csh
ou
export LINGUAS;LINGUAS="pt ja de"
na sh
A lista dos locales suportados pode ser achado no arquivo po/README.
O inglês é a língua oficial.
Leia o arquivo po/README se você deseja traduzir e manter os arquivos
locales para outras linguagens.
2 - Adicionalmente, se a sua linguagem usa caracteres multi-bytes, tais
como as línguas japonesas e koreanas, você deve definir a opção MultiByteText
para YES nos arquivos ~/GNUstep/Defaults/WMGLOBAL e ~/GNUstep/Defaults/WindowMaker
3 - Configure, compile e instale o Window Maker normalmente.
4 - Para selecionar um locale particular você deve definir a variável de
ambiente LANG para o locale que você quer. Por exemplo, se você quer definir o
locale português, você deve rodar
setenv LANG pt
na csh ou
export LANG; LANG=pt
nas Bourne sh e similares
Nota: Se você tem a variável de ambiente LC_CTYPE definida, você deve
indefiní-la antes de rodar o wmaker.
O Window Maker procura os arquivos de definições de menu na seguinte
ordem (para o português brasileiro, neste caso):
menu.pt_BR
menu.pt
menu
5 - Se você escolheu uma linguagem que usa caracteres multi-bytes, você
deve configurar as fontes adequadamente. Leia a página de manual para o
XcreateFontSet para obter mais detalhes sobre isto. Você deve mudar o arquivo
~/G/D/WindowMaker para as fontes usadas nas barras de título, menus e
outras coisas. Para as fontes usadas nas janelas de diálogo, mude o arquivo
~/G/D/WMGLOBAL. O %d no font names não deve ser removido. Você pode ainda usar
o wsetfont script para esta tarefa. Leia o próprio script para maiores instruções.
Por exemplo, você pode especificar o seguinte no ~/G/D/WindowMaker:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
e no ~/G/D/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
As duas fontes acima são usadas somente por aplicações que
usem WINGs (o Window Maker e WPrefs.app)
O script wsetfont que é fornecido vai permitir com que você mude as
definições de fonte do modo mais fácil. Dê uma olhada no script para maiores
detalhes sobre o uso.
Traduzido por Ricardo Sartori <sartori@inf.ufsc.br>

View File

@@ -1,601 +0,0 @@
In¹trukcie pre in¹taláciu Window Makera
PODPOROVANÉ PLATFORMY
=====================
(tzn: vraj to na tom niekto skompiloval...)
- Intel GNU/Linux Conectiva 5.9 (beta)
- Intel GNU/Linux Slackware
- Intel GNU/Linux Debian
- Intel GNU/Linux other distributions
- Sparc GNU/Linux RedHat 5.1
- PowerPC GNU/MkLinux
- Alpha GNU/Linux RedHat 5.1
- FreeBSD
- NetBSD
- OpenBSD
- BSDI 4.0
- Solaris 2.5.1, 2.5.2
- Solaris 2.6.0
- Solaris 2.7beta
- SCO Unix
- SGI Irix 5.x, 6.5
- OSF/1
- HP-UX
- AIX 3.2.5
- AIX 4.1.4 / IBM PowerPC
- AIX 4.3.1 / IBM CC compiler
- AIX 4.3.2 / IBM PowerPC
- AIX 5.3
- DEC Alpha/Digital UNIX 4.x
- XFree86 / OS/2
- Corel NetWinder
- SunOS 4.x
- PowerMac / Power MachTen 4.1.1 over MacOS
- Amiga 3000 running RedHat Linux 5.1 (Rawhide)
- IBM S/390 running Linux
- iBook running Darwin
Patche na rozbehanie na iných platformách sú vítané.
PO®IADAVKY:
===========
Nasledovný softvér je potrebný pre beh Window Makera:
- X11R6.x
Window Maker mô¾e by» skompilovaný na star¹ích verziách X, ako
X11R5 (Solaris) alebo X11R4 (OpenWindows) ale nebude pracova»
100% korektne. Na takých serveroch nebudú ikony aplikácií a budete
ma» problémy s pou¾ívaním doku. Upgrade klientských kni¾níc (Xlib,
Xt, atï.) pomô¾e, ak u¾ nemô¾ete spravi» upgrade servera.
Nasledovné je potrebné k skompilovaniu Window Makera:
- Základné be¾né veci
Ak chcete kompilova» Window Maker, uistite sa, ¾e máte gcc (alebo
iný ANSI C kompilátor) a hlavièkové súbory iXov. Hlavne pre zaèia-
toèníkov v Linuxe: musíte nain¹talova» v¹etky X-devel balíky a gcc.
Inak nebudete schopní skompilova» ¾iadny program pre X, teda ani
Window Maker.
- libPropList
Túto kni¾nicu mo¾no nájs» na ftp://ftp.windowmaker.org/pub/libs alebo
ftp://ftp.gnome.org/pub/libPropList. Nain¹talujte ju pred kompiláciou
Window Makera.
- autoconf, automake a libtool
Tieto nástroje NIE sú potrebné, ale ak máte niektoré z nich nain¹talo-
vané, uistite sa, ¾e V©ETKY sú presne nasledovné verzie:
autoconf 2.54
automake 1.4
libtool 1.4.2
Ak máte odli¹né verzie, odin¹talujte ich alebo ich doèasne premenujte.
Ak neprogramujete, nebudete ich potrebova» a teda ich mô¾ete
odin¹talova».
- lex (alebo flex) a yacc (alebo bison)
Tieto sú vyu¾ívané z libPropList. Lex v skutoènosti nie je nutný,
lebo jeho výstupný súbor je prítomný, ale buï ja alebo automake je
hlupák, lebo configuraèný skript pre libPropList sa jednoducho
ukonèí z neznámych dôvodov ak lex nie je prítomný.
NEPOVINNÉ:
==========
Tieto kni¾nice nie sú nutné pre beh Window Makera, ale sú podporované
v prípade, ¾e ich chcete pou¾íva». Èísla verzií sú tie, ktoré som pou¾il
ja (teda urèite fungujú), ale aj iné verzie mô¾u pracova» správne.
- libXPM 4.7 alebo nov¹ia
Star¹ie verzie nemusia fungova»!!!
Dostupné na ftp://sunsite.unc.edu/pub/Linux/libs/X/
Podpora XPM je aj vstavaná, ale nenaèíta obrázky v
ne¹tandardných kódovaniach.
- libpng 0.96 alebo nov¹ia a zlib
Pre podporu obrázkov PNG.
http://www.cdrom.com/pub/png/
- libtiff 3.4 alebo nov¹ia
Pre podporu obrázkov TIFF.
ftp://ftp.sgi.com/graphics/tiff
- libjpeg 6.0.1 alebo nov¹ia
Pre podporu obrázkov JPEG.
http://www.ijg.org/
- libgif 2.2 alebo libungif
Pre podporu obrázkov GIF.
ftp://prtr-13.ucsc.edu/pub/libungif/
- GNU xgettext
Ak chcete pou¾íva» prelo¾ené hlásenia, potrebujete GNU gettext.
Iné verzie gettext nie sú kompatibilné a nebudú fungova».
Stiahnite si GNU verziu z ftp://ftp.gnu.org
MO®NOSTI CONFIGURE:
===================
Tieto mo¾nosti mô¾u by» dané skriptu configure ako argumenty za úèelom
povolenia/zakázania urèitých vlastností Window Makera. Príklad:
./configure --enable-kde --enable-gnome
nakonfiguruje Window Maker s podporou KDE a GNOME.
Zoznam v¹etkých mo¾ností vypí¹e príkaz ./configure --help
--with-libs-from
cesty, kde sa majú hµada» kni¾nice. Re»azec -L musí predchádza»
ka¾dú cestu, napr.:
--with-libs-from="-L/opt/libs -L/usr/local/lib"
--with-incs-from
cesty, kde sa majú hµada» hlavièkové súbory. Re»azec -I musí
predchádza» ka¾dú cestu, napr.:
--with-incs-from="-I/opt/headers -I/usr/local/include"
--enable-single-icon
umo¾òuje zrolovanie v¹etký ikon aplikácií WM_CLASS+WM_INSTANCE do
jedinej. Táto vlastnos» nie je podporovaná zo strany vývojárov.
V prípade problémov s òou, kontaktujte autora:
Christopher Seawood <cls@seawood.org>
--disable-shm
zaká¾e pou¾itie roz¹írenia zdieµanej pamäte MIT. Toto trochu spomalí
generovanie textúr, ale v niektorých prípadoch je táto voµba potrebná
kvôli chybe, ktorá spôsobuje nesprávne zobrazovanie ikon a textúr.
--disable-motif
zaká¾e podporu pre pokyny mana¾éra okien wmw
--enable-lite
odstráni veci, ktoré sa u¾ nachádzajú v desktopových prostrediach
ako KDE a GNOME. Odstránené veci sú: zoznam okien, menu aplikácií,
výber viacerých okien. Vedzte, ¾e u¾ nebudete schopní ukonèi»
Window Maker; budete ho musie» zabi» pou¾itím signálu SIGTERM alebo
ho ukonèi» z KDE. Neodporúèa sa povoli» túto vlastnos».
--enable-modelock
podpora pre XKB nastavenie jazyka. Ak neviete, èo to je, pravdepo-
dobne to nepotrebujete. (Slú¾i to na prepínanie rozlo¾enia kláves
pomocou nového tlaèidla na hornom paneli okien.)
--enable-sound
povolí podporu pre modul zvukových efektov
--disable-xpm
zaká¾e podporu pre kni¾nicu XPM aj keï je dostupná na va¹om systéme.
--disable-png
zaká¾e pou¾itie kni¾nice PNG
--disable-tiff
zaká¾e pou¾itie kni¾nice TIFF
--disable-gif
zaká¾e pou¾itie kni¾nice GIF
--disable-jpeg
zaká¾e pou¾itie kni¾nice JPEG
--disable-shape
zaká¾e tvarované okná (pre oclock, xeyes atï.)
POZNÁMKY PRE ©PECIFICKÉ PLATFORMY:
==================================
- DEC/Alpha
Nasledovný mail nie je prelo¾ený, ale hovorí sa v òom, ¾e
_pravdepodobne_ nie je nutné konfigurova» Window Maker na
Alphe s voµbou --disable-shm.
#>>>>>>>>>>>
From: Anton Ivanov <aivanov@eu.level3.net>
To: Marcelo E. Magallon <mmagallo@debian.org>
Subject: Re: Is the WindowMaker package working ok on Alpha?
> Hi,
>
> I was reading some docs on the WindowMaker tarball, and found this:
>
> | - DEC/Alpha machines
> | You might need to pass the --disable-shm flag to configure,
> | like ./configure --disable-shm
>
> is anyone having problems with WindowMaker on Alpha? Can someone
> please test this? Should the flag be passed when building on Alpha?
Disclaimer: alphas under my command have never run X and are least likely to
suddenly start running it anytime soon.
Alpha used to have some ridiculously low amount of shared memory
configured.
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
Check where is yours at the moment and raise it to a more appropriate
value by either catting to the appropriate /proc entry or changing the
/usr/src/linux/include/asm/shmparam.h.
Otherwise the shared memory on alpha should be fully functional and I
see no reason to disable it. Mine are bumped up to 32 or more on most
machines.
And If I recall correctly the comments in that file are actually
wrong. Value is not bytes, but in machine size word. For alpha *8.
As I said - I do not run X on them so all #include "stdisclaimer.h"
apply.
#<<<<<<<<<<<<
- SCO Unix - spustite configure takto
CFLAGS="-belf -DANSICPP" ./configure
- SunOS, Solaris
Ak máte nain¹alované gcc, spustite configure takto:
CPP_PATH="gcc -E -x c" ./configure
Cpp od Sunu chýbajú niektoré vlastnosti, ktoré Window Maker potrebuje,
a to mô¾e spôsobi» problémy pri parsovaní konfiguraèných súborov.
Je tie¾ mo¾né, ¾e budete musie» pou¾i» --with-libs-from a
--with-incs-from na urèenie ciest k libtiff.
Niekto mi mailoval, ¾e tie¾ /usr/local/lib musí by» prvá cesta v
premennej LD_LIBRARY_PATH, aby to fungovalo.
Ak máte Ultra Creator 3D alebo iný stroj s high-end grafikou,
uistite sa, ¾e spú¹»ate iXy s 24-bitovou farebnou håbkou alebo
mô¾ete ma» problémy s pomie¹anými farbami. Toto je chyba wmakera
a bude opravená.
- GNU/Linux vo v¹eobecnosti
Uistite sa, ¾e máte /usr/local/lib v /etc/ld.so.conf a ¾e ste
po in¹talácii spustili ldconfig.
Odin¹talujte v¹etky balíkované verzie Window Makera pred in¹talovaním
novej verzie.
- RedHat GNU/Linux
Systémy RedHat majú niekoµko nepríjemných problémov. Ak ich pou¾ívate,
dodr¾ujte nasledovné kroky, alebo vám Window Maker nebude fungova»:
* ak máte nain¹alovaný Window Maker, ktorý je dodaný s RedHatom,
pred upgadom ho odin¹talujte;
* uistite sa, ¾e nemáte premenné LANG a LINGUAS nastavené na en_RN;
* uistite sa, ¾e máte /usr/local/bin v premennej PATH;
* uistite sa, ¾e máte /usr/local/lib v /etc/ld.so.conf pred
spustením ldconfig;
* ak máte problémy, v ktorých sa spomína chyba s --no-reexec,
odin¹talujte libtool-1.2b a nain¹talujte libtool-1.3. libtool-1.3
nájdete na ftp.gnu.org. Tie¾ si preèítajte èas» RIE©ENIE PROBLÉMOV.
* uistite sa, ¾e máte symbolický odkaz z /usr/include/X11 na
/usr/X11R6/include/X11 (ak nie, zadajte ln -s /usr/X11R6/include/X11
/usr/include/X11 )
* uistite sa, ¾e /lib/cpp odkazuje na program cpp
Ak máte akékoµvek pochybnosti, prosím, neotáµajte a spojte sa
s u¾ívateµskou podporou RedHatu. Radi vám odpovedia na v¹etky
va¹e otázky týkajúce sa ich systému. Vedia toho o svojom
systéme viac ako my (nepou¾ívame RedHat).
- PowerPC MkLinux
Musíte ma» poslednú verziu Xpmac. Star¹ie verzie majú asi chyby,
ktoré spôsobujú zmrznutie celého systému.
- Debian GNU/Linux
Ak chcete podporu JPEG a TIFF, uistite sa, ¾e máte nain¹talované
libiff-dev a libjpeg-dev.
- SuSE GNU/Linux
Ak ste si nain¹talovali balík Window Makera od SuSE, odin¹talujte
ho pred pokusmi o skompilovanie wmakera, alebo mô¾ete ma» problémy.
- MetroX (neznáma verzia)
MetroX má chybu, ktorá kazí obrázky, ktoré sú nastavené ako pozadie
okien. Ak pou¾ívate MetroX a máte èudné problémy s textúrami,
nepou¾ívajte textúry v horných li¹tách. Alebo pou¾ite iný X server.
IN©TALÁCIA:
===========
Kompilácia Window Makera
------------------------
Pre rýchly ¹tart, zadajte nasledovné príkazy v shelly:
./configure
make
potom sa prihláste ako root a zadajte:
make install
ldconfig
alebo ak chcete z binárnych súborov odstráni» symboly pre debugger a urobi»
ich men¹ie, napí¹te miesto toho
make install-strip
ldconfig
Toto skompiluje a nain¹taluje Window Maker so ¹tandardnými parametrami.
Ak si chcete prispôsobi» nastavenia kompilácie, mo¾ete to urobi» nasledovne:
1. (voliteµne) Pozrite sa na èas» MO®NOSTI CONFIGURE, kde sú
uvedené mo¾nosti. Tie¾ spustite:
./configure --help
ktorý vám vypí¹e kompletný zoznam ostatných mo¾ných nastavení.
2. Spustite configure s nastaveniami, ktoré chcete. Napríklad,
ak chcete pou¾íva» podporu pre KDE, zadajte:
./configure --enable-kde
3. (voliteµne) Otvorte si súbor src/wconfig.h vo svojom obµúbenom
textovom editore a prejdite si ho, èi nenájdete nejaké nastavenia,
ktoré chcete zmeni».
4. Kompilácia. Zadajte len:
make
5. Prihláste sa ako root (ak to nie je mo¾né, èítajte èas» "Nemám
rootove heslo :-( ") a nain¹talujte Window Maker:
su root
make install
Nastavenia ¹pecifické pre u¾ívateµov
------------------------------------
Nemusíte sa dr¾a» týchto in¹trukcií, ak robíte upgrade Window Makera zo
star¹ej verzie, pokiaµ to nie je uvedené v súbore NEWS.
Ka¾dý u¾ívateµ na va¹om systéme, ktorý chce pou¾íva» Window Maker, musí
urobi» nasledovné:
1. Nain¹talova» konfiguraèné súbory Window Makera do svojho
domovského adresára:
wmaker.inst
wmaker.inst nain¹taluje konfiguraèné súbory Window Makera a nastaví
iXy aby sa pri ¹tarte automaticky spustil Window Maker.
To je v¹etko!
Základné informácie o konfigurácii a iných veciach vám poskytne
"man wmaker".
Pre hlb¹í úvod do Window Makera si preèítajte si U¾ívateµký manuál.
Tie¾ sa mô¾te pozrie» na FAQ.
Installing the extras package
-----------------------------
Unpack WindowMaker-extra-<version-number>.tar.gz in /usr/local/share
You can get the file at ftp://ftp.windowmaker.org. This file is optional
and only have a few icons, and themes. Look for the latest <version-number>
available.
Also there is a WindowMaker-extra.readme to instruct you where that package
should go.
Nemám rootove heslo :(
----------------------
Ak nemáte práva roota, mô¾ete si nain¹talova» Window Maker do svojho
domovského adresára. Na to musíte pou¾i» voµbu --prefix pre configure
v druhom kroku kompilácie Window Makera. Tie¾ musíte pou¾i» voµbu
--with-appspath, pomocou ktorej ¹pecifikujete cestu pre WPrefs.app.
Príklad:
./configure --prefix=/home/jshome --with-appspath=/home/jshome/GNUstep/Applications
Poto pridajte adresár /home/jshome/bin do premennej PATH, /home/jshome/lib
do premennej LD_LIBRARY_PATH a spustite bin/wmaker.inst
Samozrejme, predpokladá sa, ¾e /home/jshome nahradíte va¹im skutoèným
domovským adresárom.
UPGRADE
=======
Ak robíte upgrade zo star¹ej verzie Window Makera:
1. Skofigurujte a skompilujte Window Maker ako v¾dy
2. Nain¹talujte Window Maker (ale nespustite wmaker.inst)
3. Preèítajte si súbor NEWS a ak je to potrebné, upravte
svoje konfiguraèné súbory.
RIE©ENIA PROBLÉMOV
==================
Ak máte problémy poèas konfigurácie (spú¹»ania configure), napríklad
nemo¾nos» pou¾i» grafickú kni¾nicu, o ktorej viete, ¾e ju máte nain¹talovanú,
v súbore config.log nájdete príèinu problému.
== Error with loading fonts, even if they exist.
Skúste kompiláciu bez podpory NLS.
== Error when configuring
ltconfig: unrecognized option `--no-reexec'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
Odstáòte voµbu --no-reexec zo súborov aclocal.m4 a libPropList/aclocal.m4
a spustite configure.
Tie¾ sa uistite, ¾e autoconf a automake, ktoré máte nain¹talované, sú v
týchto verziách:
autoconf 2.13
automake 1.4
libtool 1.3
Nesmie to by» libtool 1.2b, ale libtool 1.3, zo stránok GNU.
== Cant find proplist.h or libPropList.something
Stiahnite a nain¹talujte si libPropList zo stránok uvedených
niekde v tomto súbore.
== configure doesn't detect libtiff, or other graphic libraries.
Odstráòte config.cache, spustite configure s pridanými nasledovnými voµbami
(okrem iných, ktoré pou¾ívate):
--with-libs-from="-L/usr/local/lib"
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
Vlo¾te cesty k va¹im grafickým kni¾niciam a zodpovedajúcim hlavièkovým
súborom. Mô¾ete vlo¾i» viac ciest do ka¾dej z týchto volieb, ako je to
uvedené v príklade --with-incs-from. Len ich oddeµte medzerou.
== configure doesn't detect libXpm.
* Skontrolujte, èi máte symbolický odkaz z libXpm.so.4.9 na libXpm.so
== Segmentation fault on startup
* Skontrolujte verziu libXpm, musíte ma» aspoò 4.7
* Skontrolujte, èi máte upravenú verziu ~/GNUstep/Defaults/WindowMaker
Ak si nie ste istí, skúste premenova» ~/GNUstep na ~/GNUtmp a spustite
wmaker.inst
== "...: your machine is misconfigured. gethostname() returned (none)"
* Meno va¹eho poèítaèa je nastavené na nieèo nesprávne, èo zaèína
úvodzovkami. Preèítajte si man hostname a dozviete sa, ako to nastavi».
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
* Window Maker nevie nájs» cpp (C preprocesor). Ak sa vá¹ cpp nenachádza
v /lib/cpp, upravte src/config.h a vlo¾te správnu cestu do CPP_PATH.
== checking lex output file root... configure: error: cannot find output from true; giving up
* Preèítajte si èas» PO®IADAVKY v tomto súbore.
MIESTNE NASTAVENIA/INTERNACIONALIZÁCIA
======================================
Window Maker má podporu pre národné jazyky. Aby ste ju povolili, musíte
skompilova» Window Maker s niekoµkými prídavnými parametrami.
0 - Musíte ma» nain¹talovaný balík GNU gettext. Mô¾ete ho nájs» na
adrese ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
Kroky 1 a¾ 3 mô¾ete vynecha», ak pou¾ívate skript Install
1 - Musíte urèi» jazyky, pre ktoré chcete podporu. Nastavte premennú
LINGUAS na zoznam miestnych nastavení, ktoré chcete. Angliètina je
podporovaná v¾dy. Príklad:
setenv LINGUAS "pt ja de"
(csh)
alebo
export LINGUAS;LINGUAS="pt ja de"
(sh)
Zoznam podporovaných miestnych nastavení nájdete v súbore po/README.
Angliètina je implicitným jazykom.
Ak chcete preklada» a udr¾iava» súbory s miestnymi nastaveniami, preèítajte
si súbor po/README.
2 - Naviac, ak vá¹ jazyk pou¾íva multi-byte znaky, napríklad Japonèina
alebo Kórejèina, musíte nastaveniu MultiByteText priradi» YES v súbore
~/GNUstep/Defaults/WMGLOBAL
3 - Konfigurujte, kompilujte a in¹talujte Window Maker ako zvyèajne.
4 - Urèité miesne nastavenia si zvolíte nastavením premennej LANG na
to, ktoré chcete. Napríklad, ak chcete nastavi» slovenské miestne
nastavenia, musíte spusti»
setenv LANG pt
(csh)
export LANG; LANG=pt
(Bourne sh a podobné)
Pozor: Ak máte nastavenú premennú LC_CTYPE, musíte ju zru¹i» pred
spustením wmaker.
Window Maker hµadá súbory s definíciou menu v nasledovnom poradí
(v tomto prípade pre brazílsku portugalèinu):
menu.pt_BR
menu.pt
menu
5 - Ak si zvolíte jazyk, ktorý pou¾íva multi-byte znaky, musíte poriadne
nastavi» svoje fonty. Preèítajte si manuálovú stránku k XCreateFontSet,
kde nájdete viac detailov. Musíte v súbore ~/G/D/WindowMaker upravi» fonty
pre horné li¹ty, menu a iné veci. Pre fonty pou¾ité v dialógových oknách
upravte súbor ~/G/D/WMGLOBAL. Re»azce %d v menách fontov nesmú by»
odstránené. Tie¾ mô¾ete pou¾i» skript wsetfont, ktorý to urobí za vás.
Napríklad mô¾e zada» v súbore ~/G/D/WindowMaker nasledovné:
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
a v ~/G/D/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
Tieto dva fonty sa pou¾ijú len v aplikáciách, ktoré pou¾ívajú WINGs
(Window Maker a WPrefs.app)
Skript wsetfont vám umo¾ní nastavi» fonty jednoduch¹ím spôsobom. Pozrite
sa priamo do jeho súboru pre bli¾¹ie informácie.

210
Install Executable file
View File

@@ -0,0 +1,210 @@
#!/bin/sh
#
# WindowMaker configuration and compilation script.
#
# Copyright (c) 1997, 1998 Alfredo K. Kojima
#
export LINGUAS;LINGUAS=""
if test "$NLSDIR" = ""; then
export NLSDIR;NLSDIR="/usr/lib/locale"
fi
OPTIONS=""
PREFIX="/usr/local"
perai() {
echo "Type <Return> to continue"
read nada
}
echo
echo "========================"
echo "WindowMaker Installation"
echo "========================"
echo
echo "NOTE: If the installation procedure fails, read the INSTALL file and do"
echo "the installation manually."
perai
if test "$USER" != "root"; then
echo "Warning: you must run this script as the root user."
perai
echo
echo "Be sure to specify an installation path where you have"
echo "write persmission."
echo
fi
echo
echo "Option Selection"
echo "================"
######################## Sound
echo
echo "Do you want sound support? Note that you need a module distributed"
echo "separately to make it work. You can get it at:"
echo "http://www.frontiernet.net/~southgat/wmsound"
echo -n "<y/n> [y] "
read SFX
if [ "x$SFX" = "x" -o "$SFX" = "y" -o "$SFX" = "Y" ]; then
OPTIONS="$OPTIONS --enable-sound"
fi
######################## NLS
echo
echo "Do you want National Language Support?"
echo -n "<y/n> [n] "
read NLS
if [ "$NLS" = "y" -o "$NLS" = "Y" ]; then
NLS="Y"
echo "The supported locales are:"
ling=` (cd po; /bin/ls *.po) `
ALL_LINGUAS=""
for l in $ling; do
lname=`(cd po; grep Language-Team $l|cut -f 2 -d: |cut -f 2 -d\ )`
lname=`echo $lname`
lcode=`basename $l .po`
ALL_LINGUAS="$ALL_LINGUAS $lcode"
echo "$lcode $lname"
done
echo "Type in the locales you want [$ALL_LINGUAS]"
read foo
if test "x$foo" = "x"; then
LINGUAS=$ALL_LINGUAS
else
LINGUAS="$foo"
fi
echo "Selected locales are: $LINGUAS"
MB=""
for i in $LINGUAS; do
ok=0
for b in $ALL_LINGUAS; do
if test "$b" = "$i"; then
ok=1
break
fi
done
if test "$ok" = "0"; then
echo
echo "$i is not a supported locale"
perai
continue
fi
if [ "$MB" = "" -a "$i" = "ja" -o "$i" = "kr" ]; then
echo
echo "A language you selected needs multi-byte character support"
echo "Do you want to enable it?"
echo -n "<y/n> [n] "
read MB
if [ "$MB" = "y" -o "$MB" = "Y" ]; then
OPTIONS="$OPTIONS --enable-kanji"
fi
fi
done
echo
echo "Where do you want to put the message files? [$NLSDIR]"
echo -n "? "
read foo
if test "x$foo" != "x"; then
NLSDIR=$foo
fi
fi
##################### Installation path
done=0
while [ $done = 0 ]; do
echo
echo "Where do you want to install WindowMaker? [$PREFIX]"
echo "Don't change it if you don't know what you're doing."
echo "(The default path will install WindowMaker in "
echo "$PREFIX/bin, $PREFIX/lib etc.)"
echo -n "? "
read foo
if test "x$foo" != "x"; then
if [ "$foo" = "y" -o "$foo" = "n" ]; then
echo
echo "Hmm... I don't think you really want to install WindowMaker into \"$foo\""
echo
else
done=1
PREFIX=$foo
fi
else
done=1
fi
echo
echo "$PREFIX/bin must be in the PATH environment variable of all users who use WindowMaker"
perai
done
OPTIONS="$OPTIONS --prefix=$PREFIX"
###################### Build libPropList
if [ ! -d libPropList ]; then
gzip -d -c libPropList.tar.gz | tar xf -
fi
echo "-----------------------"
echo "Building libPropList..."
echo "-----------------------"
cd libPropList
if [ ! -f config.status ]; then
./configure
fi
make
cd ..
if [ ! -f libPropList/libPropList.a ]; then
echo "Build of libPropList was not successfull. "
exit
fi
##################### Configure
echo "--------------------------"
echo "Configuring WindowMaker..."
echo "--------------------------"
if [ `uname -s` = "SCO_SV" ]; then
echo "CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS"
CFLAGS="$CFLAGS -belf -DANSICPP" ./configure $OPTIONS
else
echo "CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS"
CFLAGS="$CFLAGS $GCCFLAGS" ./configure $OPTIONS
fi
#################### Compile
echo "------------------------"
echo "Compiling WindowMaker..."
echo "------------------------"
(cd src; make clean)
make
echo "-------------------------"
echo "Installing WindowMaker..."
echo "-------------------------"
make install
echo
echo "Installation Finished!"
echo
echo "Now, each user that wishes to use WindowMaker must run the wmaker.inst"
echo "script that was just installed."
if test "$NLS" = "Y"; then
echo "Don't forget to set the LANG environment variable to your locale"
fi

48
MIRRORS
View File

@@ -1,6 +1,6 @@
Window Maker FTP Mirror Sites
=======-=====================
WindowMaker FTP Mirror Sites
============================
Official Site (USA):
--------------------
@@ -35,29 +35,14 @@ Contact: Joshua Go <joshuago@usa.net>
ftp://ftp.cybertrails.com/pub/windowmaker/
Contact: Adam Jacob <adam@cybertrails.com>
Provider: Ameth Technologies
http://www.ameth.org/windowmaker/
ftp://ftp.ameth.org/pub/mirrors/ftp.windowmaker.org/
Contact: Chase Phillips <shepard@ameth.org>
Third Party Window Maker Distribution Packages
==============================================
Third Party WindowMaker Distribution Packages
=============================================
Debian GNU/Linux (deb)
----------------------
Contact: Marcelo Magallon <mmagallo@efis.ucr.ac.cr>
Sites:
http://master.debian.org/~mmagallo/packages/wmaker/
RedHat GNU/Linux (RPM)
----------------------
For Intel:
RedHat/RPM
----------
Contact: Jim Knoble <jmknoble@pobox.com>
Sites:
@@ -65,26 +50,5 @@ ftp://ftp.windowmaker.org/pub/beta/compiled/linux/rpms/
ftp://ftp.redhat.com/pub/contrib/SRPMS/
ftp://ftp.redhat.com/pub/contrib/i386/
For Alpha:
Contact: Peter Petrakis <peterpan@wn.net>
Site:
http://math.stcc.mass.edu/petrakis/downloads/X11
HP-UX
-----
Sites:
UK: http://hpux.csc.liv.ac.uk/
Germany: http://hpux.ask.uni-karlsruhe.de/
US (WI): http://hpux.cae.wisc.edu/
France: http://hpux.cict.fr/
Netherlands: http://hpux.tn.tudelft.nl/
Canada: http://hpux.ee.ualberta.ca/
Italy: http://hpux.dsi.unimi.it/
South Africa: http://hpux.petech.ac.za/
Japan: http://hpux.u-aizu.ac.jp/
US (UT): http://hpux.cs.utah.edu/

View File

@@ -1,10 +1,14 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc\
contrib
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N FAQ.I18N.cs FAQ.I18N.sk \
INSTALL.cs INSTALL.fr INSTALL.es INSTALL.pt INSTALL.sk \
README.definable-cursor README.pt MIRRORS COPYING.WTFPL mkpatch
# libwmfun-0.0.3.tar.gz
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS Install acconfig.h\
libPropList.tar.gz mkpatch
libPropList.tar.gz:
-(cd libPropList; $(MAKE) distclean)
-rm -f libPropList.tar.gz
tar cf libPropList.tar libPropList
gzip -9 libPropList.tar

322
Makefile.in Normal file
View File

@@ -0,0 +1,322 @@
# Makefile.in generated automatically by automake 1.3 from Makefile.am
# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
SHELL = /bin/sh
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
DISTDIR =
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_alias = @host_alias@
host_triplet = @host@
CC = @CC@
CPP_PATH = @CPP_PATH@
DFLAGS = @DFLAGS@
GFXFLAGS = @GFXFLAGS@
GFXLIBS = @GFXLIBS@
I18N = @I18N@
I18N_MB = @I18N_MB@
ICONEXT = @ICONEXT@
INTLIBS = @INTLIBS@
LIBPL_INC_PATH = @LIBPL_INC_PATH@
LIBPL_LIBS = @LIBPL_LIBS@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
MOFILES = @MOFILES@
NLSDIR = @NLSDIR@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
REDUCE_APPICONS = @REDUCE_APPICONS@
SHAPE = @SHAPE@
SOUND = @SOUND@
VERSION = @VERSION@
WPMOFILES = @WPMOFILES@
XCFLAGS = @XCFLAGS@
XGETTEXT = @XGETTEXT@
XLFLAGS = @XLFLAGS@
XLIBS = @XLIBS@
XSHM = @XSHM@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_LOCALE = @X_LOCALE@
pixmapdir = @pixmapdir@
wprefsdir = @wprefsdir@
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS Install acconfig.h\
libPropList.tar.gz mkpatch
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ./src/config.h
CONFIG_CLEAN_FILES =
DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
Makefile.in NEWS TODO aclocal.m4 config.guess config.sub configure \
configure.in install-sh missing mkinstalldirs
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP = --best
all: all-recursive all-am
.SUFFIXES:
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
$(ACLOCAL_M4): configure.in
cd $(srcdir) && $(ACLOCAL)
config.status: $(srcdir)/configure
$(SHELL) ./config.status --recheck
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
@SET_MAKE@
all-recursive install-data-recursive install-exec-recursive \
installdirs-recursive install-recursive uninstall-recursive \
check-recursive installcheck-recursive info-recursive dvi-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
list='$(SUBDIRS)'; for subdir in $$list; do \
target=`echo $@ | sed s/-recursive//`; \
echo "Making $$target in $$subdir"; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
rev="$$subdir $$rev"; \
done; \
for subdir in $$rev; do \
target=`echo $@ | sed s/-recursive//`; \
echo "Making $$target in $$subdir"; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
(cd $$subdir && $(MAKE) tags); \
done
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
here=`pwd` && cd $(srcdir) \
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
done; \
list='$(SOURCES) $(HEADERS)'; \
unique=`for i in $$list; do echo $$i; done | \
awk ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
mostlyclean-tags:
clean-tags:
distclean-tags:
-rm -f TAGS ID
maintainer-clean-tags:
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
-rm -rf $(distdir)
GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz
mkdir $(distdir)/=build
mkdir $(distdir)/=inst
dc_install_base=`cd $(distdir)/=inst && pwd`; \
cd $(distdir)/=build \
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
&& $(MAKE) \
&& $(MAKE) dvi \
&& $(MAKE) check \
&& $(MAKE) install \
&& $(MAKE) installcheck \
&& $(MAKE) dist
-rm -rf $(distdir)
@echo "========================"; \
echo "$(distdir).tar.gz is ready for distribution"; \
echo "========================"
dist: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
-rm -rf $(distdir)
dist-all: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
-rm -rf $(distdir)
distdir: $(DISTFILES)
-rm -rf $(distdir)
mkdir $(distdir)
-chmod 777 $(distdir)
@for file in $(DISTFILES); do \
d=$(srcdir); \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file; \
done
for subdir in $(SUBDIRS); do \
test -d $(distdir)/$$subdir \
|| mkdir $(distdir)/$$subdir \
|| exit 1; \
chmod 777 $(distdir)/$$subdir; \
(cd $$subdir && $(MAKE) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
|| exit 1; \
done
info: info-recursive
dvi: dvi-recursive
check: all-am
$(MAKE) check-recursive
installcheck: installcheck-recursive
all-am: Makefile
install-exec: install-exec-recursive
@$(NORMAL_INSTALL)
install-data: install-data-recursive
@$(NORMAL_INSTALL)
install: install-recursive
@:
uninstall: uninstall-recursive
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
installdirs: installdirs-recursive
mostlyclean-generic:
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f Makefile $(DISTCLEANFILES)
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean-am: mostlyclean-tags mostlyclean-generic
clean-am: clean-tags clean-generic mostlyclean-am
distclean-am: distclean-tags distclean-generic clean-am
maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
distclean-am
mostlyclean: mostlyclean-recursive mostlyclean-am
clean: clean-recursive clean-am
distclean: distclean-recursive distclean-am
-rm -f config.status
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
-rm -f config.status
.PHONY: install-data-recursive uninstall-data-recursive \
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
uninstalldirs-recursive all-recursive check-recursive \
installcheck-recursive info-recursive dvi-recursive \
mostlyclean-recursive distclean-recursive clean-recursive \
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
installcheck all-am install-exec install-data install uninstall all \
installdirs mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
libPropList.tar.gz:
-(cd libPropList; $(MAKE) distclean)
-rm -f libPropList.tar.gz
tar cf libPropList.tar libPropList
gzip -9 libPropList.tar
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

1208
NEWS

File diff suppressed because it is too large Load Diff

401
README
View File

@@ -1,236 +1,146 @@
WindowMaker X11 Window Manager
<http://windowmaker.org>
<ftp://ftp.windowmaker.org>
Alfredo K. Kojima
<kojima@windowmaker.org>
GNU Window Maker
X11 Window Manager
<http://windowmaker.org>
<ftp://ftp.windowmaker.org>
by
Alfredo K. Kojima
Dan Pascu
Web/FTP Master
Phillip Smith
Congratulations! You have purchased an extremely fine
device that would give you thousands of years of trouble-free
service, except that you undoubtably will destroy it via some
typical bonehead consumer maneuver. Which is why we ask you
to PLEASE FOR GOD'S SAKE READ THIS OWNER'S MANUAL CAREFULLY
BEFORE YOU UNPACK THE DEVICE. YOU ALREADY UNPACKED IT, DIDN'T
YOU? YOU UNPACKED IT AND PLUGGED IT IN AND TURNED IT ON AND
FIDDLED WITH THE KNOBS, AND NOW YOUR CHILD, THE SAME CHILD WHO
ONCE SHOVED A POLISH SAUSAGE INTO YOUR VIDEOCASSETTE RECORDER
AND SET IT ON "FAST FORWARD", THIS CHILD ALSO IS FIDDLING
WITH THE KNOBS, RIGHT? AND YOU'RE JUST NOW STARTING TO READ
THE INSTRUCTIONS, RIGHT??? WE MIGHT AS WELL JUST BREAK THESE
DEVICES RIGHT AT THE FACTORY BEFORE WE SHIP THEM OUT, YOU
KNOW THAT?
-- Dave Barry, "Read This First!"
Dan Pascu
<dan@windowmaker.org>
Matthew Hawkins
<matt@windowmaker.org>
Description
===========
Window Maker is the GNU window manager for the X Window System. It was
designed to emulate the look and feel of part of the NEXTSTEP(tm) GUI. It's
supposed to be relatively fast and small, feature rich, easy to configure and
easy to use, with a simple and elegant appearance borrowed from NEXTSTEP(tm).
Window Maker was designed keeping integration with GNUstep in mind and is the
"official" window manager for it. It is also part of the GNU project
(www.gnu.org) Read more about GNUstep further on this file.
Hints (information given by applications to integrate well with the window
manager) for Motif(tm) and NETWM are also supported (NETWM is used by KDE
and GNOME, so they are automatically supported as a result).
So you can replace any of the window managers for these environments
with Window Maker while keeping most, if not all, of the native window manager
functionality.
Window Maker was previously called WindowMaker.
Window Maker has no connection with Windowmaker, the software for
making windows and doors.
WindowMaker is a window manager designed to emulate the look and feel of
part of the NEXTSTEP(tm) GUI. It's supposed to be relatively fast and small,
feature rich, easy to configure and easy to use, with a simple and elegant
appearance borrowed from NEXTSTEP(tm).
Documentation
=============
User Guide
==========
Read before asking.
* README files all over the source tree have info related to the stuff
in the directories.
* INSTALL has installation instructions and some troubleshooting tips.
You're meant to read it before installing. it was not written just to
fill up space in the package...
* FAQ: Frequently Asked Questions. READ IT!!! FAQ.I18N is for
internationalization related questions.
* NEWS: list user visible changes from the previous version. Read it if
you are upgrading.
* MIRRORS: some alternative places where you can get Window Maker,
including platform specific packages of Window Maker.
* BUGFORM: use it to send bug reports. Please do use it.
* ChangeLog: what changed from the previous version?
* BUGS: list of known bugs
*** Tutorial
There's a tutorial maintained by Georges Tarbouriech at:
http://www.linuxfocus.org/~georges.t/
*** User Guide
The Window Maker User's Guide can be downloaded from the official ftp
The WindowMaker User's Guide can be downloaded from the official ftp
or web sites.
It can also be viewed in HTML format in:
http://people.delphi.com/crc3419/WMUserGuide/index.htm
The User Guide explains how to use Window Maker, the configuration files
and options.
Directories & Files
===================
o INSTALL contains installation instructions and some troubleshooting tips.
o Install is a script for configuring and compiling WindowMaker in a easy
way.
o ChangeLog contains the changes since the last version
o BUGS contains a list of the currently known bugs
o FAQ is a list of frequently asked questions. Read it. I won't answer
questions answered in it.
o NEWS is a list of user visible changes since the last version. Read it if
you are upgrading.
o wmlib/ contains the library necessary to write applications that use
WindowMaker specific features, like application defined menus. This library
will be merged into WINGs in the future.
o WINGs/ contain the WINGs (WINGs Is Not GNUstep) tiny widget library. It is
used by wmaker, but can be used by standalone programs as well.
o test/ contains a simple test program that shows some of the things that can
be done with WindowMaker and wmlib
o wrlib/ contains the library used to do image manipulation (loading,
dithering etc.) in WindowMaker. It can be used in other applications.
o util/ contains various utility programs.
o WPrefs/ contains the source code for the WindowMaker Preferences utility.
Read the WPrefs/README file before using it.
o Configuration options can be found in the ~/GNUstep/Defaults/* files
(after installation). The menus can be configured in
~/GNUstep/Library/WindowMaker/menu
o The default configuration files for the system are installed by default in
/usr/local/share/WindowMaker, along with some other data files.
o src/wconfig.h contains various compile time options you can change to
select some options/features and things like the path for configuration
directory.
o BUGFORM is a form you should fill to send a bugreport. Please use the
form. It makes things easier to me and ensures that you give me a reasonable
amount of information. This form should be sent to developers@windowmaker.org
*** man pages
Mailing List
============
Type "man wmaker" in the shell prompt to get general help about Window Maker
Directories & Files in the Source Tree
======================================
* Install is a script for configuring and compiling Window Maker in a easy
way (not that the normal way is difficult, but...).
* AUTHORS: the credits
* TODO: plans for the future
* contrib/ has some contributed patches that are not supported by Window Maker
because they conflict with design filosophies of the developers or some
other reason.
* util/ has various utility programs.
* WPrefs.app/ is the configuration program.
* src/wconfig.h has compile time options you can change to select some
options/features and other stuff.
* WINGs/ NEXTSTEP lookalike widget library
* wrlib/ image processing library
* po/ has message catalogs wich are the translated versions of the messages
displayed by Window Maker.
* docklib-x.x.tar.gz a library for writing dockapps
HELP ME!!!
==========
There is a mailing list for discussing Window Maker at
wm-user@windowmaker.org To subscribe to it, send a message containing:
There is a mailing list for discussing WindowMaker at
wmaker@linuxcenter.com To subscribe to it, send a message containing:
subscribe
in the subject of the message to wm-user-request@windowmaker.org
in the subject and the body of the message to wmaker-request@linuxcenter.com
If you got a problem, ask there (after reading the docs, of course). The
people there is more likely to be able to answer your questions than we are.
For bug reports use the BUGFORM.
If you have some problem installing or using wmaker, it would be advisable
to ask in the mailing list, as the probability of at least one of the 500+
users there having the same problem as you (and solving it) is bigger than
the three of us. The developers are subscribed to the mailing list, so we
will read your post anyway (no need for cc:). For bug reports, fill
the BUGFORM and send it to developers@windowmaker.org You can also use
the bug tracker page at http://windowmaker.org/cgi-bin/bugs
If you have a problem with a precompiled version of Window Maker
(rpm, deb etc), first ask the person who made the package.
IMPORTANT NOTE: when asking for help (in the mailing list or to the
developerts, directly) *always* send information about the system you are
using. You can use the system information section at the end of BUGFORM as a
guideline. Another thing: please don't send HTML mail.
Important note: when asking for help (in the mailing list or to the
developerts, directly) always send information about the system you are
using. You can use the system information section at the end of BUGFORM
as a guideline. Another thing: please don't send HTML mail. You will
be risking having your mail deleted before being read. Not everybody
uses a browser to read email, wich makes your message an annoyance.
There should be an option in your mail app to disable it.
There is also a #windowmaker IRC channel at openprojects. To join there,
connect your irc client to irc.openprojects.net, irc.linux.com or some other
server of that network.
Running multiple instances of WindowMaker
=========================================
GNUstep
=======
GNUstep is a complete object-oriented development system, based on the
OpenStep specification released by NeXT(tm) (now Apple(tm)) and Sun(tm). It
will provide everything one needs to produce cross-platform, object-oriented,
graphical (and non-graphical) applications; providing among other things,
base system libraries, a high-level GUI application framework that uses a
Display PostScript(tm)-like imaging model (DGS), objects for accessing
relational databases, distributed objects and a graphical development
environment, with tools like interface modeller, a project management system
(project center) and other tools.
The GNUstep development system will be used to create a user environment,
with everything needed for a complete graphical user interface, such as a
file viewer, text editors and other applications. Note that the user
environment (or "desktop environment") is only a small part of the whole
GNUstep project and therefore it does not "compete" with other projects like
KDE or GNOME, simply because they are completely different things.
For more information on the GNUstep project, visit: http://www.gnustep.org
and http://gnustep.current.nu
Running multiple instances of Window Maker
==========================================
It is not a good idea to run more than one instance of Window Maker
It is not a good idea to run more than one instance of WindowMaker
from the same user (so that wmaker will use the same configuration
files) at the same time. You might get unexpected behaviour when Window Maker
files) at the same time. You might get unexpected behaviour when WindowMaker
updates it's configuration files.
If you really desire to do this, try running Window Maker with the
command line option --static so that it will not update or change
any of the configuration files.
Sound support
=============
Sound is supported for Linux and FreeBSD systems with the use of a
separately distributed module called WSoundServer. There is also a graphical
configuration tool for setting up your sounds called WSoundPrefs.
You can download these at:
http://shadowmere.student.utwente.nl/
separately distributed module. You can download it at:
http://www.frontiernet.net/~southgat/wmsound
Note that you must compile Window Maker with the --enable-sound configure
Note that you must compile WindowMaker with the --enable-sound configure
flag and set the DisableSound option to NO.
Performance Tuning
==================
If you want to diminish Window Maker's memory usage and improve performance,
If you want to diminish WindowMaker's memory usage and improve performance,
while keeping a nice appearance and good functionality, follow the items
bellow:
- use solid textures for everything, mainly titlebars and menus. If you
want a nice looking desktop, use the Traditional style.
- turn NewStyle and Superfluous off
- turn on DisableAnimations
- do not bind many shortcuts in the menu and keep only the essential items
in the menu
- turn on DisableClip
@@ -238,116 +148,47 @@ bellow:
don't use anyway (keep in mind that some of the #defines might not
work, as they are not fully supported). Make sure to always keep
NumLock and ScrollLock turned off.
- turn on DisableAnimations. You can also #undefine ANIMATIONS in wconfig.h
- strip down the default IconPath and PixmapPath entries to contain only
the paths that you really have in your system.
- do not use large images in the root background
- remove support for image formats you don't use
- to reduce memory usage, disable the icon cache, by setting the RIMAGE_CACHE
environment variable to 0. If you want to increase performance at the cost
of memory usage, set it's value to a value like the number of different
icons you use. Also, disable anti-aliased text support in ~/GNUstep/Defaults/WMGLOBAL.
Keyboard Mouse Control
======================
Copyrights
==========
Many people ask about adding keyboard control of mouse, like in fvwm,
but Window Maker will not have such feature. The XKB extension supports
mouse simulation from the keyboard, in a much more powerfull fashion than
any simulation done by a window manager.
To enable it, hit the Control+Shift+NumLock or Shift+NumLock key combination.
You should hear the speaker beeping. To disable it, do the same thing.
To control the mouse the numeric keypad is used as follows:
- 4 (left arrow), 7 (Home), 8 (up arrow), 9 (PgUp), 6 (right arrow),
3 (PgDn), 2 (down arrow) and 1 (End) move the mouse to the corresponding
direction;
- holding one of the above keys and then holding the 5 key will move the
pointer faster;
- / will select the first mouse button (left button);
- * will select the second mouse button (middle button);
- - will select the third mouse button (right button);
- 5 will do a click with the currently selected mouse button;
- + will do a double-click with the currently selected button;
- 0 (Ins) will click and hold the currently selected button;
- . (Del) will release the currently selected button that was previously
clicked with the 0 (Ins) key.
The above key values work in a XFree86 3.2 (X11R6.1) X server but your
milleage may vary.
How to make a gdb backtrace
===========================
Backtraces can help us fix bugs that make Window Maker crash. If you
find a bug that crashes Window Maker, please send a backtrace with your
bug report.
To make a usefull backtrace, you need a core file with debugging
information produced by Window Maker when it crashes. It should
have been installed without stripping too.
To compile wmaker with debugging information:
./configure
make CFLAGS=-g
If you get the dialog window telling you that wmaker crashed and
asks you what to do, tell it to "Abort and leave a core file".
script
cd src
gdb .libs/wmaker path_to_the_core_file
Then, in the gdb prompt type "bt". Quit from gdb by typing "quit"
and then, in the shell prompt, type "exit".
The file named typescript will contain the backtrace.
Copyrights & Disclaimers
========================
Window Maker is copyrighted by Alfredo K. Kojima and is licensed through the
WindowMaker is copyrighted by Alfredo K. Kojima and is licensed through the
GNU General Public License. Read the COPYING file for the complete license.
The icons that are distributed with this program and were made by Marco van
Hylckama Vlieg, are licensed through the GNU General Public License. Read the
COPYING file for the complete license.
The icons listed in COPYING.WTFPL and are distributed in this
program and were made by Banlu Kemiyatorn (]d), are licensed through the
"do What The Fuck you want to Public License". Read the COPYING.WTFPL
file for the complete license.
NeXT, OpenStep and NEXTSTEP are a trademarks of NeXT Computer, Inc.
All other trademarks are property of their respective owners.
The authors reserve the right to make changes in the software without prior
notice.
Authors
=======
Alfredo K. Kojima <kojima@windowmaker.org>
Dan Pascu <dan@windowmaker.org>
]d <id@windowmaker.org>
Please don't ask us questions before reading the documentation (esp. the
FAQ, this file and INSTALL files) and about "cool" things you see in
people's desktop screenshots.
The AUTHORS file contains a list of the people who have contributed to the
project. The name of people who have helped with localization (translation)
can be found in po/README and Window Maker/README
can be found in po/README and WindowMaker/README
If you have any comments, fixes and bug reports (filled BUGFORMs) send them
to developers@windowmaker.org
to kojima@windowmaker.org
Musicware
=========
If you use WindowMaker and *really* like it, please consider making my day
by sending me a music CD (or a MiniDisc) of your favorite band, singer,
instrumentist, composer or whatever :^). I like listening to music and would
love to get new CDs, especially from other parts of the world. I like almost
any kind of music, from Ozzy Osbourne to Bach (mas não pagode e sertanejo
pelamordideus :), so I will be happy to receive just about anything.
Snail mail address:
Alfredo Kengi Kojima
Rua Firmino O. Bimbi, 255/25B
Porto Alegre - RS
CEP 91751-330
Brazil

View File

@@ -1,92 +0,0 @@
Definable Mouse Cursors for Window Maker
----------------------------------------
The definable-cursor feature allows user-definable mouse cursors; the
cursors can either be the built-in ones from the X11 cursor font, or
they can be bitmap (XBM) files. User-definable cursors can be useful
for theme-builders, lefthanders, and the visually impaired.
Defining Your Own Cursors
-------------------------
A cursor specification takes one of the following forms in the
~/GNUstep/Defaults/WindowMaker file:
(none)
(builtin, <cursor-name>)
(bitmap, <bitmap-filename>, <mask-filename>)
They have the following meanings:
none The cursor is inherited from the parent window (often,
this means the root window).
builtin Use the cursor named <cursor-name> from X11's set of
built-in cursors. The names are the same as you use
with 'xsetroot -cursor_name'. See the xsetroot(1) man
page for more information.
bitmap Use the bitmap in <bitmap-filename> as the foreground
cursor bitmap, and the one in <mask-filename> as the
background (mask) bitmap. This is pretty much the same
as 'xsetroot -cursor', except that Window Maker searches
for the bitmaps along its PixmapPath.
You can set the following cursor types (they're shown here with their
defaults):
NormalCursor = (builtin, left_ptr);
ArrowCursor = (builtin, top_left_arrow);
MoveCursor = (builtin, fleur);
TopLeftResizeCursor = (builtin, top_left_corner);
TopRightResizeCursor = (builtin, top_right_corner);
BottomLeftResizeCursor = (builtin, bottom_left_corner);
BottomRightResizeCursor = (builtin, bottom_right_corner);
VerticalResizeCursor = (builtin, sb_v_double_arrow);
HorizontalResizeCursor = (builtin, sb_h_double_arrow);
WaitCursor = (builtin, watch);
QuestionCursor = (builtin, question_arrow);
TextCursor = (builtin, xterm);
SelectCursor = (builtin, cross);
The following cursor types are allowed, but they're deprecated (Window
Maker used them in the past, but doesn't use them anymore):
ResizeCursor = (builtin, sizing);
Using Cursors with 'getstyle' and 'setstyle'
--------------------------------------------
The 'getstyle' and 'setstyle' style/theme-management utilities can
handle user-definable cursors. By default, 'getstyle' ignores cursor
definitions; using 'getstyle -t' to get theme-related settings will
also include any cursors you've defined in the resulting stylefile.
However, by default, 'setstyle' does NOT ignore cursor settings. If
you wish to set a style or theme without installing cursor settings,
you can use 'setstyle --no-cursors' to ignore the cursor definitions.
Random Notes
------------
Most X11 cursors are 16x16 bitmaps. Many X servers can actually handle
larger cursors, though. To check, use:
xdpyinfo
and in the resulting output look for a line such as:
largest cursor: 64x64
The example above indicates that my X server can handle cursors up to
64 pixels wide by 64 pixels high.
You can create your own bitmap cursors using the 'bitmap' program that
accompanies most X11 distributions. For example bitmap cursors and
masks, see <http://www.pobox.com/~jmknoble/WindowMaker/cursors/>.

345
README.es
View File

@@ -1,345 +0,0 @@
GNU Window Maker
X11 Window Manager
<http://windowmaker.org>
<ftp://ftp.windowmaker.org>
por
Alfredo K. Kojima
Dan Pascu
]d
Web/FTP Master
Phillip Smith
¡Felicitaciones! Ha adquirido un dispositivo
excelentísimo que le proporcionará miles de años de uso sin
problemas, si no fuera porque indudablemente lo destruirá a
través de alguna maniobra estúpida típica de consumidor. Por
eso le pedimos por EL AMOR DE DIOS LEA ESTE MANUAL DEL
PROPIETARIO CUIDADOSAMENTE ANTES DE DESEMPAQUETAR EL
DISPOSITIVO. ¿YA LO DESEMPAQUETÓ, NO? LO DESEMPAQUETÓ Y LO
ENCHUFÓ Y LO ENCENDIÓ Y TOQUETEÓ LAS PERILLAS, Y AHORA SU
CHICO, EL MISMO CHICO QUE UNA VEZ METIÓ UNA SALCHICHA EN SU
VIDEOCASETERA Y ACCIONÓ "AVANCE RÁPIDO", ESTE CHICO
TAMBIÉN ESTÁ TUOQUETEANDO LAS PERILLAS, ¿CIERTO? Y RECIÉN
AHORA ESTÁ COMENZANDO A LEER LAS INSTRUCCIONES, ¿¿¿CIERTO???
NOSOTROS PODRÍAMOS SIMPLEMENTE ROMPER ESTOS DISPOSITIVOS EN LA
FÁBRICA ANTES DE DESPACHARLOS, ¿SABE?
-- Dave Barry, "¡Lea Esto Primero!"
Descripción
===========
Window Maker es el gestor de ventanas GNU para el Sistema de Ventanas X. Fue
diseñado para emular la apariencia y funcionalidad de parte del GUI de NEXTSTEP(mr).
Procura ser relativamente rápido y pequeño, rico en características, fácil de configurar
y usar, con una simple y elegante apariencia sacada desde NEXTSTEP(mr).
Window Maker fue diseñado teniendo en mente la integración con GNUstep y por eso
es el gestor de ventanas "oficial". Es también parte del proyecto GNU (www.gnu.org)
. Lea mas sobre GNUstep más adelante en este archivo.
Pistas (información dada por las aplicaciones para integrarse bien con el gestor de
ventanas) para Motif(tm), OPEN LOOK(tm), KDE y GNOME también son soportados.
Entonces puede reemplazar cualquiera de los gestores de ventana para estos entornos
con Window Maker manteniendo la mayoría, si no todo, de la funcionalidad del
gestor de ventanas nativo.
Window Maker antes se llamaba WindowMaker.
Window Maker no tiene relación con Windowmaker, el software para
hacer ventanas y puertas.
Documentación
=============
Lea antes de preguntar.
* Los archivos README distribuidos por todas partes del árbol de fuentes
contienen información relacionada al contenido en los directorios.
* INSTALL tiene instrucciones de instalación y algunos consejos cuando tenga
algún problema. Significa que debería leerlo antes de la instalación.
No fue escrito solo para ocupar espacio en el paquete...
* FAQ: Preguntas Frecuentes. LEALO!!! FAQ.I18N es para
preguntas relacionadas con la internacionalización.
* NEWS: lista los cambios visibles por el usuario desde la versión anterior.
Léalo si está actualizando.
* MIRRORS: algunos lugares alternativos donde puede obtener Window Maker,
incluyendo paquetes de Window Maker específicos para ciertas plataformas.
* BUGFORM: uselo para enviar reportes de errores. Por favor uselo.
* ChangeLog: ¿que cambió desde la versión anterior?
* BUGS: lista de errores conocidos.
*** Tutorial
Hay un tutorial mantenido por Georges Tarbouriech en:
http://www.linuxfocus.org/~georges.t/
*** Guía del Usuario
La Guía del Usuario de Window Maker puede ser bajada desde el ftp oficial
o por sitios web.
Puede también ser vista en formato HTML en:
http://people.delphi.com/crc3419/WMUserGuide/index.htm
La Guía del Usuario explica como usar Window Maker, los archivos de configuración
y opciones.
*** man pages
Tipee "man wmaker" en el prompt del shell para obtener ayuda general sobre Window Maker.
Directorios y Archivos en el Árbol de Fuentes
=============================================
* Install es un script para configurar y compilar Window Maker de una forma
fácil (no es que la forma normal sea difícil, pero...).
* AUTORES: los créditos
* TODO: planes para el futuro.
* contrib/ tiene algunos parches aportados que no están soportados por Window Maker
porque entran en conflicto con la filosofía de diseño de los desarrolladores o por
alguna otra razón.
* util/ tiene varios programas utilitarios.
* WPrefs.app/ es el programa de configuración.
* src/wconfig.h posee opciones de compilación que puede cambiar para
seleccionar algunas opciones/caracteristicas y otras cosas.
* WINGs/ biblioteca widget para imitación de NEXTSTEP.
* wrlib/ biblioteca de procesamiento de imagen.
* po/ posee catálogos de mensajes que son las versiones traducidas de los mensajes
mostrados por Window Maker.
* docklib-x.x.tar.gz es una biblioteca para escribir dockapps.
SOCORRO!!!
==========
Hay una lista de correo para discutir sobre Window Maker en
wm-user@windowmaker.org. Para suscribirse, envie un mensaje que contenga:
subscribe
en el tema del mensaje a wm-user-request@windowmaker.org
Si tiene algun problema, pregunte aquí (después de leer los docs, por supuesto). Es
más probable que las personas de la lista sepan contestar sus preguntas
que nosotros. Para reportes de errores use el BUGFORM.
Si tiene un problema con una versión precompilada de Window Maker
(rpm, deb etc), primero pregunte a la persona que hizo el paquete.
NOTA IMPORTANTE: cuando pida ayuda (en la lista de correo o a los desarrolladores,
directamente) *siempre* envie información sobre el sistema que está usando. Puede
usar la sección de información del sistema al final del BUGFORM como una guía.
Otra cosa: por favor no envie correo HTML.
También hay un canal de IRC #windowmaker en openprojects. Únase aquí,
conecte su cliente de irc a irc.openprojects.net, irc.linux.com o algún otro
servidor de esa red.
GNUstep
=======
GNUStep es un completo sistema de desarrollo orientado a objetos, basado en la
especificación OpenStep liberada por NeXT(tm) (ahora Apple(tm) y Sun(tm)). Ello
proveerá todo lo que se necesita para producir aplicaciones multiplataforma,
orientadas a objetos, gráficas (y no gráficas); suministrando dentro de otras cosas,
bibliotecas base del sistema, una estructura de alto nivel para aplicaciones GUI que
usan un modelo de imagenes de tipo Display PostScript(tm) (DGS), objetos para acceso
a bases de datos relacionales, objetos distribuidos y un entorno de desarrollo gráfico,
con herramientas como un modelador de interfaces, un sistema para administración del
proyecto (central de proyecto) y otras herramientas.
El sistema de desarrollo de GNUStep será usado para crear un entorno de usuario,
con todo lo necesario para una completa interface gráfica de usuario, tal como
un visualizador de archivos, editores de texto y otras aplicaciones. Note que el
entorno de usuario (o "entorno de escritorio") es solo un pequeña parte de todo
el proyecto GNUStep y por lo tanto no "compite" con otros proyectos como KDE o GNOME,
simplemente porque son cosas completamente diferentes.
Para más información sobre el proyecto GNUStep, visite: http://www.gnustep.org y
http://gnustep.current.nu
Ejecutando multiples instancias de Window Maker
===============================================
No es una buena idea eejcutar más de una instancia de Window Maker desde
el mismo usuario (ya que wmaker usará los mismos archivos de configuración)
al mismo tiempo. Podría obtener un comportamiento inesperado cuando Window
Maker actualiza sus archivos de configuración.
Si de verdad desea hacer esto, intente ejecutar Window Maker con la opción
de linea de comando --static ya que así no actualizará o cambiará ninguno de los
archivos de configuración.
Soporte para Sonido
===================
El sonido es soportado por los sistemas Linux y FreeBSD con el uso de
un módulo distribuido separadamente llamado WSoundServer. Hay también
una herramienta de configuracion gráfica para definir sus sonidos llamada
WSoundPref.
Puede bajar esto en:
http://shadowmere.student.utwente.nl/
Note que debe compilar Window Maker con el parámetro --enable-sound
y definir la opción DisableSound a NO.
Ajuste de Rendimiento.
=====================
Si quiere disminuir el uso de memoria por parte de Window Maker y mejorar el
rendimiento, manteniendo una linda apariencia y buena funcionalidad, siga los
items de abajo:
- use texturas sólidas para todo, principalmente barras de título y menúes.
Si quiere un escritorio de aspecto lindo, use el estilo Tradicional.
- Apague NewStyle y Superfluous
- No una muchos atajos al menú y mantenga solo los items esenciales en el menú.
- Active DisableClip
- edite wconfig.h y desactive el NUMLOCK_HACK y lo mismo con las características
que no use (tenga en mente que algunos de los #defines podrían no funcionar,
ya que ellos no están completamente soportados). Asegúrese de mantener siempre
Numlock y ScrollLock apagados.
- Active DisableAnimations. Puede también #undefine ANIMATIONS en wconfig.h
- quite las entradas por defecto IconPath y PixmapPath para contener solo las
rutas que en verdad tiene en su sistema.
- no use imágenes grandes en el fondo raíz.
- quite el soporte para los formatos de imagen que no use.
- para reducir el uso de la memoria, desactive el caché de ícono, definiendo
la variable de entorno RIMAGE_CACHE a 0. Si quiere aumentar el rendimiento
a expensas del uso de la memoria, defina este valor a un valor igual al
número de íconos distintos que use.
Control del Mouse por Teclado
=============================
Muchas personas preguntan sobre agregar control por teclado al mouse, como
en fvwm, pero Window Maker no tendrá tal característica. La extensión XKB
soporta simulación de mouse desde el teclado, de una manera mucho más poderosa
que cualquier otra simulación hecha por un administrador de ventanas.
Para activarlo, presione la combinación de teclas Control+Shift+NumLock o
Shift+NumLock. Debiera escuchar el beep del parlante. Para desactivarlo,
haga lo mismo.
Para controlar el mouse el teclado numérico se usa así:
- 4 (flecha izquierda), 7 (Home), 8 (flecha arriba), 9 (PgUP), 6 (flecha derecha),
3 (PgDn), 2 (flecha abajo) y 1 (Fin) mueve el mouse a la correspondiente
dirección;
- sosteniendo una de las teclas de arriba y luego sosteniendo la tecla 5 moverá
el puntero más rápido;
- / seleccionará el primer botón del mouse (botón izquierdo);
- * seleccionará el segundo botón del mouse (botón del medio);
- - seleccionará el tercer botón del mouse (botón derecho);
- 5 hará un click con el botón actualmente seleccionado del mouse;
- + hará un doble click con el botón actualmente seleccionado;
- 0 (Ins) cliqueará y mantendrá el botón seleccionado actualmente;
- . (Del) liberará el botón seleccionado actualmente que fue anteriormente
cliqueado con la tecla 0 (Ins).
Los valores anteriores de las teclas funcionarán en un servidor X XFree86 3.2
(X11R6.1) pero su alcance puede variar.
Como hacer un gdb backtrace
===========================
Backtraces pueden ayudarnos a arreglar errores que hicieron que Window Maker falle.
Si encuentra un bug que hace fallar a Window Maker, por favor envie un backtrace con su
reporte de error.
Para hacer un backtrace útil, necesita un archivo core con información de depuración
producida por Window Maker cuando falló. Debería haber sido instalado sin stripping también.
Para compilar wmaker con información de depuración:
./configure
make CFLAGS=-g
Si obtiene el cuadro de diálogo que le dice que wmaker falló y le
pregunta que hacer, respóndale "Abortar y dejar un archivo core"
script
cd src
gdb .libs/wmaker path_to_the_core_file
Luego, en el prompt gdb escriba "bt". Salga de gdb escribiendo "quit"
y luego, en el prompt del shell, scriba "exit"
El archivo llamado typescript contendrá el backtrace.
Derechos de Autor y Descargo de Responsabilidad
===============================================
Window Maker está registrado por Alfredo K. Kojima y está licensiado por la
Licensia Pública General GNU. Lea el archivo COPYING para leer la licensia
completa.
Los íconos que son distribuidos con este programa y fueron hechos por Marco
van Hylckama Vlieg, están licenciados por la Licencia Pública General GNU.
Lea el archivo COPYING para leer la licencia completa.
Los íconos listados en COPYING.WTFPL y son distribuidos en este programa
fueron hechos por Banlu Kemiyatorn (]d), están licenciados por la
"do What The Fuck you want to Public License". Lea el archivo COPYING.WTFPL
para leer la licencia completa.
NeXT, OpenStep y NEXTSTEP son marcas registradas de NeXT Computer, Inc.
Todas las otras marcas registradas son propiedad de sus respectivos dueños.
Los autores se reservan el derecho de hacer cambios en el software sin previo
aviso.
Autores
=======
Alfredo K. Kojima <kojima@windowmaker.org>
Dan Pascu <dan@windowmaker.org>
]d <id@windowmaker.org>
Por favor no nos haga preguntas antes de leer la documentación (especialmente
la FAQ, este archivo y los archivos INSTALL) y sobre cosas "cool" que ve en
las capturas de pantalla del escritorio de las personas.
El archivo AUTHORS contiene una lista de las personas que han contribuido
con el proyecto. El nombre de las personas que han ayudado con localization
(traducción) se puede encontrar en po/README y Window Maker/README
Si tiene algún comentario, arreglos y reportes de errores (complete BUGFORMs)
y enviémelos a developers@windowmaker.org
traducido por Efraín Maximiliano Palermo <max_drake2001@yahoo.com.ar>

351
README.pt
View File

@@ -1,351 +0,0 @@
GNU Window Maker
Gerenciador de Janelas X11
<http://windowmaker.org>
<ftp://ftp.windowmaker.org>
por
Alfredo K. Kojima
Dan Pascu
Matthew Hawkins
]d
Web/FTP Master
Phillip Smith
Parabéns! Você acabou de adquirir um dispositivo muito
bom que lhe proporcionaria milhares de anos de uso sem problemas,
exceto por que, você, com vai certeza destruí-lo com algum procedimento
idiota típico dos consumidores. Por isso nós pedimos POR FAVOR,
PELO AMOR DE DEUS LEIA O MANUAL DO DONO COM MUITA ATENÇÃO ANTES
DE DESEMBRULHAR O DISPOSITIVO. VOCÊ JÁ O DESEMPACOTOU, NÃO FOI?
VOCÊ DESEMPACOTOU-O, CONECTOU-O, LIGOU-O E ENCHEU-O DE COISAS,
E AGORA A SUA CRIANÇA, A MESMA CRIANÇA QUE UMA VEZ ENFIOU UMA
SALSICHA NO SEU VIDEOCASSETE E APERTOU NO "FAST FORWARD", ESTA
CRIANÇA ESTÁ BRINCANDO COM OS BOTÕES TAMBÉM CERTO? E SÓ AGORA VOCÊ
ESTÁ COMEÇANDO A LER AS INSTRUÇÕES CERTO??? NÓS PODEMOS ENTÃO QUEBRAR
ESTES DISPOSITIVOS NA FÁBRICA ANTES DE DESPACHÁ-LOS, VOCÊ
SABIA DISSO?
-- Dave Barry, "Read This First!"
Descrição
=========
O Window Maker é o gerenciador de janelas GNU para o X Window System. Ele foi
desenvolvido para emular o visual e a sensação de parte da GUI NEXTSTEP(tm).
Procura ser relativamente rápido e pequeno, rico em opções, fácil de
configurar e usar, com uma aparência simples e elegante emprestada do
NEXTSTEP(tm).
O Window Maker foi projetado tendo em mente a integração com o GNUStep e
é o gerenciador de janelas "oficial" dele. É ainda parte do projeto GNU
(www.gnu.org).
Leia mais sobre o GNUstep neste arquivo.
Hints (informações dadas pelas aplicações para que se integrem bem com o
gerenciador de janelas) para Motif(tm), OPEN LOOK(tm), KDE e GNOME também
são suportados. Logo, você pode substituir os gerenciadores de janela desses
ambientes pelo Window Maker e manter muito, senão toda a funcionalidade do
gerenciador de janelas nativo.
O Window Maker antes se chamava WindowMaker.
O Window Maker não tem relação com o Windowmaker, o software para construção
de janelas e portas.
Documentação
============
Leia antes de perguntar.
* Os arquivos README distribuídos por toda a árvore dos fontes contêm
informações relacionadas ao conteúdo dos diretórios.
* O INSTALL possui instruções para instalação e algumas dicas quando há
algum problema. Você deveria lê-lo antes da instalação. Ele não foi escrito
somente para ocupar espaço no pacote...
* FAQ: Frequently Asked Questions. LEIA! O FAQ.I18N é sobre questões
relacionadas à internacionalização.
* NEWS: lista as mudanças de uma versão para outra e que são visíveis ao
usuário. Leia-o se você estiver fazendo uma atualização.
* MIRRORS: alguns locais alternativos onde você pode pegar o Window Maker,
incluindo pacotes do Window Maker específicos para certas plataformas.
* BUGFORM: use-o para enviar relatos de bug. Use-o por favor.
* ChangeLog: o que foi mudado a partir da última versão?
* BUGS: lista dos bugs conhecidos
*** Guia do Usuário
O Guia do Usuário Window Maker pode ser baixado do ftp oficial ou por
sites web. Pode ser visto ainda no formato HTML no:
http://people.delphi.com/crc3419/WMUserGuide/index.htm
O Guia do Usuário explica como usar o Window Maker, fala sobre os
arquivos de configuração e as opções.
*** man pages
Digite "man wmaker" no prompt da shell para obter uma ajuda geral sobre
o Window Maker.
Diretórios & Arquivos na Árvore dos Fontes
==========================================
* O Install é um script para configurar e compilar o Window Maker de
um modo fácil (não que o modo normal seja difícil, mas...).
* AUTHORS: os créditos
* TODO: planos para o futuro
* O contrib/ possui alguns patches enviados e que não foram suportados
pelo Window Maker por entrarem em conflito com a filosofia de projeto dos
desenvolvedores ou por algum outro motivo.
* O util/ possui vários programas utilitários.
* O WPrefs.app/ é o programa de configuração.
* O src/wconfig.h possui opções de compilação que você pode mudar para
selecionar algumas opções/aspectos e outras coisas mais.
* O WINGs/ é a biblioteca de widget NEXTSTEP lookalike
* A wrlib/ é a biblioteca de processamento de imagens
* O po/ possui catálogos de mensagens, que são versões traduzidas das
mensagens mostradas pelo Window Maker
* A docklib-x.x.tar.gz é a biblioteca para desenvolvimento de dockapps
SOCORRO!!!
==========
Há uma lista de discussão para debate de questões sobre o Window Maker
no wm-user@windowmaker.org. Para inscrever-se, mande uma mensagem
contendo:
subscribe
no campo de assunto da mensagem para wm-user-request@windowmaker.org
Se você tiver algum problema, pergunte lá (somente depois de ter lido os
documentos, é claro). As pessoas da lista estão mais preparadas para
resolver o seu problema do que nós. Para relatar BUGS, use o BUGFORM.
Se você tiver problemas com uma versão pré-compilada do Window
Maker (rpm, deb etc), primeiro questione a pessoa que criou o pacote.
NOTA IMPORTANTE: quando for pedir ajuda (seja na lista de discussão ou
diretamente aos desenvolvedores) *sempre* envie informações sobre o sistema
que você está usando. Você pode usar a seção system information no final
do BUGFORM como guia. Outra coisa: não mande mensagens em HTML.
Há ainda o canal de IRC #windowmaker na EFNET. Para entrar lá, conecte
seu cliente de irc no irc.concentric.net, irc.prison.net ou outro
servidor dessa rede.
GNUstep
=======
O GNUstep é um completo sistema de desenvolvimento orientado a objetos,
baseado na especificação OpenStep lançada pela NeXT(tm) (agora Apple(tm) e
Sun(tm)). Ele irá fornecer tudo que é necessário para desenvolver aplicações
orientadas a objetos, gráficas (e não gráficas), cross-platform; fornecendo,
dentre outras coisas, bibliotecas bases do sistema, uma estrutura de alto
nível para aplicações GUI que usa um modelo de imagens do tipo Display
PostScript(tm), objetos para acesso a bancos de dados relacional, objetos
distribuídos e um ambiente de desenvolvimento gráfico, com ferramentas como
um modelador de interfaces, um projeto de gerenciamento de sistema (central
de projetos) e outras ferramentas.
O sistema de desenvolvimento GNUstep será usado para criar um ambiente
de usuário, com tudo necessário para uma interface gráfica, tais como
visualizador de arquivos, editores de texto e outras aplicações. Note que o
ambiente do usuário (ou "ambiente desktop") é somente uma pequena parte de
todo o projeto GNUstep e não "compete" com projetos como o KDE e o GNOME,
simplesmente por que eles são coisas completamente diferentes.
Para mais informação sobre o projeto GNUstep, visite http://www.gnustep.org
e http://gnustep.current.nu
Executando múltiplas instâncias do Window Maker
===============================================
Não é uma boa idéia rodar mais de uma instância do Window Maker sob
um mesmo usuário ao mesmo tempo (já que o wmaker usa os mesmos arquivos
de configuração). Você pode obter comportamentos inesperados quando o
Window Maker atualizar os seus arquivos de configuração.
Suporte para som
================
O Som é suportado nos sistemas Linux e FreeBSD com o uso de módulos
distribuídos separadamente. Você pode baixá-los no:
http://www.frontiernet.net/~southgat/wmsound
Observe que você deve compilar o Window Maker usando o configure com a
flag --enable-sound e definindo a opção DisableSound para NO.
Ajuste da Performance
====================
Se você deseja diminuir o uso de memória pelo Window Maker, aumentar a
performance, e ainda manter uma boa aparência e funcionalidade, siga os
itens abaixo:
- use texturas sólidas para tudo, barras de títulos e menus. Se você quer
um desktop com um belo visual, use o estilo "Traditional".
- desligue o "NewStyle" e o "Superfluous"
- não vincule muitos atalhos ao seu menu e guarde somente coisas essenciais
no menu
- ative o "DisableClip"
- edite o wconfig.h e desative o NUMLOCK_HACK e as opções que você não
usa mesmo (tenha em mente que alguns dos #defines podem não funcionar,
já que eles não estão completamente suportados). Certifique-se de sempre
manter o NumLock e o ScrollLock desligados.
- ligue a opção "DisableAnimations". Você pode também usar o #undefine
ANIMATIONS no arquivo config.h
- verifique as entradas padrão "IconPath" e "PixmapPath" para que contenham
somente os paths que você realmente possua no seu sistema.
- não use imagens grandes no seu background root
- remova o suporte para formatos de imagens que você não usa
- para reduzir o uso de memória, desative o cache de ícones, definindo a
variável de ambiente RIMAGE_CACHE para 0. Se você deseja melhorar o
desempenho perdendo só um pouco de memória, defina essa variável para
o valor correspondente ao número de ícones que você usa.
Controle de Mouse pelo Teclado
==============================
Muitas pessoas perguntam sobre adicionar o controle do mouse pelo teclado,
como no fvwm, mas o Window Maker não possui tal opção. A extensão XKB
suporta a simulação do mouse pelo teclado, de uma maneira muito mais
poderosa do que qualquer outra simulação realizada por um gerenciador de
janelas.
Para ativá-la, aperte a combinação Control+Shift+NumLock ou Shift+NumLock.
Você deve então ouvir um beep. Para desativá-la, faça a mesma coisa.
Para controlar com o mouse, use as seguintes teclas do keypad:
- 4 (seta esquerda), 7 (Home), 8 (seta para cima), 9 (PgUp), 6 (seta direita),
3 (PgDn), 2 (seta para baixo) e 1 (End) move o mouse para as direções
correspondentes;
- segurar as teclas acima e depois segurar a tecla 5 vai fazer o ponteiro
se mover mais rápido;
- / vai selecionar o primeiro botão do mouse (botão esquerdo);
- * vai selecionar o segundo botão do mouse (botão do meio);
- - vai selecionar o terceiro botão do mouse (botão direito);
- 5 vai fazer um clique com o botão do mouse que foi selecionado;
- + vai fazer um duplo-clique com o botão do mouse que foi selecionado;
- 0 (Ins) vai clicar e segurar o botão do mouse selecionado;
- . (Del) vai liberar o botão do mouse selecionado que foi previamente
clicado com a tecla 0 (Ins).
Os valores das teclas acima funcionam com um servidor X XFree86 3.2 (X11R6.1)
mas nosso alcance pode variar.
Como fazer um backtrace com o gdb
=================================
Os backtraces nos ajudam a arrumar bugs que fazem com que o Window Maker
trave. Se você achar um bug que trave o Window Maker, por favor envie o
backtrace com o relato do bug.
Para fazer um backtrace útil, você precisa de um arquivo core
com informações de depuração produzidas pelo Window Maker quando ele
travar. O padrão do Window Maker é iniciar um outro gerenciador
de janelas quando ele travar, o que não gerará um arquivo core. Você
precisa editar o arquivo src/wconfig.h *depois* de ter rodado o configure
e mudar a linha que se parece com o seguinte:
#undef NO_EMERGENCY_AUTORESTART
para:
#define NO_EMERGENCY_AUTORESTART
Depois, no diretório src, digite:
make clean
make CFLAGS=-g
make install
e espere o Window Maker ser instalado.
Depois de instalado o Window Maker, inicie o X e reproduza o bug fazendo
com que o Window Maker trave. Quando ele travar, vá até o diretório
onde você compilou o wmaker e digite o seguinte comando na sua shell:
script
cd src
gdb .libs/wmaker path_ao_arquivo_core
Depois, no prompt do gdb, digite "bt". Saia do gdb digitando "quit"
e depois no prompt da shell, digite "exit".
O arquivo chamado typescript conterá o backtrace.
Direitos Autorais & Disclaimers
===============================
O Window Maker é registrado por Alfredo K. Kojima e é licenciado pela Licença
Pública Geral GNU. Leia o arquivo COPYING para ler a licença completa.
Os ícones que são distribuídos com esse programa foram criados por Marco
van Hylckama Vlieg são licenciados pela OpenContent License. Leia o
arquivo COPYING.OPL para a licença completa.
NeXT, OpenStep e NEXTSTEP são marcas da NeXT Computer, Inc.
Todas as outras marcas são propriedade dos respectivos donos.
Os autores se reservam no direito de fazer alterações no software sem
qualquer aviso prévio.
Autores
=======
Alfredo K. Kojima <kojima@windowmaker.org>
Dan Pascu <dan@windowmaker.org>
]d <id@windowmaker.org>
Por favor não nos perguntem coisas antes de ler a documentação (o FAQ,
este arquivo e os arquivos INSTALL), ou sobre coisas "legais" que você
viu em screenshots de desktops.
O arquivo AUTHORS contem uma lista de pessoas que contribuíram com o projeto.
O nome das pessoas que ajudaram com a tradução pode ser achado no po/README e
Window Maker/README
Se você tem algum comentário, correção ou deseja relatar bugs (junto com
o BUGFORM) mande-os para developers@windowmaker.org
Traduzido por: Ricardo Sartori <sartori@inf.ufsc.br>

66
TODO
View File

@@ -1,64 +1,50 @@
remake wrlib rule to not compile with -fomit-frame-pointer and stuff
if its added to CFLAGS
Do ASAP:
========
- fix bestvisual selection code. Broken.
- add a dialog to let user choose if we should restart, restart twm or continue crashing on crash. Do not forget to check if wmaker is already fully running.
- fix stacking. buggy again
+ ICCCM compliant stuff: find what is missing
- WM_COLORMAP_NOTIFY clientmessage
- fix RemakeStackList() to account for transient windows
- blink border of clients with UrgencyHint set between red and black
- finish session stuff
- remove colors_per_channel stuff from wmaker after?
+ finish the ability to browse for files/dirs in the WPrefs menu editor
- check whether window states are being saved/restored properly via netwm
on restart/crash-restart (grep for XXX/TODO)
- change CommitStacking() on AddToStackingList() to more optimized thing
- differential update of appmenu
- make unhide app map windows in the same stacking order they were before
hiding
Need to do:
===========
- figure out a better gnustep path for wprefs.app installation
- impelment a generic pixmap type, which receives attributes
(scaled/maxscaled/centered/tiled, smoothed, size/position, ...)
- allow user to select/restore default root menu from wprefs
- support for X11R6.4 extension for getting extra visual info in wrlib's
automatic best context guessing
- docklet to control AccessX (keyboard accessibility) functions
- rewrite all redundant stuff to use WINGs
- resizebartexture option
- add function to directly make a thumbnail of an image, using the
functionality provided by the image libraries to load a minimal
amount of data.
- clickonclientarearaisewindow
- edge resistance (with timer)
- save client supplied icons in ~/GNUstep/.AppInfo/ClientIcons/ and
use them by default
- GNUstepWMAttributes update in propertynotify
+ investigate memory leaks
- make Docked apps with WM_CLIENT_MACHINE be launched from respective
machines (also put a marking showing it's remote launched)
- handle change of CLIENT_LEADER property
- rewrite defaults/wdefaults stuff to use WINGs UD stuff. Search list:
~/G/D/WindowMaker /u/l/s/W/D/WindowMaker built-in-defaults
- remake internal string processing to use wchar? unicode?
- add new file for stuff like default commands and dnd commands for
docked apps, balloons for the dock etc
- check whether apps with name.class set to empty strings should be treated
like if name.class is NULL.NULL
- review the defaults handling code (not to reread after we update a
domain if possible, check WINGs apps updating WMWindowAttributes after
start making screen to flash on update)
- remake internal string processing to use wc?
- -statefile cmd arg to specify path for WMState file (multiple instance
support)
Maybe some day:
===============
- virtual workspace
- virtual desktop
- optimize for size
- make dithering in 8bpp better
Never: (so, dont even bother to ask)
======
- different themes for each workspace. Unless you give us a SGI/Power Onyx
with 2 CPUs ;).
with 2 CPUs ;). Different workspacebacks for each workspace is being
considered, but don't hold your breath.
- anything that requires the mouse pointer to be jumped by WindowMaker to
somewhere. This is *terrible* behaviour. And it's not just IMO.
- rewrite to use Gtk... I wont even bother to explain why...
- ICCCM 2.0: ICCCM 2.0 (not 1.0, which is what everybody supports so so) is
a relatively new standard and nobody, AFAIK, complies with it (not even
twm as people tend to think). It has some neat things, but many of the new
stuff is really weird and tricky to implement, not to say unworthy (read the
specs and you'll see). This is not bad, since I think it is very unlikely
that a client that requires it exists... Anyway, if we get an "official"
sample implementation (twm?) it might be supported. Maybe dtwm supports
it? I dont know...
somewhere. This is *terrible* behaviour. And it's not just IMO.

View File

@@ -1,4 +0,0 @@
Makefile Makefile.in
get-wings-flags get-wutil-flags
.libs *.pc
.psrc .inslog2 tca.map tca.log pchdir *.rpt

View File

@@ -1,3 +0,0 @@
- filepanel does not reread / . If you add new files in / they will not be
visible until the program is restarted. Closing and reopening the file
panel does not help.

View File

@@ -1,542 +1,3 @@
Changes since wmaker 0.80.1:
............................
- Added WMSetConnectionShutdownOnClose()
- Added an extra member to the ConnectionDelegate: canResumeSending
see NEWS for details.
- WMDrawString() and WMDrawImageString() now take WMColor instead of GC as
arguments. WMDrawImageString() receives 2 colors (text & background).
This is to allow easy extension for Xft/Xrender and hide X low level details
Read NEWS for details since this will break backward compatibility.
- Added alpha channel to WMColor. 2 new functions also:
WMCreateRGBAColor() and WMSetColorAlpha()
- Miscelaneous code cleanups in wtext.c
- Added Xft2 support in WINGs (for drawing antialiased fonts with transparency).
- New options in WMGLOBAL: AntialiasedText. Check NEWS for details.
- Fixed some improper calls to snprintf in wfont.c
- Added double buffering when drawing a WMFrame title with an antialiased font
to avoid flickering.
- Added double buffering when drawing WMList items to avoid flickering.
Double buffering for list also works for user drawn lists. Read NEWS for
details and incompatibilities introduced by this change.
- Added WMGetColorAlpha(WMColor *color)
- Better outline when drawing balloons.
- Added WMCreateFontWithAttributes()
- You can now pass "SystemFont", "BoldSystemFont", "SystemFont-##" or
"BoldSystemFont-##", with ## being the font size to any font creating
function to create a font with the (bold) system font font specification.
- Added WMCopyFontWithChanges(). This is a more generic and powerful function
meant to replaces the obsoleted WMEmphasizeFont(), WMNormalizeFont(),
WMStrenghtenFont() and the other similar functions. To get the same effect
you pass some predefined structs to it: WFANormal, WFABold, WFAEmphasized,
etc which are declared in WINGs.h).
- Fixed a bug with empty frame titles (Alexey Voinov <voins@voins.program.ru>)
- Added WMGetWidgetBackgroundColor()
- Code cleanup in wtext.c
- Fixed a memory leak in wfontpanel.c
- Fixed WMGetTextDefaultColor() not to retain the returned color. It returns
only a reference to the internal color, which you shouldn't release
- Added wstrndup()
- Added WMGetFontName()
- Added fontpanel callback
- Added WMSetTableViewHasHorizontalScroller()
- Fixed bug that could cause SIGSEGV by accessing beyond the end of text in
a WINGs textfield widget.
- Fixed small memory leak in the font panel code.
- Fixed call to qsort in WMSortArray.
- Fixed a memleak in the file panel.
- Double/triple-click selection in text widgets
(Vitaly Ovtchinnikov <ov@rbcmail.ru>)
- Fixed bug in tableview (clicked row callback got incorrect row)
(Carlos Torres <vlaadbrain@operamail.com>)
- Fixed bug in resizing a scrollview
- Fixed bug with wrong text wrapping (Alexey Voinov <voins@voins.program.ru>)
- Added wmkrect()
- Added xdnd v3 support (Sylvain Reynal <sreynal@nerim.net>)
- Fixed and enhanced text wrapping.
Changes since wmaker 0.80.0:
............................
- fixed a bug in wfindfile() (rewrote wfindfile() with better logic).
- separated the font caches for normal fonts and fontsets in WINGs (they can
have the same names and collide in the cache giving unwanted results)
- fixed labels not to display '\n' as a character if multiple '\n' are passed
but just skip to the next line.
- better warning when importing non-digit characters in PropList Data.
- rewrote WMBox to use a WMArray for subviews. with this change fixed a bug
about arranging subviews after removing one and a memleak occuring in the
same case.
- Fixed WMGetViewScreenPosition() to consider the window decorations.
- Added ability to enable/disable individual WMTableViewItems.
- Fixed textfields regarding interpretation of special keys with modifiers.
- Fixed some functions that accept a boolean flag as a paramater, to set only
1 or 0 for the flag value, not the flag passed by the user.
- Added 2 functions to retrieve the default system fonts:
WMDefaultSystemFont(WMScreen *scr) and WMDefaultBoldSystemFont(WMScreen *scr)
- Added WMSetButtonImageDimsWhenDisabled() and WMGetButtonEnabled()
- Cleaned-up the header files of functions/vars declared but not implemented
- Added WMGetTextFieldDelegate()
Changes since wmaker 0.70.0:
............................
- added an internal strcasecmp() (only on systems where is not present)
- removed some redundant includes of ../src/config.h when wconfig.h is
included too
- removed a wsyserror() message when reading a property list from file
(the programmer should decide if to give that message or just ignore).
- added a 'Bool recursive' flag to WMMergePLDictionaries()
- added WMSubtractPLDictionaries()
Changes since wmaker 0.65.0:
............................
- fixed problem with WINGs based apps exiting with a "X_RotateProperties"
related error when text was selected in a textfiled.
- moved wstrdup(), wstrconcat() and wstrappend() from memory.c to string.c
- added property list handling code making libPropList unnecessary and
obsolete. Backward compatibility is provided through the
WINGs/proplist-compat.h header file which has #defines from old libPropList
function names to new function names with minimal changes. Read this
header file and the NEWS file for more details about this subject.
- Renamed WMGetUDAllKeys() to WMGetUDKeys()
Changes since wmaker 0.64.0:
............................
- made programmatic scroller changes send notifications
- replaced WMSetBoxExpandsToParent with WMSetViewExpands...
- added WMGetLabelFont()
- added WMAddPersistentTimerHandler()
- Moved all internal handlers (timer, idle and input) to handlers.c
- simplified wevent.c and wutil.c.
- fixed handling of input with poll (was broken)
- fixed mem leak that occured when input handling was done with poll
- simpler and more straightforward event handling for timer, idle, input
and X events (also fixed some problems the old handling logic had)
- moved timer, idle and input handler definitions and prototypes from
WINGs.h to WUtil.h because they're not GUI related.
- better and more robust handling of events (timer, idle, input, X) in
WMMaskEvent(). Also fixed a bug where input and timer events were not
treated for undefined periods of time under some circumstances.
- fixed secure textfields not to allow text selection, to avoid compromising
sensitive information by pasting it to a terminal.
- replaced wmkrange(), wmkpoint() and wmksize() functions with macros.
- added WMRemoveFromArrayMatching(array, match, cdata), which will remove the
first element in the array that is matched by match(item, cdata)==True.
- added WMArrayFirst(), WMArrayLast(), WMArrayNext() and WMArrayPrevious()
functions and also WM_ITERATE_ARRAY() and WM_ETARETI_ARRAY() macros, to make
interfaces to WMBag and WMArray similar and to make life a little simpler
when iterating through all elements of an array.
- replaced bags with arrays wherever appropriate. This will improve
performance a bit.
- replaced some recursive code with iterative code in selection.c
- added WMCreateBlendedPixmapFromRImage()
- small API change:
1. Renamed WMSetApplicationIconImage(), WMGetApplicationIconImage() and
WMSetWindowMiniwindowImage() to respectively WMSetApplicationIconPixmap(),
WMGetApplicationIconPixmap() and WMSetWindowMiniwindowPixmap()
They operate on a WMPixmap which is practically an X Pixmap with no alpha
channel information and the new name is more suggestive and also leaves
room for the new functions added for operating on images with alpha info.
2. Added WMSetApplicationIconImage() and WMGetApplicationIconImage() which
operate on an RImage and store alpha information too.
3. Added WMCreateApplicationIconBlendedPixmap() which will take the image
set by WMSetApplicationIconImage() and will combine it with a color.
If color is NULL it will blend using the default panel color (#aeaaae)
All these changes will allow WINGs to handle images with alpha blending
correctly in panels and wherever else needed. More about in NEWS.
- updated panels to use the newly available RImages if present and fallback
to old WMPixmaps if not, to properly show alpha blended images.
- replaced some still left malloc's with wmalloc's.
- fixed a bug in WMReparentWidget()
- added WMReparentWidget() to WINGs.h
- fixed a bug that made the scroller knob jump backwards when dragged (this
bug had no relation with the behavior that #define STRICT_NEXT_BEHAVIOUR
attempts to accomplish).
- fixed scrolling direction with mouse wheel for horizontal scroller.
changes since wmaker 0.63.1:
............................
- added WMRunModalLoop() and WMBreakModalLoop()
- added WMSetBoxExpandsToParent()
- added WMRemoveBoxSubview()
- moved WINGs headers in a WINGs subdirectory when installed.
use #include <WINGs/header_file_name> in your application from now on.
Also updated get-{wings|wutil}-flags.
- Fixed a mem leak in WMList.
- Fixed a bug that caused sigsegv for a WMList with more than 32767 items.
- Added an example of how to create a server type program with WMConnection.
- added WMOpenScreen()
changes since wmaker 0.62.1:
............................
- added WRuler widget
- added WText widget (rtf multiline text widget)
Nwanua Elumeze <nwanua@colorado.edu>
- added a new AUTO option for the UseMultiByte option
- added WMRaiseWidget()/WMLowerWidget()
- added missing EscapeTextMovement to textfield delegate/notification
- added WMGetLabelText()
- added WMReparentWidget()
- added WMCreateTabViewItem()
- added W_CreateUnmanagedTopView()
- added wtokenjoin(), wtokensplit(), wtokenfree(), wtrimspace()
- added WMWidgetIsMapped()
- added WMSetApplicationIconWindow()
- restructured the directory tree. Added Documentation, Examples and Tests
subdirectories
- removed WMArrayBag and reorganized WMTreeBag to be WMBag.
- added WMArray class.
- added WMSetWindowUserPosition()
- added WMGetListSelectedItems()
- added WMSetListAllowMultipleSelection(), WMListAllowsMultipleSelection().
- added WMSetListAllowEmptySelection(), WMListAllowsEmptySelection().
- WMListSelectionDidChangeNotification passes NULL as the notification
client data (previously passed the selected item row).
- added WMUnselectListItem(), WMSelectAllListItems(), WMUnselectAllListItems()
- better behavior of wheel mices in WMList. Simple mouse wheel events
will scroll by 1/3 of the WMList height. Using Shift as a modifier will
scroll line by line, while using Control as a modifier will scroll page
by page.
- better behavior of WMScroller regarding mouse wheel events. 'Shift' modifier
will scroll line by line, while 'Control' modifier will scroll page by page.
- fixed some buffer overflow allowing bugs.
- added WSDecrementWheel and WSIncrementWheel for handling mouse wheel in
scrollers and scrolled widgets. This should be treated like the WSxxxPage
counterparts, except it should scroll by page_size/3 instead of one full page
- added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection()
WMBrowserAllowsMultipleSelection() and WMBrowserAllowsEmptySelection()
- WMBrowser now allows multiple selections.
- Added WMGetBrowserPaths() to retrieve the paths for browsers that allow
multiple selections.
- WMDestroyWidget() now calls WMUnmapWidget() first
- added WMScrollerDidScrollNotification to scroller
- added WMGetScrollViewVisibleRect()
- fixed a mem leak in the browser code.
- renamed wstrappend() to wstrconcat(). wstrconcat(str1, str2) concatenates
str1 with str2 and returns that in a newly malloc'ed string.
Be sure to rename wstrappend with wstrconcat in your code too, else
hazardous things can happen!
- implemented a new wstrappend() function. wstrappend(dst, src) will append
src to dst modifing dst and returning a pointer to it. No new string is
generated, except if dst is NULL, in which case its the same as calling
wstrdup(src).
dst can ONLY be NULL or a dynamically allocated string (obtained from a
call to malloc, realloc, wmalloc, wrealloc, ...). dst CANNOT be a static
or a constant string!
- added wmessage() for printing a variable formatted string to stderr, with
the program name prepended to it. Similar to wwarning(), except that it
doesn't add "warning:" in the output message.
- added WMBox widget
- added WMAddTabViewItemWithView()
- added W_SetViewCursor()
- made Extra widgets library
- added table widget in Extras library
- added WMGetConnectionUnsentData() (WMGetConnectionQueuedData() too as an
alias).
- added WMSetConnectionCloseOnExec() to specify if the socket associated
with a connection survives an exec* call or not. When a new connection is
created using the WMCreate... or WMAcceptConnection() calls, it has the
close on exec flag set automatically to 'True' by the library. Unless
you want to let the socket of some connection to survive across an exec*
call, you need not to call this function.
- removed all the wsyserror() and wwarning() calls from host.c and
connection.c and replaced where appropriate with assertions. If a function
returns some invalid result, you can still get the system error message if
you need, by calling wsyserrorwithcode() and passing WCErrorCode, if
WCErrorCode > 0. If WCErrorCode==0, that is not a system error, and
wsyserrorwithcode() should not be called in this case.
- added WMNextHashEnumeratorKey() to retrieve all keys in some hash enumerator
one by one.
- fixed a bug with mouse wheels scrolling in scrollers even with the widget
fully visible.
- Fixed a memory leak (the destroy function for a view was never called and
as a result the shaded windows didn't go away when closed. The non-shaded
windows were unmapped on close but not destroyed either so they only
apparently went away, but continued to use memory).
- Fixed a bug in the hashtable code which free'd the whole item instead of
just the item key in WMResetHashTable() (possible source of SIGSEGVs)
changes since wmaker 0.62.0:
............................
- added WMSetWidgetDefaultFont(), WMSetWidgetDefaultBoldFont()
changes since wmaker 0.62.0:
............................
- added WM{S,G}etDataFormat()
- added drag and drop
- changed selection code
- added clientdata to WMFindInBag
- removed SetWindowInitialSize()
- added SetWindowAspectRatio()
- added initial timeout when establishing a connection.
- added WMSetConnectionDefaultTimeout() and WMSetConnectionOpenTimeout();
- added WMGetConnectionTimeoutState()
changes since wmaker 0.61.1:
............................
- WARNING: semantic of bags has changed!
An index assigned to an item will always keep that index unless
you insert an item before it.
For example:
bag = WMCreateBag();
WMSetInBag(bag, 10, "bla");
That code will put "bla" in index 10, instead of 0, as it used to be.
- fixed WMInsertInBag(). It ignored index, and always put the new item at end.
- added WMSaveUserDefaults().
- rewrote WMPopUpButton to use WMMenuItem
- added WMGetPopUpButtonMenuItem(WMPopUpButton *bPtr, int index)
- WMSortListItemsWithComparer(WMList *lPtr, (int)(f)(const void*, const void*))
- WMSortBrowserColumnWithComparer()
- fixed bug with sorting list items.
- fixed bug in handling keyboard input associated with selection and
notification sending.
- filepanel puts dirs on top of list (Wolff <wolff@cybercable.fr>)
- added WMReplaceInBag (Wolff <wolff@cybercable.fr>)
- added vertical views and multiple views in WMSplitView (Wolff <wolff@cybercable.fr>)
- changed values of parameter values of WMSplitViewConstrainProc()
- configurable default fontsize patch (Igor P. Roboul <igor@mordor.myip.org>)
- fixed a bug that crashed the programm when a popup button was scrolled.
- fixed a bug that caused incorrect drawing position of the popup indicator.
- fixed a bug that prevented selecting no item (-1) in a popup button.
- an assertion will be raised if the program tries to select a popup button
item that is beyond the total number of items present in the popup button.
- changed names of functions for SplitView to be consistent. Some contained
SubView while other Subview. Now all have Subview.
- fixed a bug in how input events were posted. Establishing 2 or more input
handlers for the same file descriptor, handling different (read/write/except)
events, caused wrong handlers to be called.
- Reimplemented the input and idle handlers with WMBag to avoid a functional
problem with them: inability to remove handlers next to the called one, from
the called handler itself. Trying to do this with the old version caused the
program to crash.
- changed wrealloc behaviour to be like this: new = wrealloc(old, new_size);
1. if old is NULL, return wmalloc(new_size).
2. if new_size is 0, call wfree(old), and return NULL.
3. if both old is a valid pointer and new_size>0, call realloc.
- added wstrerror(int errnum) to return the string associated with errnum.
- new wsyserrorwithcode(int error, const char* fmt, ...), similar to
wsyserror(), but printing the message for the specified error code.
- added 3 new classes: WMData, WMHost and WMConnection
- fixed a big memory leak in the color panel code (from Pascal Hofstee).
- added scrolling to tabview
changes since wmaker 0.61.0:
............................
- added WMGetTextFieldFont()
- escape key in panels (craig nellist <crn@ozemail.com.au>)
- applied patch with fixes and enhancements to textfield
(Franck Wolff <wolff@cybercable.fr>)
- changed WMList to use WMBag internally, instead of a linked list
- replaced WMAddSortedListItem() with WMSortListItems()
- replaced WMAddSortedBrowserItem() with WMSortBrowserColumn()
changes since wmaker 0.60.0:
............................
- added WMScreenWidth() and WMScreenHeight() functions.
- fixed some problems when compiling with non gcc compilers.
- added WMSetTextFieldFont()
- added WMSetButtonImageDefault() (craig nellist <crn@ozemail.com.au>)
- added WMBag (array/list)
- added libWUtil, a library that is a subset of libWINGs. It contains utils
that can be used in writing non-GUI programs. They include: hashes,
notifications, input/idle/timer handlers, user defaults database handling,
memory handling, application resource handling, etc.
All the non-GUI stuff from libWINGs is present.
Still linWINGs contain all this stuff so if you use libWINGs, you don't
need to link against libWUtil too.
One notable aspect of libWUtil is that it has a modified version of the
event handling function. It is named WHandleEvents() and will handle all
input/idle/timer events the app has.
If your app has a permanent input handler (as for example a socket a server
is listening on), then the main loop of the app can be:
while(1) {
WHandleEvents();
}
but if there is no permanent input handler, you need to add some delay to
avoid a too high cpu load by your program:
while(1) {
WHandleEvents();
wusleep(5000);
}
A permanent input handler is one that is established when the program starts
and is present until the program exits.
One that is deleted and later reinstalled, is not considered permanent.
This difference is because if there is some input handler, the function will
block until some event appears, while if there is no input handler the
function will return almost immediately (after handling the timer/idle
stuff).
Except the stuff declared in WUtil.h, the following functions declared in
WINGs.h are also present in libWUtil (you will need to #include <WINGs.h>
if you use one of these):
WMInitializeApplication(char *applicationName, int *argc, char **argv);
WMSetResourcePath(char *path);
WMGetApplicationName();
WMPathForResourceOfType(char *resource, char *ext);
WMAddTimerHandler(int milliseconds, WMCallback *callback, void *cdata);
WMDeleteTimerWithClientData(void *cdata);
WMDeleteTimerHandler(WMHandlerID handlerID);
WMAddIdleHandler(WMCallback *callback, void *cdata);
WMDeleteIdleHandler(WMHandlerID handlerID);
WMAddInputHandler(int fd, int condition, WMInputProc *proc,
void *clientData);
WMDeleteInputHandler(WMHandlerID handlerID);
- added progress indicator widget
- Changed WMSetWindowUPosition() and WMSetWindowUSize() to
WMSetWindowInitialPosition() and WMSetWindowInitialSize() respectively,
for better naming conventions.
changes since wmaker 0.53.0:
............................
- added balloon help
- fixed a bug with setting initial path in browsers.
- added WMSetButtonImageDimsWhenDisabled()
- changed simple callback/notifications to delegate-like stuff. Affected
widgets are:
WMBrowser
- WMSetBrowserFillProc() was replaced with WMSetBrowserDelegate
- WMBrowserDidScrollNotification was replaced with a delegate callback
WMTextField (not completed yet)
The notifications will still work, but using the delegate is preferable
How to convert old code to delegate callbacks:
1 - create a variable (static or dynamic) of the type of the
delegate for the widget type.
2 - Replace the notification observers with the equivalent
delegate callbacks.
3 - Put pointers to the callbacks in the delegate variable.
Take a look in wfilepanel.c to see how it is used there.
- changed W_ViewProcedureTable to delegates
This will only affect user created widgets. If you have a custom
widget, you will need to update the callbacks and the declaration
of the W_ViewProcedureTable variable to be a W_ViewDelegate,
which is declared in WINGsP.h To setup the delegate, assign
the delegate variable to view->delegate.
- WMTextField
Removed all the didChange notifications that were sent when the text
was changed programmatically. Only changes made by user interaction
will be notified now. If you need the old behaviour, send notifications
manually when you change the text.
- added WMTabView
- added WMGetColorPanelColor(WMColorPanel *panel)
- made WMGetUDStringForKey() to only return a reference to the string, not a
wstrdup()'ed copy. DO NOT FREE IT ANYMORE!
- added MultiByteText option to userdefaults file to control use of multibyte
string drawing functions
- renamed WMCreateFont() to WMCreateFontSet()
- renamed WMCreateFontInDefaultEncoding() to WMCreateNormalFont()
- added WMCreateFont() with different semantics
changes since wmaker 0.52.0:
............................
- added int WMGetBrowserMaxVisibleColumns(WMBrowser *bPtr);
changes since wmaker 0.51.2:
............................
- added WMColorWellDidChangeNotification
- added wfindfileinarray()
- fixed bug in window title setting
(MANOME Tomonori <manome@itlb.te.noda.sut.ac.jp>)
changes since wmaker 0.51.1:
............................
- wusergnusteppath() will return a statically allocated string now.
DO NOT FREE IT ANYMORE!!
changes since wmaker 0.51.0:
............................
- applied c++ compat header patch from Martynas Kunigelis <mkunigelis@alna.lt>
- added WMSetTextFieldBeveled()
- removed W_GC() : use WMColorGC() instead
- added WMCreatePixmap()
- changed WMSetTextFieldEnabled() to WMSetTextFieldEditable()
changes since wmaker 0.50.1:
............................
- fixed various bugs
- added patch from Franck Wolff <frawolff@club-internet.fr>, with
many fixes and enhancements
- added notification queues, asynchronous notifications etc.
- added WMSetBrowserDoubleAction()
- fixed list double click action
changes since wmaker 0.50.2:
............................
- added wsetabort() - look WUtil.h
- fixed bug in WMList resize
- added notification sending when changing textfield programatically
- removed WMHideWindow()
- fixed bug in WMCloseWindow()
- added textfield selection patch
- added color panel code
- added auto name completion for the file panel
- added function to select text range, and to set cursor position in text
fields programatically
changes since wmaker 0.20.3:
............................
- added WMSetSliderImage(), WMSetSliderKnobThickness()
- added WMGetListItemHeight()
- added WMListDidScrollNotification
- added WSetColorWellBordered()
- added hacky color dragging in colorwell
- added poll() support in WMNextEvent. WARNING: the stuff needed for
WMAddInputHandler() is not yet implemented for the poll stuff
- added WMSetFilePanelAccessoryView(), WMGetFilePanelAccessoryView()
- added WMSetPopUpButtonEnabled()
- added WMGetLabelImage()
- autoscroll for popup button menus
- added WMDrawPixmap()
- WARNING: changed parameter list for WMListDrawProc
changes since wmaker 0.20.2:
............................
- WMSetBrowserMaxVisibleColumns() - untested
changes since wmaker 0.20.0:
............................
- added generic object field for WMListItem. This is for hanging generic
clientdata
changes since wmaker 0.20.0:
............................

View File

@@ -1,2 +0,0 @@
Makefile Makefile.in
.psrc .inslog2 tca.map tca.log pchdir *.rpt

View File

@@ -1,6 +0,0 @@
## automake input file for WINGs - Documentation
AUTOMAKE_OPTIONS = no-dependencies
EXTRA_DIST = README.connection

View File

@@ -1,51 +0,0 @@
Methods of handling WMConnectionDidDieNotification notification events
(same for WMConnectionDidTimeoutNotification)
----------------------------------------------------------------------
Once your program got this notification (you need to install an observer for
it), there are some ways to handle it:
1. Make your observer enqueue a new notification in the ASAP queue, and the
observer for this new notification (it can be the same function if you
arrange to distinguish between the two cases), should remove the connection.
You can also close the connection before enqueuing the new notification to
the ASAP queue, but is not strictly necessarily, since it will be closed
when the observer for the new enqueued notification will be called and you
will call the close/remove function there. This is just to make sure your
connection will be silent, and won't generate new events until you reach
that point.
This is by far the best method, since it will assure you that if you
enqueue more than one notification to remove the same connection, they will
be coalesced, and called only once.
2. In your observer, put the died/closed connection in an array or bag, and
destroy all the connections present in the array/bag, in your main loop,
after you call the WHandleEvents()/WMHandleEvent(). Also closing the
connection can be done before putting the connection in the array/bag, but
is optional as noted above. In this case you need to make sure you don't
put in the array/bag the same connection more than once, in case the
DieNotification is sent more that once to you. This is automagically solved
by method 1.
3. In case it's your only connection, and you plan to exit if it was closed or
died, then you can safely close/remove it, and exit. As long as you no
longer access it, there is no problem.
4. Make you observer remove the connection. Then make sure that after that
point your code no longer tries to access that connection (this usually
means until your code gets back to the main loop). This is almost always
very hard to achive and subject to hidden errors. I do not recommend this
way of handling the died notification. It is ugly and very complicated to
handle if the program is in a very deeply nested function when it finds out
that the connection died. If you use it and get plenty of SIGSEGVs then you
know why. This method was not presented here to be used, but to show what
should be avoided in dealing with the died notification, in case someone
gets the idea to try it this way.
Note: read/write operations means to use our read/write functions (like
WMGetMessage()/WMSendMessage()), not the C library ones read()/write().
Note2: removing a connection is done by WMDestroyConnection(), while
WMCloseConnection() only closes the socket, and removed any pending
queues and timers on the connection.

View File

@@ -1,5 +0,0 @@
Makefile Makefile.in
connect server fontl puzzle UserTime.plist
colorpick
.libs
.psrc .inslog2 tca.map tca.log pchdir *.rpt

View File

@@ -1,32 +0,0 @@
## automake input file for WINGs - Examples
AUTOMAKE_OPTIONS = no-dependencies
noinst_PROGRAMS = connect server fontl puzzle colorpick
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
@XFTLIBS@ @INTLIBS@
colorpick_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
fontl_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
puzzle_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
connect_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.a
connect_LDADD = $(top_builddir)/WINGs/libWUtil.a @LIBRARY_SEARCH_PATH@ \
@NETLIBS@ @INTLIBS@
server_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.a
server_LDADD = $(top_builddir)/WINGs/libWUtil.a @LIBRARY_SEARCH_PATH@ \
@NETLIBS@ @INTLIBS@
INCLUDES = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG

View File

@@ -1,19 +0,0 @@
Files:
-----
server - server example of using WMConnection. It keeps a database of
timeouts for a group of users, allowing one to add/remove
users and update the timeouts associated with them.
connect - client example of using WMConnection. Works with the server
program above. Just start both without any parameter and
type help in the client to find out how to operate them.
Rest is self explanatory.
puzzle - a nice zuPzel =)
fontl - a map of all characters with their corresponding ascii,
hex, decimal and octal representations.

View File

@@ -1,42 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <WINGs/WINGs.h>
void showSelectedColor(void *self, void *cdata)
{
WMColorPanel *panel= (WMColorPanel*)self;
printf("Selected Color: %s\n", WMGetColorRGBDescription(WMGetColorPanelColor(panel)));
}
int main(int argc, char **argv)
{
Display *dpy;
WMScreen *scr;
WMInitializeApplication("wmcolorpick", &argc, argv);
dpy = XOpenDisplay("");
if (!dpy) {
printf("could not open display\n");
exit(1);
}
scr = WMCreateScreen(dpy, DefaultScreen(dpy));
{
WMColorPanel *panel= WMGetColorPanel(scr);
WMSetColorPanelAction(panel, showSelectedColor, NULL);
WMShowColorPanel(panel);
}
WMScreenMainLoop(scr);
return 0;
}

View File

@@ -1,198 +0,0 @@
/*
* WINGs connect.c: example how to create a network client using WMConnection
*
* Copyright (c) 1999-2003 Dan Pascu
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <WINGs/WINGs.h>
static int initialized = 0;
static void didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr);
static void connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr);
static void didInitialize(ConnectionDelegate *self, WMConnection *cPtr);
static ConnectionDelegate socketDelegate = {
NULL, /* data */
NULL, /* canResumeSending */
NULL, /* didCatchException */
connectionDidDie, /* didDie */
didInitialize, /* didInitialize */
didReceiveInput, /* didReceiveInput */
NULL /* didTimeout */
};
void
wAbort(Bool foo)
{
exit(1);
}
static char*
getMessage(WMConnection *cPtr)
{
char *buffer;
WMData *aData;
int length;
aData = WMGetConnectionAvailableData(cPtr);
if (!aData)
return NULL;
if ((length=WMGetDataLength(aData))==0) {
WMReleaseData(aData);
return NULL;
}
buffer = (char*)wmalloc(length+1);
WMGetDataBytes(aData, buffer);
buffer[length]= '\0';
WMReleaseData(aData);
return buffer;
}
static void
inputHandler(int fd, int mask, void *clientData)
{
WMConnection *cPtr = (WMConnection*)clientData;
WMData *aData;
char buf[4096];
int n;
if (!initialized)
return;
n = read(fd, buf, 4096);
if (n>0) {
aData = WMCreateDataWithBytes(buf, n);
WMSendConnectionData(cPtr, aData);
WMReleaseData(aData);
}
}
static void
didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr)
{
char *buffer;
buffer = getMessage(cPtr);
if (!buffer) {
fprintf(stderr, "Connection closed by peer.\n");
exit(0);
}
printf("%s", buffer);
wfree(buffer);
}
static void
connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr)
{
WMCloseConnection(cPtr);
fprintf(stderr, "Connection closed by peer.\n");
exit(0);
}
static void
didInitialize(ConnectionDelegate *self, WMConnection *cPtr)
{
int state = WMGetConnectionState(cPtr);
WMHost *host;
if (state == WCConnected) {
host = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
fprintf(stderr, "connected to '%s:%s'\n",
host?WMGetHostName(host):WMGetConnectionAddress(cPtr),
WMGetConnectionService(cPtr));
initialized = 1;
if (host)
WMReleaseHost(host);
return;
} else {
wsyserrorwithcode(WCErrorCode, "Unable to connect");
exit(1);
}
}
int
main(int argc, char **argv)
{
char *ProgName, *host, *port;
int i;
WMConnection *sPtr;
wsetabort(wAbort);
WMInitializeApplication("connect", &argc, argv);
ProgName = strrchr(argv[0],'/');
if (!ProgName)
ProgName = argv[0];
else
ProgName++;
host = NULL;
port = "34567";
if (argc>1) {
for (i=1; i<argc; i++) {
if (strcmp(argv[i], "--help")==0 || strcmp(argv[i], "-h")==0) {
printf("usage: %s [host [port]]\n\n", ProgName);
exit(0);
} else {
if (!host)
host = argv[i];
else
port = argv[i];
}
}
}
printf("Trying to make connection to '%s:%s'\n",
host?host:"localhost", port);
sPtr = WMCreateConnectionToAddressAndNotify(host, port, NULL);
if (!sPtr) {
wfatal("could not create connection. exiting");
exit(1);
}
WMSetConnectionDelegate(sPtr, &socketDelegate);
/* watch what user types and send it over the connection */
WMAddInputHandler(0, WIReadMask, inputHandler, sPtr);
while (1) {
WHandleEvents();
}
return 0;
}

View File

@@ -1,245 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <WINGs/WINGs.h>
#define MAX_SIZE 10*10
WMWindow *win;
WMButton *Button[MAX_SIZE];
char Map[MAX_SIZE];
int Size = 4;
int MoveCount;
#define MAP(x,y) Map[(x)+(y)*Size]
int WinSize = 120;
Bool
CheckWin(void)
{
int i;
for (i = 0; i < Size*Size-1; i++) {
if (Map[i] != i)
return False;
}
return True;
}
void
MoveButton(int button, int x, int y)
{
WMMoveWidget(Button[button], x*(WinSize/Size), y*(WinSize/Size));
}
Bool
SlideButton(int button)
{
int x=0, y=0, done = 0;
/* locate the button */
for (y = 0; y < Size; y++) {
for (x = 0; x < Size; x++) {
if (MAP(x,y) == button) {
done = 1;
break;
}
}
if (done)
break;
}
if (x > 0 && MAP(x-1, y) < 0) {
MAP(x,y) = -1;
MoveButton(button, x-1, y);
MAP(x-1,y) = button;
} else if (x < Size-1 && MAP(x+1, y) < 0) {
MAP(x,y) = -1;
MoveButton(button, x+1, y);
MAP(x+1,y) = button;
} else if (y > 0 && MAP(x, y-1) < 0) {
MAP(x,y) = -1;
MoveButton(button, x, y-1);
MAP(x,y-1) = button;
} else if (y < Size-1 && MAP(x, y+1) < 0) {
MAP(x,y) = -1;
MoveButton(button, x, y+1);
MAP(x,y+1) = button;
} else {
return False;
}
return True;
}
#define SWAP(a,b) {int tmp; tmp=a; a=b; b=tmp;}
void ResetGame(void)
{
int i, x, y, ox, oy;
MoveCount = 0;
for (i = 0; i < Size*Size-1; i++) {
Map[i] = i;
}
Map[i] = -1;
ox = x = Size-1;
oy = y = Size-1;
for (i = 0; i < 1000; i++) {
int ok;
ok = 1;
switch (rand()%4) {
case 0:
if (x > 0) x--; else ok = 0;
break;
case 2:
if (x < Size-1) x++; else ok = 0;
break;
case 1:
if (y > 0) y--; else ok = 0;
break;
case 3:
if (y < Size-1) y++; else ok = 0;
break;
}
if (ok) {
MoveButton(MAP(x,y), ox, oy);
SWAP(MAP(ox, oy), MAP(x, y));
while (XPending(WMScreenDisplay(WMWidgetScreen(win)))) {
XEvent ev;
WMNextEvent(WMScreenDisplay(WMWidgetScreen(win)), &ev);
WMHandleEvent(&ev);
}
ox = x;
oy = y;
}
}
}
void buttonClick(WMWidget *w, void *ptr)
{
char buffer[300];
if (SlideButton((int)ptr)) {
MoveCount++;
if (CheckWin()) {
sprintf(buffer, "You finished the game in %i moves.", MoveCount);
if (WMRunAlertPanel(WMWidgetScreen(w), win, "You Won!", buffer,
"Wee!", "Gah! Lemme retry!", NULL) == WAPRDefault) {
exit(0);
}
ResetGame();
}
}
}
static void resizeObserver(void *self, WMNotification *notif)
{
WMSize size = WMGetViewSize(WMWidgetView(win));
int x, y;
WinSize = size.width;
for (y = 0; y < Size; y++) {
for (x = 0; x < Size; x++) {
if (MAP(x,y) >= 0) {
WMResizeWidget(Button[(int)MAP(x,y)],
WinSize/Size, WinSize/Size);
WMMoveWidget(Button[(int)MAP(x,y)],
x*(WinSize/Size), y*(WinSize/Size));
}
}
}
}
int main(int argc, char **argv)
{
Display *dpy;
WMScreen *scr;
int x, y, i;
WMInitializeApplication("Puzzle", &argc, argv);
dpy = XOpenDisplay("");
if (!dpy) {
printf("could not open display\n");
exit(1);
}
scr = WMCreateScreen(dpy, DefaultScreen(dpy));
win = WMCreateWindow(scr, "puzzle");
WMResizeWidget(win, WinSize, WinSize);
WMSetWindowTitle(win, "zuPzel");
WMSetWindowMinSize(win, 80, 80);
WMSetWindowAspectRatio(win, 2, 2, 2, 2);
WMSetWindowResizeIncrements(win, Size, Size);
WMSetViewNotifySizeChanges(WMWidgetView(win), True);
WMAddNotificationObserver(resizeObserver, NULL,
WMViewSizeDidChangeNotification,
WMWidgetView(win));
for (i = y = 0; y < Size && i < Size*Size-1; y++) {
for (x = 0; x < Size && i < Size*Size-1; x++) {
char buf[32];
WMColor *color;
RColor col;
RHSVColor hsv;
hsv.hue = i*360/(Size*Size-1);
hsv.saturation = 120;
hsv.value = 200;
RHSVtoRGB(&hsv, &col);
color = WMCreateRGBColor(scr, col.red<<8, col.green<<8,
col.blue<<8, False);
MAP(x,y) = i;
Button[i] = WMCreateButton(win, WBTMomentaryLight);
WMSetWidgetBackgroundColor(Button[i], color);
WMReleaseColor(color);
WMSetButtonAction(Button[i], buttonClick, (void*)i);
WMResizeWidget(Button[i], WinSize/Size, WinSize/Size);
WMMoveWidget(Button[i], x*(WinSize/Size), y*(WinSize/Size));
sprintf(buf, "%i", i+1);
WMSetButtonText(Button[i], buf);
WMSetButtonTextAlignment(Button[i], WACenter);
i++;
}
}
WMMapSubwidgets(win);
WMMapWidget(win);
WMRealizeWidget(win);
ResetGame();
WMScreenMainLoop(scr);
return 0;
}

View File

@@ -1,740 +0,0 @@
/*
* WINGs server.c: example how to create a network server using WMConnection
*
* Copyright (c) 2001-2003 Dan Pascu
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <WINGs/WINGs.h>
#define _(P) P
#define MAXCMD_SIZE 512
char *SEConnectionShouldBeRemovedNotification = "SEConnectionShouldBeRemovedNotification";
static void didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr);
static void connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr);
static void connectionDidTimeout(ConnectionDelegate *self, WMConnection *cPtr);
extern char *SEConnectionShouldBeRemovedNotification;
static WMUserDefaults *timeDB = NULL;
static char *ServerAddress = NULL;
static char *ServerPort = NULL;
static WMArray *allowedHostList = NULL;
static WMArray *clientConnections = NULL;
static WMConnection *serverPtr = NULL;
static ConnectionDelegate socketDelegate = {
NULL, /* client data */
NULL, /* canResumeSending */
NULL, /* didCatchException */
connectionDidDie, /* didDie */
NULL, /* didInitialize */
didReceiveInput, /* didReceiveInput */
connectionDidTimeout /* didTimeout */
};
void
wAbort(Bool foo)
{
exit(1);
}
static void
printHelp(char *progname)
{
printf(_("usage: %s [options]\n\n"), progname);
puts(_(" --help print this message"));
puts(_(" --listen [address:]port only listen on the specified address/port"));
puts(_(" --allow host1[,host2...] only allow connections from listed hosts\n"));
puts(_(" By default server listens on all interfaces and port 34567, unless"
" something\nelse is specified with the --listen option. If address is"
" omitted or the keyword\n'Any' is used, it will listen on all interfaces else"
" only on the specified one.\n\nFor example --listen localhost: will"
" listen on the default port 34567, but only\non connections comming"
" in through the loopback interface.\n\n Also by default the server"
" listens to incoming connections from any host,\nunless a list of"
" hosts is given with the --allow option, in which case it will\nreject"
" connections not comming from those hosts.\nThe list of hosts is comma"
" separated and should NOT contain ANY spaces."));
}
static void
enqueueConnectionForRemoval(WMConnection *cPtr)
{
WMNotification *notif;
/*don't release notif here. it will be released by queue after processing */
notif = WMCreateNotification(SEConnectionShouldBeRemovedNotification,
cPtr, NULL);
WMEnqueueNotification(WMGetDefaultNotificationQueue(), notif, WMPostASAP);
}
static int
sendMessage(WMConnection *cPtr, char *message)
{
WMData *aData;
int res;
if (WMGetConnectionState(cPtr)!=WCConnected)
return -1;
aData = WMCreateDataWithBytes(message, strlen(message));
res = WMSendConnectionData(cPtr, aData);
WMReleaseData(aData);
return res;
}
static Bool
enqueueMessage(WMConnection *cPtr, char *message)
{
WMData *aData;
Bool res;
if (WMGetConnectionState(cPtr)!=WCConnected)
return False;
aData = WMCreateDataWithBytes(message, strlen(message));
res = WMEnqueueConnectionData(cPtr, aData);
WMReleaseData(aData);
return res;
}
static unsigned char*
findDelimiter(unsigned char *data, unsigned const char *endPtr)
{
wassertrv(data < endPtr, NULL);
while (data<endPtr && *data!='\n' && *data!='\r' && *data!=';' && *data!='\0')
data++;
if (data < endPtr)
return data;
return NULL;
}
static WMArray*
getAvailableMessages(WMConnection *cPtr)
{
char *ptr, *crtPos, *buffer;
const char *bytes, *endPtr;
WMData *aData, *receivedData, *holdData;
WMRange range;
WMArray *messages;
int length;
receivedData = WMGetConnectionAvailableData(cPtr);
if (!receivedData)
return NULL;
if ((length=WMGetDataLength(receivedData))==0) {
WMReleaseData(receivedData);
return NULL;
}
holdData = (WMData*)WMGetConnectionClientData(cPtr);
if (holdData) {
WMAppendData(holdData, receivedData);
WMReleaseData(receivedData);
WMSetConnectionClientData(cPtr, NULL);
aData = holdData;
} else {
aData = receivedData;
}
length = WMGetDataLength(aData);
bytes = (char*)WMDataBytes(aData);
endPtr = bytes + length;
messages = WMCreateArrayWithDestructor(1, wfree);
crtPos = (char*)bytes;
while (crtPos<endPtr && (ptr = findDelimiter(crtPos, endPtr))!=NULL) {
range.position = (crtPos - bytes);
range.count = (ptr - crtPos);
if (range.count > MAXCMD_SIZE) {
/* Hmmm... The message is too long. Possibly that someone is
* flooding us, or there is a dumb client which do not know
* who is talking to. */
sendMessage(cPtr, "Command too long\n\r");
WMFreeArray(messages);
WMReleaseData(aData);
WMCloseConnection(cPtr);
enqueueConnectionForRemoval(cPtr);
return NULL;
}
buffer = wmalloc(range.count+1);
WMGetDataBytesWithRange(aData, buffer, range);
buffer[range.count] = '\0';
WMAddToArray(messages, buffer);
crtPos = ptr;
while (crtPos<endPtr && (*crtPos=='\n' || *crtPos=='\r' ||
*crtPos=='\t' || *crtPos=='\0' ||
*crtPos==';' || *crtPos==' ')) {
crtPos++;
}
}
if (crtPos<endPtr) {
range.position = (crtPos - bytes);
range.count = (endPtr - crtPos);
if (range.count > MAXCMD_SIZE) {
/* Flooooooding!!!! */
sendMessage(cPtr, "Message too long\n\r");
WMFreeArray(messages);
WMReleaseData(aData);
WMCloseConnection(cPtr);
enqueueConnectionForRemoval(cPtr);
return NULL;
}
holdData = WMGetSubdataWithRange(aData, range);
WMSetConnectionClientData(cPtr, holdData);
}
WMReleaseData(aData);
if (WMGetArrayItemCount(messages)==0) {
WMFreeArray(messages);
messages = NULL;
}
return messages;
}
static void
complainAboutBadArgs(WMConnection *cPtr, char *cmdName, char *badArgs)
{
char *buf = wmalloc(strlen(cmdName) + strlen(badArgs) + 100);
sprintf(buf, _("Invalid parameters '%s' for command %s. Use HELP for"
" a list of commands.\n"), badArgs, cmdName);
sendMessage(cPtr, buf);
wfree(buf);
}
static void
sendUpdateMessage(WMConnection *cPtr, char *id, int time)
{
char *buf = wmalloc(strlen(id) + 100);
sprintf(buf, "%s has %i minutes left\n", id, time);
sendMessage(cPtr, buf);
wfree(buf);
}
static void
showId(WMConnection *cPtr)
{
sendMessage(cPtr, "Server example based on WMConnection\n");
}
static void
showHelp(WMConnection *cPtr)
{
char *buf = wmalloc(strlen(WMGetApplicationName()) + 16);
sprintf(buf, _("%s commands:\n\n"), WMGetApplicationName());
enqueueMessage(cPtr, _("\n"));
enqueueMessage(cPtr, buf);
enqueueMessage(cPtr, _("GET <id>\t- return time left (in minutes) "
"for user with id <id>\n"));
enqueueMessage(cPtr, _("SET <id> <time>\t- set time limit to <time> "
"minutes for user with id <id>\n"));
enqueueMessage(cPtr, _("ADD <id> <time>\t- add <time> minutes "
"for user with id <id>\n"));
enqueueMessage(cPtr, _("SUB <id> <time>\t- subtract <time> minutes "
"for user with id <id>\n"));
enqueueMessage(cPtr, _("REMOVE <id>\t- remove time limitations for "
"user with id <id>\n"));
enqueueMessage(cPtr, _("LIST\t\t- list all users and their "
"corresponding time limit\n"));
enqueueMessage(cPtr, _("ID\t\t- returns the Time Manager "
"identification string\n"));
enqueueMessage(cPtr, _("EXIT\t\t- exits session\n"));
enqueueMessage(cPtr, _("QUIT\t\t- exits session\n"));
enqueueMessage(cPtr, _("HELP\t\t- show this message\n\n"));
/* Just flush the queue we made before */
WMFlushConnection(cPtr);
wfree(buf);
}
static void
listUsers(WMConnection *cPtr)
{
WMPropList *userList;
char *id;
int i, time;
userList = WMGetUDKeys(timeDB);
for (i=0; i<WMGetPropListItemCount(userList); i++) {
id = WMGetFromPLString(WMGetFromPLArray(userList, i));
time = WMGetUDIntegerForKey(timeDB, id);
sendUpdateMessage(cPtr, id, time);
}
WMReleasePropList(userList);
}
static void
setTimeForUser(WMConnection *cPtr, char *cmdArgs)
{
char *id;
int i, time;
id = wmalloc(strlen(cmdArgs));
if (sscanf(cmdArgs, "%s %d", id, &time)!=2) {
complainAboutBadArgs(cPtr, "SET", cmdArgs);
wfree(id);
return;
}
if (time<0)
time = 0;
WMSetUDIntegerForKey(timeDB, time, id);
for (i=0; i<WMGetArrayItemCount(clientConnections); i++) {
cPtr = WMGetFromArray(clientConnections, i);
sendUpdateMessage(cPtr, id, time);
}
wfree(id);
}
static void
addTimeToUser(WMConnection *cPtr, char *cmdArgs)
{
char *id;
int i, time, newTime;
id = wmalloc(strlen(cmdArgs));
if (sscanf(cmdArgs, "%s %d", id, &time)!=2) {
complainAboutBadArgs(cPtr, "ADD", cmdArgs);
wfree(id);
return;
}
newTime = WMGetUDIntegerForKey(timeDB, id) + time;
if (newTime<0)
newTime = 0;
WMSetUDIntegerForKey(timeDB, newTime, id);
for (i=0; i<WMGetArrayItemCount(clientConnections); i++) {
cPtr = WMGetFromArray(clientConnections, i);
sendUpdateMessage(cPtr, id, newTime);
}
wfree(id);
}
static void
subTimeFromUser(WMConnection *cPtr, char *cmdArgs)
{
char *id;
int i, time, newTime;
id = wmalloc(strlen(cmdArgs));
if (sscanf(cmdArgs, "%s %d", id, &time)!=2) {
complainAboutBadArgs(cPtr, "SUB", cmdArgs);
wfree(id);
return;
}
newTime = WMGetUDIntegerForKey(timeDB, id) - time;
if (newTime<0)
newTime = 0;
WMSetUDIntegerForKey(timeDB, newTime, id);
for (i=0; i<WMGetArrayItemCount(clientConnections); i++) {
cPtr = WMGetFromArray(clientConnections, i);
sendUpdateMessage(cPtr, id, newTime);
}
wfree(id);
}
static void
removeTimeForUser(WMConnection *cPtr, char *cmdArgs)
{
char *ptr;
int i;
if (cmdArgs[0]=='\0') {
sendMessage(cPtr, _("Missing parameter for command REMOVE."
" Use HELP for a list of commands.\n"));
return;
}
ptr = cmdArgs;
while (*ptr && *ptr!=' ' && *ptr!='\t')
ptr++;
*ptr = '\0';
WMRemoveUDObjectForKey(timeDB, cmdArgs);
for (i=0; i<WMGetArrayItemCount(clientConnections); i++) {
cPtr = WMGetFromArray(clientConnections, i);
sendUpdateMessage(cPtr, cmdArgs, -1);
}
}
static void
getTimeForUser(WMConnection *cPtr, char *cmdArgs)
{
char *ptr;
int time;
if (cmdArgs[0]=='\0') {
sendMessage(cPtr, _("Missing parameter for command GET."
" Use HELP for a list of commands.\n"));
return;
}
ptr = cmdArgs;
while (*ptr && *ptr!=' ' && *ptr!='\t')
ptr++;
*ptr = '\0';
if (WMGetUDObjectForKey(timeDB, cmdArgs)!=NULL)
time = WMGetUDIntegerForKey(timeDB, cmdArgs);
else
time = -1;
sendUpdateMessage(cPtr, cmdArgs, time);
}
static void
handleConnection(WMConnection *cPtr)
{
char *command, *ptr, *cmdArgs, *buffer;
WMArray *commands;
int i;
commands = getAvailableMessages(cPtr);
if (!commands)
return;
for (i=0; i<WMGetArrayItemCount(commands); i++) {
command = WMGetFromArray(commands, i);
while (*command && (*command==' ' || *command=='\t'))
command++;
ptr = command;
while(*ptr && *ptr!=' ' && *ptr!='\t')
ptr++;
if (*ptr) {
*ptr = '\0';
ptr++;
}
while (*ptr && (*ptr==' ' || *ptr=='\t'))
ptr++;
cmdArgs = ptr;
fprintf(stderr, "Command: '%s', args: '%s'\n", command, cmdArgs);
if (strcasecmp(command, "quit")==0 || strcasecmp(command, "exit")==0) {
sendMessage(cPtr, "Bye\n");
WMCloseConnection(cPtr);
enqueueConnectionForRemoval(cPtr);
WMFreeArray(commands);
return;
} else if (strcasecmp(command, "id")==0) {
showId(cPtr);
} else if (strcasecmp(command, "help")==0) {
showHelp(cPtr);
} else if (strcasecmp(command, "list")==0) {
listUsers(cPtr);
} else if (strcasecmp(command, "set")==0) {
setTimeForUser(cPtr, cmdArgs);
} else if (strcasecmp(command, "add")==0) {
addTimeToUser(cPtr, cmdArgs);
} else if (strcasecmp(command, "sub")==0) {
subTimeFromUser(cPtr, cmdArgs);
} else if (strcasecmp(command, "remove")==0) {
removeTimeForUser(cPtr, cmdArgs);
} else if (strcasecmp(command, "get")==0) {
getTimeForUser(cPtr, cmdArgs);
} else {
buffer = wmalloc(strlen(command) + 100);
sprintf(buffer, _("Unknown command '%s'. Try HELP for"
" a list of commands.\n"), command);
sendMessage(cPtr, buffer);
wfree(buffer);
}
}
WMFreeArray(commands);
}
static Bool
isAllowedToConnect(WMConnection *cPtr)
{
WMHost *hPtr;
int i;
if (allowedHostList == NULL)
return True; /* No list. Allow all by default */
hPtr = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
for (i=0; i<WMGetArrayItemCount(allowedHostList); i++) {
if (WMIsHostEqualToHost(hPtr, WMGetFromArray(allowedHostList, i))) {
WMReleaseHost(hPtr);
return True;
}
}
WMReleaseHost(hPtr);
return False;
}
static void
didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr)
{
if (cPtr == serverPtr) {
WMConnection *newPtr = WMAcceptConnection(cPtr);
if (newPtr) {
if (isAllowedToConnect(newPtr)) {
WMSetConnectionDelegate(newPtr, &socketDelegate);
WMSetConnectionSendTimeout(newPtr, 120);
WMAddToArray(clientConnections, newPtr);
} else {
sendMessage(newPtr, "Sorry, you are not allowed to connect.\n");
WMDestroyConnection(newPtr);
}
}
} else {
/* Data arriving on an already-connected socket */
handleConnection(cPtr);
}
}
static void
connectionDidTimeout(ConnectionDelegate *self, WMConnection *cPtr)
{
WMHost *hPtr;
if (cPtr == serverPtr) {
wfatal(_("The server listening socket did timeout. Exiting."));
exit(1);
}
hPtr = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
wwarning(_("Connection with %s did timeout. Closing connection."),
WMGetHostName(hPtr));
WMReleaseHost(hPtr);
enqueueConnectionForRemoval(cPtr);
}
static void
connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr)
{
if (cPtr == serverPtr) {
/* trouble. server listening port itself died!!! */
wfatal(_("The server listening socket died. Exiting."));
exit(1);
}
enqueueConnectionForRemoval(cPtr);
}
static void
removeConnection(void *observer, WMNotification *notification)
{
WMConnection *cPtr = (WMConnection*)WMGetNotificationObject(notification);
WMData *data;
WMRemoveFromArray(clientConnections, cPtr);
if ((data = (WMData*)WMGetConnectionClientData(cPtr))!=NULL)
WMReleaseData(data);
WMDestroyConnection(cPtr);
}
static void
updatedDomain(void *observer, WMNotification *notification)
{
wmessage("defaults domain file changed on disk. synchronizing.");
}
#if 0
static Bool
isDifferent(char *str1, char *str2)
{
if ((!str1 && !str2) || (str1 && str2 && strcmp(str1, str2)==0))
return False;
return True;
}
#endif
int
main(int argc, char **argv)
{
int i;
wsetabort(wAbort);
WMInitializeApplication("server", &argc, argv);
if (argc>1) {
for (i=1; i<argc; i++) {
if (strcmp(argv[i], "--help")==0) {
printHelp(argv[0]);
exit(0);
} else if (strcmp(argv[i], "--listen")==0) {
char *p;
if ((p = strchr(argv[++i], ':')) != NULL) {
*p = 0;
ServerAddress = wstrdup(argv[i]);
ServerPort = wstrdup(p+1);
*p = ':';
if (ServerAddress[0] == 0) {
wfree(ServerAddress);
ServerAddress = NULL;
}
if (ServerPort[0] == 0) {
wfree(ServerPort);
ServerPort = "34567";
}
} else if (argv[i][0]!=0) {
ServerPort = argv[i];
}
} else if (strcmp(argv[i], "--allow")==0) {
char *p, *ptr;
int done;
WMHost *hPtr;
ptr = argv[++i];
done = 0;
while (!done) {
if ((p = strchr(ptr, ',')) != NULL) {
*p = 0;
}
if (*ptr != 0) {
hPtr = WMGetHostWithName(ptr);
if (hPtr) {
if (!allowedHostList)
allowedHostList = WMCreateArray(4);
WMAddToArray(allowedHostList, hPtr);
} else {
wwarning(_("Unknown host '%s'. Ignored."), ptr);
}
}
if (p!=NULL) {
*p = ',';
ptr = p+1;
} else {
done = 1;
}
}
} else {
printf(_("%s: invalid argument '%s'\n"), argv[0], argv[i]);
printf(_("Try '%s --help' for more information\n"), argv[0]);
exit(1);
}
}
}
timeDB = WMGetDefaultsFromPath("./UserTime.plist");
WMAddNotificationObserver(updatedDomain, NULL,
WMUserDefaultsDidChangeNotification, NULL);
clientConnections = WMCreateArray(4);
/* A NULL ServerAddress means to listen on any address the host has.
* Else if ServerAddress points to a specific address (like "localhost",
* "host.domain.com" or "192.168.1.1"), then it will only listen on that
* interface and ignore incoming connections on the others. */
if (ServerAddress && strcasecmp(ServerAddress, "Any")==0)
ServerAddress = NULL;
if (ServerPort==NULL)
ServerPort = "34567";
printf("Server will listen on '%s:%s'\n", ServerAddress?ServerAddress:"Any",
ServerPort);
printf("This server will allow connections from:");
if (allowedHostList) {
int i;
char *hName;
for (i=0; i<WMGetArrayItemCount(allowedHostList); i++) {
hName = WMGetHostName(WMGetFromArray(allowedHostList, i));
printf("%s'%s'", i==0?" ":", ", hName);
}
printf(".\n");
} else {
printf(" any host.\n");
}
serverPtr = WMCreateConnectionAsServerAtAddress(ServerAddress, ServerPort,
NULL);
if (!serverPtr) {
wfatal("could not create server on `%s:%s`. Exiting.",
ServerAddress ? ServerAddress : "localhost", ServerPort);
exit(1);
}
WMSetConnectionDelegate(serverPtr, &socketDelegate);
WMAddNotificationObserver(removeConnection, NULL,
SEConnectionShouldBeRemovedNotification, NULL);
while (1) {
/* The ASAP notification queue is called at the end of WHandleEvents()
* There's where died connections we get while running through
* WHandleEvents() get removed. */
WHandleEvents();
}
return 0;
}

View File

@@ -1,4 +0,0 @@
Makefile Makefile.in
.libs
test
.psrc .inslog2 tca.map tca.log pchdir *.rpt

View File

@@ -1,34 +0,0 @@
## automake input file for WINGs
AUTOMAKE_OPTIONS = no-dependencies
# is this a kluge? if so, how should i do it?
includedir = @includedir@/WINGs
include_HEADERS = wtableview.h wtabledelegates.h
lib_LIBRARIES = libExtraWINGs.a
noinst_PROGRAMS = test
EXTRA_DIST =
libExtraWINGs_a_SOURCES = \
wtableview.c \
wtabledelegates.c \
wtableview.h \
wtabledelegates.h
AM_CFLAGS = @NOSTRICTALIASING@
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
@XFTLIBS@ @INTLIBS@
test_LDADD = wtableview.o wtabledelegates.o $(LDADD)

View File

@@ -1,140 +0,0 @@
#include <WINGs/WINGs.h>
#include <stdio.h>
#include "wtableview.h"
#include "wtabledelegates.h"
static char *col1[20] = {0};
static int col2[20];
static char *options[] = {
"Option1",
"Option2",
"Option3",
"Option4",
"Option5"
};
int
numberOfRows(WMTableViewDelegate *self, WMTableView *table)
{
return 20;
}
void*
valueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row)
{
/*WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column);*/
int i;
if (col1[0] == 0) {
for (i = 0; i < 20; i++) {
char buf[128];
sprintf(buf, "Test row %i", i);
col1[i] = wstrdup(buf);
col2[i] = 0;
}
}
if ((int)WMGetTableColumnId(column) == 1)
return col1[row];
else
return (void*)col2[row];
}
void
setValueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row,
void *data)
{
if ((int)WMGetTableColumnId(column) == 1)
col1[row] = data;
else
col2[row] = (int)data;
}
static WMTableViewDelegate delegate = {
NULL,
numberOfRows,
valueForCell,
setValueForCell
};
void
clickedTable(WMWidget *w, void *self)
{
int row = WMGetTableViewClickedRow((WMTableView*)self);
WMEditTableViewRow(self, row);
}
int
main(int argc, char **argv)
{
WMScreen *scr;
WMWindow *win;
WMTableView *table;
WMTableColumn *col;
WMTableColumnDelegate *colDeleg;
WMInitializeApplication("test", &argc, argv);
scr = WMOpenScreen(NULL);
XSynchronize(WMScreenDisplay(scr), 1);
win = WMCreateWindow(scr, "eweq");
WMResizeWidget(win, 400, 200);
WMMapWidget(win);
table = WMCreateTableView(win);
WMSetTableViewHasHorizontalScroller(table, 0);
WMSetViewExpandsToParent(WMWidgetView(table), 10, 10, 10, 10);
WMSetTableViewBackgroundColor(table, WMWhiteColor(scr));
/*WMSetTableViewGridColor(table, WMGrayColor(scr));*/
WMSetTableViewHeaderHeight(table, 20);
WMSetTableViewDelegate(table, &delegate);
WMSetTableViewAction(table, clickedTable, table);
colDeleg = WTCreateStringEditorDelegate(table);
col = WMCreateTableColumn("Group");
WMSetTableColumnWidth(col, 180);
WMAddTableViewColumn(table, col);
WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)1);
colDeleg = WTCreateEnumSelectorDelegate(table);
WTSetEnumSelectorOptions(colDeleg, options, 5);
col = WMCreateTableColumn("Package");
WMSetTableColumnWidth(col, 140);
WMAddTableViewColumn(table, col);
WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)2);
colDeleg = WTCreateBooleanSwitchDelegate(table);
col = WMCreateTableColumn("Bool");
WMSetTableColumnWidth(col, 50);
WMAddTableViewColumn(table, col);
WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)2);
WMMapWidget(table);
WMRealizeWidget(win);
WMScreenMainLoop(scr);
return 0;
}

View File

@@ -1,638 +0,0 @@
#include <WINGs/WINGsP.h>
#include "wtableview.h"
#include "wtabledelegates.h"
typedef struct {
WMTableView *table;
WMFont *font;
GC gc;
GC selGC;
WMColor *textColor;
} StringData;
typedef struct {
WMTableView *table;
GC selGc;
} PixmapData;
typedef struct {
WMTextField *widget;
WMTableView *table;
WMFont *font;
GC gc;
GC selGC;
WMColor *textColor;
} StringEditorData;
typedef struct {
WMPopUpButton *widget;
WMTableView *table;
WMFont *font;
char **options;
int count;
GC gc;
GC selGC;
WMColor *textColor;
} EnumSelectorData;
typedef struct {
WMButton *widget;
WMTableView *table;
Bool state;
GC gc;
GC selGC;
} BooleanSwitchData;
static char *SelectionColor = "#bbbbcc";
static void
stringDraw(WMScreen *scr, Drawable d, GC gc, GC sgc, WMColor *textColor,
WMFont *font, void *data, WMRect rect, Bool selected)
{
int x, y;
XRectangle rects[1];
Display *dpy = WMScreenDisplay(scr);
x = rect.pos.x + 5;
y = rect.pos.y + (rect.size.height - WMFontHeight(font))/2;
rects[0].x = rect.pos.x+1;
rects[0].y = rect.pos.y+1;
rects[0].width = rect.size.width-1;
rects[0].height = rect.size.height-1;
XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
if (!selected) {
XFillRectangles(dpy, d, gc, rects, 1);
WMDrawString(scr, d, textColor, font, x, y,
data, strlen(data));
} else {
XFillRectangles(dpy, d, sgc, rects, 1);
WMDrawString(scr, d, textColor, font, x, y,
data, strlen(data));
}
XSetClipMask(dpy, gc, None);
}
static void
pixmapDraw(WMScreen *scr, Drawable d, GC gc, GC sgc, WMPixmap *pixmap,
WMRect rect, Bool selected)
{
int x, y;
XRectangle rects[1];
Display *dpy = WMScreenDisplay(scr);
WMSize size;
rects[0].x = rect.pos.x+1;
rects[0].y = rect.pos.y+1;
rects[0].width = rect.size.width-1;
rects[0].height = rect.size.height-1;
XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
if (!selected) {
XFillRectangles(dpy, d, gc, rects, 1);
if (pixmap) {
size = WMGetPixmapSize(pixmap);
x = rect.pos.x + (rect.size.width - size.width) / 2;
y = rect.pos.y + (rect.size.height - size.height) / 2;
WMDrawPixmap(pixmap, d, x, y);
}
} else {
XFillRectangles(dpy, d, sgc, rects, 1);
if (pixmap) {
size = WMGetPixmapSize(pixmap);
x = rect.pos.x + (rect.size.width - size.width) / 2;
y = rect.pos.y + (rect.size.height - size.height) / 2;
WMDrawPixmap(pixmap, d, x, y);
}
}
XSetClipMask(dpy, gc, None);
}
/* ---------------------------------------------------------------------- */
static void
SECellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void
selectedSECellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
True);
}
static void
beginSECellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
void *data = WMTableViewDataForCell(strdata->table, column, row);
WMSetTextFieldText(strdata->widget, (char*)data);
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
WMResizeWidget(strdata->widget, rect.size.width+1, rect.size.height+1);
WMMapWidget(strdata->widget);
}
static void
endSECellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
char *text;
WMUnmapWidget(strdata->widget);
text = WMGetTextFieldText(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)text);
}
WMTableColumnDelegate*
WTCreateStringEditorDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
StringEditorData *data = wmalloc(sizeof(StringEditorData));
data->widget = WMCreateTextField(parent);
W_ReparentView(WMWidgetView(data->widget),
WMGetTableViewDocumentView(parent),
0, 0);
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->textColor = WMBlackColor(scr);
delegate->data = data;
delegate->drawCell = SECellPainter;
delegate->drawSelectedCell = selectedSECellPainter;
delegate->beginCellEdit = beginSECellEdit;
delegate->endCellEdit = endSECellEdit;
return delegate;
}
/* ---------------------------------------------------------------------- */
static void
ESCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
False);
}
static void
selectedESCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
True);
}
static void
beginESCellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int data = (int)WMTableViewDataForCell(strdata->table, column, row);
wassertr(data < strdata->count);
WMSetPopUpButtonSelectedItem(strdata->widget, data);
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
WMResizeWidget(strdata->widget, rect.size.width, rect.size.height+1);
WMMapWidget(strdata->widget);
}
static void
endESCellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
int option;
WMUnmapWidget(strdata->widget);
option = WMGetPopUpButtonSelectedItem(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)option);
}
WMTableColumnDelegate*
WTCreateEnumSelectorDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
data->widget = WMCreatePopUpButton(parent);
W_ReparentView(WMWidgetView(data->widget),
WMGetTableViewDocumentView(parent),
0, 0);
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->textColor = WMBlackColor(scr);
data->count = 0;
data->options = NULL;
delegate->data = data;
delegate->drawCell = ESCellPainter;
delegate->drawSelectedCell = selectedESCellPainter;
delegate->beginCellEdit = beginESCellEdit;
delegate->endCellEdit = endESCellEdit;
return delegate;
}
void
WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate, char **options,
int count)
{
EnumSelectorData *data = (EnumSelectorData*)delegate->data;
int i;
for (i = 0;
i < WMGetPopUpButtonNumberOfItems(data->widget);
i++) {
WMRemovePopUpButtonItem(data->widget, 0);
}
data->options = options;
data->count = count;
for (i = 0; i < count; i++) {
WMAddPopUpButtonItem(data->widget, options[i]);
}
}
/* ---------------------------------------------------------------------- */
static void
BSCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
WMScreen *scr = WMWidgetScreen(table);
if (i) {
pixmapDraw(scr, d,
strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
WMTableViewRectForCell(table, column, row), False);
} else {
pixmapDraw(scr, d,
strdata->gc, strdata->selGC, NULL,
WMTableViewRectForCell(table, column, row), False);
}
}
static void
selectedBSCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
WMScreen *scr = WMWidgetScreen(table);
if (i) {
pixmapDraw(scr, d,
strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
WMTableViewRectForCell(table, column, row), True);
} else {
pixmapDraw(scr, d,
strdata->gc, strdata->selGC, NULL,
WMTableViewRectForCell(table, column, row), True);
}
}
static void
beginBSCellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int data = (int)WMTableViewDataForCell(strdata->table, column, row);
WMSetButtonSelected(strdata->widget, data);
WMMoveWidget(strdata->widget, rect.pos.x+1, rect.pos.y+1);
WMResizeWidget(strdata->widget, rect.size.width-1, rect.size.height-1);
WMMapWidget(strdata->widget);
}
static void
endBSCellEdit(WMTableColumnDelegate *self, WMTableColumn *column, int row)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
int value;
value = WMGetButtonSelected(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)value);
WMUnmapWidget(strdata->widget);
}
WMTableColumnDelegate*
WTCreateBooleanSwitchDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
BooleanSwitchData *data = wmalloc(sizeof(BooleanSwitchData));
WMColor *color;
data->widget = WMCreateSwitchButton(parent);
W_ReparentView(WMWidgetView(data->widget),
WMGetTableViewDocumentView(parent),
0, 0);
WMSetButtonText(data->widget, NULL);
WMSetButtonImagePosition(data->widget, WIPImageOnly);
WMSetButtonImage(data->widget, NULL);
WMSetButtonAltImage(data->widget, WMGetSystemPixmap(scr, WSICheckMark));
data->table = parent;
color = WMCreateNamedColor(scr, SelectionColor, False);
WMSetWidgetBackgroundColor(data->widget, color);
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(color);
delegate->data = data;
delegate->drawCell = BSCellPainter;
delegate->drawSelectedCell = selectedBSCellPainter;
delegate->beginCellEdit = beginBSCellEdit;
delegate->endCellEdit = endBSCellEdit;
return delegate;
}
/* ---------------------------------------------------------------------- */
static void
SCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void
selectedSCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
True);
}
WMTableColumnDelegate*
WTCreateStringDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
StringData *data = wmalloc(sizeof(StringData));
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->textColor = WMBlackColor(scr);
delegate->data = data;
delegate->drawCell = SCellPainter;
delegate->drawSelectedCell = selectedSCellPainter;
delegate->beginCellEdit = NULL;
delegate->endCellEdit = NULL;
return delegate;
}
/* ---------------------------------------------------------------------- */
static void
PCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
pixmapDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC,
(WMPixmap*)WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void
selectedPCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
pixmapDraw(WMWidgetScreen(table), d,
strdata->gc, strdata->selGC,
(WMPixmap*)WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
True);
}
WMTableColumnDelegate*
WTCreatePixmapDelegate(WMTableView *table)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(table);
StringData *data = wmalloc(sizeof(StringData));
data->table = table;
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
delegate->data = data;
delegate->drawCell = PCellPainter;
delegate->drawSelectedCell = selectedPCellPainter;
delegate->beginCellEdit = NULL;
delegate->endCellEdit = NULL;
return delegate;
}
/* ---------------------------------------------------------------------- */
static void
drawPSCell(WMTableColumnDelegate *self, Drawable d, WMTableColumn *column,
int row, Bool selected)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
void **data;
WMPixmap *pix;
char *str;
WMRect rect;
WMSize size;
data = WMTableViewDataForCell(table, column, row);
str = (char*)data[0];
pix = (WMPixmap*)data[1];
rect = WMTableViewRectForCell(table, column, row);
if (pix) {
int owidth = rect.size.width;
size = WMGetPixmapSize(pix);
rect.size.width = size.width;
pixmapDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGC, pix, rect,
selected);
rect.pos.x += size.width-1;
rect.size.width = owidth-size.width+1;
}
stringDraw(WMWidgetScreen(table), d, strdata->gc, strdata->selGC,
strdata->textColor, strdata->font, str, rect, selected);
}
static void
PSCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
drawPSCell(self, d, column, row, False);
}
static void
selectedPSCellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row, Drawable d)
{
drawPSCell(self, d, column, row, True);
}
WMTableColumnDelegate*
WTCreatePixmapStringDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
StringData *data = wmalloc(sizeof(StringData));
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->gc = WMColorGC(WMWhiteColor(scr));
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->textColor = WMBlackColor(scr);
delegate->data = data;
delegate->drawCell = PSCellPainter;
delegate->drawSelectedCell = selectedPSCellPainter;
delegate->beginCellEdit = NULL;
delegate->endCellEdit = NULL;
return delegate;
}

View File

@@ -1,25 +0,0 @@
#ifndef _TABLEDELEGATES_H_
#define _TABLEDELEGATES_H_
#ifdef __cplusplus
extern "C" {
#endif
WMTableColumnDelegate *WTCreatePixmapDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreatePixmapStringDelegate(WMTableView *parent);
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *table);
void WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate,
char **options, int count);
WMTableColumnDelegate *WTCreateBooleanSwitchDelegate(WMTableView *parent);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +0,0 @@
#ifndef _WTABLEVIEW_H_
#define _WTABLEVIEW_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef struct W_TableColumn WMTableColumn;
typedef struct W_TableView WMTableView;
extern const char *WMTableViewSelectionDidChangeNotification;
typedef struct WMTableColumnDelegate {
void *data;
void (*drawCell)(struct WMTableColumnDelegate *self,
WMTableColumn *column, int row, Drawable d);
void (*drawSelectedCell)(struct WMTableColumnDelegate *self,
WMTableColumn *column, int row, Drawable d);
void (*beginCellEdit)(struct WMTableColumnDelegate *self, WMTableColumn *column,
int row);
void (*endCellEdit)(struct WMTableColumnDelegate *self, WMTableColumn *column,
int row);
} WMTableColumnDelegate;
typedef struct W_TableViewDelegate {
void *data;
int (*numberOfRows)(struct W_TableViewDelegate *self,
WMTableView *table);
void *(*valueForCell)(struct W_TableViewDelegate *self,
WMTableColumn *column, int row);
void (*setValueForCell)(struct W_TableViewDelegate *self,
WMTableColumn *column, int row, void *value);
} WMTableViewDelegate;
WMTableColumn *WMCreateTableColumn(char *title);
void WMSetTableColumnWidth(WMTableColumn *column, unsigned width);
void WMSetTableColumnConstraints(WMTableColumn *column,
unsigned minWidth, unsigned maxWidth);
void WMSetTableColumnDelegate(WMTableColumn *column,
WMTableColumnDelegate *delegate);
WMTableView *WMGetTableColumnTableView(WMTableColumn *column);
void WMSetTableColumnId(WMTableColumn *column, void *id);
void *WMGetTableColumnId(WMTableColumn *column);
WMTableView *WMCreateTableView(WMWidget *parent);
void WMSetTableViewDataSource(WMTableView *table, void *source);
void *WMGetTableViewDataSource(WMTableView *table);
void WMSetTableViewHeaderHeight(WMTableView *table, unsigned height);
void WMAddTableViewColumn(WMTableView *table, WMTableColumn *column);
void WMSetTableViewDelegate(WMTableView *table, WMTableViewDelegate *delegate);
void WMSetTableViewAction(WMTableView *table, WMAction *action,
void *clientData);
void *WMGetTableViewClickedColumn(WMTableView *table);
int WMGetTableViewClickedRow(WMTableView *table);
WMArray *WMGetTableViewSelectedRows(WMTableView *table);
WMView *WMGetTableViewDocumentView(WMTableView *table);
void WMEditTableViewRow(WMTableView *table, int row);
void WMSelectTableViewRow(WMTableView *table, int row);
void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row);
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data);
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row);
void WMSetTableViewBackgroundColor(WMTableView *table, WMColor *color);
void WMSetTableViewGridColor(WMTableView *table, WMColor *color);
void WMSetTableViewRowHeight(WMTableView *table, int height);
void WMReloadTableView(WMTableView *table);
void WMNoteTableViewNumberOfRowsChanged(WMTableView *table);
void WMScrollTableViewRowToVisible(WMTableView *table, int row);
void WMSetTableViewHasHorizontalScroller(WMTableView *tPtr, Bool flag);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -2,131 +2,89 @@
AUTOMAKE_OPTIONS = no-dependencies
SUBDIRS = WINGs . po Documentation Resources Examples Extras Tests
SUBDIRS = Resources
#libWINGs_la_LDFLAGS = -version-info 1:1:0
bin_SCRIPTS = get-wings-flags get-wutil-flags
lib_LIBRARIES = libWINGs.a libWUtil.a
LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
-lm @LIBPL_LIBS@
LDADD= libWINGs.a $(top_builddir)/wrlib/libwraster.la @INTLIBS@
lib_LIBRARIES = libWINGs.a
include_HEADERS = WINGs.h WUtil.h WINGsP.h
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
fontl_SOURCES = fontl.c
fontl_LDADD = -L. -lWINGs $(LIBLIST)
wtest_SOURCES = wtest.c
wtest_LDADD = -L. -lWINGs $(LIBLIST)
wtest_DEPENDENCIES = libWINGs.a
wmfile_SOURCES = wmfile.c
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
EXTRA_DIST = BUGS python/Makefile python/README python/WINGs.i \
python/WINGs.py python/setup.py python/test.py
wmquery_SOURCES = wmquery.c
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
EXTRA_DIST = logo.xpm
# wbutton.c
libWINGs_a_SOURCES = \
array.c \
bagtree.c \
WINGs.h \
WINGsP.h \
configuration.c \
connection.c \
data.c \
dragcommon.c \
dragdestination.c \
dragsource.c \
error.c \
findfile.c \
handlers.c \
hashtable.c \
host.c \
international.c \
memory.c \
misc.c \
notification.c \
proplist.c \
selection.c \
snprintf.c \
string.c \
tree.c \
userdefaults.c \
usleep.c \
wapplication.c \
wappresource.c \
wballoon.c \
wbox.c \
wbrowser.c \
wbutton.c \
wcolor.c \
wcolorpanel.c \
wcolorwell.c \
wconfig.h \
wevent.c \
wfilepanel.c \
wframe.c \
wfont.c \
wfontpanel.c \
widgets.c \
winputmethod.c \
wlabel.c \
wlist.c \
wmenuitem.c \
wmisc.c \
wpanel.c \
wpixmap.c \
wpopupbutton.c \
wprogressindicator.c \
wruler.c \
wscroller.c \
wscrollview.c \
wslider.c \
wsplitview.c \
wtabview.c \
wtext.c \
wtextfield.c \
wwindow.c \
wview.c \
wwindow.c
libWUtil_a_SOURCES = \
array.c \
bagtree.c \
connection.c \
data.c \
error.c \
findfile.c \
handlers.c \
hashtable.c \
host.c \
international.c \
memory.c \
misc.c \
notification.c \
proplist.c \
snprintf.c \
string.c \
tree.c \
userdefaults.c \
usleep.c \
wapplication.c \
wconfig.h \
wutil.c
usleep.c
##
## Find a better way than $(GFXFLAGS) to inform widgets.c wich of
## tiff or xpm images should be used
AM_CPPFLAGS = -DLOCALEDIR=\"$(NLSDIR)\"
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \
@LIBPL_INC_PATH@
AM_CFLAGS = @NOSTRICTALIASING@
INCLUDES = -I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFTFLAGS@ @HEADER_SEARCH_PATH@ -DDEBUG
wcolorpanel.o: wcolorpanel.c
$(COMPILE) -c -DRGBTXT="\"@X_LIBRARY_PATH@/X11/rgb.txt\"" $<
DISTCLEANFILES = WINGs.pc
install-exec-local:
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(libdir)/pkgconfig
@list='WINGs.pc'; for p in $$list; do \
if test -f $$p; then \
echo "$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/pkgconfig/"; \
$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/pkgconfig/; \
else :; fi; \
done

513
WINGs/Makefile.in Normal file
View File

@@ -0,0 +1,513 @@
# Makefile.in generated automatically by automake 1.3 from Makefile.am
# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
SHELL = /bin/sh
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
DISTDIR =
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_alias = @host_alias@
host_triplet = @host@
CC = @CC@
CPP_PATH = @CPP_PATH@
DFLAGS = @DFLAGS@
GFXFLAGS = @GFXFLAGS@
GFXLIBS = @GFXLIBS@
I18N = @I18N@
I18N_MB = @I18N_MB@
ICONEXT = @ICONEXT@
INTLIBS = @INTLIBS@
LIBPL_INC_PATH = @LIBPL_INC_PATH@
LIBPL_LIBS = @LIBPL_LIBS@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
MOFILES = @MOFILES@
NLSDIR = @NLSDIR@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
REDUCE_APPICONS = @REDUCE_APPICONS@
SHAPE = @SHAPE@
SOUND = @SOUND@
VERSION = @VERSION@
WPMOFILES = @WPMOFILES@
XCFLAGS = @XCFLAGS@
XGETTEXT = @XGETTEXT@
XLFLAGS = @XLFLAGS@
XLIBS = @XLIBS@
XSHM = @XSHM@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_LOCALE = @X_LOCALE@
pixmapdir = @pixmapdir@
wprefsdir = @wprefsdir@
AUTOMAKE_OPTIONS = no-dependencies
SUBDIRS = Resources
LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
-lm @LIBPL_LIBS@
lib_LIBRARIES = libWINGs.a
include_HEADERS = WINGs.h WUtil.h WINGsP.h
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
fontl_SOURCES = fontl.c
fontl_LDADD = -L. -lWINGs $(LIBLIST)
wtest_SOURCES = wtest.c
wtest_LDADD = -L. -lWINGs $(LIBLIST)
wtest_DEPENDENCIES = libWINGs.a
wmfile_SOURCES = wmfile.c
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
wmquery_SOURCES = wmquery.c
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
EXTRA_DIST = logo.xpm
# wbutton.c
libWINGs_a_SOURCES = \
WINGs.h \
WINGsP.h \
configuration.c \
international.c \
notification.c \
selection.c \
userdefaults.c \
wapplication.c \
wbrowser.c \
wbutton.c \
wcolor.c \
wcolorwell.c \
wevent.c \
wfilepanel.c \
wframe.c \
wfont.c \
wfontpanel.c \
widgets.c \
wlabel.c \
wlist.c \
wmisc.c \
wpanel.c \
wpixmap.c \
wpopupbutton.c \
wscroller.c \
wscrollview.c \
wslider.c \
wsplitview.c \
wtextfield.c \
wwindow.c \
wview.c \
error.c \
findfile.c \
hashtable.c \
memory.c \
usleep.c
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \
@LIBPL_INC_PATH@
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../src/config.h
CONFIG_CLEAN_FILES =
LIBRARIES = $(lib_LIBRARIES)
DEFS = @DEFS@ -I. -I$(srcdir) -I../src
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
libWINGs_a_LIBADD =
libWINGs_a_OBJECTS = configuration.o international.o notification.o \
selection.o userdefaults.o wapplication.o wbrowser.o wbutton.o wcolor.o \
wcolorwell.o wevent.o wfilepanel.o wframe.o wfont.o wfontpanel.o \
widgets.o wlabel.o wlist.o wmisc.o wpanel.o wpixmap.o wpopupbutton.o \
wscroller.o wscrollview.o wslider.o wsplitview.o wtextfield.o wwindow.o \
wview.o error.o findfile.o hashtable.o memory.o usleep.o
AR = ar
PROGRAMS = $(noinst_PROGRAMS)
wtest_OBJECTS = wtest.o
wtest_LDFLAGS =
wmquery_OBJECTS = wmquery.o
wmquery_DEPENDENCIES =
wmquery_LDFLAGS =
wmfile_OBJECTS = wmfile.o
wmfile_DEPENDENCIES =
wmfile_LDFLAGS =
fontl_OBJECTS = fontl.o
fontl_DEPENDENCIES =
fontl_LDFLAGS =
testmywidget_OBJECTS = testmywidget.o mywidget.o
testmywidget_DEPENDENCIES =
testmywidget_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
HEADERS = $(include_HEADERS)
DIST_COMMON = README ChangeLog Makefile.am Makefile.in TODO
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP = --best
SOURCES = $(libWINGs_a_SOURCES) $(wtest_SOURCES) $(wmquery_SOURCES) $(wmfile_SOURCES) $(fontl_SOURCES) $(testmywidget_SOURCES)
OBJECTS = $(libWINGs_a_OBJECTS) $(wtest_OBJECTS) $(wmquery_OBJECTS) $(wmfile_OBJECTS) $(fontl_OBJECTS) $(testmywidget_OBJECTS)
all: all-recursive all-am
.SUFFIXES:
.SUFFIXES: .S .c .o .s
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --gnu WINGs/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
mostlyclean-libLIBRARIES:
clean-libLIBRARIES:
-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
distclean-libLIBRARIES:
maintainer-clean-libLIBRARIES:
install-libLIBRARIES: $(lib_LIBRARIES)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(libdir)
list='$(lib_LIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
echo " $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p"; \
$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p; \
else :; fi; \
done
@$(POST_INSTALL)
@list='$(lib_LIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
echo " $(RANLIB) $(DESTDIR)$(libdir)/$$p"; \
$(RANLIB) $(DESTDIR)$(libdir)/$$p; \
else :; fi; \
done
uninstall-libLIBRARIES:
@$(NORMAL_UNINSTALL)
list='$(lib_LIBRARIES)'; for p in $$list; do \
rm -f $(DESTDIR)$(libdir)/$$p; \
done
.c.o:
$(COMPILE) -c $<
.s.o:
$(COMPILE) -c $<
.S.o:
$(COMPILE) -c $<
mostlyclean-compile:
-rm -f *.o core *.core
clean-compile:
distclean-compile:
-rm -f *.tab.c
maintainer-clean-compile:
libWINGs.a: $(libWINGs_a_OBJECTS) $(libWINGs_a_DEPENDENCIES)
-rm -f libWINGs.a
$(AR) cru libWINGs.a $(libWINGs_a_OBJECTS) $(libWINGs_a_LIBADD)
$(RANLIB) libWINGs.a
mostlyclean-noinstPROGRAMS:
clean-noinstPROGRAMS:
-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
distclean-noinstPROGRAMS:
maintainer-clean-noinstPROGRAMS:
wtest: $(wtest_OBJECTS) $(wtest_DEPENDENCIES)
@rm -f wtest
$(LINK) $(wtest_LDFLAGS) $(wtest_OBJECTS) $(wtest_LDADD) $(LIBS)
wmquery: $(wmquery_OBJECTS) $(wmquery_DEPENDENCIES)
@rm -f wmquery
$(LINK) $(wmquery_LDFLAGS) $(wmquery_OBJECTS) $(wmquery_LDADD) $(LIBS)
wmfile: $(wmfile_OBJECTS) $(wmfile_DEPENDENCIES)
@rm -f wmfile
$(LINK) $(wmfile_LDFLAGS) $(wmfile_OBJECTS) $(wmfile_LDADD) $(LIBS)
fontl: $(fontl_OBJECTS) $(fontl_DEPENDENCIES)
@rm -f fontl
$(LINK) $(fontl_LDFLAGS) $(fontl_OBJECTS) $(fontl_LDADD) $(LIBS)
testmywidget: $(testmywidget_OBJECTS) $(testmywidget_DEPENDENCIES)
@rm -f testmywidget
$(LINK) $(testmywidget_LDFLAGS) $(testmywidget_OBJECTS) $(testmywidget_LDADD) $(LIBS)
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(includedir)
@list='$(include_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \
done
uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
list='$(include_HEADERS)'; for p in $$list; do \
rm -f $(DESTDIR)$(includedir)/$$p; \
done
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
@SET_MAKE@
all-recursive install-data-recursive install-exec-recursive \
installdirs-recursive install-recursive uninstall-recursive \
check-recursive installcheck-recursive info-recursive dvi-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
list='$(SUBDIRS)'; for subdir in $$list; do \
target=`echo $@ | sed s/-recursive//`; \
echo "Making $$target in $$subdir"; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
rev="$$subdir $$rev"; \
done; \
for subdir in $$rev; do \
target=`echo $@ | sed s/-recursive//`; \
echo "Making $$target in $$subdir"; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
(cd $$subdir && $(MAKE) tags); \
done
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
here=`pwd` && cd $(srcdir) \
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
done; \
list='$(SOURCES) $(HEADERS)'; \
unique=`for i in $$list; do echo $$i; done | \
awk ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
mostlyclean-tags:
clean-tags:
distclean-tags:
-rm -f TAGS ID
maintainer-clean-tags:
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
subdir = WINGs
distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file; \
done
for subdir in $(SUBDIRS); do \
test -d $(distdir)/$$subdir \
|| mkdir $(distdir)/$$subdir \
|| exit 1; \
chmod 777 $(distdir)/$$subdir; \
(cd $$subdir && $(MAKE) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
|| exit 1; \
done
info: info-recursive
dvi: dvi-recursive
check: all-am
$(MAKE) check-recursive
installcheck: installcheck-recursive
all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS)
install-exec-am: install-libLIBRARIES
install-data-am: install-includeHEADERS
uninstall-am: uninstall-libLIBRARIES uninstall-includeHEADERS
install-exec: install-exec-recursive install-exec-am
@$(NORMAL_INSTALL)
install-data: install-data-recursive install-data-am
@$(NORMAL_INSTALL)
install: install-recursive install-exec-am install-data-am
@:
uninstall: uninstall-recursive uninstall-am
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
installdirs: installdirs-recursive
$(mkinstalldirs) $(DATADIR)$(libdir) $(DATADIR)$(includedir)
mostlyclean-generic:
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f Makefile $(DISTCLEANFILES)
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean-am: mostlyclean-libLIBRARIES mostlyclean-compile \
mostlyclean-noinstPROGRAMS mostlyclean-tags \
mostlyclean-generic
clean-am: clean-libLIBRARIES clean-compile clean-noinstPROGRAMS \
clean-tags clean-generic mostlyclean-am
distclean-am: distclean-libLIBRARIES distclean-compile \
distclean-noinstPROGRAMS distclean-tags \
distclean-generic clean-am
maintainer-clean-am: maintainer-clean-libLIBRARIES \
maintainer-clean-compile \
maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
maintainer-clean-generic distclean-am
mostlyclean: mostlyclean-recursive mostlyclean-am
clean: clean-recursive clean-am
distclean: distclean-recursive distclean-am
-rm -f config.status
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
.PHONY: mostlyclean-libLIBRARIES distclean-libLIBRARIES \
clean-libLIBRARIES maintainer-clean-libLIBRARIES uninstall-libLIBRARIES \
install-libLIBRARIES mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile mostlyclean-noinstPROGRAMS \
distclean-noinstPROGRAMS clean-noinstPROGRAMS \
maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \
install-includeHEADERS install-data-recursive uninstall-data-recursive \
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
uninstalldirs-recursive all-recursive check-recursive \
installcheck-recursive info-recursive dvi-recursive \
mostlyclean-recursive distclean-recursive clean-recursive \
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
installcheck all-am install-exec-am install-data-am uninstall-am \
install-exec install-data install uninstall all installdirs \
mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@@ -1,293 +0,0 @@
*** Mon Oct 14 19:42:42 EEST 2002 - Dan
Double buffering
----------------
To avoid flickering caused by redrawing the widgets on Expose events, a
double buffering tehnique was implemented for most of the widgets.
This flickering effect has gotten more vizible with the introduction
of antialiased fonts. If with normal text one can redraw the text over the
old one over and over again without any degradation of the text (new pixels
simply overwrite old pixels), with antialiased text the situation is
different and text gets quickly corrupted. To avoid this corruption, one
needs to first erase the area where the text will go, which can cause the
before mentioned flickering.
The double buffer is implemented to solve this issue.
This is a change that that will be automatically available for any WINGs
applications and will require no change in the existing code.
However there is an exception from this in case of WMList if you delegate
the drawing of items to userspace (read below for the compelte details).
*** Mon Oct 14 22:07:42 EEST 2002 - Dan
WMList change
-------------
In case of WMList there is the posibility to delegate the drawing of the
list items to the application that is linked with WINGs, and this code will
not be inside the WINGs library, but in userland. Since we use the double
buffering tehnique in this case too (to allow all widgets based on WMList
and the ones that draw their list items by themselves to benefit from the
double buffering advantage automatically), we no longer pass the window to
the user code doing item drawing, but instead pass this pixmap in which we
draw before copying to the real window.
Since one cannot use XClearWindow() or XClearArea() on pixmaps, but only on
windows, if the code drawing list items used to call these functions to clear
the item area before drawing it needs to change to using XFillRectangle()
instead.
With this change it also means that there is no longer any need to do any
double buffering in the user code, since it's already done by WINGs.
*** Mon Oct 14 19:28:35 EEST 2002 - Dan
API change
----------
WMDrawString() and WMDrawImageString() no longer take a GC as argument.
Instead WMDrawString() takes a WMColor* as the color for the string to be
drawn, while WMDrawImageString() takes 2 WMColor* arguments in place of the
old GC: first for text color and second for background color.
This change is required to support extending WMFont to allow it to handle
antialiased fonts through the XFree86 Xft2 extension.
This also has the advantage of hiding low level X11 details and use WINGs
internat objects instead.
To fix your old code to work with the new WINGs API you need to replace the
GC passed to WMDraw***String() in your code with a WMColor*.
Most of the old code used to be like this:
WMDrawString(screen, window, WMColorGC(color), font, x, y, txt, len);
for the new API it should be replaced by:
WMDrawString(screen, window, color, font, x, y, txt, len);
However if you used a particular GC created by yourself to suit your special
needs, you need to pass a color which is the same as the foreground color of
that gc.
For WMDrawImageString(), from:
WMDrawImageString(screen, window, gc, font, x, y, txt, len);
becomes
WMDrawImageString(screen, window, textColor, backColor, font, x, y, txt, len);
where textColor and backColor are declared like:
WMColor *textColor, *backColor;
and have the color of the foreground respective the background of the old gc.
*** Wed Oct 9 07:10:04 EEST 2002 - Dan
Antialiased font support
------------------------
With the addition of Xft2 support in the WINGs library, now WINGs can display
antialiased text with TrueType or any scalable fonts.
Antialiased text is enabled by default, but can be disabled by adding
AntialiasedText = NO; in ~/GNUstep/Defaults/WMGLOBAL
This will disable antialiased text for any WINGs based application. If you
only want to disable them for a specific application only, like WindowMaker
for example, then add the same option in the applications configuration file,
in this case ~/GNUstep/Defaults/WindowMaker
Note that bitmapped fonts look much better than TrueType when antialiasing is
disabled.
*** Mon Sep 09 06:58:30 EEST 2002 - Dan
New delegate for the WMConnection class
---------------------------------------
ConnectionDelegate structure has a new member: canResumeSending.
The purpose of this callback is to notify you that you can resume sending
data over a WMConnection.
It works in the following manner:
WMSendConnectionData() can return 3 values: -1, 0, 1
-1 - means that the connection has died. you should stop sending data and
close the connection ASAP.
1 - means that the data was succesfully sent
0 - means that the data (or part of it) was not sent. however, it was saved
in a queue and the library will try to send it later when possible.
if the return value is 1, you can continue to send the next message, and so
on, until the return value of such a send call will be 0.
After it returns 0 you can continue sending, however, the data will not be
sent over the connection because the operating system cannot accept any more
data for the moment. Instead it will be queued inside the library, making your
program's memory footprint increase. If the ammount of data you need to
send is limited and not too big, this shouldn't be a problem, because your
data will be queued and sent when the operating system will notify the
library that sending is possible again.
If this is the case you can just ignore the output of WMSendConnectionData()
and not set a callback for canResumeSending.
However, if the ammount of data you have to send is undetermined and you
also want to keep a small memory footprint for your program (so that it
won't grow until it uses all your available memory ;) ), you will have to
stop sending data over the connection as soon as WMSendConnectionData()
returns with 0. Then you should somehow mark this situation in your program
to avoid it trying to send anymore data until notified that it can resume.
(You should have also set a canResumeSending callback when you initialized
your WMConnection object because else you cannot be notified when to resume.)
Now, when you receive such a 0 from the send operation, your last sent data
is put in a queue inside the library. At a later time when the operating
system notifies the library that sending is possible again, the library will
resume to send the data that is saved in the queue. After it will be able to
send all the data in the queue, the canResumeSending callback will be
called, letting you know that not only you can resume sending because the
operating system is again able to send data, but also that the queue was
completely flushed.
From the canResumeSending callback, you should again update the status of
your program marking that it can send again, and then resume sending the
data from where you were left.
*** Thu Oct 04 06:00:09 EEST 2001 -Dan
Property lists handling code
----------------------------
Code to handle property lists was added to WINGs. It is more robust
than the libPropList code, mostly because some conflicting concepts
borrowed from UserDefaults (which libPropList use) are no longer used in
the WINGs property lists code. These borrowed concepts conflicted with the
retain/release mechanism of property lists and could lead in certain cases
to segmentation faults when executing libPropList based code. But the worse
part was that these libPropList problems were practically unsolvable without
removing one of those conflicting concepts and without a complete redesign.
The new WINGs property lists code is also better integrated with the other
data types from WINGs and is actively maintained.
Practically the things that were removed from the WINGs property list
implementation compared to the old libPropList implementation, are exactly
the UserDefaults borrowed concepts that conflict with the retain/release
mechanism:
- The container of a proplist object and the associated functions are gone.
- The filename associated with a proplist object and the corresponding
functions are gone. Now the saving function needs the filename as a
parameter.
- The synchronization functions are no longer supported. They are part of
the UserDefaults and are implemented there.
- No functions related to domains/registering were implemented in the WINGs
property lists code, because they are also not part of property lists.
They are more in connection with UserDefaults and a central point of access
for domains.
The above 2 concepts: container and filename were added to libPropList just
to let it support synchronization which was borrowed from UserDefaults.
Property lists as defined in the openstep specification are just complex
data structures composed of strings, data, arrays, dictionaries and a mix of
them and are not associated with any file in particular. UserDefaults on the
other hand are property lists read from a specific file and they associate
that property list with that file and allow them to be synchronized.
Old libPropList based code can still be used by linking against the WINGs
library containing the new proplist code with minimal changes which are
described in detail in the comments at the top of the WINGs/proplist-compat.h
header file (the same file carries the #defines for mapping old libPropList
functions to the new WINGs proplist functions).
Our recommendation is to move to the new functions WINGs provide because
they better integrate with other function naming conventions in WINGs.
The proplist-compat.h header file is just a way to have old code up and
running with minimal changes so that we can remove the old and unmaintained
libPropList from systems while keeping to use old libPropList based code
without rewriting it and it should not be used for other purposes.
*** Sat Apr 21 09:12:09 EEST 2001 -Dan
API change
----------
To allow a correct display of icon images with alpha blending in panels and
other places where a WINGs based application may use them the following
changes took place:
1. The following functions were renamed:
- WMSetApplicationIconImage() --> WMSetApplicationIconPixmap()
- WMGetApplicationIconImage() --> WMGetApplicationIconPixmap()
- WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap()
2. The following functions were added:
- WMSetApplicationIconImage(WMScreen *scr, RImage *image)
- RImage* WMGetApplicationIconImage(WMScreen *scr)
- WMPixmap* WMCreateApplicationIconBlendedPixmap(WMScreen *scr, RColor *col)
As you can see the old functions that operated on WMPixmap images (which are
basically X Pixmaps that lack alpha information) were renamed to ...Pixmap()
to make them more suggestive about what they do and to make room for the
new functions that operate on RImages (that hold alpha information).
Since the corresponding WMGet... functions only retrieve the stored
image/pixmap from the application, I'll outline how the WMSet...
functions operate:
All WM...IconPixmap() functions operate on WMPixmaps
All WM...IconImage() functions operate on RImages
- WMSetApplicationIconImage() will set the RImage to be used in panels
and will also convert the RImage to a WMPixmap with a threshold of 128
and will use that pixmap for the appicon image. If that doesn't satisfy
you, you can make a call to WMSetApplicationIconPixmap() on your own to
set whatever WMPixmap you see fit for the appicon.
- WMSetApplicationIconPixmap() will set the WMPixmap to be used for the
appicon and for the panels
If you use only one of the above functions, the corresponding image/pixmap
will be used everywhere where needed (panels and appicon), but the pixmap
version will not be able to handle alpha blending correctly.
If you use both WMSetApplicationIconImage() and WMSetApplicationIconPixmap()
then the RImage will have priority in panels, and the WMPixmap will only be
used for the appicon. This allows you to better control what icon is
displayed in the appicon, in case the default conversion of the RImage to a
pixmap with a threshold of 128 is not good enough, or in case you want a
different icon to be shown in the appicon than in panels.
Also this new function was added:
- WMCreateApplicationIconBlendedPixmap() will use the RImage set with
WMSetApplicationIconImage() if available and will blend it with the color
you passed. This will make the image show well on a background of that
color. If the RImage was not set it will return NULL. You need to call
WMReleasePixmap() on it after you finish with it. Passing a NULL pointer
instead of a color will make the RImage be blended with the default color
of the WINGs widgets: '#aeaaae' making it suitable to be assigned to any
WINGs widget.
To make your existing code work as before all you need to do is to rename
the following functions:
- WMSetApplicationIconImage() --> WMSetApplicationIconPixmap()
- WMGetApplicationIconImage() --> WMGetApplicationIconPixmap()
- WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap()
But if you want to take advantage of the new abilities to show alpha
blended images you need to start using the new functions.

View File

@@ -1,11 +1,11 @@
WINGs - WINGs Is Not GNUstep
WINGs - WINGs Is Not GNUstep
by
by
Alfredo Kengi Kojima
kojima@windowmaker.org
Alfredo Kengi Kojima
kojima@windowmaker.org
WINGs is a small widget set with the N*XTSTEP look and feel. It's API
@@ -13,7 +13,7 @@ is inspired in OpenStep and it's implementation borrows some ideas
from Tk. It has a reasonable set of widgets, sufficient for building
small applications (like a CDPlayer or hacking something like rxvt). It
also has other functions that are usefull for applications, like a
User Defaults alike configuration manager and a notification system.
User Defaults like configuration manager and a notification system.
The library is limited and it's design is a little sloppy,
so it's not intended to build large or complex applications, like
@@ -25,9 +25,9 @@ and faster than say, Motif or even Athena. Knowing Xlib will help you to
workaround some of it's limitations, although you'll probably be able to
write something like a trivial tic-tac-toe game without knowing much Xlib.
Some of it's functions are designed to support the Window Maker window
Some of it's functions are designed to support the WindowMaker window
manager (see http://windowmaker.org) In fact, it's primary role is to
support Window Maker. All other uses of it are just an added bonus.
support WindowMaker. All other uses of it are just an added bonus.
It will help you to understand the API if you read the ApplicationKit
reference manual, distributed as a PDF by Apple. The function names,
@@ -37,8 +37,9 @@ structs and most of the intrinsics are very close to OpenStep classes.
Internationalization:
---------------------
Change ~/GNUstep/Defaults/WMGLOBAL to set the desired font set and
set MultiByteText = YES; to enable support for multibyte text.
WINGs supports display of multibyte characters (kanji etc) without the
to specify any flags (ie: there is no way to disable i18n support).
Change ~/GNUstep/Defaults/WMGLOBAL to set the desired font set.
Widgets provided by WINGs:
@@ -56,22 +57,24 @@ Widgets provided by WINGs:
- slider
- scrollable view
- color well
- split view
- tabbed view
- progress indicator
- selection (make pasteboard like?)
- drag&drop
- split view (only 2 subviews)
- input box
- file panel
- color panel
- alert panel
- font panel
Planned:
--------
- selection (pasteboard like)
- drag&drop
If you think you can code the following, please do. They are needed by
WPrefs.app, but the number of other things I have to do is huge.
- color panel
- font panel (the UI part is done. Might require a rewrite of the font list
retrievel code. Might also require a WMFontManager)
- input method support (XIM). I have no idea of how to code it. People who use
different characters than ASCII will have trouble editing menus without it...
@@ -81,7 +84,9 @@ Wish list: (I don't have the know-how or time to do them)
- text (with support for RTF)
- matrix (like NSMatrix)
- splitviews with more than 2 subviews
- font manager (like NSFontManager)
- finish file panel, open/save
- finish other wigets
- optimize list scrolling (XCopyArea() the area that's already drawn)
- InterfaceMaker?

View File

@@ -1,2 +0,0 @@
Makefile Makefile.in
.psrc .inslog2 tca.map tca.log pchdir *.rpt

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

210
WINGs/Resources/Makefile.in Normal file
View File

@@ -0,0 +1,210 @@
# Makefile.in generated automatically by automake 1.3 from Makefile.am
# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
SHELL = /bin/sh
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
DISTDIR =
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ../..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_alias = @host_alias@
host_triplet = @host@
CC = @CC@
CPP_PATH = @CPP_PATH@
DFLAGS = @DFLAGS@
GFXFLAGS = @GFXFLAGS@
GFXLIBS = @GFXLIBS@
I18N = @I18N@
I18N_MB = @I18N_MB@
ICONEXT = @ICONEXT@
INTLIBS = @INTLIBS@
LIBPL_INC_PATH = @LIBPL_INC_PATH@
LIBPL_LIBS = @LIBPL_LIBS@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
MOFILES = @MOFILES@
NLSDIR = @NLSDIR@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
REDUCE_APPICONS = @REDUCE_APPICONS@
SHAPE = @SHAPE@
SOUND = @SOUND@
VERSION = @VERSION@
WPMOFILES = @WPMOFILES@
XCFLAGS = @XCFLAGS@
XGETTEXT = @XGETTEXT@
XLFLAGS = @XLFLAGS@
XLIBS = @XLIBS@
XSHM = @XSHM@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_LOCALE = @X_LOCALE@
pixmapdir = @pixmapdir@
wprefsdir = @wprefsdir@
resdatadir = $(datadir)/WINGs
resdata_DATA = Images.tiff Images.xpm defaultIcon.tiff defaultIcon.xpm
EXTRA_DIST = $(resdata_DATA) Images.xcf
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../../src/config.h
CONFIG_CLEAN_FILES =
DATA = $(resdata_DATA)
DIST_COMMON = Makefile.am Makefile.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP = --best
all: Makefile $(DATA)
.SUFFIXES:
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps WINGs/Resources/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
install-resdataDATA: $(resdata_DATA)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(resdatadir)
@list='$(resdata_DATA)'; for p in $$list; do \
if test -f $(srcdir)/$$p; then \
echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(resdatadir)/$$p"; \
$(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(resdatadir)/$$p; \
else if test -f $$p; then \
echo " $(INSTALL_DATA) $$p $(DESTDIR)$(resdatadir)/$$p"; \
$(INSTALL_DATA) $$p $(DESTDIR)$(resdatadir)/$$p; \
fi; fi; \
done
uninstall-resdataDATA:
@$(NORMAL_UNINSTALL)
list='$(resdata_DATA)'; for p in $$list; do \
rm -f $(DESTDIR)$(resdatadir)/$$p; \
done
tags: TAGS
TAGS:
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
subdir = WINGs/Resources
distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file; \
done
info:
dvi:
check: all
$(MAKE)
installcheck:
install-exec:
@$(NORMAL_INSTALL)
install-data: install-resdataDATA
@$(NORMAL_INSTALL)
install: install-exec install-data all
@:
uninstall: uninstall-resdataDATA
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
installdirs:
$(mkinstalldirs) $(DATADIR)$(resdatadir)
mostlyclean-generic:
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f Makefile $(DISTCLEANFILES)
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean: mostlyclean-generic
clean: clean-generic mostlyclean
distclean: distclean-generic clean
-rm -f config.status
maintainer-clean: maintainer-clean-generic distclean
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
.PHONY: uninstall-resdataDATA install-resdataDATA tags distdir info dvi \
installcheck install-exec install-data install uninstall all \
installdirs mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@@ -1,13 +1,4 @@
- move paint to idle handlers
- check if its useful to add some WMBrowserSelectionDidChangeNotification
(actually a pass-through for WMListSelectionDidChangeNotification).
Or a delegate to be called when the list selection change.
- add some way to modify speed when scrolling WMList, depending on how
far the mouse is moved outside of the list.
- clean up header files of declared but not implemented anywhere functions
- implement a generic WMChangeFontAttribute(WMFont *font, enum attributes)
function
- optimize color allocation for repeated colors
- make it work in 8bpp

View File

@@ -1,4 +0,0 @@
Makefile Makefile.in
testtext testcolorpanel testmywidget wmfile wmquery wtest
.libs
.psrc .inslog2 tca.map tca.log pchdir *.rpt

View File

@@ -1,22 +0,0 @@
## automake input file for WINGs - Tests
AUTOMAKE_OPTIONS = no-dependencies
noinst_PROGRAMS = wtest wmquery wmfile testmywidget
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
@XFTLIBS@ @INTLIBS@
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
wtest_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
EXTRA_DIST = logo.xpm upbtn.xpm wm.html wm.png
INCLUDES = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFTFLAGS@ @HEADER_SEARCH_PATH@ \
-DDEBUG

View File

@@ -1,57 +0,0 @@
/* XPM */
static char * upbtn_xpm[] = {
"20 22 32 1",
" c None",
". c #000000",
"+ c #FFFFFF",
"@ c #4A485A",
"# c #524052",
"$ c #4A595A",
"% c #5A596A",
"& c #4A486A",
"* c #5A595A",
"= c #52556A",
"- c #52406A",
"; c #6A556A",
"> c #5A6D6A",
", c #5A597B",
"' c #5A6D7B",
") c #6A557B",
"! c #6A6D7B",
"~ c #6A697B",
"{ c #6A698B",
"] c #7B797B",
"^ c #C5C2C5",
"/ c #6A818B",
"( c #6A7D7B",
"_ c #7B698B",
": c #6A798B",
"< c #7B799C",
"[ c #7B798B",
"} c #7B8D94",
"| c #7B81A4",
"1 c #8B85A4",
"2 c #73899C",
"3 c #7B89A4",
" ",
" .+ ",
" .@#+ ",
" .$%$&+ ",
" .*=*-*-+ ",
" .%%%%%%$%+ ",
" .%=%;%=*=*-+ ",
" .>%>,''>,>%=%+ ",
" .%)>)!~>)>)>=*#+ ",
" .>~'~'{'{'~',>%$@+ ",
" ]+++^{!{!~!)>+++++ ",
" ./{/{({'~+ ",
" ._:_:_!~>+ ",
" ./</</{'~+ ",
" .<<<[_({!+ ",
" .}|}</{(~+ ",
" .12<[_:{'+ ",
" .31}</{'~+ ",
" .12<[_!~>+ ",
" .2</</{''+ ",
" ]+++++++++ ",
" "};

View File

@@ -1,37 +0,0 @@
<HTML><font size=-1>
<center>
<Img src=wm.png></b><p>
<b>GNU Window Maker</B><br>
<i>X11 Window Manager</i><p>
<u>http://windowmaker.org<br>
ftp.windowmaker.org</u></font><Br>
</center>
<b><i>Window Maker</b>
<Img src=upbtn.xpm></i>is the GNU window manager
for the X Window System. It was
designed to emulate the look and feel of part of the NEXTSTEP(tm) GUI. Its
supposed to be relatively fast and small, feature rich, easy to configure and
easy to use, with a simple and elegant appearance borrowed from NEXTSTEP(tm).
<p>
<b>Window Maker</b> was designed keeping integration with GNUstep in
mind and is the
"official" window manager for it. It is also part of the GNU project
(<u>www.gnu.org</u>)
<p>
<b>What is <i>GNUstep?</i></b><p>
<i><b>G</i>NU</b>step is a complete object-oriented development system, based on the
OpenStep specification released by NeXT(tm) (now Apple(tm)) and Sun(tm). It will provide everything one needs to produce cross-platform, object-oriented, graphical (and non-graphical) applications; providing among other things, base system libraries, a high-level GUI application framework that uses a Display PostScript(tm)-like imaging model (DGS), objects for accessing relational databases, distributed objects and a graphical development environment, with tools like interface modeller, a project management system
(project center) and other tools.
<p>
The GNUstep development system will be used to create a user environment,
with everything needed for a complete graphical user interface, such as a
file viewer, text editors and other applications. Note that the user
environment (or "desktop environment") is only a small part of the whole
GNUstep project and therefore it does not "compete" with other projects like
KDE or GNOME, simply because they are completely different things.
<p>
For more information on the GNUstep project, visit:
<u>http://www.gnustep.org</u> and <u>http://gnustep.current.nu</u>
</HTML>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,126 +0,0 @@
/*
* Author: Len Trigg <trigg@cs.waikato.ac.nz>
*/
/*
Update: Franck Wolff <frawolff@club-internet.fr>
-----------------------------------------------------------------------
List of updated functions :
- main :
add -s option for a save panel...
-----------------------------------------------------------------------
*/
#include <WINGs/WINGs.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "logo.xpm"
void
wAbort()
{
exit(1);
}
char *ProgName;
void usage(void)
{
fprintf(stderr,
"usage:\n"
"\t%s [-options]\n"
"\n"
"options:\n"
" -s\t\tSave panel (default open panel)\n"
" -i <str>\tInitial directory (default /)\n"
" -t <str>\tQuery window title (default none)\n"
"\n"
"information:\n"
"\t%s pops up a WindowMaker style file selection panel.\n"
"\n"
"version:\n"
"\t%s\n"
,ProgName,ProgName,__DATE__
);
exit(0);
}
#define OPEN_PANEL_TYPE 0
#define SAVE_PANEL_TYPE 1
int main(int argc, char **argv)
{
Display *dpy = XOpenDisplay("");
WMScreen *scr;
WMPixmap *pixmap;
WMOpenPanel *oPanel;
WMSavePanel *sPanel;
/* RImage *image;*/
char *title = NULL;
char *initial = "/";
int ch;
int panelType = OPEN_PANEL_TYPE;
extern char *optarg;
extern int optind;
if (!dpy) {
puts("could not open display");
exit(1);
}
WMInitializeApplication("WMFile", &argc, argv);
ProgName = argv[0];
while((ch = getopt(argc, argv, "si:ht:")) != -1)
switch(ch)
{
case 's':
panelType = SAVE_PANEL_TYPE;
break;
case 'i':
initial = optarg;
break;
case 't':
title = optarg;
break;
default:
usage();
}
for(; optind <argc; optind++)
usage();
scr = WMCreateSimpleApplicationScreen(dpy);
pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM);
WMSetApplicationIconPixmap(scr, pixmap);
WMReleasePixmap(pixmap);
if (panelType == SAVE_PANEL_TYPE) {
sPanel = WMGetSavePanel(scr);
if (WMRunModalFilePanelForDirectory(sPanel, NULL, initial,
/*title*/ NULL, NULL) == True)
printf("%s\n", WMGetFilePanelFileName(sPanel));
else
printf("\n");
} else {
oPanel = WMGetOpenPanel(scr);
if (WMRunModalFilePanelForDirectory(oPanel, NULL, initial,
/*title*/ NULL, NULL) == True)
printf("%s\n", WMGetFilePanelFileName(oPanel));
else
printf("\n");
}
return 0;
}

View File

@@ -1,103 +0,0 @@
/*
* Author: Len Trigg <trigg@cs.waikato.ac.nz>
*/
#include <WINGs/WINGs.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "logo.xpm"
void
wAbort()
{
exit(1);
}
char *ProgName;
void
usage(void)
{
fprintf(stderr,
"usage:\n"
"\t%s [-options]\n"
"\n"
"options:\n"
" -i <str>\tInitial entry contents (default none)\n"
" -p <str>\tPrompt message (default none)\n"
" -t <str>\tQuery window title (default none)\n"
"\n"
"information:\n"
"\t%s pops up a WindowMaker style input panel.\n"
"\n"
"version:\n"
"\t%s\n"
,ProgName,ProgName,__DATE__
);
exit(0);
}
int
main(int argc, char **argv)
{
Display *dpy = XOpenDisplay("");
WMScreen *scr;
WMPixmap *pixmap;
char *title = NULL;
char *prompt = NULL;
char *initial = NULL;
char *result = NULL;
int ch;
extern char *optarg;
extern int optind;
WMInitializeApplication("WMQuery", &argc, argv);
ProgName = argv[0];
if (!dpy) {
puts("could not open display");
exit(1);
}
while((ch = getopt(argc, argv, "i:hp:t:")) != -1)
switch(ch)
{
case 'i':
initial = optarg;
break;
case 'p':
prompt = optarg;
break;
case 't':
title = optarg;
break;
default:
usage();
}
for(; optind <argc; optind++)
usage();
scr = WMCreateSimpleApplicationScreen(dpy);
pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM);
WMSetApplicationIconPixmap(scr, pixmap); WMReleasePixmap(pixmap);
if ((result = WMRunInputPanel(scr, NULL, title, prompt, initial, "OK", "Cancel")) != NULL)
printf("%s\n", result);
else
printf("\n");
return 0;
}

File diff suppressed because it is too large Load Diff

1004
WINGs/WINGs.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
Makefile Makefile.in

View File

@@ -1,9 +0,0 @@
## automake input file for WINGs - Headers subdir
AUTOMAKE_OPTIONS = no-dependencies
# is this a kluge? if so, how should i do it?
includedir = @includedir@/WINGs
include_HEADERS = WINGs.h WUtil.h WINGsP.h proplist-compat.h

File diff suppressed because it is too large Load Diff

View File

@@ -1,620 +0,0 @@
#ifndef _WINGSP_H_
#define _WINGSP_H_
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <WINGs/WINGs.h>
#if WINGS_H_VERSION < 20040406
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
#endif
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define DOUBLE_BUFFER 1
#define WC_UserWidget 128
#define SCROLLER_WIDTH 20
#define XDND_VERSION 4
typedef struct W_Application {
char *applicationName;
int argc;
char **argv;
char *resourcePath;
} W_Application;
typedef struct W_Font {
struct W_Screen *screen;
struct _XftFont *font;
short height;
short y;
short refCount;
char *name;
} W_Font;
typedef struct W_Pixmap {
struct W_Screen *screen;
Pixmap pixmap;
Pixmap mask;
unsigned short width;
unsigned short height;
short depth;
short refCount;
} W_Pixmap;
typedef struct W_Color {
struct W_Screen *screen;
XColor color;
unsigned short alpha;
short refCount;
GC gc;
struct {
unsigned int exact:1;
} flags;
} W_Color;
typedef struct W_FocusInfo {
struct W_View *toplevel;
struct W_View *focused; /* view that has the focus in this toplevel */
struct W_FocusInfo *next;
} W_FocusInfo;
typedef void* W_DndState(WMView *destView, XClientMessageEvent *event,
WMDraggingInfo *info);
typedef struct W_DragOperationItem {
WMDragOperationType type;
char* text;
} W_DragOperationItem;
typedef struct W_DragSourceInfo {
WMView *sourceView;
Window destinationWindow;
W_DndState *state;
WMSelectionProcs *selectionProcs;
Window icon;
WMPoint imageLocation;
WMPoint mouseOffset; /* mouse pos in icon */
Cursor dragCursor;
WMRect noPositionMessageZone;
Atom firstThreeTypes[3];
} W_DragSourceInfo;
typedef struct W_DragDestinationInfo {
WMView *destView;
Window sourceWindow;
W_DndState *state;
WMArray *sourceTypes;
WMArray *requiredTypes;
Bool typeListAvailable;
WMArray *dropDatas;
} W_DragDestinationInfo;
struct W_DraggingInfo {
unsigned char protocolVersion;
Time timestamp;
Atom sourceAction;
Atom destinationAction;
W_DragSourceInfo* sourceInfo; /* infos needed by source */
W_DragDestinationInfo* destInfo; /* infos needed by destination */
} W_DraggingInfo;
typedef struct W_Screen {
Display *display;
int screen;
int depth;
Colormap colormap;
Visual *visual;
Time lastEventTime;
Window rootWin;
struct W_View *rootView;
RContext *rcontext;
struct W_IMContext *imctx;
struct _XftDraw *xftdraw; /* shared XftDraw */
/* application related */
W_FocusInfo *focusInfo;
RImage *applicationIconImage; /* image (can have alpha channel) */
struct W_Pixmap *applicationIconPixmap; /* pixmap - no alpha channel */
Window applicationIconWindow;
struct W_Window *windowList; /* list of windows in the app */
Window groupLeader; /* the leader of the application */
/* also used for other things */
struct W_SelectionHandlers *selectionHandlerList;
struct {
unsigned int hasAppIcon:1;
unsigned int simpleApplication:1;
} aflags;
WMOpenPanel *sharedOpenPanel;
WMSavePanel *sharedSavePanel;
struct W_FontPanel *sharedFontPanel;
struct W_ColorPanel *sharedColorPanel;
Pixmap stipple;
struct W_View *dragSourceView;
struct W_DraggingInfo dragInfo;
/* colors */
W_Color *white;
W_Color *black;
W_Color *gray;
W_Color *darkGray;
GC stippleGC;
GC copyGC;
GC clipGC;
GC monoGC; /* GC for 1bpp visuals */
GC xorGC;
GC ixorGC; /* IncludeInferiors XOR */
GC drawStringGC; /* for WMDrawString() */
GC drawImStringGC; /* for WMDrawImageString() */
W_Font *normalFont;
W_Font *boldFont;
WMHashTable *fontCache;
Bool antialiasedText;
unsigned int ignoredModifierMask; /* modifiers to ignore when typing txt */
struct W_Balloon *balloon;
struct W_Pixmap *checkButtonImageOn;
struct W_Pixmap *checkButtonImageOff;
struct W_Pixmap *radioButtonImageOn;
struct W_Pixmap *radioButtonImageOff;
struct W_Pixmap *buttonArrow;
struct W_Pixmap *pushedButtonArrow;
struct W_Pixmap *scrollerDimple;
struct W_Pixmap *upArrow;
struct W_Pixmap *downArrow;
struct W_Pixmap *leftArrow;
struct W_Pixmap *rightArrow;
struct W_Pixmap *hiUpArrow;
struct W_Pixmap *hiDownArrow;
struct W_Pixmap *hiLeftArrow;
struct W_Pixmap *hiRightArrow;
struct W_Pixmap *pullDownIndicator;
struct W_Pixmap *popUpIndicator;
struct W_Pixmap *checkMark;
struct W_Pixmap *homeIcon;
struct W_Pixmap *altHomeIcon;
struct W_Pixmap *trashcanIcon;
struct W_Pixmap *altTrashcanIcon;
struct W_Pixmap *createDirIcon;
struct W_Pixmap *altCreateDirIcon;
struct W_Pixmap *disketteIcon;
struct W_Pixmap *altDisketteIcon;
struct W_Pixmap *unmountIcon;
struct W_Pixmap *altUnmountIcon;
struct W_Pixmap *magnifyIcon;
/*struct W_Pixmap *altMagnifyIcon;*/
struct W_Pixmap *wheelIcon;
struct W_Pixmap *grayIcon;
struct W_Pixmap *rgbIcon;
struct W_Pixmap *cmykIcon;
struct W_Pixmap *hsbIcon;
struct W_Pixmap *customPaletteIcon;
struct W_Pixmap *colorListIcon;
struct W_Pixmap *defaultObjectIcon;
Cursor defaultCursor;
Cursor textCursor;
Cursor invisibleCursor;
Atom attribsAtom; /* GNUstepWindowAttributes */
Atom deleteWindowAtom; /* WM_DELETE_WINDOW */
Atom protocolsAtom; /* _XA_WM_PROTOCOLS */
Atom clipboardAtom; /* CLIPBOARD */
Atom xdndAwareAtom; /* XdndAware */
Atom xdndSelectionAtom;
Atom xdndEnterAtom;
Atom xdndLeaveAtom;
Atom xdndPositionAtom;
Atom xdndDropAtom;
Atom xdndFinishedAtom;
Atom xdndTypeListAtom;
Atom xdndActionListAtom;
Atom xdndActionDescriptionAtom;
Atom xdndStatusAtom;
Atom xdndActionCopy;
Atom xdndActionMove;
Atom xdndActionLink;
Atom xdndActionAsk;
Atom xdndActionPrivate;
Atom wmIconDragOffsetAtom;
Atom wmStateAtom; /* WM_STATE */
Atom utf8String;
Atom netwmName;
Atom netwmIconName;
Atom netwmIcon;
/* stuff for detecting double-clicks */
Time lastClickTime; /* time of last mousedown event */
Window lastClickWindow; /* window of the last mousedown */
struct W_View *modalView;
unsigned modalLoop:1;
unsigned ignoreNextDoubleClick:1;
} W_Screen;
typedef struct W_ViewDelegate {
void *data;
void (*didMove)(struct W_ViewDelegate*, WMView*);
void (*didResize)(struct W_ViewDelegate*, WMView*);
void (*willMove)(struct W_ViewDelegate*, WMView*, int*, int*);
void (*willResize)(struct W_ViewDelegate*, WMView*,
unsigned int*, unsigned int*);
} W_ViewDelegate;
typedef struct W_View {
struct W_Screen *screen;
WMWidget *self; /* must point to the widget the
* view belongs to */
W_ViewDelegate *delegate;
Window window;
WMSize size;
short topOffs;
short leftOffs;
short bottomOffs;
short rightOffs;
WMPoint pos;
struct W_View *nextFocusChain; /* next/prev in focus chain */
struct W_View *prevFocusChain;
struct W_View *nextResponder; /* next to receive keyboard events */
struct W_View *parent; /* parent WMView */
struct W_View *childrenList; /* first in list of child windows */
struct W_View *nextSister; /* next on parent's children list */
WMArray *eventHandlers; /* event handlers for this window */
unsigned long attribFlags;
XSetWindowAttributes attribs;
void *hangedData; /* data holder for user program */
WMColor *backColor;
Cursor cursor;
Atom *droppableTypes;
struct W_DragSourceProcs *dragSourceProcs;
struct W_DragDestinationProcs *dragDestinationProcs;
WMPixmap *dragImage;
int helpContext;
struct {
unsigned int realized:1;
unsigned int mapped:1;
unsigned int parentDying:1;
unsigned int dying:1; /* the view is being destroyed */
unsigned int topLevel:1; /* is a top level window */
unsigned int root:1; /* is the root window */
unsigned int mapWhenRealized:1; /* map the view when it's realized */
unsigned int alreadyDead:1; /* view was freed */
unsigned int dontCompressMotion:1; /* motion notify event compress */
unsigned int notifySizeChanged:1;
unsigned int dontCompressExpose:1; /* expose event compress */
/* toplevel only */
unsigned int worksWhenModal:1;
unsigned int pendingRelease1:1;
unsigned int pendingRelease2:1;
unsigned int pendingRelease3:1;
unsigned int pendingRelease4:1;
unsigned int pendingRelease5:1;
unsigned int xdndHintSet:1;
} flags;
int refCount;
} W_View;
typedef struct W_EventHandler {
unsigned long eventMask;
WMEventProc *proc;
void *clientData;
} W_EventHandler;
typedef struct _WINGsConfiguration {
char *systemFont;
char *boldSystemFont;
int defaultFontSize;
Bool antialiasedText;
char *floppyPath;
unsigned doubleClickDelay;
unsigned mouseWheelUp;
unsigned mouseWheelDown;
} _WINGsConfiguration;
extern _WINGsConfiguration WINGsConfiguration;
#define CHECK_CLASS(widget, class) assert(W_CLASS(widget)==(class))
#define W_CLASS(widget) (((W_WidgetType*)(widget))->widgetClass)
#define W_VIEW(widget) (((W_WidgetType*)(widget))->view)
#define W_VIEW_REALIZED(view) (view)->flags.realized
#define W_VIEW_MAPPED(view) (view)->flags.mapped
#define W_VIEW_DISPLAY(view) (view)->screen->display
#define W_VIEW_SCREEN(view) (view)->screen
#define W_VIEW_DRAWABLE(view) (view)->window
#define W_VIEW_WIDTH(view) (view)->size.width
#define W_VIEW_HEIGHT(view) (view)->size.height
#define W_PIXEL(c) (c)->color.pixel
#define W_FONTID(f) (f)->font->fid
#define W_DRAWABLE(scr) (scr)->rcontext->drawable
W_View *W_GetViewForXWindow(Display *display, Window window);
W_View *W_CreateView(W_View *parent);
W_View *W_CreateTopView(W_Screen *screen);
W_View *W_CreateUnmanagedTopView(W_Screen *screen);
W_View *W_CreateRootView(W_Screen *screen);
void W_DestroyView(W_View *view);
void W_RealizeView(W_View *view);
void W_ReparentView(W_View *view, W_View *newParent, int x, int y);
void W_RaiseView(W_View *view);
void W_LowerView(W_View *view);
void W_MapView(W_View *view);
void W_MapSubviews(W_View *view);
void W_UnmapSubviews(W_View *view);
W_View *W_TopLevelOfView(W_View *view);
void W_UnmapView(W_View *view);
void W_MoveView(W_View *view, int x, int y);
void W_ResizeView(W_View *view, unsigned int width, unsigned int height);
void W_SetViewBackgroundColor(W_View *view, WMColor *color);
void W_SetViewCursor(W_View *view, Cursor cursor);
void W_DrawRelief(W_Screen *scr, Drawable d, int x, int y, unsigned int width,
unsigned int height, WMReliefType relief);
void W_DrawReliefWithGC(W_Screen *scr, Drawable d, int x, int y,
unsigned int width, unsigned int height,
WMReliefType relief,
GC black, GC dark, GC light, GC white);
void W_CallDestroyHandlers(W_View *view);
void W_PaintTextAndImage(W_View *view, int wrap, WMColor *textColor,
W_Font *font, WMReliefType relief, char *text,
WMAlignment alignment, W_Pixmap *image,
WMImagePosition position, WMColor *backColor, int ofs);
void W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
int width, WMAlignment alignment, WMColor *color,
int wrap, char *text, int length);
int W_GetTextHeight(WMFont *font, char *text, int width, int wrap);
int W_TextWidth(WMFont *font, char *text, int length);
void W_BroadcastMessage(W_View *targetParent, XEvent *event);
void W_DispatchMessage(W_View *target, XEvent *event);
void W_SetFocusOfToplevel(W_View *toplevel, W_View *view);
W_View *W_FocusedViewOfToplevel(W_View *view);
void W_SetFocusOfTopLevel(W_View *toplevel, W_View *view);
void W_ReleaseView(WMView *view);
WMView *W_RetainView(WMView *view);
void W_InitApplication(WMScreen *scr);
void W_InitNotificationCenter(void);
W_Class W_RegisterUserWidget(void);
void W_RedisplayView(WMView *view);
Bool W_ApplicationInitialized(void);
void W_HandleSelectionEvent(XEvent *event);
void W_HandleDNDClientMessage(WMView *toplevel, XClientMessageEvent *event);
void W_FlushASAPNotificationQueue(void);
void W_FlushIdleNotificationQueue(void);
struct W_Balloon *W_CreateBalloon(WMScreen *scr);
void W_BalloonHandleEnterView(WMView *view);
void W_BalloonHandleLeaveView(WMView *view);
Bool W_CheckIdleHandlers(void);
void W_CheckTimerHandlers(void);
Bool W_HandleInputEvents(Bool waitForInput, int inputfd);
/* XDnD */
Atom W_OperationToAction(WMScreen *scr, WMDragOperationType operation);
WMDragOperationType W_ActionToOperation(WMScreen *scr, Atom action);
void W_FreeDragOperationItem(void* item);
Bool W_SendDnDClientMessage(Display *dpy, Window win, Atom message,
unsigned long data1, unsigned long data2,
unsigned long data3, unsigned long data4,
unsigned long data5);
void W_DragSourceStartTimer(WMDraggingInfo *info);
void W_DragSourceStopTimer();
void W_DragSourceStateHandler(WMDraggingInfo *info, XClientMessageEvent *event);
void W_DragDestinationStartTimer(WMDraggingInfo *info);
void W_DragDestinationStopTimer();
void W_DragDestinationStoreEnterMsgInfo(WMDraggingInfo *info, WMView *toplevel,
XClientMessageEvent *event);
void W_DragDestinationStorePositionMsgInfo(WMDraggingInfo *info,
WMView *toplevel,
XClientMessageEvent *event);
void W_DragDestinationCancelDropOnEnter(WMView *toplevel, WMDraggingInfo *info);
void W_DragDestinationStateHandler(WMDraggingInfo *info,
XClientMessageEvent *event);
void W_DragDestinationInfoClear(WMDraggingInfo *info);
void W_FreeViewXdndPart(WMView *view);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _WINGSP_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,138 +0,0 @@
/*
* This header file is provided for old libPropList compatibility.
* DO _NOT_ USE this except for letting your old libPropList-based code to
* work with the new property list code from WINGs, with minimal changes.
*
* All code written with old libPropList functions should work, given
* that the following changes are made:
*
* 1. Replace all
* #include <proplist.h>
* with
* #include <WINGs/proplist-compat.h>
* in your code.
*
* 2. Change all calls to PLSave() to have the extra filename parameter like:
* PLSave(proplist_t proplist, char* filename, Bool atomically)
*
* 3. The PLSetStringCmpHook() function is no longer available. There is a
* similar but simpler function provided which is enough for practical
* purposes:
* PLSetCaseSensitive(Bool caseSensitive)
*
* 4. The following functions do no longer exist. They were removed because
* they were based on concepts borrowed from UserDefaults which conflict
* with the retain/release mechanism:
* PLSynchronize(), PLDeepSynchronize(), PLShallowSynchronize()
* PLSetFilename(), PLGetFilename()
* PLGetContainer()
* You should change your code to not use them anymore.
*
* 5. The following functions are no longer available. They were removed
* because they also used borrowed concepts which have no place in a
* property list as defined in the OpenStep specifications. Also these
* functions were hardly ever used in programs to our knowledge.
* PLGetDomainNames(), PLGetDomain(), PLSetDomain(), PLDeleteDomain()
* PLRegister(), PLUnregister()
* You should also change your code to not use them anymore (in case you
* ever used them anyway ;-) ).
*
* 6. Link your program with libWINGs or libWUtil instead of libPropList.
* (libWINGs should be used for GUI apps, while libWUtil for non-GUI apps)
*
*
* Our recommandation is to rewrite your code to use the new functions and
* link against libWINGs/libWUtil. We do not recommend you to keep using old
* libPropList function names. This file is provided just to allow existing
* libropList based applications to run with minimal changes with the new
* proplist code from WINGs before their authors get the time to rewrite
* them. New proplist code from WINGs provide a better integration with the
* other data types from WINGs, not to mention that the proplist code in WINGs
* is actively maintained while the old libPropList is dead.
*
*/
#ifndef _PROPLIST_COMPAT_H_
#define _PROPLIST_COMPAT_H_
#include <WINGs/WUtil.h>
typedef WMPropList* proplist_t;
#ifndef YES
#define YES True
#endif
#ifndef NO
#define NO False
#endif
#define PLSetCaseSensitive(c) WMPLSetCaseSensitive(c)
#define PLMakeString(bytes) WMCreatePLString(bytes)
#define PLMakeData(bytes, length) WMCreatePLDataWithBytes(bytes, length)
#define PLMakeArrayFromElements WMCreatePLArray
#define PLMakeDictionaryFromEntries WMCreatePLDictionary
#define PLRetain(pl) WMRetainPropList(pl)
#define PLRelease(pl) WMReleasePropList(pl)
#define PLInsertArrayElement(array, pl, pos) WMInsertInPLArray(array, pos, pl)
#define PLAppendArrayElement(array, pl) WMAddToPLArray(array, pl)
#define PLRemoveArrayElement(array, pos) WMDeleteFromPLArray(array, pos)
#define PLInsertDictionaryEntry(dict, key, value) WMPutInPLDictionary(dict, key, value)
#define PLRemoveDictionaryEntry(dict, key) WMRemoveFromPLDictionary(dict, key)
#define PLMergeDictionaries(dest, source) WMMergePLDictionaries(dest, source, False)
#define PLGetNumberOfElements(pl) WMGetPropListItemCount(pl)
#define PLIsString(pl) WMIsPLString(pl)
#define PLIsData(pl) WMIsPLData(pl)
#define PLIsArray(pl) WMIsPLArray(pl)
#define PLIsDictionary(pl) WMIsPLDictionary(pl)
#define PLIsSimple(pl) (WMIsPLString(pl) || WMIsPLData(pl))
#define PLIsCompound(pl) (WMIsPLArray(pl) || WMIsPLDictionary(pl))
#define PLIsEqual(pl1, pl2) WMIsPropListEqualTo(pl1, pl2)
#define PLGetString(pl) WMGetFromPLString(pl)
#define PLGetDataBytes(pl) WMGetPLDataBytes(pl)
#define PLGetDataLength(pl) WMGetPLDataLength(pl)
#define PLGetArrayElement(pl, index) WMGetFromPLArray(pl, index)
#define PLGetDictionaryEntry(pl, key) WMGetFromPLDictionary(pl, key)
#define PLGetAllDictionaryKeys(pl) WMGetPLDictionaryKeys(pl)
#define PLShallowCopy(pl) WMShallowCopyPropList(pl)
#define PLDeepCopy(pl) WMDeepCopyPropList(pl)
#define PLGetProplistWithDescription(desc) WMCreatePropListFromDescription(desc)
#define PLGetDescriptionIndent(pl, level) WMGetPropListDescription(pl, True)
#define PLGetDescription(pl) WMGetPropListDescription(pl, False)
#define PLGetStringDescription(pl) WMGetPropListDescription(pl, False)
#define PLGetDataDescription(pl) WMGetPropListDescription(pl, False)
#define PLGetProplistWithPath(file) WMReadPropListFromFile(file)
#define PLSave(pl, file, atm) WMWritePropListToFile(pl, file, atm)
/* Unsupported functions. Do not ask for them. They're evil :P */
#define PLSetStringCmpHook(fn) error_PLSetStringCmpHook_is_not_supported
#define PLDeepSynchronize(pl) error_PLDeepSynchronize_is_not_supported
#define PLSynchronize(pl) error_PLSynchronize_is_not_supported
#define PLShallowSynchronize(pl) error_PLShallowSynchronize_is_not_supported
#define PLSetFilename(pl, filename) error_PLSetFilename_is_not_supported
#define PLGetFilename(pl, filename) error_PLGetFilename_is_not_supported
#define PLGetContainer(pl) error_PLGetContainer_is_not_supported
#define PLGetDomainNames error_PLGetDomainNames_is_not_supported
#define PLGetDomain(name) error_PLGetDomain_is_not_supported
#define PLSetDomain(name, value, kickme) error_PLSetDomain_is_not_supported
#define PLDeleteDomain(name, kickme) error_PLDeleteDomain_is_not_supported
#define PLRegister(name, callback) error_PLRegister_is_not_supported
#define PLUnregister(name) error_PLUnregister_is_not_supported
#endif

394
WINGs/WINGsP.h Normal file
View File

@@ -0,0 +1,394 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "WINGs.h"
#include "WUtil.h"
#if WINGS_H_VERSION < 980922
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
#endif
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define DOUBLE_BUFFER
#define WC_UserWidget 128
#define SCROLLER_WIDTH 20
/* internal messages */
#define WM_UPDATE_COLORWELL 130
#define WM_USER_MESSAGE 1024
#define SETUP_INTERNAL_MESSAGE(event, scrPtr) \
event.xclient.type=ClientMessage;\
event.xclient.display=scrPtr->display;\
event.xclient.send_event=False;\
event.xclient.serial=0;\
event.xclient.format=32;\
event.xclient.message_type=scrPtr->internalMessage;
typedef struct W_Font {
struct W_Screen *screen;
union {
XFontSet set;
XFontStruct *normal;
} font;
short height;
short y;
short refCount;
unsigned int notFontSet:1;
} W_Font;
typedef struct W_Pixmap {
struct W_Screen *screen;
Pixmap pixmap;
Pixmap mask;
unsigned short width;
unsigned short height;
short depth;
short refCount;
} W_Pixmap;
typedef struct W_Color {
struct W_Screen *screen;
XColor color;
short refCount;
GC gc;
struct {
unsigned int exact:1;
} flags;
} W_Color;
typedef struct W_FocusInfo {
struct W_View *toplevel;
struct W_View *focused; /* view that has the focus in this toplevel */
struct W_FocusInfo *next;
} W_FocusInfo;
typedef struct W_Screen {
Display *display;
int screen;
int depth;
Colormap colormap;
Visual *visual;
Time lastEventTime;
Window rootWin;
struct W_View *rootView;
RContext *rcontext;
/* application related */
W_FocusInfo *focusInfo;
struct W_Pixmap *applicationIcon;
struct W_Window *windowList; /* list of windows in the app */
Window groupLeader; /* the leader of the application */
/* also used for other things */
struct W_SelectionHandlers *selectionHandlerList;
struct {
unsigned int hasAppIcon:1;
unsigned int simpleApplication:1;
} aflags;
WMOpenPanel *sharedOpenPanel;
WMSavePanel *sharedSavePanel;
struct W_FontPanel *sharedFontPanel;
struct W_ColorPanel *sharedColorPanel;
/* colors */
W_Color *white;
W_Color *black;
W_Color *gray;
W_Color *darkGray;
GC stippleGC;
GC copyGC;
GC clipGC;
GC monoGC; /* GC for 1bpp visuals */
GC xorGC;
GC ixorGC; /* IncludeInferiors XOR */
GC textFieldGC;
W_Font *normalFont;
W_Font *boldFont;
struct W_Pixmap *checkButtonImageOn;
struct W_Pixmap *checkButtonImageOff;
struct W_Pixmap *radioButtonImageOn;
struct W_Pixmap *radioButtonImageOff;
struct W_Pixmap *buttonArrow;
struct W_Pixmap *pushedButtonArrow;
struct W_Pixmap *scrollerDimple;
struct W_Pixmap *upArrow;
struct W_Pixmap *downArrow;
struct W_Pixmap *leftArrow;
struct W_Pixmap *rightArrow;
struct W_Pixmap *hiUpArrow;
struct W_Pixmap *hiDownArrow;
struct W_Pixmap *hiLeftArrow;
struct W_Pixmap *hiRightArrow;
struct W_Pixmap *pullDownIndicator;
struct W_Pixmap *popUpIndicator;
struct W_Pixmap *homeIcon;
struct W_Pixmap *defaultObjectIcon;
Cursor defaultCursor;
Cursor textCursor;
Atom internalMessage; /* for ClientMessage */
Atom attribsAtom; /* GNUstepWindowAttributes */
Atom deleteWindowAtom; /* WM_DELETE_WINDOW */
Atom protocolsAtom; /* _XA_WM_PROTOCOLS */
Atom clipboardAtom; /* CLIPBOARD */
/* stuff for detecting double-clicks */
Time lastClickTime; /* time of last mousedown event */
Window lastClickWindow; /* window of the last mousedown */
struct W_View *modalView;
unsigned modal:1;
unsigned ignoreNextDoubleClick:1;
} W_Screen;
typedef struct W_View {
struct W_Screen *screen;
WMWidget *self; /* must point to the widget the
* view belongs to */
Window window;
WMSize size;
WMPoint pos;
struct W_View *nextFocusChain; /* next/prev in focus chain */
struct W_View *prevFocusChain;
struct W_View *parent; /* parent WMView */
struct W_View *childrenList; /* first in list of child windows */
struct W_View *nextSister; /* next on parent's children list */
struct W_EventHandler *handlerList;/* list of event handlers for this window */
unsigned long attribFlags;
XSetWindowAttributes attribs;
void *hangedData; /* data holder for user program */
#if 0
struct W_DragSourceProcs *dragSourceProcs;
struct W_DragDestinationProcs *dragDestinationProcs;
#endif
int helpContext;
struct {
unsigned int realized:1;
unsigned int mapped:1;
unsigned int parentDying:1;
unsigned int dying:1; /* the view is being destroyed */
unsigned int topLevel:1; /* is a top level window */
unsigned int root:1; /* is the root window */
unsigned int mapWhenRealized:1;/* map the view when it's realized */
unsigned int alreadyDead:1; /* view was freed */
unsigned int dontCompressMotion:1; /* motion notify event compress */
unsigned int notifySizeChanged:1;
unsigned int dontCompressExpose:1; /* will compress all expose
events into one */
/* toplevel only */
unsigned int worksWhenModal:1;
unsigned int pendingRelease1:1;
unsigned int pendingRelease2:1;
unsigned int pendingRelease3:1;
unsigned int pendingRelease4:1;
unsigned int pendingRelease5:1;
} flags;
int refCount;
} W_View;
typedef struct W_EventHandler {
unsigned long eventMask;
WMEventProc *proc;
void *clientData;
struct W_EventHandler *nextHandler;
} W_EventHandler;
typedef struct W_ViewProcedureTable {
void (*setBackgroundColor)(WMWidget*, WMColor *color);
void (*resize)(WMWidget*, unsigned int, unsigned int);
void (*move)(WMWidget*, int, int);
} W_ViewProcedureTable;
typedef struct _WINGsConfiguration {
char *systemFont;
char *boldSystemFont;
unsigned doubleClickDelay;
} _WINGsConfiguration;
_WINGsConfiguration WINGsConfiguration;
#define CHECK_CLASS(widget, class) assert(W_CLASS(widget)==(class))
#define W_CLASS(widget) (((W_WidgetType*)(widget))->widgetClass)
#define W_VIEW(widget) (((W_WidgetType*)(widget))->view)
#define W_VIEW_REALIZED(view) (view)->flags.realized
#define W_VIEW_MAPPED(view) (view)->flags.mapped
#define W_PIXEL(c) (c)->color.pixel
#define W_GC(c) (c)->gc
#define W_FONTID(f) (f)->font->fid
#define W_DRAWABLE(scr) (scr)->rootWin
W_View *W_GetViewForXWindow(Display *display, Window window);
W_View *W_CreateView(W_View *parent);
W_View *W_CreateTopView(W_Screen *screen);
W_View *W_CreateRootView(W_Screen *screen);
void W_DestroyView(W_View *view);
void W_RealizeView(W_View *view);
void W_ReparentView(W_View *view, W_View *newParent);
void W_MapView(W_View *view);
void W_MapSubviews(W_View *view);
void W_UnmapSubviews(W_View *view);
W_View *W_TopLevelOfView(W_View *view);
void W_UnmapView(W_View *view);
void W_MoveView(W_View *view, int x, int y);
void W_ResizeView(W_View *view, unsigned int width, unsigned int height);
void W_SetViewBackgroundColor(W_View *view, WMColor *color);
void W_DrawRelief(W_Screen *scr, Drawable d, int x, int y, unsigned int width,
unsigned int height, WMReliefType relief);
void W_CleanUpEvents(W_View *view);
void W_CallDestroyHandlers(W_View *view);
void W_PaintTextAndImage(W_View *view, int wrap, GC textGC, W_Font *font,
WMReliefType relief, char *text,
WMAlignment alignment, W_Pixmap *image,
WMImagePosition position, GC backGC, int ofs);
void W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
int width, WMAlignment alignment, GC gc,
int wrap, char *text, int length);
int W_GetTextHeight(WMFont *font, char *text, int width, int wrap);
int W_TextWidth(WMFont *font, char *text, int length);
void W_BroadcastMessage(W_View *targetParent, XEvent *event);
void W_DispatchMessage(W_View *target, XEvent *event);
Bool W_CheckInternalMessage(W_Screen *scr, XClientMessageEvent *cev, int event);
void W_SetFocusOfToplevel(W_View *toplevel, W_View *view);
W_View *W_FocusedViewOfToplevel(W_View *view);
void W_SetFocusOfTopLevel(W_View *toplevel, W_View *view);
void W_ReleaseView(WMView *view);
WMView *W_RetainView(WMView *view);
void W_InitApplication(WMScreen *scr);
void W_InitNotificationCenter(void);
W_Class W_RegisterUserWidget(W_ViewProcedureTable *procTable);
void W_RedisplayView(WMView *view);
Bool W_ApplicationInitialized(void);
char *W_GetTextSelection(WMScreen *scr, Atom selection);

227
WINGs/WUtil.h Normal file
View File

@@ -0,0 +1,227 @@
#ifndef _WUTIL_H_
#define _WUTIL_H_
#include <X11/Xlib.h>
#include <sys/types.h>
/*
* Warning: proplist.h #defines BOOL which will clash with the
* typedef BOOL in Xmd.h
* proplist.h should use Bool (which is a #define in Xlib.h) instead.
*
*/
#include <proplist.h>
#ifndef WMAX
# define WMAX(a,b) ((a)>(b) ? (a) : (b))
#endif
#ifndef WMIN
# define WMIN(a,b) ((a)<(b) ? (a) : (b))
#endif
typedef enum {
WMPostWhenIdle = 1,
WMPostASAP = 2,
WMPostNow = 3
} WMPostingStyle;
typedef enum {
WNCNone = 0,
WNCOnName = 1,
WNCOnSender = 2
} WMNotificationCoalescing;
typedef struct W_HashTable WMHashTable;
typedef struct W_UserDefaults WMUserDefaults;
typedef struct W_Notification WMNotification;
typedef struct W_NotificationQueue WMNotificationQueue;
/* DO NOT ACCESS THE CONTENTS OF THIS STRUCT */
typedef struct {
void *table;
void *nextItem;
int index;
} WMHashEnumerator;
typedef struct {
/* NULL is pointer hash */
unsigned (*hash)(const void *);
/* NULL is pointer compare */
Bool (*keyIsEqual)(const void *, const void *);
/* NULL does nothing */
void* (*retainKey)(const void *);
/* NULL does nothing */
void (*releaseKey)(const void *);
} WMHashTableCallbacks;
typedef void WMNotificationObserverAction(void *observerData,
WMNotification *notification);
/*......................................................................*/
void wfatal(const char *msg, ...);
void wwarning(const char *msg, ...);
void wsyserror(const char *msg, ...);
char *wfindfile(char *paths, char *file);
char *wfindfileinlist(char **path_list, char *file);
char *wexpandpath(char *path);
/* don't free the returned string */
char *wgethomedir();
void *wmalloc(size_t size);
void *wrealloc(void *ptr, size_t newsize);
void wrelease(void *ptr);
void *wretain(void *ptr);
char *wstrdup(char *str);
char *wstrappend(char *dst, char *src);
char *wusergnusteppath();
char *wdefaultspathfordomain(char *domain);
void wusleep(unsigned int microsec);
/*......................................................................*/
WMHashTable *WMCreateHashTable(WMHashTableCallbacks callbacks);
void WMFreeHashTable(WMHashTable *table);
void WMResetHashTable(WMHashTable *table);
void *WMHashGet(WMHashTable *table, const void *key);
/* put data in table, replacing already existing data and returning
* the old value */
void *WMHashInsert(WMHashTable *table, void *key, void *data);
void WMHashRemove(WMHashTable *table, const void *key);
/* warning: do not manipulate the table while using these functions */
WMHashEnumerator WMEnumerateHashTable(WMHashTable *table);
void *WMNextHashEnumeratorItem(WMHashEnumerator *enumerator);
unsigned WMCountHashTable(WMHashTable *table);
/* some predefined callback sets */
extern const WMHashTableCallbacks WMIntHashCallbacks;
/* sizeof(keys) are <= sizeof(void*) */
extern const WMHashTableCallbacks WMStringHashCallbacks;
/* keys are strings. Strings will be copied with wstrdup()
* and freed with free() */
extern const WMHashTableCallbacks WMStringPointerHashCallbacks;
/* keys are strings, bug they are not copied */
/*......................................................................*/
WMNotification *WMCreateNotification(char *name, void *object, void *clientData);
void WMReleaseNotification(WMNotification *notification);
WMNotification *WMRetainNotification(WMNotification *notification);
void *WMGetNotificationClientData(WMNotification *notification);
void *WMGetNotificationObject(WMNotification *notification);
char *WMGetNotificationName(WMNotification *notification);
void WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
void *observer, char *name, void *object);
void WMPostNotification(WMNotification *notification);
void WMRemoveNotificationObserver(void *observer);
void WMRemoveNotificationObserverWithName(void *observer, char *name,
void *object);
void WMPostNotificationName(char *name, void *object, void *clientData);
WMNotificationQueue *WMGetDefaultNotificationQueue(void);
WMNotificationQueue *WMCreateNotificationQueue(void);
void WMDequeueNotificationMatching(WMNotificationQueue *queue, unsigned mask);
void WMEnqueueNotification(WMNotificationQueue *queue, WMNotification *notification,
WMPostingStyle postingStyle);
void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
WMNotification *notification,
WMPostingStyle postingStyle,
unsigned coalesceMask);
/*......................................................................*/
WMUserDefaults *WMGetStandardUserDefaults(void);
proplist_t WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName);
void WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
char *defaultName);
void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName);
/* you can free the returned string */
char *WMGetUDStringForKey(WMUserDefaults *database, char *defaultName);
int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName);
int WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName);
Bool WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName);
void WMSetUDStringForKey(WMUserDefaults *database, char *value,
char *defaultName);
void WMSetUDIntegerForKey(WMUserDefaults *database, int value,
char *defaultName);
void WMSetUDFloatForKey(WMUserDefaults *database, float value,
char *defaultName);
void WMSetUDBoolForKey(WMUserDefaults *database, Bool value,
char *defaultName);
proplist_t WMGetUDSearchList(WMUserDefaults *database);
void WMSetUDSearchList(WMUserDefaults *database, proplist_t list);
#endif

View File

@@ -1,368 +0,0 @@
/*
* Dynamically Resized Array
*
* Authors: Alfredo K. Kojima <kojima@windowmaker.org>
* Dan Pascu <dan@windowmaker.org>
*
* This code is released to the Public Domain, but
* proper credit is always appreciated :)
*/
#include <stdlib.h>
#include <string.h>
#include "WUtil.h"
#define INITIAL_SIZE 8
#define RESIZE_INCREMENT 8
typedef struct W_Array {
void **items; /* the array data */
int itemCount; /* # of items in array */
int allocSize; /* allocated size of array */
WMFreeDataProc *destructor; /* the destructor to free elements */
} W_Array;
WMArray*
WMCreateArray(int initialSize)
{
return WMCreateArrayWithDestructor(initialSize, NULL);
}
WMArray*
WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc *destructor)
{
WMArray *array;
array = wmalloc(sizeof(WMArray));
if (initialSize <= 0) {
initialSize = INITIAL_SIZE;
}
array->items = wmalloc(sizeof(void*) * initialSize);
array->itemCount = 0;
array->allocSize = initialSize;
array->destructor = destructor;
return array;
}
WMArray*
WMCreateArrayWithArray(WMArray *array)
{
WMArray *newArray;
newArray = wmalloc(sizeof(WMArray));
newArray->items = wmalloc(sizeof(void*) * array->allocSize);
memcpy(newArray->items, array->items, sizeof(void*)*array->itemCount);
newArray->itemCount = array->itemCount;
newArray->allocSize = array->allocSize;
newArray->destructor = NULL;
return newArray;
}
void
WMEmptyArray(WMArray *array)
{
if (array->destructor) {
while (array->itemCount > 0) {
array->itemCount--;
array->destructor(array->items[array->itemCount]);
}
}
/*memset(array->items, 0, array->itemCount * sizeof(void*));*/
array->itemCount = 0;
}
void
WMFreeArray(WMArray *array)
{
WMEmptyArray(array);
wfree(array->items);
wfree(array);
}
int
WMGetArrayItemCount(WMArray *array)
{
return array->itemCount;
}
void
WMAppendArray(WMArray *array, WMArray *other)
{
if (other->itemCount == 0)
return;
if (array->itemCount + other->itemCount > array->allocSize) {
array->allocSize += other->allocSize;
array->items = wrealloc(array->items, sizeof(void*)*array->allocSize);
}
memcpy(array->items+array->itemCount, other->items,
sizeof(void*)*other->itemCount);
array->itemCount += other->itemCount;
}
void
WMAddToArray(WMArray *array, void *item)
{
if (array->itemCount >= array->allocSize) {
array->allocSize += RESIZE_INCREMENT;
array->items = wrealloc(array->items, sizeof(void*)*array->allocSize);
}
array->items[array->itemCount] = item;
array->itemCount++;
}
void
WMInsertInArray(WMArray *array, int index, void *item)
{
wassertr(index >= 0 && index <= array->itemCount);
if (array->itemCount >= array->allocSize) {
array->allocSize += RESIZE_INCREMENT;
array->items = wrealloc(array->items, sizeof(void*)*array->allocSize);
}
if (index < array->itemCount) {
memmove(array->items+index+1, array->items+index,
sizeof(void*)*(array->itemCount-index));
}
array->items[index] = item;
array->itemCount++;
}
void*
WMReplaceInArray(WMArray *array, int index, void *item)
{
void *old;
wassertrv(index >= 0 && index <= array->itemCount, NULL);
/* is it really useful to perform append if index == array->itemCount ? -Dan */
if (index == array->itemCount) {
WMAddToArray(array, item);
return NULL;
}
old = array->items[index];
array->items[index] = item;
return old;
}
int
WMDeleteFromArray(WMArray *array, int index)
{
wassertrv(index >= 0 && index < array->itemCount, 0);
if (array->destructor) {
array->destructor(array->items[index]);
}
if (index < array->itemCount-1) {
memmove(array->items+index, array->items+index+1,
sizeof(void*)*(array->itemCount-index-1));
}
array->itemCount--;
return 1;
}
int
WMRemoveFromArrayMatching(WMArray *array, WMMatchDataProc *match, void *cdata)
{
int i;
if (match != NULL) {
for (i = 0; i < array->itemCount; i++) {
if ((*match)(array->items[i], cdata)) {
WMDeleteFromArray(array, i);
return 1;
}
}
} else {
for (i = 0; i < array->itemCount; i++) {
if (array->items[i] == cdata) {
WMDeleteFromArray(array, i);
return 1;
}
}
}
return 0;
}
void*
WMGetFromArray(WMArray *array, int index)
{
if (index < 0 || index >= array->itemCount)
return NULL;
return array->items[index];
}
void*
WMPopFromArray(WMArray *array)
{
array->itemCount--;
return array->items[array->itemCount];
}
int
WMFindInArray(WMArray *array, WMMatchDataProc *match, void *cdata)
{
int i;
if (match!=NULL) {
for (i = 0; i < array->itemCount; i++) {
if ((*match)(array->items[i], cdata))
return i;
}
} else {
for (i = 0; i < array->itemCount; i++) {
if (array->items[i] == cdata)
return i;
}
}
return WANotFound;
}
int
WMCountInArray(WMArray *array, void *item)
{
int i, count;
for (i=0, count=0; i<array->itemCount; i++) {
if (array->items[i] == item)
count++;
}
return count;
}
void
WMSortArray(WMArray *array, WMCompareDataProc *comparer)
{
if (array->itemCount > 1) { /* Don't sort empty or single element arrays */
qsort(array->items, array->itemCount, sizeof(void*), comparer);
}
}
void
WMMapArray(WMArray *array, void (*function)(void*, void*), void *data)
{
int i;
for (i=0; i<array->itemCount; i++) {
(*function)(array->items[i], data);
}
}
WMArray*
WMGetSubarrayWithRange(WMArray* array, WMRange aRange)
{
WMArray *newArray;
if (aRange.count <= 0)
return WMCreateArray(0);
if (aRange.position < 0)
aRange.position = 0;
if (aRange.position >= array->itemCount)
aRange.position = array->itemCount - 1;
if (aRange.position + aRange.count > array->itemCount)
aRange.count = array->itemCount - aRange.position;
newArray = WMCreateArray(aRange.count);
memcpy(newArray->items, array->items+aRange.position,
sizeof(void*)*aRange.count);
newArray->itemCount = aRange.count;
return newArray;
}
void*
WMArrayFirst(WMArray *array, WMArrayIterator *iter)
{
if (array->itemCount == 0) {
*iter = WANotFound;
return NULL;
} else {
*iter = 0;
return array->items[0];
}
}
void*
WMArrayLast(WMArray *array, WMArrayIterator *iter)
{
if (array->itemCount == 0) {
*iter = WANotFound;
return NULL;
} else {
*iter = array->itemCount-1;
return array->items[*iter];
}
}
void*
WMArrayNext(WMArray *array, WMArrayIterator *iter)
{
if (*iter >= 0 && *iter < array->itemCount-1) {
return array->items[++(*iter)];
} else {
*iter = WANotFound;
return NULL;
}
}
void*
WMArrayPrevious(WMArray *array, WMArrayIterator *iter)
{
if (*iter > 0 && *iter < array->itemCount) {
return array->items[--(*iter)];
} else {
*iter = WANotFound;
return NULL;
}
}

View File

@@ -1,868 +0,0 @@
#include <stdlib.h>
#include <string.h>
#include "WUtil.h"
typedef struct W_Node {
struct W_Node *parent;
struct W_Node *left;
struct W_Node *right;
int color;
void *data;
int index;
} W_Node;
typedef struct W_Bag {
W_Node *root;
W_Node *nil; /* sentinel */
int count;
void (*destructor)(void *item);
} W_Bag;
#define IS_LEFT(node) (node == node->parent->left)
#define IS_RIGHT(node) (node == node->parent->right)
static void
leftRotate(W_Bag *tree, W_Node *node)
{
W_Node *node2;
node2 = node->right;
node->right = node2->left;
node2->left->parent = node;
node2->parent = node->parent;
if (node->parent == tree->nil) {
tree->root = node2;
} else {
if (IS_LEFT(node)) {
node->parent->left = node2;
} else {
node->parent->right = node2;
}
}
node2->left = node;
node->parent = node2;
}
static void
rightRotate(W_Bag *tree, W_Node *node)
{
W_Node *node2;
node2 = node->left;
node->left = node2->right;
node2->right->parent = node;
node2->parent = node->parent;
if (node->parent == tree->nil) {
tree->root = node2;
} else {
if (IS_LEFT(node)) {
node->parent->left = node2;
} else {
node->parent->right = node2;
}
}
node2->right = node;
node->parent = node2;
}
static void
treeInsert(W_Bag *tree, W_Node *node)
{
W_Node *y = tree->nil;
W_Node *x = tree->root;
while (x != tree->nil) {
y = x;
if (node->index <= x->index)
x = x->left;
else
x = x->right;
}
node->parent = y;
if (y == tree->nil)
tree->root = node;
else if (node->index <= y->index)
y->left = node;
else
y->right = node;
}
static void
rbTreeInsert(W_Bag *tree, W_Node *node)
{
W_Node *y;
treeInsert(tree, node);
node->color = 'R';
while (node != tree->root && node->parent->color == 'R') {
if (IS_LEFT(node->parent)) {
y = node->parent->parent->right;
if (y->color == 'R') {
node->parent->color = 'B';
y->color = 'B';
node->parent->parent->color = 'R';
node = node->parent->parent;
} else {
if (IS_RIGHT(node)) {
node = node->parent;
leftRotate(tree, node);
}
node->parent->color = 'B';
node->parent->parent->color = 'R';
rightRotate(tree, node->parent->parent);
}
} else {
y = node->parent->parent->left;
if (y->color == 'R') {
node->parent->color = 'B';
y->color = 'B';
node->parent->parent->color = 'R';
node = node->parent->parent;
} else {
if (IS_LEFT(node)) {
node = node->parent;
rightRotate(tree, node);
}
node->parent->color = 'B';
node->parent->parent->color = 'R';
leftRotate(tree, node->parent->parent);
}
}
}
tree->root->color = 'B';
}
static void
rbDeleteFixup(W_Bag *tree, W_Node *node)
{
W_Node *w;
while (node != tree->root && node->color == 'B') {
if (IS_LEFT(node)) {
w = node->parent->right;
if (w->color == 'R') {
w->color = 'B';
node->parent->color = 'R';
leftRotate(tree, node->parent);
w = node->parent->right;
}
if (w->left->color == 'B' && w->right->color == 'B') {
w->color = 'R';
node = node->parent;
} else {
if (w->right->color == 'B') {
w->left->color = 'B';
w->color = 'R';
rightRotate(tree, w);
w = node->parent->right;
}
w->color = node->parent->color;
node->parent->color = 'B';
w->right->color = 'B';
leftRotate(tree, node->parent);
node = tree->root;
}
} else {
w = node->parent->left;
if (w->color == 'R') {
w->color = 'B';
node->parent->color = 'R';
rightRotate(tree, node->parent);
w = node->parent->left;
}
if (w->left->color == 'B' && w->right->color == 'B') {
w->color = 'R';
node = node->parent;
} else {
if (w->left->color == 'B') {
w->right->color = 'B';
w->color = 'R';
leftRotate(tree, w);
w = node->parent->left;
}
w->color = node->parent->color;
node->parent->color = 'B';
w->left->color = 'B';
rightRotate(tree, node->parent);
node = tree->root;
}
}
}
node->color = 'B';
}
static W_Node*
treeMinimum(W_Node *node, W_Node *nil)
{
while (node->left != nil)
node = node->left;
return node;
}
static W_Node*
treeMaximum(W_Node *node, W_Node *nil)
{
while (node->right != nil)
node = node->right;
return node;
}
static W_Node*
treeSuccessor(W_Node *node, W_Node *nil)
{
W_Node *y;
if (node->right != nil) {
return treeMinimum(node->right, nil);
}
y = node->parent;
while (y != nil && node == y->right) {
node = y;
y = y->parent;
}
return y;
}
static W_Node*
treePredecessor(W_Node *node, W_Node *nil)
{
W_Node *y;
if (node->left != nil) {
return treeMaximum(node->left, nil);
}
y = node->parent;
while (y != nil && node == y->left) {
node = y;
y = y->parent;
}
return y;
}
static W_Node*
rbTreeDelete(W_Bag *tree, W_Node *node)
{
W_Node *nil = tree->nil;
W_Node *x, *y;
if (node->left == nil || node->right == nil) {
y = node;
} else {
y = treeSuccessor(node, nil);
}
if (y->left != nil) {
x = y->left;
} else {
x = y->right;
}
x->parent = y->parent;
if (y->parent == nil) {
tree->root = x;
} else {
if (IS_LEFT(y)) {
y->parent->left = x;
} else {
y->parent->right = x;
}
}
if (y != node) {
node->index = y->index;
node->data = y->data;
}
if (y->color == 'B') {
rbDeleteFixup(tree, x);
}
return y;
}
static W_Node*
treeSearch(W_Node *root, W_Node *nil, int index)
{
if (root == nil || root->index == index) {
return root;
}
if (index < root->index) {
return treeSearch(root->left, nil, index);
} else {
return treeSearch(root->right, nil, index);
}
}
static W_Node*
treeFind(W_Node *root, W_Node *nil, void *data)
{
W_Node *tmp;
if (root == nil || root->data == data)
return root;
tmp = treeFind(root->left, nil, data);
if (tmp != nil)
return tmp;
tmp = treeFind(root->right, nil, data);
return tmp;
}
#if 0
static char buf[512];
static void
printNodes(W_Node *node, W_Node *nil, int depth)
{
if (node == nil) {
return;
}
printNodes(node->left, nil, depth+1);
memset(buf, ' ', depth*2);
buf[depth*2] = 0;
if (IS_LEFT(node))
printf("%s/(%2i\n", buf, node->index);
else
printf("%s\\(%2i\n", buf, node->index);
printNodes(node->right, nil, depth+1);
}
void
PrintTree(WMBag *bag)
{
W_TreeBag *tree = (W_TreeBag*)bag->data;
printNodes(tree->root, tree->nil, 0);
}
#endif
WMBag*
WMCreateTreeBag(void)
{
return WMCreateTreeBagWithDestructor(NULL);
}
WMBag*
WMCreateTreeBagWithDestructor(WMFreeDataProc *destructor)
{
WMBag *bag;
bag = wmalloc(sizeof(WMBag));
memset(bag, 0, sizeof(WMBag));
bag->nil = wmalloc(sizeof(W_Node));
memset(bag->nil, 0, sizeof(W_Node));
bag->nil->left = bag->nil->right = bag->nil->parent = bag->nil;
bag->nil->index = WBNotFound;
bag->root = bag->nil;
bag->destructor = destructor;
return bag;
}
int
WMGetBagItemCount(WMBag *self)
{
return self->count;
}
void
WMAppendBag(WMBag *self, WMBag *bag)
{
WMBagIterator ptr;
void *data;
for (data = WMBagFirst(bag, &ptr); data != NULL; data = WMBagNext(bag, &ptr)) {
WMPutInBag(self, data);
}
}
void
WMPutInBag(WMBag *self, void *item)
{
W_Node *ptr;
ptr = wmalloc(sizeof(W_Node));
ptr->data = item;
ptr->index = self->count;
ptr->left = self->nil;
ptr->right = self->nil;
ptr->parent = self->nil;
rbTreeInsert(self, ptr);
self->count++;
}
void
WMInsertInBag(WMBag *self, int index, void *item)
{
W_Node *ptr;
ptr = wmalloc(sizeof(W_Node));
ptr->data = item;
ptr->index = index;
ptr->left = self->nil;
ptr->right = self->nil;
ptr->parent = self->nil;
rbTreeInsert(self, ptr);
while ((ptr = treeSuccessor(ptr, self->nil)) != self->nil) {
ptr->index++;
}
self->count++;
}
int
WMRemoveFromBag(WMBag *self, void *item)
{
W_Node *ptr = treeFind(self->root, self->nil, item);
if (ptr != self->nil) {
W_Node *tmp;
self->count--;
tmp = treeSuccessor(ptr, self->nil);
while (tmp != self->nil) {
tmp->index--;
tmp = treeSuccessor(tmp, self->nil);
}
ptr = rbTreeDelete(self, ptr);
if (self->destructor)
self->destructor(ptr->data);
wfree(ptr);
return 1;
} else {
return 0;
}
}
int
WMEraseFromBag(WMBag *self, int index)
{
W_Node *ptr = treeSearch(self->root, self->nil, index);
if (ptr != self->nil) {
self->count--;
ptr = rbTreeDelete(self, ptr);
if (self->destructor)
self->destructor(ptr->data);
wfree(ptr);
wassertrv(self->count == 0||self->root->index >= 0, 1);
return 1;
} else {
return 0;
}
}
int
WMDeleteFromBag(WMBag *self, int index)
{
W_Node *ptr = treeSearch(self->root, self->nil, index);
if (ptr != self->nil) {
W_Node *tmp;
self->count--;
tmp = treeSuccessor(ptr, self->nil);
while (tmp != self->nil) {
tmp->index--;
tmp = treeSuccessor(tmp, self->nil);
}
ptr = rbTreeDelete(self, ptr);
if (self->destructor)
self->destructor(ptr->data);
wfree(ptr);
wassertrv(self->count == 0||self->root->index >= 0, 1);
return 1;
} else {
return 0;
}
}
void*
WMGetFromBag(WMBag *self, int index)
{
W_Node *node;
node = treeSearch(self->root, self->nil, index);
if (node != self->nil)
return node->data;
else
return NULL;
}
int
WMGetFirstInBag(WMBag *self, void *item)
{
W_Node *node;
node = treeFind(self->root, self->nil, item);
if (node != self->nil)
return node->index;
else
return WBNotFound;
}
static int
treeCount(W_Node *root, W_Node *nil, void *item)
{
int count = 0;
if (root == nil)
return 0;
if (root->data == item)
count++;
if (root->left != nil)
count += treeCount(root->left, nil, item);
if (root->right != nil)
count += treeCount(root->right, nil, item);
return count;
}
int
WMCountInBag(WMBag *self, void *item)
{
return treeCount(self->root, self->nil, item);
}
void*
WMReplaceInBag(WMBag *self, int index, void *item)
{
W_Node *ptr = treeSearch(self->root, self->nil, index);
void *old = NULL;
if (item == NULL) {
self->count--;
ptr = rbTreeDelete(self, ptr);
if (self->destructor)
self->destructor(ptr->data);
wfree(ptr);
} else if (ptr != self->nil) {
old = ptr->data;
ptr->data = item;
} else {
W_Node *ptr;
ptr = wmalloc(sizeof(W_Node));
ptr->data = item;
ptr->index = index;
ptr->left = self->nil;
ptr->right = self->nil;
ptr->parent = self->nil;
rbTreeInsert(self, ptr);
self->count++;
}
return old;
}
void
WMSortBag(WMBag *self, WMCompareDataProc *comparer)
{
void **items;
W_Node *tmp;
int i;
if (self->count == 0)
return;
items = wmalloc(sizeof(void*)*self->count);
i = 0;
tmp = treeMinimum(self->root, self->nil);
while (tmp != self->nil) {
items[i++] = tmp->data;
tmp = treeSuccessor(tmp, self->nil);
}
qsort(&items[0], self->count, sizeof(void*), comparer);
i = 0;
tmp = treeMinimum(self->root, self->nil);
while (tmp != self->nil) {
tmp->index = i;
tmp->data = items[i++];
tmp = treeSuccessor(tmp, self->nil);
}
wfree(items);
}
static void
deleteTree(WMBag *self, W_Node *node)
{
if (node == self->nil)
return;
deleteTree(self, node->left);
if (self->destructor)
self->destructor(node->data);
deleteTree(self, node->right);
wfree(node);
}
void
WMEmptyBag(WMBag *self)
{
deleteTree(self, self->root);
self->root = self->nil;
self->count = 0;
}
void
WMFreeBag(WMBag *self)
{
WMEmptyBag(self);
wfree(self->nil);
wfree(self);
}
static void
mapTree(W_Bag *tree, W_Node *node, void (*function)(void*, void*), void *data)
{
if (node == tree->nil)
return;
mapTree(tree, node->left, function, data);
(*function)(node->data, data);
mapTree(tree, node->right, function, data);
}
void
WMMapBag(WMBag *self, void (*function)(void*, void*), void *data)
{
mapTree(self, self->root, function, data);
}
static int
findInTree(W_Bag *tree, W_Node *node, WMMatchDataProc *function, void *cdata)
{
int index;
if (node == tree->nil)
return WBNotFound;
index = findInTree(tree, node->left, function, cdata);
if (index != WBNotFound)
return index;
if ((*function)(node->data, cdata)) {
return node->index;
}
return findInTree(tree, node->right, function, cdata);
}
int
WMFindInBag(WMBag *self, WMMatchDataProc *match, void *cdata)
{
return findInTree(self, self->root, match, cdata);
}
void*
WMBagFirst(WMBag *self, WMBagIterator *ptr)
{
W_Node *node;
node = treeMinimum(self->root, self->nil);
if (node == self->nil) {
*ptr = NULL;
return NULL;
} else {
*ptr = node;
return node->data;
}
}
void*
WMBagLast(WMBag *self, WMBagIterator *ptr)
{
W_Node *node;
node = treeMaximum(self->root, self->nil);
if (node == self->nil) {
*ptr = NULL;
return NULL;
} else {
*ptr = node;
return node->data;
}
}
void*
WMBagNext(WMBag *self, WMBagIterator *ptr)
{
W_Node *node;
if (*ptr == NULL)
return NULL;
node = treeSuccessor(*ptr, self->nil);
if (node == self->nil) {
*ptr = NULL;
return NULL;
} else {
*ptr = node;
return node->data;
}
}
void*
WMBagPrevious(WMBag *self, WMBagIterator *ptr)
{
W_Node *node;
if (*ptr == NULL)
return NULL;
node = treePredecessor(*ptr, self->nil);
if (node == self->nil) {
*ptr = NULL;
return NULL;
} else {
*ptr = node;
return node->data;
}
}
void*
WMBagIteratorAtIndex(WMBag *self, int index, WMBagIterator *ptr)
{
W_Node *node;
node = treeSearch(self->root, self->nil, index);
if (node == self->nil) {
*ptr = NULL;
return NULL;
} else {
*ptr = node;
return node->data;
}
}
int
WMBagIndexForIterator(WMBag *bag, WMBagIterator ptr)
{
return ((W_Node*)ptr)->index;
}

View File

@@ -1,44 +1,19 @@
#include "WINGsP.h"
#include "wconfig.h"
#include <X11/Xlocale.h>
#include <proplist.h>
_WINGsConfiguration WINGsConfiguration;
#define SYSTEM_FONT "Trebuchet MS,Luxi Sans"
#define BOLD_SYSTEM_FONT "Trebuchet MS,Luxi Sans:bold"
#define DEFAULT_FONT_SIZE 12
#define SYSTEM_FONT "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*"
#define FLOPPY_PATH "/floppy"
#define BOLD_SYSTEM_FONT "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*"
static unsigned
getButtonWithName(const char *name, unsigned defaultButton)
{
if (strncmp(name, "Button", 6)==0 && strlen(name)==7) {
switch (name[6]) {
case '1':
return Button1;
case '2':
return Button2;
case '3':
return Button3;
case '4':
return Button4;
case '5':
return Button5;
default:
break;
}
}
return defaultButton;
}
void
@@ -51,73 +26,24 @@ W_ReadConfigurations(void)
defaults = WMGetStandardUserDefaults();
if (defaults) {
char *buttonName;
unsigned button;
char *str;
WINGsConfiguration.systemFont =
WMGetUDStringForKey(defaults, "SystemFont");
WINGsConfiguration.systemFont =
WMGetUDStringForKey(defaults, "SystemFont");
WINGsConfiguration.boldSystemFont =
WMGetUDStringForKey(defaults, "BoldSystemFont");
WINGsConfiguration.antialiasedText =
WMGetUDBoolForKey(defaults, "AntialiasedText");
WINGsConfiguration.doubleClickDelay =
WMGetUDIntegerForKey(defaults, "DoubleClickTime");
WINGsConfiguration.floppyPath =
WMGetUDStringForKey(defaults, "FloppyPath");
buttonName = WMGetUDStringForKey(defaults, "MouseWheelUp");
if (buttonName) {
button = getButtonWithName(buttonName, Button4);
wfree(buttonName);
} else {
button = Button4;
}
WINGsConfiguration.mouseWheelUp = button;
buttonName = WMGetUDStringForKey(defaults, "MouseWheelDown");
if (buttonName) {
button = getButtonWithName(buttonName, Button5);
wfree(buttonName);
} else {
button = Button5;
}
WINGsConfiguration.mouseWheelDown = button;
if (WINGsConfiguration.mouseWheelDown==WINGsConfiguration.mouseWheelUp) {
WINGsConfiguration.mouseWheelUp = Button4;
WINGsConfiguration.mouseWheelDown = Button5;
}
WINGsConfiguration.defaultFontSize =
WMGetUDIntegerForKey(defaults, "DefaultFontSize");
WINGsConfiguration.boldSystemFont =
WMGetUDStringForKey(defaults, "BoldSystemFont");
WINGsConfiguration.doubleClickDelay =
WMGetUDIntegerForKey(defaults, "DoubleClickTime");
}
if (!WINGsConfiguration.systemFont) {
WINGsConfiguration.systemFont = SYSTEM_FONT;
WINGsConfiguration.systemFont = SYSTEM_FONT;
}
if (!WINGsConfiguration.boldSystemFont) {
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
}
if (WINGsConfiguration.defaultFontSize == 0) {
WINGsConfiguration.defaultFontSize = DEFAULT_FONT_SIZE;
}
if (!WINGsConfiguration.floppyPath) {
WINGsConfiguration.floppyPath = FLOPPY_PATH;
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
}
if (WINGsConfiguration.doubleClickDelay == 0) {
WINGsConfiguration.doubleClickDelay = 250;
WINGsConfiguration.doubleClickDelay = 250;
}
if (WINGsConfiguration.mouseWheelUp == 0) {
WINGsConfiguration.mouseWheelUp = Button4;
}
if (WINGsConfiguration.mouseWheelDown == 0) {
WINGsConfiguration.mouseWheelDown = Button5;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,350 +0,0 @@
/*
* WINGs WMData function library
*
* Copyright (c) 1999-2003 Dan Pascu
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <string.h>
#include "WUtil.h"
typedef struct W_Data {
unsigned length; /* How many bytes we have */
unsigned capacity; /* How many bytes it can hold */
unsigned growth; /* How much to grow */
void *bytes; /* Actual data */
unsigned retainCount;
WMFreeDataProc *destructor;
int format; /* 0, 8, 16 or 32 */
} W_Data;
/* Creating and destroying data objects */
WMData*
WMCreateDataWithCapacity(unsigned capacity)
{
WMData *aData;
aData = (WMData*)wmalloc(sizeof(WMData));
if (capacity>0)
aData->bytes = wmalloc(capacity);
else
aData->bytes = NULL;
aData->capacity = capacity;
aData->growth = capacity/2 > 0 ? capacity/2 : 1;
aData->length = 0;
aData->retainCount = 1;
aData->format = 0;
aData->destructor = wfree;
return aData;
}
WMData*
WMCreateDataWithLength(unsigned length)
{
WMData *aData;
aData = WMCreateDataWithCapacity(length);
if (length>0) {
memset(aData->bytes, 0, length);
aData->length = length;
}
return aData;
}
WMData*
WMCreateDataWithBytes(void *bytes, unsigned length)
{
WMData *aData;
aData = WMCreateDataWithCapacity(length);
aData->length = length;
memcpy(aData->bytes, bytes, length);
return aData;
}
WMData*
WMCreateDataWithBytesNoCopy(void *bytes, unsigned length,
WMFreeDataProc *destructor)
{
WMData *aData;
aData = (WMData*)wmalloc(sizeof(WMData));
aData->length = length;
aData->capacity = length;
aData->growth = length/2 > 0 ? length/2 : 1;
aData->bytes = bytes;
aData->retainCount = 1;
aData->format = 0;
aData->destructor = destructor;
return aData;
}
WMData*
WMCreateDataWithData(WMData *aData)
{
WMData *newData;
if (aData->length > 0) {
newData = WMCreateDataWithBytes(aData->bytes, aData->length);
} else {
newData = WMCreateDataWithCapacity(0);
}
newData->format = aData->format;
return newData;
}
WMData*
WMRetainData(WMData *aData)
{
aData->retainCount++;
return aData;
}
void
WMReleaseData(WMData *aData)
{
aData->retainCount--;
if (aData->retainCount > 0)
return;
if (aData->bytes!=NULL && aData->destructor!=NULL) {
aData->destructor(aData->bytes);
}
wfree(aData);
}
/* Adjusting capacity */
void
WMSetDataCapacity(WMData *aData, unsigned capacity)
{
if (aData->capacity != capacity) {
aData->bytes = wrealloc(aData->bytes, capacity);
aData->capacity = capacity;
aData->growth = capacity/2 > 0 ? capacity/2 : 1;
}
if (aData->length > capacity) {
aData->length = capacity;
}
}
void
WMSetDataLength(WMData *aData, unsigned length)
{
if (length > aData->capacity) {
WMSetDataCapacity(aData, length);
}
if (length > aData->length) {
memset((unsigned char*)aData->bytes + aData->length, 0,
length - aData->length);
}
aData->length = length;
}
void
WMSetDataFormat(WMData *aData, unsigned format)
{
aData->format = format;
}
void
WMIncreaseDataLengthBy(WMData *aData, unsigned extraLength)
{
WMSetDataLength(aData, aData->length + extraLength);
}
/* Accessing data */
const void*
WMDataBytes(WMData *aData)
{
return aData->bytes;
}
void
WMGetDataBytes(WMData *aData, void *buffer)
{
wassertr(aData->length > 0);
memcpy(buffer, aData->bytes, aData->length);
}
unsigned
WMGetDataFormat(WMData *aData)
{
return aData->format;
}
void
WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length)
{
wassertr(aData->length > 0);
wassertr(length <= aData->length);
memcpy(buffer, aData->bytes, length);
}
void
WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange)
{
wassertr(aRange.position < aData->length);
wassertr(aRange.count <= aData->length-aRange.position);
memcpy(buffer, (unsigned char*)aData->bytes + aRange.position,
aRange.count);
}
WMData*
WMGetSubdataWithRange(WMData *aData, WMRange aRange)
{
void *buffer;
WMData *newData;
if (aRange.count <= 0)
return WMCreateDataWithCapacity(0);
buffer = wmalloc(aRange.count);
WMGetDataBytesWithRange(aData, buffer, aRange);
newData = WMCreateDataWithBytesNoCopy(buffer, aRange.count, wfree);
newData->format = aData->format;
return newData;
}
/* Testing data */
Bool
WMIsDataEqualToData(WMData *aData, WMData *anotherData)
{
if (aData->length != anotherData->length)
return False;
else if (!aData->bytes && !anotherData->bytes) /* both are empty */
return True;
else if (!aData->bytes || !anotherData->bytes) /* one of them is empty */
return False;
return (memcmp(aData->bytes, anotherData->bytes, aData->length)==0);
}
unsigned
WMGetDataLength(WMData *aData)
{
return aData->length;
}
/* Adding data */
void
WMAppendDataBytes(WMData *aData, void *bytes, unsigned length)
{
unsigned oldLength = aData->length;
unsigned newLength = oldLength + length;
if (newLength > aData->capacity) {
unsigned nextCapacity = aData->capacity + aData->growth;
unsigned nextGrowth = aData->capacity ? aData->capacity : 1;
while (nextCapacity < newLength) {
unsigned tmp = nextCapacity + nextGrowth;
nextGrowth = nextCapacity;
nextCapacity = tmp;
}
WMSetDataCapacity(aData, nextCapacity);
aData->growth = nextGrowth;
}
memcpy((unsigned char*)aData->bytes + oldLength, bytes, length);
aData->length = newLength;
}
void
WMAppendData(WMData *aData, WMData *anotherData)
{
if (anotherData->length > 0)
WMAppendDataBytes(aData, anotherData->bytes, anotherData->length);
}
/* Modifying data */
void
WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes)
{
wassertr(aRange.position < aData->length);
wassertr(aRange.count <= aData->length-aRange.position);
memcpy((unsigned char*)aData->bytes + aRange.position, bytes, aRange.count);
}
void
WMResetDataBytesInRange(WMData *aData, WMRange aRange)
{
wassertr(aRange.position < aData->length);
wassertr(aRange.count <= aData->length-aRange.position);
memset((unsigned char*)aData->bytes + aRange.position, 0, aRange.count);
}
void
WMSetData(WMData *aData, WMData *anotherData)
{
unsigned length = anotherData->length;
WMSetDataCapacity(aData, length);
if (length > 0)
memcpy(aData->bytes, anotherData->bytes, length);
aData->length = length;
}
/* Storing data */

View File

@@ -1,275 +0,0 @@
/* #include <X11/Xatom.h> */
#include "WINGsP.h"
#define VERSION_INFO(dragInfo) dragInfo->protocolVersion
#define XDND_DEST_INFO(dragInfo) dragInfo->destInfo
#define XDND_DEST_VIEW(dragInfo) dragInfo->destInfo->destView
#define XDND_DEST_VIEW_STORED(dragInfo) ((dragInfo->destInfo) != NULL)\
&& ((dragInfo->destInfo->destView) != NULL)
static Bool _WindowExists;
Atom
W_OperationToAction(WMScreen *scr, WMDragOperationType operation)
{
switch (operation) {
case WDOperationNone:
return None;
case WDOperationCopy:
return scr->xdndActionCopy;
case WDOperationMove:
return scr->xdndActionMove;
case WDOperationLink:
return scr->xdndActionLink;
case WDOperationAsk:
return scr->xdndActionAsk;
case WDOperationPrivate:
return scr->xdndActionPrivate;
default:
return None;
}
}
WMDragOperationType
W_ActionToOperation(WMScreen *scr, Atom action)
{
if (action == scr->xdndActionCopy) {
return WDOperationCopy;
} else if (action == scr->xdndActionMove) {
return WDOperationMove;
} else if (action == scr->xdndActionLink) {
return WDOperationLink;
} else if (action == scr->xdndActionAsk) {
return WDOperationAsk;
} else if (action == scr->xdndActionPrivate) {
return WDOperationPrivate;
} else if (action == None) {
return WDOperationNone;
} else {
char *tmp = XGetAtomName(scr->display, action);
wwarning("unknown XDND action %s ", tmp);
XFree(tmp);
return WDOperationCopy;
}
}
static void
freeDragOperationItem(void* item)
{
wfree(item);
}
WMArray*
WMCreateDragOperationArray(int initialSize)
{
return WMCreateArrayWithDestructor(initialSize, freeDragOperationItem);
}
WMDragOperationItem*
WMCreateDragOperationItem(WMDragOperationType type, char* text)
{
W_DragOperationItem *result = wmalloc(sizeof(W_DragOperationItem));
result->type = type;
result->text = text;
return (WMDragOperationItem*) result;
}
WMDragOperationType
WMGetDragOperationItemType(WMDragOperationItem* item)
{
return ((W_DragOperationItem*)item)->type;
}
char*
WMGetDragOperationItemText(WMDragOperationItem* item)
{
return ((W_DragOperationItem*)item)->text;
}
static int
handleNoWindowXError(Display *dpy, XErrorEvent *errEvt)
{
if (errEvt->error_code == BadWindow
|| errEvt->error_code == BadDrawable) {
_WindowExists = False;
return Success;
}
return errEvt->error_code;
}
static Bool
windowExists(Display *dpy, Window win)
{
void* previousErrorHandler;
XWindowAttributes attr;
XSynchronize(dpy, True);
previousErrorHandler = XSetErrorHandler(handleNoWindowXError);
_WindowExists = True;
/* can generate BadDrawable or BadWindow */
XGetWindowAttributes(dpy, win, &attr);
XSetErrorHandler(previousErrorHandler);
XSynchronize(dpy, False);
return _WindowExists;
}
Bool
W_SendDnDClientMessage(Display *dpy, Window win, Atom message,
unsigned long data0,
unsigned long data1,
unsigned long data2,
unsigned long data3,
unsigned long data4)
{
XEvent ev;
if (! windowExists(dpy, win)) {
wwarning("xdnd message target %d does no longer exist.", win);
return False; /* message not sent */
}
ev.type = ClientMessage;
ev.xclient.message_type = message;
ev.xclient.format = 32;
ev.xclient.window = win;
ev.xclient.data.l[0] = data0;
ev.xclient.data.l[1] = data1;
ev.xclient.data.l[2] = data2;
ev.xclient.data.l[3] = data3;
ev.xclient.data.l[4] = data4;
XSendEvent(dpy, win, False, 0, &ev);
XFlush(dpy);
return True; /* message sent */
}
static void
handleLeaveMessage(WMDraggingInfo *info)
{
if (XDND_DEST_INFO(info) != NULL) {
if (XDND_DEST_VIEW(info) != NULL) {
XDND_DEST_VIEW(info)->dragDestinationProcs->concludeDragOperation(
XDND_DEST_VIEW(info));
}
W_DragDestinationInfoClear(info);
}
}
void
W_HandleDNDClientMessage(WMView *toplevel, XClientMessageEvent *event)
{
WMScreen *scr = W_VIEW_SCREEN(toplevel);
WMDraggingInfo *info = &scr->dragInfo;
Atom messageType = event->message_type;
#ifdef XDND_DEBUG
{
char* msgTypeName = XGetAtomName(scr->display, messageType);
if (msgTypeName != NULL)
printf("event type = %s\n", msgTypeName);
else
printf("pb with event type !\n");
}
#endif
/* Messages from destination to source */
if (messageType == scr->xdndStatusAtom
|| messageType == scr->xdndFinishedAtom) {
W_DragSourceStopTimer();
W_DragSourceStateHandler(info, event);
return;
}
/* Messages from source to destination */
if (messageType == scr->xdndEnterAtom) {
W_DragDestinationStopTimer();
W_DragDestinationStoreEnterMsgInfo(info, toplevel, event);
if (VERSION_INFO(info) <= XDND_VERSION) {
if (XDND_DEST_VIEW_STORED(info)) {
/* xdndPosition previously received on xdnd aware view */
W_DragDestinationStateHandler(info, event);
return;
} else {
W_DragDestinationStartTimer(info);
return;
}
} else {
wwarning("received dnd enter msg with unsupported version %i",
VERSION_INFO(info));
W_DragDestinationCancelDropOnEnter(toplevel, info);
return;
}
}
if (messageType == scr->xdndPositionAtom) {
W_DragDestinationStopTimer();
W_DragDestinationStorePositionMsgInfo(info, toplevel, event);
W_DragDestinationStateHandler(info, event);
return;
}
if (messageType == scr->xdndSelectionAtom
|| messageType == scr->xdndDropAtom) {
W_DragDestinationStopTimer();
W_DragDestinationStateHandler(info, event);
return;
}
if (messageType == scr->xdndLeaveAtom) {
/* conclude drop operation, and clear dragging info */
W_DragDestinationStopTimer();
handleLeaveMessage(info);
}
}
/* called in destroyView (wview.c) */
void
W_FreeViewXdndPart(WMView *view)
{
WMUnregisterViewDraggedTypes(view);
if (view->dragSourceProcs)
wfree(view->dragSourceProcs);
if (view->dragDestinationProcs)
wfree(view->dragDestinationProcs);
if (view->dragImage)
WMReleasePixmap(view->dragImage);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
/*
* Window Maker miscelaneous function library
*
* Copyright (c) 1997-2003 Alfredo K. Kojima
*
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -19,7 +19,7 @@
*/
#include "wconfig.h"
#include "../src/config.h"
#include <stdio.h>
#include <stdlib.h>
@@ -27,102 +27,19 @@
#include <string.h>
#include <errno.h>
extern char *_WINGS_progname;
extern char *_WINGS_progname;
#define MAXLINE 1024
/*********************************************************************
* Returns the system error message associated with error code 'errnum'
*********************************************************************/
char*
wstrerror(int errnum)
{
#if defined(HAVE_STRERROR)
return strerror(errnum);
#elif !defined(HAVE_STRERROR) && defined(BSD)
extern int errno, sys_nerr;
# ifndef __DECC
extern char *sys_errlist[];
# endif
static char buf[] = "Unknown error 12345678901234567890";
if (errno < sys_nerr)
return sys_errlist[errnum];
snprintf(buf, sizeof(buf), _("Unknown error %d"), errnum);
return buf;
#else /* no strerror() and no sys_errlist[] */
static char buf[] = "Error 12345678901234567890";
snprintf(buf, sizeof(buf), _("Error %d"), errnum);
return buf;
#endif
}
/*********************************************************************
* Prints a message with variable arguments
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
wmessage(const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
strcat(buf,"\n");
fflush(stdout);
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
fputs(": ",stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
va_end(args);
}
/*********************************************************************
* Prints a warning message with variable arguments
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
wwarning(const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
strcat(buf,"\n");
fflush(stdout);
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
fputs(_(" warning: "),stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
va_end(args);
}
/**************************************************************************
* Prints a fatal error message with variable arguments and terminates
*
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
* ... - arguments to use on formatting
**************************************************************************/
void
void
wfatal(const char *msg, ...)
{
va_list args;
@@ -130,73 +47,72 @@ wfatal(const char *msg, ...)
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
vsprintf(buf, msg, args);
strcat(buf,"\n");
fflush(stdout);
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
fputs(_(" fatal error: "),stderr);
fputs(_WINGS_progname, stderr);
fputs(" fatal error: ",stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
fflush(NULL);
va_end(args);
}
/*********************************************************************
* Prints a system error message with variable arguments
*
* Prints a warning message with variable arguments
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
void
wwarning(const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
va_start(args, msg);
vsprintf(buf, msg, args);
strcat(buf,"\n");
fflush(stdout);
fputs(_WINGS_progname, stderr);
fputs(" warning: ",stderr);
fputs(buf, stderr);
fflush(NULL);
va_end(args);
}
/*********************************************************************
* Prints a system error message with variable arguments
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
wsyserror(const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
#ifdef HAVE_STRERROR
int error=errno;
#endif
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
vsprintf(buf, msg, args);
fflush(stdout);
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
fputs(_(" error: "), stderr);
fputs(_WINGS_progname, stderr);
fputs(" error: ", stderr);
strcat(buf, ": ");
#ifdef HAVE_STRERROR
strcat(buf, strerror(error));
strcat(buf,"\n");
fputs(buf, stderr);
fputs(": ", stderr);
fputs(wstrerror(error), stderr);
fputs("\n", stderr);
fflush(stderr);
fflush(stdout);
fflush(NULL);
#else
perror(buf);
#endif
va_end(args);
}
/*********************************************************************
* Prints a system error message with variable arguments, being given
* the error code.
*
* error - the error code foe which to print the message
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
wsyserrorwithcode(int error, const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
fflush(stdout);
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
fputs(_(" error: "), stderr);
fputs(buf, stderr);
fputs(": ", stderr);
fputs(wstrerror(error), stderr);
fputs("\n", stderr);
fflush(stderr);
fflush(stdout);
va_end(args);
}

View File

@@ -1,8 +1,8 @@
/*
* Window Maker miscelaneous function library
*
* Copyright (c) 1997-2003 Alfredo K. Kojima
*
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -19,7 +19,7 @@
*/
#include "wconfig.h"
#include "../src/config.h"
#include "WUtil.h"
@@ -41,17 +41,17 @@ wgethomedir()
struct passwd *user;
if (home)
return home;
return home;
user = getpwuid(getuid());
if (!user) {
wsyserror(_("could not get password entry for UID %i"), getuid());
return "/";
wsyserror("could not get password entry for UID %i", getuid());
return "/";
}
if (!user->pw_dir) {
return "/";
return "/";
} else {
return user->pw_dir;
return user->pw_dir;
}
}
@@ -60,16 +60,16 @@ static char*
getuserhomedir(char *username)
{
struct passwd *user;
user = getpwnam(username);
if (!user) {
wsyserror(_("could not get password entry for user %s"), username);
return NULL;
wsyserror("could not get password entry for user %s", username);
return NULL;
}
if (!user->pw_dir) {
return "/";
return "/";
} else {
return user->pw_dir;
return user->pw_dir;
}
}
@@ -84,172 +84,149 @@ wexpandpath(char *path)
int i;
memset(buffer, 0, PATH_MAX+2);
if (*path=='~') {
char *home;
path++;
if (*path=='/' || *path==0) {
home = wgethomedir();
strcat(buffer, home);
} else {
int j;
j = 0;
while (*path!=0 && *path!='/') {
buffer2[j++] = *path;
buffer2[j] = 0;
path++;
}
home = getuserhomedir(buffer2);
if (!home)
return NULL;
strcat(buffer, home);
}
char *home;
path++;
if (*path=='/' || *path==0) {
home = wgethomedir();
strcat(buffer, home);
} else {
int j;
j = 0;
while (*path!=0 && *path!='/') {
buffer2[j++] = *path;
buffer2[j] = 0;
path++;
}
home = getuserhomedir(buffer2);
if (!home)
return NULL;
strcat(buffer, home);
}
}
i = strlen(buffer);
while (*path!=0) {
char *tmp;
if (*path=='$') {
int j = 0;
path++;
/* expand $(HOME) or $HOME style environment variables */
if (*path=='(') {
path++;
while (*path!=0 && *path!=')') {
buffer2[j++] = *(path++);
buffer2[j] = 0;
char *tmp;
if (*path=='$') {
int j = 0;
path++;
/* expand $(HOME) or $HOME style environment variables */
if (*path=='(') {
path++;
while (*path!=0 && *path!=')') {
buffer2[j++] = *(path++);
buffer2[j] = 0;
}
if (*path==')')
path++;
tmp = getenv(buffer2);
if (!tmp) {
buffer[i] = 0;
strcat(buffer, "$(");
strcat(buffer, buffer2);
strcat(buffer, ")");
i += strlen(buffer2)+3;
} else {
strcat(buffer, tmp);
i += strlen(tmp);
}
} else {
while (*path!=0 && *path!='/') {
buffer2[j++] = *(path++);
buffer2[j] = 0;
}
tmp = getenv(buffer2);
if (!tmp) {
strcat(buffer, "$");
strcat(buffer, buffer2);
i += strlen(buffer2)+1;
} else {
strcat(buffer, tmp);
i += strlen(tmp);
}
}
} else {
buffer[i++] = *path;
path++;
}
tmp = getenv(buffer2);
if (!tmp) {
buffer[i] = 0;
strcat(buffer, "$(");
strcat(buffer, buffer2);
strcat(buffer, ")");
i += strlen(buffer2)+3;
} else {
strcat(buffer, tmp);
i += strlen(tmp);
}
} else {
while (*path!=0 && *path!='/') {
buffer2[j++] = *(path++);
buffer2[j] = 0;
}
tmp = getenv(buffer2);
if (!tmp) {
strcat(buffer, "$");
strcat(buffer, buffer2);
i += strlen(buffer2)+1;
} else {
strcat(buffer, tmp);
i += strlen(tmp);
}
}
} else {
buffer[i++] = *path;
path++;
}
}
return wstrdup(buffer);
}
/* return address of next char != tok or end of string whichever comes first */
static char*
skipchar(char *string, char tok)
{
while(*string!=0 && *string==tok)
string++;
return string;
}
/* return address of next char == tok or end of string whichever comes first */
static char*
nextchar(char *string, char tok)
{
while(*string!=0 && *string!=tok)
string++;
return string;
}
/*
*----------------------------------------------------------------------
* findfile--
* Finds a file in a : separated list of paths. ~ expansion is also
* Finds a file in a : separated list of paths. ~ expansion is also
* done.
*
*
* Returns:
* The complete path for the file (in a newly allocated string) or
* NULL if the file was not found.
*
*
* Side effects:
* A new string is allocated. It must be freed later.
*
*----------------------------------------------------------------------
*
*----------------------------------------------------------------------
*/
char*
wfindfile(char *paths, char *file)
{
char *path;
char *tmp, *tmp2;
char *tmp;
int done;
int len, flen;
char *fullpath;
if (!file)
return NULL;
if (*file=='/' || *file=='~' || *file=='$' || !paths || *paths==0) {
if (access(file, F_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, F_OK)<0) {
wfree(fullpath);
return NULL;
} else {
return fullpath;
}
} else {
return wstrdup(file);
}
return NULL;
if (*file=='/' || *file=='~' || *file=='$' || !paths) {
if (access(file, R_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, R_OK)<0) {
free(fullpath);
return NULL;
} else {
return fullpath;
}
} else {
return wstrdup(file);
}
}
flen = strlen(file);
tmp = paths;
while (*tmp) {
tmp = skipchar(tmp, ':');
if (*tmp==0)
break;
tmp2 = nextchar(tmp, ':');
len = tmp2 - tmp;
path = wmalloc(len+flen+2);
path = memcpy(path, tmp, len);
path[len]=0;
if (path[len-1] != '/')
strcat(path, "/");
strcat(path, file);
fullpath = wexpandpath(path);
wfree(path);
if (fullpath) {
if (access(fullpath, F_OK)==0) {
return fullpath;
}
wfree(fullpath);
}
tmp = tmp2;
done = 0;
while (!done) {
len = strcspn(tmp, ":");
if (len==0) done=1;
path = wmalloc(len+flen+2);
path = memcpy(path, tmp, len);
path[len]=0;
strcat(path, "/");
strcat(path, file);
fullpath = wexpandpath(path);
free(path);
if (fullpath) {
if (access(fullpath, R_OK)==0) {
return fullpath;
}
free(fullpath);
}
tmp=&(tmp[len+1]);
if (*tmp==0) break;
}
return NULL;
}
@@ -263,107 +240,46 @@ wfindfileinlist(char **path_list, char *file)
char *fullpath;
if (!file)
return NULL;
return NULL;
if (*file=='/' || *file=='~' || !path_list) {
if (access(file, F_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, F_OK)<0) {
wfree(fullpath);
return NULL;
} else {
return fullpath;
}
} else {
return wstrdup(file);
}
if (access(file, R_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, R_OK)<0) {
free(fullpath);
return NULL;
} else {
return fullpath;
}
} else {
return wstrdup(file);
}
}
flen = strlen(file);
for (i=0; path_list[i]!=NULL; i++) {
len = strlen(path_list[i]);
path = wmalloc(len+flen+2);
path = memcpy(path, path_list[i], len);
path[len]=0;
strcat(path, "/");
strcat(path, file);
/* expand tilde */
fullpath = wexpandpath(path);
wfree(path);
if (fullpath) {
/* check if file exists */
if (access(fullpath, F_OK)==0) {
return fullpath;
}
wfree(fullpath);
}
len = strlen(path_list[i]);
path = wmalloc(len+flen+2);
path = memcpy(path, path_list[i], len);
path[len]=0;
strcat(path, "/");
strcat(path, file);
/* expand tilde */
fullpath = wexpandpath(path);
free(path);
if (fullpath) {
/* check if file is readable */
if (access(fullpath, R_OK)==0) {
return fullpath;
}
free(fullpath);
}
}
return NULL;
}
char*
wfindfileinarray(WMPropList *array, char *file)
{
int i;
char *path;
int len, flen;
char *fullpath;
if (!file)
return NULL;
if (*file=='/' || *file=='~' || !array) {
if (access(file, F_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, F_OK)<0) {
wfree(fullpath);
return NULL;
} else {
return fullpath;
}
} else {
return wstrdup(file);
}
}
flen = strlen(file);
for (i=0; i<WMGetPropListItemCount(array); i++) {
WMPropList *prop;
char *p;
prop = WMGetFromPLArray(array, i);
if (!prop)
continue;
p = WMGetFromPLString(prop);
len = strlen(p);
path = wmalloc(len+flen+2);
path = memcpy(path, p, len);
path[len]=0;
strcat(path, "/");
strcat(path, file);
/* expand tilde */
fullpath = wexpandpath(path);
wfree(path);
if (fullpath) {
/* check if file exists */
if (access(fullpath, F_OK)==0) {
return fullpath;
}
wfree(fullpath);
}
}
return NULL;
}

View File

@@ -1,8 +1,8 @@
/*
* WINGs demo: font lister
*
* Copyright (c) 1998-2003 Alfredo K. Kojima
*
*
* Copyright (c) 1998 Alfredo K. Kojima
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
@@ -24,8 +24,8 @@
#include <stdlib.h>
#include <stdio.h>
#include <WINGs/WINGs.h>
#include <WINGs/WUtil.h>
#include "WINGs.h"
#include "WUtil.h"
void
wAbort()
@@ -64,10 +64,10 @@ main(int argc, char **argv)
dpy = XOpenDisplay("");
if (!dpy) {
wfatal("cant open display");
exit(0);
wfatal("cant open display");
exit(0);
}
scr = WMCreateSimpleApplicationScreen(dpy);
win = WMCreateWindow(scr, "main");
@@ -80,25 +80,25 @@ main(int argc, char **argv)
c = 0;
for (y=0; y<8; y++) {
for (x=0; x<32; x++, c++) {
lab = WMCreateCustomButton(win, WBBStateLightMask);
WMResizeWidget(lab, 20, 20);
WMMoveWidget(lab, 10+x*20, 30+y*20);
sprintf(buf, "%c", c);
WMSetButtonText(lab, buf);
WMSetButtonAction(lab, show, pos);
WMHangData(lab, (void*)c);
if (c>0) {
WMGroupButtons(l0, lab);
} else {
l0 = lab;
}
}
for (x=0; x<32; x++, c++) {
lab = WMCreateCustomButton(win, WBBStateLightMask);
WMResizeWidget(lab, 20, 20);
WMMoveWidget(lab, 10+x*20, 30+y*20);
sprintf(buf, "%c", c);
WMSetButtonText(lab, buf);
WMSetButtonAction(lab, show, pos);
WMHangData(lab, (void*)c);
if (c>0) {
WMGroupButtons(l0, lab);
} else {
l0 = lab;
}
}
}
WMRealizeWidget(win);
WMMapSubwidgets(win);
WMMapWidget(win);
WMScreenMainLoop(scr);
return 0;
return 0;
}

View File

@@ -1,614 +0,0 @@
/*
* WINGs internal handlers: timer, idle and input handlers
*/
#include "WINGsP.h"
#include "../src/config.h"
#include <sys/types.h>
#include <unistd.h>
#include <X11/Xos.h>
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include <time.h>
#ifndef X_GETTIMEOFDAY
#define X_GETTIMEOFDAY(t) gettimeofday(t, (struct timezone*)0)
#endif
typedef struct TimerHandler {
WMCallback *callback; /* procedure to call */
struct timeval when; /* when to call the callback */
void *clientData;
struct TimerHandler *next;
int nextDelay; /* 0 if it's one-shot */
} TimerHandler;
typedef struct IdleHandler {
WMCallback *callback;
void *clientData;
} IdleHandler;
typedef struct InputHandler {
WMInputProc *callback;
void *clientData;
int fd;
int mask;
} InputHandler;
/* queue of timer event handlers */
static TimerHandler *timerHandler=NULL;
static WMArray *idleHandler=NULL;
static WMArray *inputHandler=NULL;
#define timerPending() (timerHandler)
static void
rightNow(struct timeval *tv)
{
X_GETTIMEOFDAY(tv);
}
/* is t1 after t2 ? */
#define IS_AFTER(t1, t2) (((t1).tv_sec > (t2).tv_sec) || \
(((t1).tv_sec == (t2).tv_sec) \
&& ((t1).tv_usec > (t2).tv_usec)))
#define IS_ZERO(tv) (tv.tv_sec == 0 && tv.tv_usec == 0)
#define SET_ZERO(tv) tv.tv_sec = 0, tv.tv_usec = 0
static void
addmillisecs(struct timeval *tv, int milliseconds)
{
tv->tv_usec += milliseconds*1000;
tv->tv_sec += tv->tv_usec/1000000;
tv->tv_usec = tv->tv_usec%1000000;
}
static void
enqueueTimerHandler(TimerHandler *handler)
{
TimerHandler *tmp;
/* insert callback in queue, sorted by time left */
if (!timerHandler || !IS_AFTER(handler->when, timerHandler->when)) {
/* first in the queue */
handler->next = timerHandler;
timerHandler = handler;
} else {
tmp = timerHandler;
while (tmp->next && IS_AFTER(handler->when, tmp->next->when)) {
tmp = tmp->next;
}
handler->next = tmp->next;
tmp->next = handler;
}
}
static void
delayUntilNextTimerEvent(struct timeval *delay)
{
struct timeval now;
TimerHandler *handler;
handler = timerHandler;
while (handler && IS_ZERO(handler->when)) handler = handler->next;
if (!handler) {
/* The return value of this function is only valid if there _are_
timers active. */
delay->tv_sec = 0;
delay->tv_usec = 0;
return;
}
rightNow(&now);
if (IS_AFTER(now, handler->when)) {
delay->tv_sec = 0;
delay->tv_usec = 0;
} else {
delay->tv_sec = handler->when.tv_sec - now.tv_sec;
delay->tv_usec = handler->when.tv_usec - now.tv_usec;
if (delay->tv_usec < 0) {
delay->tv_usec += 1000000;
delay->tv_sec--;
}
}
}
WMHandlerID
WMAddTimerHandler(int milliseconds, WMCallback *callback, void *cdata)
{
TimerHandler *handler;
handler = malloc(sizeof(TimerHandler));
if (!handler)
return NULL;
rightNow(&handler->when);
addmillisecs(&handler->when, milliseconds);
handler->callback = callback;
handler->clientData = cdata;
handler->nextDelay = 0;
enqueueTimerHandler(handler);
return handler;
}
WMHandlerID
WMAddPersistentTimerHandler(int milliseconds, WMCallback *callback, void *cdata)
{
TimerHandler *handler = WMAddTimerHandler(milliseconds, callback, cdata);
if (handler != NULL)
handler->nextDelay = milliseconds;
return handler;
}
void
WMDeleteTimerWithClientData(void *cdata)
{
TimerHandler *handler, *tmp;
if (!cdata || !timerHandler)
return;
tmp = timerHandler;
if (tmp->clientData==cdata) {
tmp->nextDelay = 0;
if (!IS_ZERO(tmp->when)) {
timerHandler = tmp->next;
wfree(tmp);
}
} else {
while (tmp->next) {
if (tmp->next->clientData==cdata) {
handler = tmp->next;
handler->nextDelay = 0;
if (IS_ZERO(handler->when))
break;
tmp->next = handler->next;
wfree(handler);
break;
}
tmp = tmp->next;
}
}
}
void
WMDeleteTimerHandler(WMHandlerID handlerID)
{
TimerHandler *tmp, *handler=(TimerHandler*)handlerID;
if (!handler || !timerHandler)
return;
tmp = timerHandler;
handler->nextDelay = 0;
if (IS_ZERO(handler->when))
return;
if (tmp==handler) {
timerHandler = handler->next;
wfree(handler);
} else {
while (tmp->next) {
if (tmp->next==handler) {
tmp->next=handler->next;
wfree(handler);
break;
}
tmp = tmp->next;
}
}
}
WMHandlerID
WMAddIdleHandler(WMCallback *callback, void *cdata)
{
IdleHandler *handler;
handler = malloc(sizeof(IdleHandler));
if (!handler)
return NULL;
handler->callback = callback;
handler->clientData = cdata;
/* add handler at end of queue */
if (!idleHandler) {
idleHandler = WMCreateArrayWithDestructor(16, wfree);
}
WMAddToArray(idleHandler, handler);
return handler;
}
void
WMDeleteIdleHandler(WMHandlerID handlerID)
{
IdleHandler *handler = (IdleHandler*)handlerID;
if (!handler || !idleHandler)
return;
WMRemoveFromArray(idleHandler, handler);
}
WMHandlerID
WMAddInputHandler(int fd, int condition, WMInputProc *proc, void *clientData)
{
InputHandler *handler;
handler = wmalloc(sizeof(InputHandler));
handler->fd = fd;
handler->mask = condition;
handler->callback = proc;
handler->clientData = clientData;
if (!inputHandler)
inputHandler = WMCreateArrayWithDestructor(16, wfree);
WMAddToArray(inputHandler, handler);
return handler;
}
void
WMDeleteInputHandler(WMHandlerID handlerID)
{
InputHandler *handler = (InputHandler*)handlerID;
if (!handler || !inputHandler)
return;
WMRemoveFromArray(inputHandler, handler);
}
Bool
W_CheckIdleHandlers(void)
{
IdleHandler *handler;
WMArray *handlerCopy;
WMArrayIterator iter;
if (!idleHandler || WMGetArrayItemCount(idleHandler)==0) {
W_FlushIdleNotificationQueue();
/* make sure an observer in queue didn't added an idle handler */
return (idleHandler!=NULL && WMGetArrayItemCount(idleHandler)>0);
}
handlerCopy = WMDuplicateArray(idleHandler);
WM_ITERATE_ARRAY(handlerCopy, handler, iter) {
/* check if the handler still exist or was removed by a callback */
if (WMGetFirstInArray(idleHandler, handler) == WANotFound)
continue;
(*handler->callback)(handler->clientData);
WMDeleteIdleHandler(handler);
}
WMFreeArray(handlerCopy);
W_FlushIdleNotificationQueue();
/* this is not necesarrily False, because one handler can re-add itself */
return (WMGetArrayItemCount(idleHandler)>0);
}
void
W_CheckTimerHandlers(void)
{
TimerHandler *handler;
struct timeval now;
if (!timerHandler) {
W_FlushASAPNotificationQueue();
return;
}
rightNow(&now);
handler = timerHandler;
while (handler && IS_AFTER(now, handler->when)) {
if (!IS_ZERO(handler->when)) {
SET_ZERO(handler->when);
(*handler->callback)(handler->clientData);
}
handler = handler->next;
}
while (timerHandler && IS_ZERO(timerHandler->when)) {
handler = timerHandler;
timerHandler = timerHandler->next;
if (handler->nextDelay > 0) {
handler->when = now;
addmillisecs(&handler->when, handler->nextDelay);
enqueueTimerHandler(handler);
} else {
wfree(handler);
}
}
W_FlushASAPNotificationQueue();
}
/*
* This functions will handle input events on all registered file descriptors.
* Input:
* - waitForInput - True if we want the function to wait until an event
* appears on a file descriptor we watch, False if we
* want the function to immediately return if there is
* no data available on the file descriptors we watch.
* - inputfd - Extra input file descriptor to watch for input.
* This is only used when called from wevent.c to watch
* on ConnectionNumber(dpy) to avoid blocking of X events
* if we wait for input from other file handlers.
* Output:
* if waitForInput is False, the function will return False if there are no
* input handlers registered, or if there is no data
* available on the registered ones, and will return True
* if there is at least one input handler that has data
* available.
* if waitForInput is True, the function will return False if there are no
* input handlers registered, else it will block until an
* event appears on one of the file descriptors it watches
* and then it will return True.
*
* If the retured value is True, the input handlers for the corresponding file
* descriptors are also called.
*
* Parametersshould be passed like this:
* - from wevent.c:
* waitForInput - apropriate value passed by the function who called us
* inputfd = ConnectionNumber(dpy)
* - from wutil.c:
* waitForInput - apropriate value passed by the function who called us
* inputfd = -1
*
*/
Bool
W_HandleInputEvents(Bool waitForInput, int inputfd)
{
#if defined(HAVE_POLL) && defined(HAVE_POLL_H) && !defined(HAVE_SELECT)
struct poll fd *fds;
InputHandler *handler;
int count, timeout, nfds, i, extrafd;
extrafd = (inputfd < 0) ? 0 : 1;
if (inputHandler)
nfds = WMGetArrayItemCount(inputHandler);
else
nfds = 0;
if (!extrafd && nfds==0) {
W_FlushASAPNotificationQueue();
return False;
}
fds = wmalloc((nfds+extrafd) * sizeof(struct pollfd));
if (extrafd) {
/* put this to the end of array to avoid using ranges from 1 to nfds+1 */
fds[nfds].fd = inputfd;
fds[nfds].events = POLLIN;
}
/* use WM_ITERATE_ARRAY() here */
for (i = 0; i<nfds; i++) {
handler = WMGetFromArray(inputHandler, i);
fds[i].fd = handler->fd;
fds[i].events = 0;
if (handler->mask & WIReadMask)
fds[i].events |= POLLIN;
if (handler->mask & WIWriteMask)
fds[i].events |= POLLOUT;
#if 0 /* FIXME */
if (handler->mask & WIExceptMask)
FD_SET(handler->fd, &eset);
#endif
}
/*
* Setup the timeout to the estimated time until the
* next timer expires.
*/
if (!waitForInput) {
timeout = 0;
} else if (timerPending()) {
struct timeval tv;
delayUntilNextTimerEvent(&tv);
timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
timeout = -1;
}
count = poll(fds, nfds+extrafd, timeout);
if (count>0 && nfds>0) {
WMArray *handlerCopy = WMDuplicateArray(inputHandler);
int mask;
/* use WM_ITERATE_ARRAY() here */
for (i=0; i<nfds; i++) {
handler = WMGetFromArray(handlerCopy, i);
/* check if the handler still exist or was removed by a callback */
if (WMGetFirstInArray(inputHandler, handler) == WANotFound)
continue;
mask = 0;
if ((handler->mask & WIReadMask) &&
(fds[i].revents & (POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI)))
mask |= WIReadMask;
if ((handler->mask & WIWriteMask) &&
(fds[i].revents & (POLLOUT | POLLWRBAND)))
mask |= WIWriteMask;
if ((handler->mask & WIExceptMask) &&
(fds[i].revents & (POLLHUP | POLLNVAL | POLLERR)))
mask |= WIExceptMask;
if (mask!=0 && handler->callback) {
(*handler->callback)(handler->fd, mask,
handler->clientData);
}
}
WMFreeArray(handlerCopy);
}
wfree(fds);
W_FlushASAPNotificationQueue();
return (count > 0);
#else
#ifdef HAVE_SELECT
struct timeval timeout;
struct timeval *timeoutPtr;
fd_set rset, wset, eset;
int maxfd, nfds, i;
int count;
InputHandler *handler;
if (inputHandler)
nfds = WMGetArrayItemCount(inputHandler);
else
nfds = 0;
if (inputfd<0 && nfds==0) {
W_FlushASAPNotificationQueue();
return False;
}
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_ZERO(&eset);
if (inputfd < 0) {
maxfd = 0;
} else {
FD_SET(inputfd, &rset);
maxfd = inputfd;
}
/* use WM_ITERATE_ARRAY() here */
for (i=0; i<nfds; i++) {
handler = WMGetFromArray(inputHandler, i);
if (handler->mask & WIReadMask)
FD_SET(handler->fd, &rset);
if (handler->mask & WIWriteMask)
FD_SET(handler->fd, &wset);
if (handler->mask & WIExceptMask)
FD_SET(handler->fd, &eset);
if (maxfd < handler->fd)
maxfd = handler->fd;
}
/*
* Setup the timeout to the estimated time until the
* next timer expires.
*/
if (!waitForInput) {
SET_ZERO(timeout);
timeoutPtr = &timeout;
} else if (timerPending()) {
delayUntilNextTimerEvent(&timeout);
timeoutPtr = &timeout;
} else {
timeoutPtr = (struct timeval*)0;
}
count = select(1 + maxfd, &rset, &wset, &eset, timeoutPtr);
if (count>0 && nfds>0) {
WMArray *handlerCopy = WMDuplicateArray(inputHandler);
int mask;
/* use WM_ITERATE_ARRAY() here */
for (i=0; i<nfds; i++) {
handler = WMGetFromArray(handlerCopy, i);
/* check if the handler still exist or was removed by a callback */
if (WMGetFirstInArray(inputHandler, handler) == WANotFound)
continue;
mask = 0;
if ((handler->mask & WIReadMask) && FD_ISSET(handler->fd, &rset))
mask |= WIReadMask;
if ((handler->mask & WIWriteMask) && FD_ISSET(handler->fd, &wset))
mask |= WIWriteMask;
if ((handler->mask & WIExceptMask) && FD_ISSET(handler->fd, &eset))
mask |= WIExceptMask;
if (mask!=0 && handler->callback) {
(*handler->callback)(handler->fd, mask,
handler->clientData);
}
}
WMFreeArray(handlerCopy);
}
W_FlushASAPNotificationQueue();
return (count > 0);
#else /* not HAVE_SELECT, not HAVE_POLL */
# error Neither select nor poll. You lose.
#endif /* HAVE_SELECT */
#endif /* HAVE_POLL */
}

View File

@@ -21,9 +21,9 @@
typedef struct HashItem {
const void *key;
const void *data;
void *key;
void *data;
struct HashItem *next; /* collided item list */
} HashItem;
@@ -41,13 +41,13 @@ typedef struct W_HashTable {
#define HASH(table, key) (((table)->callbacks.hash ? \
(*(table)->callbacks.hash)(key) : hashPtr(key)) % (table)->size)
(*(table)->callbacks.hash)(key) : hashPtr(key)) % (table)->size)
#define DUPKEY(table, key) ((table)->callbacks.retainKey ? \
(*(table)->callbacks.retainKey)(key) : (key))
(*(table)->callbacks.retainKey)(key) : (key))
#define RELKEY(table, key) if ((table)->callbacks.releaseKey) \
(*(table)->callbacks.releaseKey)(key)
(*(table)->callbacks.releaseKey)(key)
@@ -59,10 +59,10 @@ hashString(const char *key)
unsigned ctr = 0;
while (*key) {
ret ^= *(char*)key++ << ctr;
ctr = (ctr + 1) % sizeof (char *);
ret ^= *(char*)key++ << ctr;
ctr = (ctr + 1) % sizeof (char *);
}
return ret;
}
@@ -106,15 +106,15 @@ rebuildTable(WMHashTable *table)
table->table = wmalloc(sizeof(char*)*newSize);
memset(table->table, 0, sizeof(char*)*newSize);
table->size = newSize;
for (i = 0; i < oldSize; i++) {
while (oldArray[i]!=NULL) {
next = oldArray[i]->next;
rellocateItem(table, oldArray[i]);
oldArray[i] = next;
}
while (oldArray[i]!=NULL) {
next = oldArray[i]->next;
rellocateItem(table, oldArray[i]);
oldArray[i] = next;
}
}
wfree(oldArray);
free(oldArray);
}
@@ -123,17 +123,17 @@ WMHashTable*
WMCreateHashTable(WMHashTableCallbacks callbacks)
{
HashTable *table;
table = wmalloc(sizeof(HashTable));
memset(table, 0, sizeof(HashTable));
table->callbacks = callbacks;
table->size = INITIAL_CAPACITY;
table->table = wmalloc(sizeof(HashItem*)*table->size);
memset(table->table, 0, sizeof(HashItem*)*table->size);
return table;
}
@@ -145,21 +145,21 @@ WMResetHashTable(WMHashTable *table)
int i;
for (i = 0; i < table->size; i++) {
item = table->table[i];
while (item) {
tmp = item->next;
RELKEY(table, item->key);
wfree(item);
item = tmp;
}
item = table->table[i];
while (item) {
tmp = item->next;
RELKEY(table, item);
free(item);
item = tmp;
}
}
table->itemCount = 0;
if (table->size > INITIAL_CAPACITY) {
wfree(table->table);
table->size = INITIAL_CAPACITY;
table->table = wmalloc(sizeof(HashItem*)*table->size);
free(table->table);
table->size = INITIAL_CAPACITY;
table->table = wmalloc(sizeof(HashItem*)*table->size);
}
memset(table->table, 0, sizeof(HashItem*)*table->size);
}
@@ -170,157 +170,114 @@ WMFreeHashTable(WMHashTable *table)
{
HashItem *item, *tmp;
int i;
for (i = 0; i < table->size; i++) {
item = table->table[i];
while (item) {
tmp = item->next;
RELKEY(table, item->key);
wfree(item);
item = tmp;
}
item = table->table[i];
while (item) {
tmp = item->next;
RELKEY(table, item);
free(item);
item = tmp;
}
}
wfree(table->table);
wfree(table);
free(table->table);
free(table);
}
unsigned
WMCountHashTable(WMHashTable *table)
{
return table->itemCount;
}
void*
WMHashGet(WMHashTable *table, const void *key)
{
unsigned h;
HashItem *item;
h = HASH(table, key);
item = table->table[h];
if (table->callbacks.keyIsEqual) {
while (item) {
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
break;
}
item = item->next;
}
while (item) {
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
break;
}
item = item->next;
}
} else {
while (item) {
if (key == item->key) {
break;
}
item = item->next;
}
while (item) {
if (key == item->key) {
break;
}
item = item->next;
}
}
if (item)
return (void*)item->data;
return item->data;
else
return NULL;
}
Bool
WMHashGetItemAndKey(WMHashTable *table, const void *key,
void **retItem, void **retKey)
{
unsigned h;
HashItem *item;
h = HASH(table, key);
item = table->table[h];
if (table->callbacks.keyIsEqual) {
while (item) {
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
break;
}
item = item->next;
}
} else {
while (item) {
if (key == item->key) {
break;
}
item = item->next;
}
}
if (item) {
if (retKey)
*retKey = (void*)item->key;
if (retItem)
*retItem = (void*)item->data;
return True;
} else {
return False;
}
return NULL;
}
void*
WMHashInsert(WMHashTable *table, const void *key, const void *data)
WMHashInsert(WMHashTable *table, void *key, void *data)
{
unsigned h;
HashItem *item;
int replacing = 0;
h = HASH(table, key);
/* look for the entry */
item = table->table[h];
if (table->callbacks.keyIsEqual) {
while (item) {
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
replacing = 1;
break;
}
item = item->next;
}
while (item) {
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
replacing = 1;
break;
}
item = item->next;
}
} else {
while (item) {
if (key == item->key) {
replacing = 1;
break;
}
item = item->next;
}
while (item) {
if (key == item->key) {
replacing = 1;
break;
}
item = item->next;
}
}
if (replacing) {
const void *old;
void *old;
old = item->data;
item->data = data;
RELKEY(table, item->key);
item->key = DUPKEY(table, key);
old = item->data;
item->data = data;
RELKEY(table, item->key);
item->key = DUPKEY(table, key);
return (void*)old;
return old;
} else {
HashItem *nitem;
HashItem *nitem;
nitem = wmalloc(sizeof(HashItem));
nitem->key = DUPKEY(table, key);
nitem->data = data;
nitem->next = table->table[h];
table->table[h] = nitem;
nitem = wmalloc(sizeof(HashItem));
nitem->key = DUPKEY(table, key);
nitem->data = data;
nitem->next = table->table[h];
table->table[h] = nitem;
table->itemCount++;
table->itemCount++;
}
/* OPTIMIZE: put this in an idle handler.*/
if (table->itemCount > table->size) {
#ifdef DEBUG0
printf("rebuilding hash table...\n");
printf("rebuilding hash table...\n");
#endif
rebuildTable(table);
rebuildTable(table);
#ifdef DEBUG0
printf("finished rebuild.\n");
printf("finished rebuild.\n");
#endif
}
return NULL;
}
@@ -329,23 +286,23 @@ static HashItem*
deleteFromList(HashTable *table, HashItem *item, const void *key)
{
HashItem *next;
if (item==NULL)
return NULL;
return NULL;
if ((table->callbacks.keyIsEqual
&& (*table->callbacks.keyIsEqual)(key, item->key))
|| (!table->callbacks.keyIsEqual && key==item->key)) {
if ((table->callbacks.keyIsEqual
&& (*table->callbacks.keyIsEqual)(key, item->key))
|| (!table->callbacks.keyIsEqual && key==item->key)) {
next = item->next;
RELKEY(table, item->key);
free(item);
table->itemCount--;
next = item->next;
RELKEY(table, item->key);
wfree(item);
table->itemCount--;
return next;
return next;
}
item->next = deleteFromList(table, item->next, key);
return item;
@@ -356,9 +313,9 @@ void
WMHashRemove(WMHashTable *table, const void *key)
{
unsigned h;
h = HASH(table, key);
table->table[h] = deleteFromList(table, table->table[h], key);
}
@@ -367,11 +324,11 @@ WMHashEnumerator
WMEnumerateHashTable(WMHashTable *table)
{
WMHashEnumerator enumerator;
enumerator.table = table;
enumerator.index = 0;
enumerator.nextItem = table->table[0];
return enumerator;
}
@@ -380,85 +337,34 @@ WMEnumerateHashTable(WMHashTable *table)
void*
WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
{
const void *data = NULL;
void *data = NULL;
/* this assumes the table doesn't change between
/* this assumes the table doesn't change between
* WMEnumerateHashTable() and WMNextHashEnumeratorItem() calls */
if (enumerator->nextItem==NULL) {
HashTable *table = enumerator->table;
while (++enumerator->index < table->size) {
if (table->table[enumerator->index]!=NULL) {
enumerator->nextItem = table->table[enumerator->index];
break;
}
}
HashTable *table = enumerator->table;
while (++enumerator->index < table->size) {
if (table->table[enumerator->index]!=NULL) {
enumerator->nextItem = table->table[enumerator->index];
break;
}
}
}
if (enumerator->nextItem) {
data = ((HashItem*)enumerator->nextItem)->data;
enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next;
data = ((HashItem*)enumerator->nextItem)->data;
enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next;
}
return (void*)data;
return data;
}
void*
WMNextHashEnumeratorKey(WMHashEnumerator *enumerator)
unsigned
WMCountHashTable(WMHashTable *table)
{
const void *key = NULL;
/* this assumes the table doesn't change between
* WMEnumerateHashTable() and WMNextHashEnumeratorKey() calls */
if (enumerator->nextItem==NULL) {
HashTable *table = enumerator->table;
while (++enumerator->index < table->size) {
if (table->table[enumerator->index]!=NULL) {
enumerator->nextItem = table->table[enumerator->index];
break;
}
}
}
if (enumerator->nextItem) {
key = ((HashItem*)enumerator->nextItem)->key;
enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next;
}
return (void*)key;
}
Bool
WMNextHashEnumeratorItemAndKey(WMHashEnumerator *enumerator,
void **item, void **key)
{
/* this assumes the table doesn't change between
* WMEnumerateHashTable() and WMNextHashEnumeratorItemAndKey() calls */
if (enumerator->nextItem==NULL) {
HashTable *table = enumerator->table;
while (++enumerator->index < table->size) {
if (table->table[enumerator->index]!=NULL) {
enumerator->nextItem = table->table[enumerator->index];
break;
}
}
}
if (enumerator->nextItem) {
if (item)
*item = (void*)((HashItem*)enumerator->nextItem)->data;
if (key)
*key = (void*)((HashItem*)enumerator->nextItem)->key;
enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next;
return True;
}
return False;
return table->itemCount;
}
@@ -477,24 +383,24 @@ typedef void (*releaseFunc)(const void*);
const WMHashTableCallbacks WMIntHashCallbacks = {
NULL,
NULL,
NULL,
NULL
NULL,
NULL,
NULL
};
const WMHashTableCallbacks WMStringHashCallbacks = {
(hashFunc)hashString,
(isEqualFunc)compareStrings,
(retainFunc)wstrdup,
(releaseFunc)wfree
(isEqualFunc)compareStrings,
(retainFunc)wstrdup,
(releaseFunc)free
};
const WMHashTableCallbacks WMStringPointerHashCallbacks = {
(hashFunc)hashString,
(isEqualFunc)compareStrings,
NULL,
NULL
(isEqualFunc)compareStrings,
NULL,
NULL
};

View File

@@ -1,310 +0,0 @@
/*
* WINGs WMHost function library
*
* Copyright (c) 1999-2003 Dan Pascu
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "wconfig.h"
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "WUtil.h"
/* For Solaris */
#ifndef INADDR_NONE
# define INADDR_NONE (-1)
#endif
/* Max hostname length (RFC 1123) */
#define W_MAXHOSTNAMELEN 255
typedef struct W_Host {
char *name;
WMArray *names;
WMArray *addresses;
int refCount;
} W_Host;
static WMHashTable *hostCache = NULL;
static Bool hostCacheEnabled = True;
static WMHost*
getHostFromCache(char *name)
{
if (!hostCache)
return NULL;
return WMHashGet(hostCache, name);
}
static WMHost*
getHostWithHostEntry(struct hostent *host, char *name)
{
WMHost *hPtr;
struct in_addr in;
int i;
hPtr = (WMHost*)wmalloc(sizeof(WMHost));
memset(hPtr, 0, sizeof(WMHost));
hPtr->names = WMCreateArrayWithDestructor(1, wfree);
hPtr->addresses = WMCreateArrayWithDestructor(1, wfree);
WMAddToArray(hPtr->names, wstrdup(host->h_name));
for (i=0; host->h_aliases[i]!=NULL; i++) {
WMAddToArray(hPtr->names, wstrdup(host->h_aliases[i]));
}
for (i=0; host->h_addr_list[i]!=NULL; i++) {
memcpy((void*)&in.s_addr, (const void*)host->h_addr_list[i],
host->h_length);
WMAddToArray(hPtr->addresses, wstrdup(inet_ntoa(in)));
}
hPtr->refCount = 1;
if (hostCacheEnabled) {
if (!hostCache)
hostCache = WMCreateHashTable(WMStringPointerHashCallbacks);
hPtr->name = wstrdup(name);
wassertr(WMHashInsert(hostCache, hPtr->name, hPtr)==NULL);
hPtr->refCount++;
}
return hPtr;
}
WMHost*
WMGetCurrentHost()
{
char name[W_MAXHOSTNAMELEN+1];
if (gethostname(name, W_MAXHOSTNAMELEN) < 0) {
wsyserror(_("Cannot get current host name"));
return NULL;
}
name[W_MAXHOSTNAMELEN] = 0;
return WMGetHostWithName(name);
}
WMHost*
WMGetHostWithName(char *name)
{
struct hostent *host;
WMHost *hPtr;
wassertrv(name!=NULL, NULL);
if (hostCacheEnabled) {
if ((hPtr = getHostFromCache(name)) != NULL) {
WMRetainHost(hPtr);
return hPtr;
}
}
host = gethostbyname(name);
if (host == NULL) {
return NULL;
}
hPtr = getHostWithHostEntry(host, name);
return hPtr;
}
WMHost*
WMGetHostWithAddress(char *address)
{
struct hostent *host;
struct in_addr in;
WMHost *hPtr;
wassertrv(address!=NULL, NULL);
if (hostCacheEnabled) {
if ((hPtr = getHostFromCache(address)) != NULL) {
WMRetainHost(hPtr);
return hPtr;
}
}
#ifndef HAVE_INET_ATON
if ((in.s_addr = inet_addr(address)) == INADDR_NONE)
return NULL;
#else
if (inet_aton(address, &in) == 0)
return NULL;
#endif
host = gethostbyaddr((char*)&in, sizeof(in), AF_INET);
if (host == NULL) {
return NULL;
}
hPtr = getHostWithHostEntry(host, address);
return hPtr;
}
WMHost*
WMRetainHost(WMHost *hPtr)
{
hPtr->refCount++;
return hPtr;
}
void
WMReleaseHost(WMHost *hPtr)
{
hPtr->refCount--;
if (hPtr->refCount > 0)
return;
WMFreeArray(hPtr->names);
WMFreeArray(hPtr->addresses);
if (hPtr->name) {
WMHashRemove(hostCache, hPtr->name);
wfree(hPtr->name);
}
wfree(hPtr);
}
void
WMSetHostCacheEnabled(Bool flag)
{
hostCacheEnabled = ((flag==0) ? 0 : 1);
}
Bool
WMIsHostCacheEnabled()
{
return hostCacheEnabled;
}
void
WMFlushHostCache()
{
if (hostCache && WMCountHashTable(hostCache)>0) {
WMArray *hostArray = WMCreateArray(WMCountHashTable(hostCache));
WMHashEnumerator enumer = WMEnumerateHashTable(hostCache);
WMHost *hPtr;
int i;
while ((hPtr = WMNextHashEnumeratorItem(&enumer))) {
/* we can't release the host here, because we can't change the
* hash while using the enumerator functions. */
WMAddToArray(hostArray, hPtr);
}
for (i=0; i<WMGetArrayItemCount(hostArray); i++)
WMReleaseHost(WMGetFromArray(hostArray, i));
WMFreeArray(hostArray);
WMResetHashTable(hostCache);
}
}
static int
matchAddress(void *item, void *cdata)
{
return (strcmp((char*) item, (char*) cdata)==0);
}
Bool
WMIsHostEqualToHost(WMHost* hPtr, WMHost* aPtr)
{
char *adr;
int i;
wassertrv(hPtr!=NULL && aPtr!=NULL, False);
if (hPtr == aPtr)
return True;
for (i=0; i<WMGetArrayItemCount(aPtr->addresses); i++) {
adr = WMGetFromArray(aPtr->addresses, i);
if (WMFindInArray(hPtr->addresses, matchAddress, adr) != WANotFound) {
return True;
}
}
return False;
}
char*
WMGetHostName(WMHost *hPtr)
{
return (WMGetArrayItemCount(hPtr->names) > 0 ?
WMGetFromArray(hPtr->names, 0) : NULL);
/*return WMGetFromArray(hPtr->names, 0);*/
}
WMArray*
WMGetHostNames(WMHost *hPtr)
{
return hPtr->names;
}
char*
WMGetHostAddress(WMHost *hPtr)
{
return (WMGetArrayItemCount(hPtr->addresses) > 0 ?
WMGetFromArray(hPtr->addresses, 0) : NULL);
}
WMArray*
WMGetHostAddresses(WMHost *hPtr)
{
return hPtr->addresses;
}

View File

@@ -8,5 +8,5 @@
void
InitI18n(Display *dpy)
{
}

View File

@@ -1,8 +1,8 @@
/*
* Window Maker miscelaneous function library
*
* Copyright (c) 1997-2003 Alfredo K. Kojima
*
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -29,11 +29,6 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#ifdef TEST_WITH_GC
#include <gc/gc.h>
#endif
#ifndef False
# define False 0
@@ -42,33 +37,7 @@
# define True 1
#endif
static void
defaultHandler(int bla)
{
if (bla)
kill(getpid(), SIGABRT);
else
exit(1);
}
static waborthandler *aborthandler = (waborthandler*)defaultHandler;
#define wAbort(a) (*aborthandler)(a)
waborthandler*
wsetabort(waborthandler *handler)
{
waborthandler *old = aborthandler;
aborthandler = handler;
return old;
}
extern void wAbort(int);
static int Aborting=0; /* if we're in the middle of an emergency exit */
@@ -76,77 +45,42 @@ static int Aborting=0; /* if we're in the middle of an emergency exit */
static WMHashTable *table = NULL;
void*
wmalloc(size_t size)
void *wmalloc(size_t size)
{
void *tmp;
assert(size > 0);
#ifdef TEST_WITH_GC
tmp = GC_malloc(size);
#else
tmp = malloc(size);
#endif
if (tmp == NULL) {
wwarning("malloc() failed. Retrying after 2s.");
sleep(2);
#ifdef TEST_WITH_GC
tmp = GC_malloc(size);
#else
tmp = malloc(size);
#endif
if (tmp == NULL) {
if (Aborting) {
fputs("Really Bad Error: recursive malloc() failure.", stderr);
exit(-1);
} else {
wfatal("virtual memory exhausted");
Aborting=1;
wAbort(False);
}
}
wwarning("malloc() failed. Retrying after 2s.");
sleep(2);
tmp = malloc(size);
if (tmp == NULL) {
if (Aborting) {
puts("Real Bad Error: recursive malloc() failure.");
exit(-1);
} else {
wfatal("virtual memory exhausted");
Aborting=1;
wAbort(False);
}
}
}
return tmp;
}
void*
wrealloc(void *ptr, size_t newsize)
void *wrealloc(void *ptr, size_t newsize)
{
void *nptr;
if (!ptr) {
nptr = wmalloc(newsize);
} else if (newsize==0) {
wfree(ptr);
nptr = NULL;
nptr = malloc(newsize);
} else {
#ifdef TEST_WITH_GC
nptr = GC_realloc(ptr, newsize);
#else
nptr = realloc(ptr, newsize);
#endif
if (nptr==NULL) {
wwarning("realloc() failed. Retrying after 2s.");
sleep(2);
#ifdef TEST_WITH_GC
nptr = GC_realloc(ptr, newsize);
#else
nptr = realloc(ptr, newsize);
#endif
if (nptr == NULL) {
if (Aborting) {
fputs("Really Bad Error: recursive realloc() failure.",
stderr);
exit(-1);
} else {
wfatal("virtual memory exhausted");
Aborting=1;
wAbort(False);
}
}
}
nptr=realloc(ptr, newsize);
}
if (nptr==NULL) {
printf("Could not do realloc");
return NULL;
}
return nptr;
}
@@ -156,67 +90,80 @@ void*
wretain(void *ptr)
{
int *refcount;
if (!table) {
table = WMCreateHashTable(WMIntHashCallbacks);
table = WMCreateHashTable(WMIntHashCallbacks);
}
refcount = WMHashGet(table, ptr);
if (!refcount) {
refcount = wmalloc(sizeof(int));
*refcount = 1;
WMHashInsert(table, ptr, refcount);
refcount = wmalloc(sizeof(int));
*refcount = 1;
WMHashInsert(table, ptr, refcount);
#ifdef VERBOSE
printf("== %i (%p)\n", *refcount, ptr);
printf("== %i (%p)\n", *refcount, ptr);
#endif
} else {
(*refcount)++;
(*refcount)++;
#ifdef VERBOSE
printf("+ %i (%p)\n", *refcount, ptr);
printf("+ %i (%p)\n", *refcount, ptr);
#endif
}
return ptr;
}
void
wfree(void *ptr)
{
#ifdef TEST_WITH_GC
GC_free(ptr);
#else
free(ptr);
#endif
}
void
wrelease(void *ptr)
{
int *refcount;
refcount = WMHashGet(table, ptr);
if (!refcount) {
wwarning("trying to release unexisting data %p", ptr);
wwarning("trying to release unexisting data %p", ptr);
} else {
(*refcount)--;
if (*refcount < 1) {
(*refcount)--;
if (*refcount < 1) {
#ifdef VERBOSE
printf("RELEASING %p\n", ptr);
printf("RELEASING %p\n", ptr);
#endif
WMHashRemove(table, ptr);
wfree(refcount);
wfree(ptr);
}
WMHashRemove(table, ptr);
free(refcount);
free(ptr);
}
#ifdef VERBOSE
else {
printf("- %i (%p)\n", *refcount, ptr);
}
else {
printf("- %i (%p)\n", *refcount, ptr);
}
#endif
}
}
char*
wstrdup(char *str)
{
assert(str!=NULL);
return strcpy(wmalloc(strlen(str)+1), str);
}
char*
wstrappend(char *dst, char *src)
{
char *str;
if (!dst)
return wstrdup(src);
else if (!src)
return wstrdup(dst);
str = wmalloc(strlen(dst)+strlen(src)+1);
strcpy(str, dst);
strcat(str, src);
return str;
}

View File

@@ -1,18 +0,0 @@
/* Miscelaneous helper functions */
#include "WINGsP.h"
WMRange
wmkrange(int start, int count)
{
WMRange range;
range.position = start;
range.count = count;
return range;
}

View File

@@ -1,10 +1,8 @@
/*
* Demo user widget for WINGs
*
* Author: Alfredo K. Kojima
*
* This file is in the public domain.
* Demo user widget for WINGs.
*
*
* Copyright (c) 1998 Alfredo K. Kojima
*/
@@ -12,9 +10,9 @@
*
* Include the WINGs private data header.
*
*
*
*/
#include <WINGs/WINGsP.h>
#include "WINGsP.h"
/*
* Our public header.
@@ -25,14 +23,14 @@
* Define the widget "class"
*/
typedef struct W_MyWidget {
/* these two fields must be present in all your widgets in this
/* these two fields must be present in all your widgets in this
* exact position */
W_Class widgetClass;
WMView *view;
/* put your stuff here */
char *text;
} _MyWidget;
@@ -50,16 +48,15 @@ static void handleActionEvents(XEvent *event, void *data);
/*
* Delegates
* Some procedures you might want to override. Don't forget to call
* the equivalent view procedure after (or before) doing your stuff.
* See the source for the other widgets to see how to use.
* You won't need to use this most of the time.
*/
static W_ViewDelegate _MyWidgetDelegate = {
NULL,
NULL,
NULL,
NULL,
NULL
static W_ViewProcedureTable _MyWidgetViewProcedures = {
NULL,
NULL,
NULL
};
@@ -76,9 +73,9 @@ InitMyWidget(WMScreen *scr)
{
/* register our widget with WINGs and get our widget class ID */
if (!myWidgetClass) {
myWidgetClass = W_RegisterUserWidget();
myWidgetClass = W_RegisterUserWidget(&_MyWidgetViewProcedures);
}
return myWidgetClass;
}
@@ -90,7 +87,7 @@ MyWidget*
CreateMyWidget(WMWidget *parent)
{
MyWidget *mPtr;
/* allocate some storage for our new widget instance */
mPtr = wmalloc(sizeof(MyWidget));
/* initialize it */
@@ -98,31 +95,28 @@ CreateMyWidget(WMWidget *parent)
/* set the class ID */
mPtr->widgetClass = myWidgetClass;
/*
/*
* Create the view for our widget.
* Note: the Window for the view is only created after the view is
* realized with W_RealizeView()
*
*
* Consider the returned view as read-only.
*/
mPtr->view = W_CreateView(W_VIEW(parent));
if (!mPtr->view) {
wfree(mPtr);
return NULL;
free(mPtr);
return NULL;
}
/* always do this */
mPtr->view->self = mPtr;
/* setup the delegates for the view */
mPtr->view->delegate = &_MyWidgetDelegate;
/*
* Intercept some events for our widget, so that we can handle them.
*/
WMCreateEventHandler(mPtr->view, ExposureMask /* this allows us to know when we should paint */
|StructureNotifyMask, /* this allows us to know things like when we are destroyed */
handleEvents, mPtr);
|StructureNotifyMask, /* this allows us to know things like when we are destroyed */
handleEvents, mPtr);
/*
* Intercept some other events. This could be merged with the above
@@ -146,14 +140,14 @@ paintMyWidget(_MyWidget *mPtr)
if (mPtr->text) {
color = WMWhiteColor(scr);
W_PaintText(mPtr->view, mPtr->view->window, scr->normalFont, 0, 0,
mPtr->view->size.width, WACenter, color,
False, mPtr->text, strlen(mPtr->text));
WMReleaseColor(color);
color = WMWhiteColor(scr);
W_PaintText(mPtr->view, mPtr->view->window, scr->normalFont, 0, 0,
mPtr->view->size.width, WACenter, W_GC(color),
False, mPtr->text, strlen(mPtr->text));
WMReleaseColor(color);
}
}
@@ -165,17 +159,17 @@ handleEvents(XEvent *event, void *data)
_MyWidget *mPtr = (_MyWidget*)data;
switch (event->type) {
case Expose:
if (event->xexpose.count!=0)
break;
paintMyWidget(mPtr);
break;
case DestroyNotify:
destroyMyWidget(mPtr);
break;
switch (event->type) {
case Expose:
if (event->xexpose.count!=0)
break;
paintMyWidget(mPtr);
break;
case DestroyNotify:
destroyMyWidget(mPtr);
break;
}
}
@@ -186,10 +180,10 @@ handleActionEvents(XEvent *event, void *data)
_MyWidget *mPtr = (_MyWidget*)data;
switch (event->type) {
case ButtonPress:
XBell(mPtr->view->screen->display, 100);
XBell(mPtr->view->screen->display, 100);
break;
case ButtonPress:
XBell(mPtr->view->screen->display, 100);
XBell(mPtr->view->screen->display, 100);
break;
}
}
@@ -200,12 +194,12 @@ SetMyWidgetText(MyWidget *mPtr, char *text)
CHECK_CLASS(mPtr, myWidgetClass);
if (mPtr->text)
wfree(mPtr->text);
free(mPtr->text);
mPtr->text = wstrdup(text);
if (W_VIEW_MAPPED(mPtr->view)) {
paintMyWidget(mPtr);
paintMyWidget(mPtr);
}
}
@@ -215,13 +209,13 @@ static void
destroyMyWidget(_MyWidget *mPtr)
{
/*
* Free all data we allocated for our widget.
* Free all data we allocated for our widget.
*/
if (mPtr->text)
wfree(mPtr->text);
wfree(mPtr);
free(mPtr->text);
free(mPtr);
}

View File

@@ -1,7 +1,7 @@
/*
* Header for demo widget.
*
* Header foy demo widget.
*
*/
typedef struct W_MyWidget MyWidget;

View File

@@ -8,17 +8,15 @@
typedef struct W_Notification {
const char *name;
char *name;
void *object;
void *clientData;
int refCount;
} Notification;
extern void W_FlushASAPNotificationQueue();
const char*
char*
WMGetNotificationName(WMNotification *notification)
{
return notification->name;
@@ -40,18 +38,18 @@ WMGetNotificationClientData(WMNotification *notification)
WMNotification*
WMCreateNotification(const char *name, void *object, void *clientData)
WMCreateNotification(char *name, void *object, void *clientData)
{
Notification *nPtr;
nPtr = wmalloc(sizeof(Notification));
nPtr->name = name;
nPtr->object = object;
nPtr->clientData = clientData;
nPtr->refCount = 1;
return nPtr;
}
@@ -60,9 +58,9 @@ void
WMReleaseNotification(WMNotification *notification)
{
notification->refCount--;
if (notification->refCount < 1) {
wfree(notification);
free(notification);
}
}
@@ -71,7 +69,7 @@ WMNotification*
WMRetainNotification(WMNotification *notification)
{
notification->refCount++;
return notification;
}
@@ -82,7 +80,7 @@ typedef struct NotificationObserver {
WMNotificationObserverAction *observerAction;
void *observer;
const char *name;
char *name;
void *object;
struct NotificationObserver *prev; /* for tables */
@@ -95,7 +93,7 @@ typedef struct W_NotificationCenter {
WMHashTable *nameTable; /* names -> observer lists */
WMHashTable *objectTable; /* object -> observer lists */
NotificationObserver *nilList; /* obervers that catch everything */
WMHashTable *observerTable; /* observer -> NotificationObserver */
} NotificationCenter;
@@ -108,21 +106,21 @@ void
W_InitNotificationCenter(void)
{
notificationCenter = wmalloc(sizeof(NotificationCenter));
notificationCenter->nameTable = WMCreateHashTable(WMStringPointerHashCallbacks);
notificationCenter->objectTable = WMCreateHashTable(WMIntHashCallbacks);
notificationCenter->nilList = NULL;
notificationCenter->observerTable = WMCreateHashTable(WMIntHashCallbacks);
}
void
WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
void *observer, const char *name, void *object)
void *observer, char *name, void *object)
{
NotificationObserver *oRec, *rec;
oRec = wmalloc(sizeof(NotificationObserver));
oRec->observerAction = observerAction;
oRec->observer = observer;
@@ -130,42 +128,39 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
oRec->object = object;
oRec->next = NULL;
oRec->prev = NULL;
/* put this action in the list of actions for this observer */
rec = (NotificationObserver*)WMHashInsert(notificationCenter->observerTable,
observer, oRec);
rec = WMHashInsert(notificationCenter->observerTable, observer, oRec);
if (rec) {
/* if this is not the first action for the observer */
oRec->nextAction = rec;
/* if this is not the first action for the observer */
oRec->nextAction = rec;
} else {
oRec->nextAction = NULL;
oRec->nextAction = NULL;
}
if (!name && !object) {
/* catch-all */
oRec->next = notificationCenter->nilList;
if (notificationCenter->nilList) {
notificationCenter->nilList->prev = oRec;
}
notificationCenter->nilList = oRec;
/* catch-all */
oRec->next = notificationCenter->nilList;
if (notificationCenter->nilList) {
notificationCenter->nilList->prev = oRec;
}
notificationCenter->nilList = oRec;
} else if (!name) {
/* any message coming from object */
rec = (NotificationObserver*)WMHashInsert(notificationCenter->objectTable,
object, oRec);
oRec->next = rec;
if (rec) {
rec->prev = oRec;
}
/* any message coming from object */
rec = WMHashInsert(notificationCenter->objectTable, object, oRec);
oRec->next = rec;
if (rec) {
rec->prev = oRec;
}
} else {
/* name && (object || !object) */
rec = (NotificationObserver*)WMHashInsert(notificationCenter->nameTable,
name, oRec);
oRec->next = rec;
if (rec) {
rec->prev = oRec;
}
/* name && (object || !object) */
rec = WMHashInsert(notificationCenter->nameTable, name, oRec);
oRec->next = rec;
if (rec) {
rec->prev = oRec;
}
}
}
@@ -176,63 +171,62 @@ WMPostNotification(WMNotification *notification)
NotificationObserver *orec, *tmp;
WMRetainNotification(notification);
/* tell the observers that want to know about a particular message */
orec = (NotificationObserver*)WMHashGet(notificationCenter->nameTable,
notification->name);
orec = WMHashGet(notificationCenter->nameTable, notification->name);
while (orec) {
tmp = orec->next;
tmp = orec->next;
if (!orec->object || orec->object == notification->object) {
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
}
if (!orec->object || !notification->object
|| orec->object == notification->object) {
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
}
orec = tmp;
orec = tmp;
}
/* tell the observers that want to know about an object */
orec = (NotificationObserver*)WMHashGet(notificationCenter->objectTable,
notification->object);
orec = WMHashGet(notificationCenter->objectTable, notification->object);
while (orec) {
tmp = orec->next;
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
orec = tmp;
tmp = orec->next;
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
orec = tmp;
}
/* tell the catch all observers */
orec = notificationCenter->nilList;
while (orec) {
tmp = orec->next;
tmp = orec->next;
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
orec = tmp;
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
}
orec = tmp;
}
WMReleaseNotification(notification);
}
void
WMRemoveNotificationObserver(void *observer)
{
NotificationObserver *orec, *tmp, *rec;
/* get the list of actions the observer is doing */
orec = (NotificationObserver*)WMHashGet(notificationCenter->observerTable,
observer);
orec = WMHashGet(notificationCenter->observerTable, observer);
/*
* FOREACH orec IN actionlist for observer
@@ -242,47 +236,45 @@ WMRemoveNotificationObserver(void *observer)
* END
*/
while (orec) {
tmp = orec->nextAction;
tmp = orec->nextAction;
if (!orec->name && !orec->object) {
/* catch-all */
if (notificationCenter->nilList==orec)
notificationCenter->nilList = orec->next;
} else if (!orec->name) {
/* any message coming from object */
rec = (NotificationObserver*)WMHashGet(notificationCenter->objectTable,
orec->object);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->objectTable, orec->object,
orec->next);
} else {
WMHashRemove(notificationCenter->objectTable, orec->object);
}
}
} else {
/* name && (object || !object) */
rec = (NotificationObserver*)WMHashGet(notificationCenter->nameTable,
orec->name);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->nameTable, orec->name,
orec->next);
} else {
WMHashRemove(notificationCenter->nameTable, orec->name);
}
}
}
if (orec->prev)
orec->prev->next = orec->next;
if (orec->next)
orec->next->prev = orec->prev;
if (!orec->name && !orec->object) {
/* catch-all */
if (notificationCenter->nilList==orec)
notificationCenter->nilList = orec->next;
} else if (!orec->name) {
/* any message coming from object */
rec = WMHashGet(notificationCenter->objectTable, orec->object);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->objectTable, orec->object,
orec->next);
} else {
WMHashRemove(notificationCenter->objectTable, orec->object);
}
}
} else {
/* name && (object || !object) */
rec = WMHashGet(notificationCenter->nameTable, orec->name);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->nameTable, orec->name,
orec->next);
} else {
WMHashRemove(notificationCenter->nameTable, orec->name);
}
}
}
if (orec->prev)
orec->prev->next = orec->next;
if (orec->next)
orec->next->prev = orec->prev;
wfree(orec);
orec = tmp;
free(orec);
orec = tmp;
}
WMHashRemove(notificationCenter->observerTable, observer);
@@ -290,90 +282,76 @@ WMRemoveNotificationObserver(void *observer)
void
WMRemoveNotificationObserverWithName(void *observer, const char *name, void *object)
WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
{
NotificationObserver *orec, *tmp, *rec;
NotificationObserver *newList = NULL;
/* get the list of actions the observer is doing */
orec = (NotificationObserver*)WMHashGet(notificationCenter->observerTable, observer);
WMHashRemove(notificationCenter->observerTable, observer);
/* rebuild the list of actions for the observer */
orec = WMHashGet(notificationCenter->observerTable, observer);
while (orec) {
tmp = orec->nextAction;
if (orec->name == name && orec->object == object) {
if (!name && !object) {
if (notificationCenter->nilList == orec)
notificationCenter->nilList = orec->next;
} else if (!name) {
rec = (NotificationObserver*)WMHashGet(notificationCenter->objectTable, orec->object);
if (rec==orec) {
assert(rec->prev==NULL);
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->objectTable,
orec->object, orec->next);
} else {
WMHashRemove(notificationCenter->objectTable,
orec->object);
}
}
} else {
rec = (NotificationObserver*)WMHashGet(notificationCenter->nameTable,
orec->name);
if (rec==orec) {
assert(rec->prev==NULL);
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->nameTable,
orec->name, orec->next);
} else {
WMHashRemove(notificationCenter->nameTable,
orec->name);
}
}
}
tmp = orec->nextAction;
if (orec->name == name && orec->object == object) {
if (!name && !object) {
if (notificationCenter->nilList == orec)
notificationCenter->nilList = orec->next;
} else if (!name) {
rec = WMHashGet(notificationCenter->objectTable, orec->object);
if (rec==orec) {
assert(rec->prev==NULL);
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->objectTable, orec->object,
orec->next);
} else {
WMHashRemove(notificationCenter->objectTable,
orec->object);
}
}
} else {
rec = WMHashGet(notificationCenter->nameTable, orec->name);
if (rec==orec) {
assert(rec->prev==NULL);
/* replace table entry */
if (orec->next) {
WMHashInsert(notificationCenter->nameTable, orec->name,
orec->next);
} else {
WMHashRemove(notificationCenter->nameTable, orec->name);
}
}
}
/* update the action list for the observer */
rec = WMHashGet(notificationCenter->observerTable, observer);
if (rec == orec) {
if (orec->nextAction) {
WMHashInsert(notificationCenter->nameTable, observer,
orec->nextAction);
} else {
WMHashRemove(notificationCenter->nameTable, observer);
}
}
if (orec->prev)
orec->prev->next = orec->next;
if (orec->next)
orec->next->prev = orec->prev;
wfree(orec);
} else {
/* append this action in the new action list */
orec->nextAction = NULL;
if (!newList) {
newList = orec;
} else {
NotificationObserver *p;
p = newList;
while (p->nextAction) {
p = p->nextAction;
}
p->nextAction = orec;
}
}
orec = tmp;
}
/* reinsert the list to the table */
if (newList) {
WMHashInsert(notificationCenter->observerTable, observer, newList);
if (orec->prev)
orec->prev->next = orec->next;
if (orec->next)
orec->next->prev = orec->prev;
free(orec);
}
orec = tmp;
}
}
void
WMPostNotificationName(const char *name, void *object, void *clientData)
WMPostNotificationName(char *name, void *object, void *clientData)
{
WMNotification *notification;
notification = WMCreateNotification(name, object, clientData);
WMPostNotification(notification);
WMReleaseNotification(notification);
@@ -385,25 +363,18 @@ WMPostNotificationName(const char *name, void *object, void *clientData)
typedef struct W_NotificationQueue {
WMArray *asapQueue;
WMArray *idleQueue;
struct W_NotificationQueue *next;
NotificationCenter *center;
void *asapQueue;
void *idleQueue;
} NotificationQueue;
static WMNotificationQueue *notificationQueueList = NULL;
/* default queue */
static WMNotificationQueue *notificationQueue = NULL;
WMNotificationQueue*
WMGetDefaultNotificationQueue(void)
{
if (!notificationQueue)
notificationQueue = WMCreateNotificationQueue();
return notificationQueue;
}
@@ -411,133 +382,33 @@ WMGetDefaultNotificationQueue(void)
WMNotificationQueue*
WMCreateNotificationQueue(void)
{
NotificationQueue *queue;
queue = wmalloc(sizeof(NotificationQueue));
queue->asapQueue =
WMCreateArrayWithDestructor(8, (WMFreeDataProc*)WMReleaseNotification);
queue->idleQueue =
WMCreateArrayWithDestructor(8, (WMFreeDataProc*)WMReleaseNotification);
queue->next = notificationQueueList;
notificationQueueList = queue;
return queue;
return NULL;
}
void
WMDequeueNotificationMatching(WMNotificationQueue *queue, unsigned mask)
{
}
void
WMEnqueueNotification(WMNotificationQueue *queue, WMNotification *notification,
WMPostingStyle postingStyle)
WMPostingStyle postingStyle)
{
WMEnqueueCoalesceNotification(queue, notification, postingStyle,
WNCOnName|WNCOnSender);
}
#define NOTIF ((WMNotification*)cdata)
#define ITEM ((WMNotification*)item)
static int
matchSenderAndName(void *item, void *cdata)
{
return (NOTIF->object==ITEM->object && strcmp(NOTIF->name, ITEM->name)==0);
}
static int
matchSender(void *item, void *cdata)
{
return (NOTIF->object == ITEM->object);
}
static int
matchName(void *item, void *cdata)
{
return (strcmp(NOTIF->name, ITEM->name)==0);
}
#undef NOTIF
#undef ITEM
void
WMDequeueNotificationMatching(WMNotificationQueue *queue,
WMNotification *notification, unsigned mask)
{
WMMatchDataProc *matchFunc;
if ((mask & WNCOnName) && (mask & WNCOnSender))
matchFunc = matchSenderAndName;
else if (mask & WNCOnName)
matchFunc = matchName;
else if (mask & WNCOnSender)
matchFunc = matchSender;
else
return;
WMRemoveFromArrayMatching(queue->asapQueue, matchFunc, notification);
WMRemoveFromArrayMatching(queue->idleQueue, matchFunc, notification);
}
void
WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
WMNotification *notification,
WMPostingStyle postingStyle,
unsigned coalesceMask)
WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
WMNotification *notification,
WMPostingStyle postingStyle,
unsigned coalesceMask)
{
if (coalesceMask != WNCNone)
WMDequeueNotificationMatching(queue, notification, coalesceMask);
switch (postingStyle) {
case WMPostNow:
WMPostNotification(notification);
WMReleaseNotification(notification);
break;
case WMPostASAP:
WMAddToArray(queue->asapQueue, notification);
break;
case WMPostWhenIdle:
WMAddToArray(queue->idleQueue, notification);
break;
}
}
void
W_FlushASAPNotificationQueue()
{
WMNotificationQueue *queue = notificationQueueList;
while (queue) {
while (WMGetArrayItemCount(queue->asapQueue)) {
WMPostNotification(WMGetFromArray(queue->asapQueue, 0));
WMDeleteFromArray(queue->asapQueue, 0);
}
queue = queue->next;
}
}
void
W_FlushIdleNotificationQueue()
{
WMNotificationQueue *queue = notificationQueueList;
while (queue) {
while (WMGetArrayItemCount(queue->idleQueue)) {
WMPostNotification(WMGetFromArray(queue->idleQueue, 0));
WMDeleteFromArray(queue->idleQueue, 0);
}
queue = queue->next;
}
}

View File

@@ -1,4 +0,0 @@
Makefile Makefile.in
.psrc .inslog2 tca.map tca.log pchdir *.rpt
*.pot
*.mo

View File

@@ -1,52 +0,0 @@
nlsdir = $(NLSDIR)
CATALOGS = @WINGSMOFILES@
CLEANFILES = $(CATALOGS) WINGs.pot
EXTRA_DIST = bg.po ca.po cs.po de.po fr.po sk.po
POTFILES = \
$(top_builddir)/WINGs/connection.c \
$(top_builddir)/WINGs/error.c \
$(top_builddir)/WINGs/findfile.c \
$(top_builddir)/WINGs/host.c \
$(top_builddir)/WINGs/proplist.c \
$(top_builddir)/WINGs/userdefaults.c \
$(top_builddir)/WINGs/wcolor.c \
$(top_builddir)/WINGs/wcolorpanel.c \
$(top_builddir)/WINGs/wfilepanel.c \
$(top_builddir)/WINGs/wfont.c \
$(top_builddir)/WINGs/wfontpanel.c \
$(top_builddir)/WINGs/widgets.c \
$(top_builddir)/WINGs/wruler.c
SUFFIXES = .po .mo
.po.mo:
msgfmt -c -o $@ $<
all-local: $(CATALOGS)
WINGs.pot: $(POTFILES)
xgettext --default-domain=WINGs \
--add-comments --keyword=_ $(POTFILES)
if cmp -s WINGs.po WINGs.pot; then \
rm -f WINGs.po; \
else \
mv -f WINGs.po WINGs.pot; \
fi
install-data-local: $(CATALOGS)
$(mkinstalldirs) $(DESTDIR)$(nlsdir)
chmod 755 $(DESTDIR)$(nlsdir)
for n in $(CATALOGS) __DuMmY ; do \
if test "$$n" -a "$$n" != "__DuMmY" ; then \
l=`basename $$n .mo`; \
$(mkinstalldirs) $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES; \
chmod 755 $(DESTDIR)$(nlsdir)/$$l; \
chmod 755 $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES; \
$(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES/WINGs.mo; \
fi; \
done

View File

@@ -1,19 +0,0 @@
Instructions for translating po files can be found in the po/README directory
in the top of the WindowMaker source tree.
All files are in UTF-8
File Language Note Current Maintainer
------------------------------------------------------------------------------
ca.po Catalan Ernest Adrogué <eadrogue@gmx.net>
cs.po Czech Jiri Hnidek <Jiri.Hnidek@vslib.cz
de.po German Guido Scholz <guido.scholz@bayernline.de>
fr.po French Emmanuel Benoit <tseeker@neptune.fr>
Antoine Hulin <antoine@origan.fdn.org>
sk.po Slovak Jan 'judas' Tomka <judas@linux.sk>
bg.po Bulgarian Anton Zinoviev <zinoviev@debian.org>
Notes
-----

View File

@@ -1,660 +0,0 @@
# Message catalog for WINGs
# Copyright (C) 2003 Free Software Foundation, Inc.
# Anton Zinoviev <zinoviev@debian.org>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: WINGs 0.80.0\n"
"POT-Creation-Date: 2003-02-08 21:42+0200\n"
"PO-Revision-Date: 2003-02-09 12:10+0200\n"
"Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n"
"Language-Team: Bulgarian <dict@linux.zonebg.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../WINGs/connection.c:461 ../../WINGs/connection.c:526
#: ../../WINGs/connection.c:569
msgid "Bad address-service-protocol combination"
msgstr "Неправилна комбинация адрес-услуга-протокол"
#: ../../WINGs/error.c:54
#, c-format
msgid "Unknown error %d"
msgstr "Непозната грешка %d"
#: ../../WINGs/error.c:59
#, c-format
msgid "Error %d"
msgstr "Грешка %d"
#: ../../WINGs/error.c:110
msgid " warning: "
msgstr "внимание: "
#: ../../WINGs/error.c:137
msgid " fatal error: "
msgstr " критична грешка: "
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
msgid " error: "
msgstr " грешка: "
#: ../../WINGs/findfile.c:48
#, c-format
msgid "could not get password entry for UID %i"
msgstr "не може да се получи записът за парола на потребител с номер %i"
#: ../../WINGs/findfile.c:66
#, c-format
msgid "could not get password entry for user %s"
msgstr "не може да се получи записът за парола на потребител %s<"
#: ../../WINGs/host.c:114
msgid "Cannot get current host name"
msgstr "Не може да се получи името на хоста"
#: ../../WINGs/proplist.c:91
#, c-format
msgid "syntax error in %s %s, line %i: %s"
msgstr "синтактична грешка в %s %s, ред %i: %s"
#: ../../WINGs/proplist.c:150
msgid "Only string or data is supported for a proplist dictionary key"
msgstr "Като ключ за достъп до proplist се поддържат само низове или данни"
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
msgid "Used proplist functions on non-WMPropLists objects"
msgstr "Ползват се proplist-функции за обекти, които не са от тип WMPropLists"
#: ../../WINGs/proplist.c:630
msgid "unterminated PropList string"
msgstr "незавършен низ PropList"
#: ../../WINGs/proplist.c:670
msgid "unterminated PropList data"
msgstr "незавършени данни PropList"
#: ../../WINGs/proplist.c:678
msgid "unterminated PropList data (missing hexdigit)"
msgstr "незавършени данни PropList (липсва шестнадесетично число)"
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
msgid "non hexdigit character in PropList data"
msgstr "знак, който не е шестнадесетично число, в данни PropList"
#: ../../WINGs/proplist.c:729
msgid "unterminated PropList array"
msgstr "незавършен масив PropList"
#: ../../WINGs/proplist.c:737
msgid "missing or unterminated PropList array"
msgstr "липсващ или незавършен масив Proplist"
#: ../../WINGs/proplist.c:747
msgid "could not get PropList array element"
msgstr "не може да се получи елемент от масив PropList"
#: ../../WINGs/proplist.c:776
msgid "unterminated PropList dictionary"
msgstr "незавършен речник PropList"
#: ../../WINGs/proplist.c:793
msgid "missing PropList dictionary key"
msgstr "липсващ ключ за достъп до PropList"
#: ../../WINGs/proplist.c:795
msgid "missing PropList dictionary entry key or unterminated dictionary"
msgstr "липсващ ключ за достъп до PropList или незавършен речник"
#: ../../WINGs/proplist.c:803
msgid "error parsing PropList dictionary key"
msgstr "грешка при разбор на ключ в PropList"
#: ../../WINGs/proplist.c:811
msgid "missing = in PropList dictionary entry"
msgstr "липсва знак за равенство в елемент на PropList"
#: ../../WINGs/proplist.c:819
msgid "error parsing PropList dictionary entry value"
msgstr "грешка при разбор на стойност на елемент в PropList"
#: ../../WINGs/proplist.c:827
msgid "missing ; in PropList dictionary entry"
msgstr "липсва знак точка и запетая в елемент на PropList"
#: ../../WINGs/proplist.c:888
msgid ""
"was expecting a string, data, array or dictionary. If it's a string, try "
"enclosing it with \"."
msgstr "очакваха се низ, данни, масив или речник. Ако е речник, пробвайте да го оградите с \"."
#: ../../WINGs/proplist.c:892
msgid "Comments are not allowed inside WindowMaker owned domain files."
msgstr "Не се позволяват коментари във файлове с области, собственост на Уиндоу Мейкър"
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1628
msgid "extra data after end of property list"
msgstr "данни в повече след края на списък свойства"
#: ../../WINGs/proplist.c:1606
#, c-format
msgid "could not get size for file '%s'"
msgstr "не може да се получи размерът за файл \"%s\""
#: ../../WINGs/proplist.c:1618
#, c-format
msgid "error reading from file '%s'"
msgstr "грешка при четене от файл \"%s\""
#: ../../WINGs/proplist.c:1669
#, c-format
msgid "mkstemp (%s) failed"
msgstr "mkstemp (%s) не успя"
#: ../../WINGs/proplist.c:1680
#, c-format
msgid "mktemp (%s) failed"
msgstr "mktemp (%s) не успя"
#: ../../WINGs/proplist.c:1691
#, c-format
msgid "open (%s) failed"
msgstr "open (%s) не успя"
#: ../../WINGs/proplist.c:1698
#, c-format
msgid "writing to file: %s failed"
msgstr "записът във файл %s не успя"
#: ../../WINGs/proplist.c:1706
#, c-format
msgid "fclose (%s) failed"
msgstr "fclose (%s) не успя"
#: ../../WINGs/proplist.c:1715
#, c-format
msgid "rename ('%s' to '%s') failed"
msgstr "преименуването (от \"%s\" на \"%s\") не успя"
#. something happened with the file. just overwrite it
#: ../../WINGs/userdefaults.c:192 ../../WINGs/userdefaults.c:208
#, c-format
msgid "cannot read domain from file '%s' when syncing"
msgstr "не може да се прочете областта от файл \"%s\" при синхронизиране"
#: ../../WINGs/wcolor.c:198 ../../WINGs/wcolor.c:211 ../../WINGs/wcolor.c:250
#: ../../WINGs/wcolor.c:291
#, c-format
msgid "could not allocate %s color"
msgstr "не може да се задели цвят %s"
#: ../../WINGs/wcolor.c:198
msgid "white"
msgstr "бял"
#: ../../WINGs/wcolor.c:211
msgid "black"
msgstr "черен"
#: ../../WINGs/wcolor.c:250
msgid "gray"
msgstr "сив"
#: ../../WINGs/wcolor.c:291
msgid "dark gray"
msgstr "тъмносив"
#: ../../WINGs/wcolorpanel.c:415
msgid "Colors"
msgstr "Цветове"
#: ../../WINGs/wcolorpanel.c:605 ../../WINGs/wcolorpanel.c:2824
msgid "Brightness"
msgstr "Яркост"
#: ../../WINGs/wcolorpanel.c:607 ../../WINGs/wcolorpanel.c:683
#: ../../WINGs/wcolorpanel.c:716 ../../WINGs/wcolorpanel.c:750
#: ../../WINGs/wcolorpanel.c:810 ../../WINGs/wcolorpanel.c:844
#: ../../WINGs/wcolorpanel.c:878 ../../WINGs/wcolorpanel.c:913
#: ../../WINGs/wcolorpanel.c:2164 ../../WINGs/wcolorpanel.c:2826
#: ../../WINGs/wcolorpanel.c:2862 ../../WINGs/wcolorpanel.c:2898
#: ../../WINGs/wcolorpanel.c:3746
msgid "Color Panel: Could not allocate memory"
msgstr "Color Panel: не може да се задели памет"
#: ../../WINGs/wcolorpanel.c:680 ../../WINGs/wcolorpanel.c:681
msgid "Red"
msgstr "Червен"
#: ../../WINGs/wcolorpanel.c:713 ../../WINGs/wcolorpanel.c:714
msgid "Green"
msgstr "Зелен"
#: ../../WINGs/wcolorpanel.c:747 ../../WINGs/wcolorpanel.c:748
msgid "Blue"
msgstr "Син"
#: ../../WINGs/wcolorpanel.c:807 ../../WINGs/wcolorpanel.c:808
msgid "Cyan"
msgstr "Синьозелен"
#: ../../WINGs/wcolorpanel.c:841 ../../WINGs/wcolorpanel.c:842
msgid "Magenta"
msgstr "Пурпурен"
#: ../../WINGs/wcolorpanel.c:875 ../../WINGs/wcolorpanel.c:876
msgid "Yellow"
msgstr "Жълт"
#: ../../WINGs/wcolorpanel.c:910 ../../WINGs/wcolorpanel.c:911
msgid "Black"
msgstr "Черен"
#: ../../WINGs/wcolorpanel.c:991
msgid "Spectrum"
msgstr "Спектър"
#: ../../WINGs/wcolorpanel.c:1021
msgid "Palette"
msgstr "Палитра"
#: ../../WINGs/wcolorpanel.c:1027
msgid "New from File..."
msgstr "Нова от файл..."
#: ../../WINGs/wcolorpanel.c:1028 ../../WINGs/wcolorpanel.c:1076
#: ../../WINGs/wcolorpanel.c:1093
msgid "Rename..."
msgstr "Преименувай..."
#: ../../WINGs/wcolorpanel.c:1029 ../../WINGs/wcolorpanel.c:1077
#: ../../WINGs/wcolorpanel.c:1094 ../../WINGs/wcolorpanel.c:3321
msgid "Remove"
msgstr "Премахни"
#: ../../WINGs/wcolorpanel.c:1030
msgid "Copy"
msgstr "Копирай"
#: ../../WINGs/wcolorpanel.c:1031
#, fuzzy
msgid "New from Clipboard"
msgstr "Нова от Clipboard"
#: ../../WINGs/wcolorpanel.c:1052
msgid "X11-Colors"
msgstr "Цветове от X11"
#: ../../WINGs/wcolorpanel.c:1069
msgid "Color"
msgstr "Цвят"
#: ../../WINGs/wcolorpanel.c:1075
msgid "Add..."
msgstr "Добави..."
#: ../../WINGs/wcolorpanel.c:1085
msgid "List"
msgstr "Списък"
#: ../../WINGs/wcolorpanel.c:1092
msgid "New..."
msgstr "Нов..."
#: ../../WINGs/wcolorpanel.c:1231
#, c-format
msgid ""
"Color Panel: Could not create directory %s needed to store configurations"
msgstr "Color Panel: Не може да се създаде директория %s, необходима за да се запазят настройките"
#. Delete the file, it doesn't belong here
#: ../../WINGs/wcolorpanel.c:1237 ../../WINGs/wcolorpanel.c:3207
#: ../../WINGs/wcolorpanel.c:3211
msgid "File Error"
msgstr "Файлова грешка"
#: ../../WINGs/wcolorpanel.c:1238
msgid "Could not create ColorPanel configuration directory"
msgstr "Не може да се създаде конфигурационна директория за ColorPanel"
#: ../../WINGs/wcolorpanel.c:1239 ../../WINGs/wcolorpanel.c:3208
#: ../../WINGs/wcolorpanel.c:3213 ../../WINGs/wcolorpanel.c:3240
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:647
#: ../../WINGs/wfilepanel.c:659 ../../WINGs/wfilepanel.c:760
#: ../../WINGs/wfilepanel.c:971 ../../WINGs/wfontpanel.c:709
msgid "OK"
msgstr "Приемам"
#: ../../WINGs/wcolorpanel.c:1245 ../../WINGs/wcolorpanel.c:1281
#: ../../WINGs/wcolorpanel.c:1299
msgid "Color Panel: Could not find file"
msgstr "Color Panel: Не може да се открие файла"
#: ../../WINGs/wcolorpanel.c:1486 ../../WINGs/wcolorpanel.c:1551
#: ../../WINGs/wcolorpanel.c:1615
msgid "Color Panel: X failed request"
msgstr "Color Panel: не успя заявка към X"
#: ../../WINGs/wcolorpanel.c:2860
msgid "Saturation"
msgstr "Наситеност"
#: ../../WINGs/wcolorpanel.c:2896
msgid "Hue"
msgstr "Нюанс"
#: ../../WINGs/wcolorpanel.c:3146
msgid "Open Palette"
msgstr "Отваряне на палитра"
#: ../../WINGs/wcolorpanel.c:3208
msgid "Invalid file format !"
msgstr "Неправилен файлов формат!"
#: ../../WINGs/wcolorpanel.c:3210
#, c-format
msgid "can't remove file %s"
msgstr "не може да се изтрие файлът %s"
#: ../../WINGs/wcolorpanel.c:3212
msgid "Couldn't remove file from Configuration Directory !"
msgstr "Не може да се изтрие файл от директорията за настройки!"
#: ../../WINGs/wcolorpanel.c:3239
msgid "Rename"
msgstr "Преименуване"
#: ../../WINGs/wcolorpanel.c:3239
msgid "Rename palette to:"
msgstr "Преименувай палитрата на "
#: ../../WINGs/wcolorpanel.c:3240 ../../WINGs/wfilepanel.c:259
#: ../../WINGs/wfilepanel.c:659 ../../WINGs/wfilepanel.c:760
msgid "Cancel"
msgstr "Отменям"
#. Careful, this palette exists already
#: ../../WINGs/wcolorpanel.c:3256 ../../WINGs/wfilepanel.c:760
msgid "Warning"
msgstr "Внимание"
#: ../../WINGs/wcolorpanel.c:3257
msgid ""
"Palette already exists !\n"
"\n"
"Overwrite ?"
msgstr ""
"Такава палитра вече съществува!\n"
"\n"
"Да бъде ли заменена с новата?"
#: ../../WINGs/wcolorpanel.c:3257 ../../WINGs/wcolorpanel.c:3321
msgid "No"
msgstr "Не"
#: ../../WINGs/wcolorpanel.c:3257 ../../WINGs/wcolorpanel.c:3321
msgid "Yes"
msgstr "Да"
#: ../../WINGs/wcolorpanel.c:3289
#, c-format
msgid "Couldn't rename palette %s to %s\n"
msgstr "Палитрата %s не може да се преименува на %s\n"
#: ../../WINGs/wcolorpanel.c:3315
msgid "This will permanently remove the palette "
msgstr "Това ще отстрани палитрата необратимо "
#: ../../WINGs/wcolorpanel.c:3318
msgid ""
".\n"
"\n"
"Are you sure you want to remove this palette ?"
msgstr ""
".\n"
"\n"
"Убедени ли сте, че искате да отстраните тази палитра?"
#: ../../WINGs/wcolorpanel.c:3343
#, c-format
msgid "Couldn't remove palette %s\n"
msgstr "Палитрата %s не може да бъде отстранена\n"
#: ../../WINGs/wcolorpanel.c:3648
#, c-format
msgid "Could not open %s"
msgstr "Не може да бъде отворен %s"
#: ../../WINGs/wcolorpanel.c:3655
#, c-format
msgid "Could not create %s"
msgstr "Не може да бъде създаден %s"
#: ../../WINGs/wcolorpanel.c:3666
#, c-format
msgid "Write error on file %s"
msgstr "Грешка при запис във файл %s"
#: ../../WINGs/wcolorpanel.c:3711
msgid "Color Panel: Color unspecified"
msgstr "Color Panel: Не е посочен цвят"
#: ../../WINGs/wfilepanel.c:235
msgid "Name:"
msgstr "Име:"
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
msgid "Open"
msgstr "Отвори"
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
msgid "Save"
msgstr "Запази"
#: ../../WINGs/wfilepanel.c:562
#, c-format
msgid "WINGs: could not open directory %s\n"
msgstr "WINGs: директорията %s не може да се отвори\n"
#: ../../WINGs/wfilepanel.c:580
#, c-format
msgid "WINGs: could not stat %s\n"
msgstr "WINGs: не могат да се получат атрибутите (stat) за %s\n"
#: ../../WINGs/wfilepanel.c:647 ../../WINGs/wfilepanel.c:970
#: ../../WINGs/wfontpanel.c:708
msgid "Error"
msgstr "Грешка"
#: ../../WINGs/wfilepanel.c:658
msgid "Create Directory"
msgstr "Създаване на директория"
#: ../../WINGs/wfilepanel.c:659
msgid "Enter directory name"
msgstr "Въведете името на директорията"
#: ../../WINGs/wfilepanel.c:695 ../../WINGs/wfilepanel.c:734
#: ../../WINGs/wfilepanel.c:765 ../../WINGs/wfilepanel.c:793
msgid "Permission denied."
msgstr "Отказан достъп"
#: ../../WINGs/wfilepanel.c:698
#, c-format
msgid "'%s' already exists."
msgstr "вече съществува \"%s\"."
#: ../../WINGs/wfilepanel.c:701
msgid "Path does not exist."
msgstr "Пътят не съществува."
#: ../../WINGs/wfilepanel.c:731 ../../WINGs/wfilepanel.c:790
#, c-format
msgid "'%s' does not exist."
msgstr "Не съществува \"%s\"."
#: ../../WINGs/wfilepanel.c:738 ../../WINGs/wfilepanel.c:797
msgid "Insufficient memory available."
msgstr "Не е достъпна достатъчно памет."
#: ../../WINGs/wfilepanel.c:742 ../../WINGs/wfilepanel.c:801
#, c-format
msgid "'%s' is on a read-only filesystem."
msgstr "\"%s\" се намира във файлова система с достъп само за четене."
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:777
#: ../../WINGs/wfilepanel.c:804
#, c-format
msgid "Can not delete '%s'."
msgstr "\"%s\" не може да бъде изтрит."
#: ../../WINGs/wfilepanel.c:752
#, c-format
msgid "Delete directory %s ?"
msgstr "Да се изтрие ли директорията %s?"
#: ../../WINGs/wfilepanel.c:756
#, c-format
msgid "Delete file %s ?"
msgstr "Да се изтрие ли файлът %s?"
#: ../../WINGs/wfilepanel.c:768
#, c-format
msgid "Directory '%s' does not exist."
msgstr "Директорията \"%s\" не съществува."
#: ../../WINGs/wfilepanel.c:771
#, c-format
msgid "Directory '%s' is not empty."
msgstr "Директорията \"%s\" не е празна."
#: ../../WINGs/wfilepanel.c:774
#, c-format
msgid "Directory '%s' is busy."
msgstr "Директорията \"%s е заета."
#: ../../WINGs/wfilepanel.c:787
#, c-format
msgid "'%s' is a directory."
msgstr "\"%s\" е директория."
#: ../../WINGs/wfilepanel.c:829
#, c-format
msgid "An error occured browsing '%s'."
msgstr "Настъпи грешка при показване на \"%s\"."
#: ../../WINGs/wfilepanel.c:833
#, c-format
msgid "'%s' is not a directory."
msgstr "\"%s\" не е директория."
#: ../../WINGs/wfilepanel.c:970
msgid "File does not exist."
msgstr "Файлът не съществува."
#: ../../WINGs/wfont.c:129
#, c-format
msgid "the following character sets are missing in %s:"
msgstr "в %s липсват следните кодирания:"
#: ../../WINGs/wfont.c:136
#, c-format
msgid ""
"the string \"%s\" will be used in place of any characters from those sets."
msgstr "Вместо кой да е символ от тези кодирания ще се използва низът \"%s\"."
#: ../../WINGs/wfont.c:300 ../../WINGs/wfont.c:336
#, c-format
msgid "could not load font set %s. Trying fixed."
msgstr "не може да се зареди шрифтова комбинация %s. Опит за шрифт fixed."
#: ../../WINGs/wfont.c:306 ../../WINGs/wfont.c:342
#, c-format
msgid "could not load font %s. Trying fixed."
msgstr "не може да се зареди шрифт %s. Опит за шрифт fixed."
#: ../../WINGs/wfont.c:310 ../../WINGs/wfont.c:346
msgid "could not load fixed font!"
msgstr "не може да се зареди шрифтът fixed!"
#: ../../WINGs/wfont.c:441
#, c-format
msgid "font description %s is too large."
msgstr "шрифтовото описание %s е твърде дълго."
#: ../../WINGs/wfontpanel.c:205
msgid "Test!!!"
msgstr "Проба!!! Test!!!"
#: ../../WINGs/wfontpanel.c:211
msgid "Family"
msgstr "Гарнитура"
#: ../../WINGs/wfontpanel.c:222
msgid "Typeface"
msgstr "Стил"
#: ../../WINGs/wfontpanel.c:233
msgid "Size"
msgstr "Размер"
#: ../../WINGs/wfontpanel.c:252
msgid "Set"
msgstr "Установи"
#: ../../WINGs/wfontpanel.c:257
msgid "Revert"
msgstr "Предишното"
#: ../../WINGs/wfontpanel.c:709
msgid "Could not retrieve font list"
msgstr "Не може да се получи списъка от шрифтове"
#: ../../WINGs/wfontpanel.c:721
#, c-format
msgid "font name %s is longer than 256, which is invalid."
msgstr "името на шрифта %s е по-дълго от 256 символа, което е недопустимо."
#: ../../WINGs/wfontpanel.c:868
msgid "Roman"
msgstr "Изправен"
#: ../../WINGs/wfontpanel.c:871
msgid "Italic"
msgstr "Курсив"
#: ../../WINGs/wfontpanel.c:873
msgid "Oblique"
msgstr "Наклонен"
#: ../../WINGs/wfontpanel.c:875
msgid "Rev Italic"
msgstr "Обратен курсив"
#: ../../WINGs/wfontpanel.c:877
msgid "Rev Oblique"
msgstr "Обратно наклонен"
#: ../../WINGs/wfontpanel.c:883
msgid "Normal"
msgstr "Нормален"
#: ../../WINGs/widgets.c:415
#, c-format
msgid "WINGs: could not load widget images file: %s"
msgstr "WINGs: не може да се зареди изображението %s на библиотеката."
#: ../../WINGs/widgets.c:763
msgid ""
"could not load any fonts. Make sure your font installation and locale "
"settings are correct."
msgstr "не може да се зареди никакъв шрифт. Убедете се, че имате правилно инсталирани шрифтове и посочен езиков локал."
#: ../../WINGs/wruler.c:189
msgid "0 inches"
msgstr "0 цола"

Some files were not shown because too many files have changed in this diff Show More