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

1 Commits

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

View File

@@ -1,7 +0,0 @@
Makefile Makefile.in
aclocal.m4
configure config.log config.cache config.guess config.status config.sub
libtool ltconfig ltmain.sh
.psrc .inslog2 tca.map tca.log
*.rpt
update update-autoconf

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@maliwan.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 :-)

21
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,11 +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-kde
[ ] --enable-gnome
[ ] --enable-openlook
[ ] --enable-modelock
[ ] Others: .......................
@@ -71,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.

26
BUGS
View File

@@ -1,20 +1,10 @@
- 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)
- after restart focus is losed or switched to another window. May be related
to the one above.
- 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,45 +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"
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.

670
ChangeLog
View File

@@ -1,672 +1,3 @@
Changes since version 0.64.0:
.............................
- fix with gnome hints stuff, related to tasklist/bar
- ripped off single appicon stuff
- added better appicon handling of apps of the same type
- applied patch for wkdemenu (Malcolm Cowe <malk@bruhaha.co.uk>)
- added WINDOWS_MENU submenu type for root menu (Bastien Nocera <hadess@hadess.net>)
- added kbd shortcuts for icon chooser
- use Hermes in wrlib
- removed MOUSE_WS_WHEEL #defines
- fixed bug with multibyte text on libc5 systems (Osamu Ajiki <osam-a@astroarts.co.jp>)
- fixed race conditions on signal handlers
- SIGINT will gently exit, SIGTERM will not be handled
- When Window Maker calls wmsetbg to set the background, it will consider the
value of the DisableDithering option and pass the right switch to wmsetbg.
- fixed a memleak in the dialog panels.
- made "Keep on Top" in the dock/clip menu a checked menu entry. It's _much_
easier to work with it this way.
- Fixed problem with GNOME apps that have windows which need to stay on the
desktop level.
- Fixed incorrect parsing of display and screen number from $DISPLAY.
- Organized the inspector panel a bit better.
- Replaced bags with arrays wherever appropriate. This will improve
performance a bit.
- Made the Gnome tasklist skip the windows with the "Skip window list" flag
enabled. (Bastien Nocera <hadess@hadess.net>)
- Fixed crashing bug when name and class were empty for a docked app.
- Removed MIN() and MAX() macros and replaced them with WMIN() and WMAX() from
WINGs.
- Added a hint that Window Maker crashed, to allow windows to be placed
correctly after a crash situation.
- Added a hint that Window Maker crashed, to allow windows to be placed
in their correct previous positions after a crash situation and also to
preserve their state before the crash (minimized, shaded, hidden, ...)
- Fixed wrong mapping position of the "Docked Applications Panel" for some
icons.
- Smoother animation for the smiley =)
- Added retain/release mechanism for RImages. RDestroyImage() has become
obsolete. More about this can be found in wrlib/Changelog and wrlib/NEWS.
- Small API change in WINGs to allow images with alpha blending set as the
application icons be shown correctly. More about this in WINGs/Changelog
and WINGs/NEWS.
- Made images with alpha blending be shown correctly in the panels and the
icon chooser.
- The icon image set to be shown in panels ("Logo.WMPanel") will be
automatically updated if its entry in WMWindowAttributes changes (without
a need to restart as until now).
- Fixed a bug in the icon chooser dialog that made the selected icon look
wrong if it had alpha blending.
- Removed the following 3 options from configuration: SelectWindowsMouseButton,
WindowListMouseButton and ApplicationMenuMouseButton.
- Added 4 options to the configuration file for binding workspace actions to
mouse buttons: MouseLeftButtonAction, MouseMiddleButtonAction,
MouseRightButtonAction and MouseWheelAction. They replace the above 3
removed options, but use a different semantic. More in NEWS.
- client supplied icons that were saved by Window Maker in the directory
~/GNUstep/.AppInfo/WindowMaker/ will be recreated if missing when the
application starts.
- fixed a small memleak when the client supplied icon was extracted and saved.
Changes since version 0.63.1:
.............................
- fixed messup in get-{wings,wutil,wraster}-flags
- fixed #wmdatadir# substitution in wmaker.inst
(Seiichi SATO <sato@cvs-net.co.jp>)
- Removed spurious focus disabling for GNUstep applications - but retain
code that lets GNUstep apps control their window titlebar.
(Richard Frith-Macdonald <rfm@gnu.org>)
- Fixed broken panels.
- Renamed se.po to sv.po
- New version of wkdemenu.pl (from Malcolm Cowe <malk@bruhaha.co.uk>)
- new updated Slovak translations (Jan Tomka/judas@hell <tomka@oalevice.sk>)
- integrated the 'no polling' patch from Jim Knoble <jmknoble@jmknoble.cx>.
- new wsetfont script (Anton Zinoviev <zinoviev@debian.org>)
- lots of i18n fixes (Jan Tomka/judas@hell <tomka@oalevice.sk>)
- window levels changed to match GNUstep <rfm@gnu.org> ... src/GNUstep.h
src/WindowMaker.h src/window.c wmlib/WMaker.h WINGs/WINGs/WINGs.h
Changes since version 0.63.0:
.............................
- fixed compile prob with SGI compiler
- decreased nice() value in wmsetbg
- applied gnome panel not-covering patch from (Bastien Nocera <hadess@hadess.net>)
- added item copy to WPrefs menu editor
- added locale selection code for menu in wmaker.inst (Eliphas Levy Theodoro <eliphas@conectiva.com.br>)
- fixed bug in built-in xpm support (Alessandro Strada <a.strada@libero.it>)
- removed plugin support
- fixed a crash bug in WPrefs menu editor
- added es and pt potfiles from conectiva/eliphas
- added updated galician potfile (Jesus Bravo Alvarez <jba@pobox.com>)
- added update hungarian potfiles (HORVATH Szabolcs <horvaths@inf.elte.hu>)
- added updated single-click patch from John Morrissey <jwm@horde.net>
- added updated danish translations (Birger Langkjer <birger.langkjer@image.dk>)
- fixed WindozeCycling config in WPrefs
- fixed circulate raise withour WindozeCycling
Changes since version 0.62.1:
.............................
- added blackbox style igradient (interwoven)
- added wmagnify utility
- changed behaviour of control/shift double click on titlebar for maximize
- updated getstyle to account for extendspace options
- fixed weird color bug in jpeg loader
(Alban Hertroys <dalroi@wit401310.student.utwente.nl>)
- improved and simplified fonts configuration for multibyte languages
(Tomohiro KUBOTA <kubota@debian.or.jp>)
- cleaned ParseCommand() and renamed to TokenizeString()
- rewrote menu editor in WPrefs
- added definable workspace border (0..5 pixels). See NEWS.
- fixed circulateraise on non-windoze cycling mode
- fixed bug in RCombineAreaWithOpaqueness (Tim Malone <tmalone3@uswest.net>)
- fixed bug with hangling of WM_COMMAND update in client.c (Andrew M. Langmead <aml@world.std.com>)
- fixed bug with incorrect reading of ppm files (Adam Fedor <fedor@gnu.org>)
- fixed bug with incorrect window placement using automatic placement, while
there were shaded windows on other workspaces
- fixed some buffer overflow issues in WINGs
- fixed bug with WPrefs.app not selecting the menu appearance options after
startup.
- replaced free() with wfree() wherever appropriate
- fixed some memory leaks generated by wstrappend()
- fixed code that was dependant on the order of evaluation in wrlib. This
fixed a number of problems, like greyscale jpegs that showed up in red
and possibly the problems with pseudocolor displays.
- made clicks on unfocused windows be effective on focus follow mouse/sloppy
Changes since version 0.62.0:
.............................
- made shortcuts available during alt+tab
- save lowered state of menus
- fixed portability bugs for old X servers
- added check for XInternAtoms in configure and replacement code
- fixed window cycling with single key shortcut
- fixed WPrefs crash on menu editor
- install only needed icons for WPrefs.app
- updated Finnish translations
- fixed user-whining-windoze-cycling bug
- added option for f'n windoze cycling..
- added --create-stdcmap and made std colormap creation off by default
- updated get/setstyle to account for new options
- fixed crash on restart bug
- made GNOME wm hints take precedence over KDE.. KDE hint will only be read
if GNOME hints dont exist
- updated kwm hint support (maximize hint)
- added memory usage in info panel
- fixed sticky hint handling in GNOME
- fixed saving of maximized state for restart
Changes since version 0.61.1:
.............................
- fixed bug with menu editor in WPrefs placing cut/paste-ed entries in wrong
positions.
- removed "Keep Attracted Icons" option from Clip's menu. See NEWS.
- fixed bug in Xdnd code to be able to work with QT. (This is QT's bug so
it will change again in future)
- replaced debugging output stuff with Nana
- fixed problem with session restoring and dock autolaunch (Jacek Naglak
<nag@promail.pl>)
- put WorkspaceNamePosition in WPrefs
- added a lock to docked icons
- fixed crashing bug in WPrefs.app's Appearance section.
- fixed sorting of names in icon chooser, and file browser.
- fixed name completion problem in file browser.
- added new sound events (from pascal)
- fixed bug when moving/resizing internal windows
- propagation of -noext for submenus (David Reviejo <dreviejo@arrakis.es>)
- fixed problem with mouse sampling rate in SGIs
- optimized frame drawing (Swivel <swivel@gnugeneration.com>)
- removed broken optimized frame drawing patch
- added Select Window button in attribute inspector
- made icon images scale by a constant factor when changing icon size
- added support for standard colormaps in PseudoColor visuals
- changed geometry view for move/resize to a WINGs widget
- removed DisplayFont option
- added NoBorder attribute
- changed semantics of GNUstep window attribute hints
- added get-wings-flags and get-wutil-flags with the same purpose as
get-wraster-flags, but for compiling and linking with WINGs/WUtil
- fixed bug handling non-string values given to string valued options in
defaults.c
- fixed colormap_window crash bug (appears when launching some apps from dock,
or removing apps from gnome panel etc)
- added DONT_SCALE_ICONS #define
- added --no-autolaunch patch (John Bafford <dshadow@zort.net>)
- made Apply button work on window inspector for windows with no WM_CLASS
- changed sound server code to be more efficient
- fixed crash with broken apps that set mask size != pixmap size in icons
- made wmsetbg accept relative paths for images that are not in PixmapPath
- fixed windoze cycling
- replaced XSync with XFlush in wUnshadeWindow()
- added GNUstep window recognition through WM_CLASS->class == GNUstep
- made window focusing not change titlebar color of GNUstep windows
- disabled passive mouse grabbing in client area of GNUstep window
when they are unfocused
- added Jim Knoble <jmknoble@pobox.com>'s cursor thing patch
- fixed lock of wmaker when clicking on menu multiple times
- made transients appear near their owner
- fixed crash bug with broken java implementations (Miguel Covarrubias
<mcovarr@tigr.org>)
- made Revert on attributes panel apply the reverted changes immediately
to avoid inconsistent internal state
- color dragging works correctly now
- arbitrary stacking levels
- save window shortcuts in state
- changed license of Marco's icons to GPL
- added --dont-restore cmd line option to not restore previous state
- fixed focus bug when moving wmaker panel windows in focus-follow mouse
Changes since version 0.61.0:
.............................
- fixed Xdnd by cropping filename with ""
- fixed OPEN_MENU
- fixed crash when moving a shaded window with keyboard
- fixed problem with window shortcut assignment from the menu
- fixed problem with fonts in WINGs (Masahide -mac- NODA
<mac@flab.fujitsu.co.jp>)
- fixed multihead bugs (Morten Bøgeskov" <mb@dbc.dk>)
- fixed crashing bug when saving session information.
- fixed crashing bug related to onmipresent icons in Clip
- added _WINDOWMAKER_ICON_TILE and _WINDOWMAKER_ICON_SIZE hint in
the noticeboard window
Changes since version 0.60.0:
.............................
- fixed bug in window attribute panel
- SGI portability fix (Graham Whitted <gbw@sgrail.com>)
- fixed compilation problem with --enable-singleicon
- fixed compilation problem with WS_INDICATOR
- fixed crash bug with SGI (defaults.c) (Graham Whitted <gbw@sgrail.com>)
- fixed sloppyfocus problem in multihead dpys (Morten Bøgeskov
<morten@bogeskov.dk>)
- fixed WorkspaceSpecificBackground bug in wmsetbg
- give preference to windows in window list when switching focus after
workspace change (Richard Kilgore <rkilgore@ece.utexas.edu>)
- brought back --locale cmd line option
- fixed bug with WorkspaceNameDisplayPosition (Emanuele Caratti <wiz@iol.it>)
- added missing kbd shortcut definitions for window shortcuts
(Michael Smith <mjsmith@spirit.com.au>)
- fixed floppy button layout in filepanel (Matthew Ashton <mrashton@home.com>)
- fixed bug with documentedited close button (Felipe A. Rodriguez
<farz@mindspring.com>)
- fixed some buffer overflows
- fixed some problem with the alpha
- fixed some problems with non gcc compilers.
- fixed problem with showing instance.class in the inspector window.
- fixed crash when displaying workspace name in some positions.
- fixed compilation problem when WS_INDICATOR was defined.
- added edge attraction. See NEWS.
- fixed buggy RSaveXPM() in wraster library. Its output was messed up, and
caused crashes for icons with more than 1024 colors.
- sinking windows (such as gmc icons) won't be calculated in edge resistance
or attraction.
- removed drop shadow for text on title bar code. (TITLE_TEXT_SHADOW)
- text on title bar is now possible to be drawn by plugin. See NEWS.
- WPrefs: added support for button4/5
- fixed scrolling of menus outside screen (Vito Caputo
<swivel@virtual-webworld.com)
- added dialog window for menu commands that can't be executed
- fixed crash when deiconifying windows when icons are disabled
- better smart placement (Gabor Melis <gabor.melis@essnet.se>)
- replaced old linkedlist code with WMBag
- fixed wmsetbg to use right bg color with transparent background images
- fixed crash with Assertion "bad_root_window" && 0' failed. on startup
- fixed crash when more than 1 dockapp fails to launch on startup
- added a different dock setup config for each screen size
- fixed PPosition handling
- New "Smart placement" mode. 'Smart' is no longer an alias to 'Auto' but
a different mode of placing windows. 'Auto' keeps the old behavior.
- added the dir where the menu is being read from to the search path
given to cpp
- doing a multiwindow selection shortcut and hitting the shortcut
repeatedly will cycle through the selected windows
- fixed crash when overwriting a string constant (default font specs) in WINGs
Changes since version 0.53.0:
.............................
- fixed a bug that caused icon overlaping in Clip, when icon was moved around.
- this time really added libwmfun to distribution.
- made deiconification not automatically focus window in sloppy focus
- fixed crash with DisableMiniwindows and icon pixmap changes
- fixed crash when changing icon of window without WM_CLASS
- added hysteresys for offscreen menu scrollback
- fixed bug with IgnoreFocusClick
- fixed crash with windows with width == 1 (Alban Hertroys
<dalroi@wit401310.student.utwente.nl>)
- added SHEXEC command
- fixed resizebarback for SHADOW_RESIZEBAR ( jim knoble jmknoble@pobox.com)
- added balloon help everywhere
- fixed bug with FullMaximize attribute
- GNOME: button events not bound in wmaker are proxyized (to gmc)
(Paul Warren <pdw@ferret.lmh.ox.ac.uk>)
- fixed bug with restoration of maximized window after restart with
--enable-kde
- added high-quality filtered rescaling (smoothed rescaling) to wrlib/wmsetbg
- added SmoothWorkspaceBack
- fixed crash bug in Paths section of WPrefs
- optimized image rendering for 15/16 bpp
- user menus' paths were changed. See NEWS.
- added a timeout for the workspace name fading
- HP-UX compiler compatibility workarounds (Sebastien Bauer
seb_bauer@bigfoot.com)
- fixed crash with attributes panel
- save state of all menus when exiting (Sebastien Bauer
seb_bauer@bigfoot.com)
- added GNUstep info panel (still needs beautification..)
- made the paths selector in WPrefs.app use the open file panel
- fixed crash bug with hiding apps without dock/clip
- fixed a mem leak in superfluous mode caused by the ghost icon.
- added possibility to set omnipresent icons in Clip. See NEWS.
- fixed bug in WPrefs menu editor
- fixed crash when moving internal window with kbd
- fixed compilation problem on IRIX machines (Neil Muller
<neil@octane.sun.ac.za>)
- replace xde support drop on dock with xdnd.
- added an (internal use) environment variable for telling WPrefs whats's
the name of the wmaker binary being ran.
- more elegant text entries in Clip's menu, regarding single/multiple
selected icons.
- fixed cosmetic bug in geom. dpy window for 8bpp
- removed --enable-kanji and added MultiByteText option
- rewrote font code to use WINGs
- made autoraise only work for the active window
- fixed compilation problem with OpenWindows and other non-X11R6 systems..
- fixed crash bug when iconsize=24
- fixed portability prob with raise() in SunOS
- fixed icon placement bug (Markus Schoder <Markus.Schoder@online.de>)
- added delete and floppy buttons in file panel.
Changes since version 0.52.0:
.............................
- patched wmsetbg to work with dynamically loadable texture renderer code
- added libwmfun to distribution (forgot to do so in 0.52.0)
- added MenuStyle option
- changed configuration updating to use notifications
- fixed window move through workspaces in nonopaquemove
- added message to immediately reread configuration data
- fixed some bug in XKB modelock toggling
- fixed crash bug when hiding apps with appicon disabled
- fixed wrong initial workspace # being shown on attributes panel
- XSMP updates
- update colorpanel
- applied WMSound patch from "Quinn, Anthony" <Anthony.Quinn@usa.xerox.com>
- fixed focus bug with unfocusable window (I swear I had fixed that before...)
- applied windoze cycle patch from Paul Warren <pdw@ferret.lmh.ox.ac.uk>
- changed initscript and exitscript execution from fork()/exec() to system()
- added ResizebarBack and added appropriate backwards compat. hacks in setstyle
- applied ]d's patch to allow DEMATERIALIZE_ICON over windows
- made clip arrows gradiented
- added a crashing dialog panel to select what to do on crashes.
- fixed the problem with showing a window as focused in the window list menu
while it was on another workspace.
- show workspace name on screen when switching workspaces
- made setstyle support WorkspaceSpecificBack
- fixed getstyle prob with filenames with spaces (Pierre Phaneuf
<pp@ludusdesign.com)
- fixed crash with InfoPanel in multihead dpy
- Fixed bug in WPrefs that added a new line at the end of autostart script
at every save, growing it indefinitely.
- fixed a memory leak in wrlib (Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>)
- fixed crash during forced shutdown of X (Wolfram Gloger
<wmglo@dent.med.uni-muenchen.de>)
Changes since version 0.51.2:
.............................
- made the Attributes panel be available for all windows, even
for completely broken apps (although settings wont be saved for
completely broken apps)
- fixed compilation problems with compile time #defines
- workaround for crash during startup related to hiding miniaturized windows
from Matt Armstrong <matt_armstrong@bigfoot.com>
- fixed focus problem with unfocusable windows
- fixed bug in WPrefs that changed EXIT to SHUTDOWN
- fixed menu title messup bug in WPrefs
- added a dot to mark hidden applications (compile time) (id@windowmaker.org)
- enhancements to the modelock patch (id@windowmaker.org)
- show kbd mode for modelock (id@windowmaker.org)
- enhanced positioning of transient windows
- added dynamically loadable texture renderer code
from Tobias Gloth <gloth@online.de>
- added DisableMiniwindows option
- kde: miniaturize animation will match the taskbar icon (KWM_WIN_ICON_GEOMETRY)
- miniwindows show the title of the window if there is none set for it
- fixed crash on kpanel restart
- remember window shortcuts after restart
- change edge resistance to account for panels and stuffs
- narrower menus
- fixed auto raise/lower behaviour of clip for docked applications that have
their own window (applets).
- cleaned up Clip's autocollapsing code, and made it to be similar to the
auto raise/lower code (much cleaner).
- fixed a race condition in Clip behavior when changing workspaces, if set to
autocollapsing.
Changes since version 0.51.1:
.............................
- fixed bug with window that can get focus if both shaded and hidden.
- maximize for full screen
- fixed problem with frame drawing in non-opaque
- fixed installation path prob [jmknoble@pobox.com]
- fixed bug moving window when only one window is on screen
- fixed bug with ignored GNUstep attributes
- fixed WPrefs crash in Mouse Preferences
- fixed crash bug in WINGs/wmaker startup
- added workaround for kde pager crash bug
- made %W in root menu and wmsetbg -w take numbers starting from 1
- fixed crash bugs with kpanel
Changes since version 0.51.0:
.............................
- put . to mark hidden apps
- fixed dont set xset stuff option in WPrefs
- fixed menu title messup in WPrefs
- fixed WPrefs message dialogs for invalid menus
- fixed workspace back setting in all screens
- fixed WorkspaceSpecificBack / wmsetbg
- added WindozeCycle patch (being rewritten)
- cleaned up focus/unfocus state transitions
- made WPrefs more robust
- fixed locale file (po) installation stuff
- fixed focus loss when dragging window across workspaces
- fixed workspace baby boom with nextworkspacekey
- removed ignore_next_unmap kluge
- install defaults data in /usr/local/etc
- added menu for miniwindow
- fixed remove resizebar from shaded window
- rewrote library/header search code in configure
- rewrote window move/edge resistance code
- added window border resistance
- changed EdgeResistance option to only YES/NO
- added workaround for glibc bug in sscanf("", bla, bla)
- hopefully fixed WM_COLORMAP_WINDOWS crash bug
- fixed searching of localized menus
- fixed --help option
- fixed handling of docked apps with . in their instance names
- RSupportedFileFormats() in wrlib will now return a static buffer
- fixed bug in StartHidden
- a little faster startup
- will rearrange icons after moving an icon if autoarrangeicons
- fixed icon overlap bug
- fixed crash with internal dialogs and multi-heads
- added standard colormap support to wrlib (taken from libXmu sources)
- fixed memory leak in attribute panel
- fixed crash with CalendarManager deiconify
- fixed heisencrash when mapping new windows
- fixed totally buggy wmaker.inst ~/.xinitrc checker
Changes since version 0.50.2:
.............................
- added some new icons made by Marco
- kde: fixed stacking order reporting for modules
- gnome: fixed state change request handling
- fixed handling of file names with non-alphanum characters in wmsetbg
- hopefully fixed timestamp problem that caused regeneration of configure
- fixed a bug in the auto raise code
- made SIGHUP exit wmaker and SIGUSR1 restart for GNOME compatibility
- fixed %a() bug (now it really is fixed!)
- fixed docking icons in last icon
- fixed WMInsertPopUpButtonItem()
- fixed bug that caused fonts of themes to be ignored
- fixed bug in path handling in getstyle
- stop icon explosion animation by clicking on root window
- made SAVE_SESSION save the state of the dock
- added command line option aliases that adhere to the GNU standards
- fixed png gamma bug (actually unmade buggy fix)
- fixed bug in property notify handling
- removed KeepTransientsOnTop
- fixed window focus when switching workspaces
- fixed attribute inspector Apply for dont bind keys
- fixed bad colormap bug (I hope)
- added acceleration to keyboard window move
- %W expand to current workspace #
- fixed background pixmap color problem (cpixmap etc)
- applied drop shadow patch
- fixed crash on startup with xconsole and xdm
- fixed portability prob with MkLinux/PPC
- fixed portability prob with Alpha
- added color panel to WINGs
- added support for olwm/OPEN LOOK(tm) hints
- added SaveYourself support
- fixed bug in start maximized
- added _WINDOWMAKER_NOTICEBOARD protocol
- added docklib
- updated utility parameter format to GNU standards
- removed libPropList from distribution and merged with GNOME one
Changes since version 0.50.1:
.............................
- fixed wmsetbg
- fixed parsing of WorkspaceSpecificBack
- fixed initial workspace for new windows
- added the workspace button proxy thingy for GNOME
- added more GNOME compatibility fixes
- fixed bug in %a() macro in root menu
Changes since version 0.50.0:
.............................
- fixed bug that allowed docking of icons to outside the screen
- added extra code to handle kpager bug
- fixed crash when opening appicon menu
- fixed problem that caused Motif hints to be sometimes ignored
- fixed bug in layer treatment of GNOME hints
- fixed weirdness in initial window workspace
- fixed problem with Sun compilers
- fixed bug with () Workspace{Specific,}Back specs
- added --disable-rpath option (from KDE) by request
- maybe fixed bug with StarOffice
- fixed pipe fd inheritance mess
- fixed bug in kde workspace renaming
- fixed installation problems
Changes since version 0.20.3:
.............................
- window list is ordered by workspace
- preliminary grid move mode
- fixed prob with docked apps with the same name switching places (like wmmon
and wmmon -s)
- wrapping of workspace switching for 5button mice
- added restart in fallback menu
- fixed buglet in modifier error reporting
- extra options in window command menu
- changed select() used in wevent.c to poll()
- fixed bug in SGI boxes (black dialogs)
- added IconTitleBack, IconTitleColor
- made error checking stricter
- fixed crash when saving application supplied icons that have many colors
- added move threshold to menus
- added textured gradient textures
- added -nofont flag for setstyle
- added -p flag and theme pack support for getstyle
- fixed crash bug when clicking on menu title opened with kbd
- fixed bug that caused incorrect saving of icon configuration (the -name bug)
- scale pixmap texture for workspaceback type will maintain aspect ratio
- fixed memory leak in jpeg loader
- started XStandardColormap support
- added StartMaximized window flag
- fixed bug of mixed up Unfocusable and StartMiniaturized flags
- yet another try to switch to shared libraries
- workspace specific background images
- stack new windows to under focused window if autofocus is off (disabled)
- added kde support
- implemented the "GNOME Window Manager Compliance" stuff
- window move/resize by keyboard
- rewrote window attribute code to make it cleaner
- added --enable-lite configure option
- added support to change prompt in %a() for root menu
- rewrote exit code
- added KeepInsideScreen=YES; for scilab in default WMWindowAttributes
- added an option to the Clip, to allow automatic Raise/Lower when the mouse
cursor enter/leave the Clip.
Changes since version 0.20.2:
.............................
- hysteresis for menu item selection (delayed selection for selecting
submenu items)
- window shortcuts
- removed Hide Others from window commands menu
- window commands menu will close when the window for it is closed
- made shade not set the Iconic state
- fixed bug in miniaturizing atribute panel
- made frame rectangles be more visible in PseudoColor (8bpp)
- fixed bug for 64bit machines
- added support for ICCCM 2.0 WM_COLORMAP_NOTIFY message
- fixed bug for apps that put strings with . in WM_CLASS
- added handling for reparented client windows
- fixed bug with window positioning
- fixed cascade window placement to account for dock
- added modelock stuff
- added X include path in gfx header when configure searches for headers
- fixed bug in window positioning by clients
- added run-time test for shared pixmap support on server
- changed order of link flags in Makefiles
- fixed problem with random window placement
- fixed multiple window selection for multiheads
- grayscale and 8bit jpeg support
- fixed client restoration in restart/exit in multiheads
- started session management code
- fixed problem with docked programs that have names with spaces
- updated WPrefs.app for iconificationstyle
- added -static command line option
- put redundant NoWindowOverDock
- fixed overlapping clip icon bug
- extended window level code
- added KeepOnBottom hint
- added iconification style to WPrefs.app
- fixed crash with bad value in defaults file
- changed icon stacking code
- added primitive support for 5 button mouse (for switching workspaces)
- fixed BadAccess and crash on programs that do XGrabButton
- fixed bug with rootmenu Exec not working when stty is called from ~/.tcshrc
- fixed bug with Move menu and sloppy focus
- temporarily removed SHELL support in apps menu
Changes since version 0.20.1:
.............................
- fixed timer bug
- removed NoWindowUnderDock
- error reporting mechanism has changed in wrlib. Instead of a writing
the message in a string, it will place the error code in RErrorCode
- smoother icon selection
- persistent client supplied icon pixmaps
- fixed yet another crash on emacs exit bug
- fixed portability prob in wrlib shm code
- fixed bug in DISPLAY variable setting in multiheads
- fixed a few more portability problems related to storing struct properties
- fixed damaged balloons on Suns/8bpp (I guess)
- better "one of" type option handling
- added a timeout for some animations
- support for large binary files in wxcopy/wxpaste
- fixed bug of losing focus when resizing/moving windows
- fixed bug in libproplist
- fixed focus with sloppy
- changed permissions of shm segments to 0666. Now, if someone has a shm
leak, we can know who it is.
- faster titlebar texture update
- faster icon kaboom
- added different undocking animation
- updated wmaker -version to output "Window Maker" instead of WindowMaker
- fixed crash bug with transient windows (gimp etc)
- fixed bug with popen()+wwarning() - problem opening cpp'ed menus
- added test for header files in configure for gfx libraries
- simplified building process, making libPropList be always built
- fixed crash with bad mgradient color entry
- docked appicons that are being edited/killed cant be moved (mutex fix)
- more features in wxcopy/wxpaste
- fixed bug with state file in multiheads
- selection retrieval moved to WINGs
- fixed workspacekey to switch workspaces in the current layer
- fixed workspacekey to not switch to inexisting workspace unless
AdvanceToNewWorkspace is YES
- fixed bug with disappearing windows if a workspace switch is made on startup
- fixed blocking of window creation/destroy events when opening menu with kbd
- fixed aspect ratio setting bug
- fixed crashing when miniaturized window is closed during animation
- added XDE support
- fixed stupid bug in shape stuff
- raised threshold for removing docked icons
- fixed HideOthers for windows with NoAppIcon=YES
- if Cancel is pressed in dialog box of %a in menu cmd lines, the command
will be canceled
- slightly better dithering for 8bpp
- apps menu will use $SHELL, instead of /bin/sh to run EXEC menu commands
- cleaned up some code (GetNormalHints(), wManageWindow(),
wGetWindowSavedState() et al, )
Changes since version 0.20.0:
.............................
@@ -705,6 +36,7 @@ Changes since version 0.19.3:
- AIX bug compatibility in XmbTextEntents()
- fixed jpeg loading bug
Changes since version 0.19.2:
.............................

1466
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,9 +25,9 @@ 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, set the
MultiByteText option to YES in ~/GNUstep/Defaults/WindowMaker
and ~/GNUstep/Defaults/WMGLOBAL
- 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..

493
INSTALL
View File

@@ -1,5 +1,5 @@
Installation Instructions for Window Maker
Installation Instructions for WindowMaker
@@ -7,97 +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
- 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
- iBook running Darwin
- Windows NT with Cygwin/XFree86
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
If you will build Window Maker, make sure you have gcc (or some
other ANSI C compiler) 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 Window Maker.
- libPropList
This library can be found in ftp://ftp.windowmaker.org/pub/libs
or in ftp://ftp.gnome.org/pub/libPropList
Install it before building Window Maker.
- autoconf, automake and libtool
These tools are NOT needed, but IF you have one or
more of them installed, make sure you have ALL of the following
with exactly these versions:
autoconf 2.13
automake 1.4
libtool 1.3
If you have a different version, disable them by temporarily
renaming them to something else or uninstalling them from your
system. If you don't develop software you don't need them,
so you can safely uninstall.
- lex (or flex) and yacc (or bison)
These are used by libPropList. lex is actually not needed since
it's output file is included, but either me or automake is stupid,
causing the configure script for libPropList to simply abort for no
convincent reason if lex is not found.
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/
@@ -106,243 +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/
- libHermes 1.3.2 or newer
For faster pixel conversion in the wraster library
(its used only in some conversions - for TrueColor visuals)
http://www.clanlib.org/hermes/
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-kde --enable-gnome
./configure --enable-kanji
will configure Window Maker with KDE and GNOME supported compiled in.
will configure WindowMaker with kanji characters support compiled in.
To get a list of other options, run ./configure --help
--disable-xpm disables use of the XPM library even if it is available on
your system.
--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-png disables use of PNG library
--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-tiff disable use of TIFF library
--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>
--disable-gif disable use of GIF 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-jpeg disable use of JPEG library
--disable-motif
disable support for mwm window manager hints
--disable-shape disables shaped windows (for oclock, xeyes etc.)
--enable-openlook
enable support for OPEN LOOK(tm) window manager hints
--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.
--enable-gnome
enable support for GNOME window manager hints
--enable-kde
enable support for kde/kwm window manager hints
--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.
--enable-modelock
XKB language status lock support. If you don't know what it is you
probably don't need it.
--enable-sound
enable support of sound effects module
--disable-xpm
disables use of the XPM library even if it is available on your
system.
--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;
* if you have problems that mention an error message with --no-reexec
uninstall libtool-1.2b and install libtool-1.3 instead. libtool-1.3
can be found in ftp.gnu.org Also read the TROUBLESHOOTING section;
* if you installed the Window Maker package from RedHat and are
installing a new version of it by hand (compiling yourself), uninstall
the package from RedHat before.
* make sure you have a symbolic link from /usr/include/X11 to
/usr/X11R6/include/X11 (if not, type ln -s /usr/X11R6/include/X11
/usr/include/X11 )
* make sure you have /lib/cpp pointing to the cpp program
If you have any doubts in doing any of the stuff above, please
don't hesitate to contact the RedHat user support. They will
kindly answer to all your questions regarding their system.
They also know much more about their own system than us
(we don't use RedHat).
- 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
@@ -350,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.
@@ -370,92 +225,84 @@ 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-kde option, type:
Note that the WPrefs.app installation path is configured
in a different way. Look at WPrefs/README for information.
./configure --enable-kde
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/Apps
./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:
If you are upgrading from an older version of WindowMaker:
1. Configure and build Window Maker as always
2. Install Window Maker (but do not run wmaker.inst)
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.
@@ -467,41 +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 libPropList/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.
== Cant find proplist.h or libPropList.something
Download and install libPropList from the places pointed to
somewhere else in this file.
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.
@@ -525,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
@@ -565,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
@@ -585,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
@@ -597,9 +434,9 @@ menu
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. The %d in the font names must not be
removed. You can also use the supplied wsetfont script for the task.
Read the script itself for instructions.
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:
@@ -615,8 +452,4 @@ and in ~/G/D/WMGLOBAL:
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
The above 2 fonts are only used by applications that use WINGs (WindowMaker
and WPrefs.app)
The wsetfont script that's supplied will allow you to change the font
settings in a easier way. Take a look in the script for details on usage.

View File

@@ -1,566 +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.13
automake 1.4
libtool 1.3
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-openlook
Ativa compatibilidade com gerenciador de janelas OPEN LOOK(tm).
--enable-gnome
Ativa compatibilidade com gerenciador de janelas GNOME.
--enable-kde
Ativa compatibilidade com gerenciador de janelas kde/kwm.
--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/Apps
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>

204
Install
View File

@@ -2,7 +2,7 @@
#
# WindowMaker configuration and compilation script.
#
# Copyright (c) 1997, 1998, 1999 Alfredo K. Kojima
# Copyright (c) 1997, 1998 Alfredo K. Kojima
#
export LINGUAS;LINGUAS=""
@@ -10,7 +10,6 @@ if test "$NLSDIR" = ""; then
export NLSDIR;NLSDIR="/usr/lib/locale"
fi
OPTIONS=""
PREFIX="/usr/local"
@@ -20,84 +19,22 @@ perai() {
}
perform() {
if ! $* ; then
echo
echo "Window Maker installation failed or aborted by user."
exit 1
fi
}
trap "echo Window Maker installation aborted. ; exit 1" 2 3
echo
echo "========================="
echo "Window Maker Installation"
echo "========================="
echo
echo "NOTE: If this script fails, read the INSTALL file and"
echo "install by hand."
echo
echo "Please read the README, INSTALL and FAQ files before e-mailing "
echo "questions. We will IGNORE any questions that are already"
echo "answered in the documentation."
echo "========================"
echo "WindowMaker Installation"
echo "========================"
echo
echo "NOTE: If the installation procedure fails, read the INSTALL file and do"
echo "the installation manually."
perai
echo
echo "Did you install libPropList? If not, please install it now."
echo
perai
echo "Did you read the INSTALL file?"
echo -n "<y/n> "
read rtfm
if [ "$rtfm" != y ]; then
echo "Please read the INSTALL file before installing"
exit
fi
echo "Are you sure?"
echo -n "<y/n> "
read rtfm
if [ "$rtfm" != y ]; then
echo "Please read the INSTALL file before installing"
exit
fi
echo "Are you lying?"
echo -n "<y/n> "
read rtfm
if [ "$rtfm" != n ]; then
echo "What a shame!"
echo "Please read the INSTALL file before installing"
exit
fi
echo "Do you *swear* that you really read the INSTALL file?"
echo -n "<y/n> "
read rtfm
if [ "$rtfm" != y ]; then
echo "Please read the INSTALL file before installing"
exit
fi
echo "Last chance. You will not get help if you have some problem"
echo "because you didn't read that file. Even if your computer explodes."
echo "Do you *really* read it?"
echo -n "<y/n> "
read rtfm
if [ "$rtfm" != y ]; then
echo "Please read the INSTALL file before installing"
exit
fi
echo
echo "Ok, you have been warned."
echo
perai
if test "$USER" != "root"; then
echo
echo "Warning: you must run this script as root to install"
echo "Window Maker. Hit <Control>-<C> to quit this script."
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
@@ -105,31 +42,17 @@ echo
echo "Option Selection"
echo "================"
######################## KDE
echo
echo "Do you want KDE support?"
echo -n "<y/n> [n] "
read kde
if [ "$kde" = y -o "$kde" = Y ]; then
OPTIONS="$OPTIONS --enable-kde"
fi
######################## Sound
######################## GNOME
echo
echo "Do you want GNOME support?"
echo -n "<y/n> [n] "
read gnome
if [ "$gnome" = y -o "$gnome" = Y ]; then
OPTIONS="$OPTIONS --enable-gnome"
fi
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
######################## OLWM
echo
echo "Do you want OPEN LOOK(tm)/olwm support?"
echo -n "<y/n> [n] "
read olwm
if [ "$olwm" = y -o "$olwm" = Y ]; then
OPTIONS="$OPTIONS --enable-openlook"
if [ "x$SFX" = "x" -o "$SFX" = "y" -o "$SFX" = "Y" ]; then
OPTIONS="$OPTIONS --enable-sound"
fi
######################## NLS
@@ -144,16 +67,16 @@ if [ "$NLS" = "y" -o "$NLS" = "Y" ]; then
ling=` (cd po; /bin/ls *.po) `
ALL_LINGUAS=""
for l in $ling; do
lname=`(cd po; grep Language-Team $l|cut -f2 -d: |cut -f2 -d\ |cut -f1 -d\\)`
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 will install everything) [none]"
echo "Type in the locales you want [$ALL_LINGUAS]"
read foo
if test "$foo" = "all"; then
LINGUAS="$ALL_LINGUAS"
if test "x$foo" = "x"; then
LINGUAS=$ALL_LINGUAS
else
LINGUAS="$foo"
fi
@@ -175,6 +98,16 @@ if [ "$NLS" = "y" -o "$NLS" = "Y" ]; then
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]"
@@ -189,18 +122,17 @@ fi
done=0
while [ $done = 0 ]; do
echo
echo "Where do you want to install Window Maker? [$PREFIX]"
echo "Where do you want to install WindowMaker? [$PREFIX]"
echo "Don't change it if you don't know what you're doing."
if test "$USER" != "root"; then
echo "Make sure to specify a path where you have write permission."
fi
echo "(The default will put Window Maker in $PREFIX/bin, $PREFIX/lib etc.)"
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
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 Window Maker into \"$foo\""
echo "Hmm... I don't think you really want to install WindowMaker into \"$foo\""
echo
else
done=1
@@ -210,52 +142,60 @@ while [ $done = 0 ]; do
done=1
fi
echo
echo " $PREFIX/bin must be in the PATH environment variable"
echo "of all users who will use Window Maker"
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 Window Maker..."
echo "Configuring WindowMaker..."
echo "--------------------------"
if [ `uname -s` = "SCO_SV" ]; then
echo "CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS"
CFLAGS="$CFLAGS -belf -DANSICPP"
perform ./configure $OPTIONS
CFLAGS="$CFLAGS -belf -DANSICPP" ./configure $OPTIONS
else
echo "CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS"
CFLAGS="$CFLAGS $GCCFLAGS"
perform ./configure $OPTIONS
CFLAGS="$CFLAGS $GCCFLAGS" ./configure $OPTIONS
fi
#################### Compile
echo "------------------------"
echo "Compiling WindowMaker..."
echo "------------------------"
(cd src; make clean)
make
echo "-------------------------"
echo "Compiling Window Maker..."
echo "Installing WindowMaker..."
echo "-------------------------"
(cd src; perform make clean)
perform make
echo "--------------------------"
echo "Installing Window Maker..."
echo "--------------------------"
perform make install
if [ `uname -s` = "Linux" ]; then
echo
echo " Make sure $PREFIX/lib is in the /etc/ld.so.conf file"
/sbin/ldconfig
fi
make install
echo
echo "Installation Finished!"

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,26 +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 MIRRORS COPYING.WTFPL \
Install acconfig.h INSTALL.pt README.pt\
mkpatch README.KDE README.GNOME WindowMaker.lsm.in\
README.definable-cursor
# libwmfun-0.0.3.tar.gz
WindowMaker.lsm: WindowMaker.lsm.in
size=`wc -c $(distdir).tar.gz|cut -d\ -f1`;\
size=`echo scale=2\;$$size/1048576|bc`;\
sed -e "s/VERSION/"$(VERSION)"/" \
-e "s/DATE/`date +%d%b%Y|tr a-z A-Z`/"\
-e "s/SIZE/$$size M/"\
WindowMaker.lsm.in > WindowMaker-$(VERSION).lsm
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS Install acconfig.h\
libPropList.tar.gz mkpatch
#dist-hook:
# touch `find -name configure.in -print`
# touch `find -name aclocal.m4 -print`
# touch `find -name Makefile.am -print`
# touch `find -name Makefile.in -print`
# touch `find -name configure -print`
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:

955
NEWS
View File

@@ -1,963 +1,12 @@
NEWS for veteran Window Maker users
-----------------------------------
--- 0.65.0
Single AppIcon
--------------
Removed --single-appicon patch and replaced it with a application
specific collapsing option. Check inspector panel and appicon menu.
New options to configure the workspace mouse actions
----------------------------------------------------
The following options were removed from the WindowMaker defaults configuration
file:
SelectWindowsMouseButton, WindowListMouseButton and ApplicationMenuMouseButton.
They were replaced with the following 3+1:
MouseLeftButtonAction, MouseMiddleButtonAction and MouseRightButtonAction plus
MouseWheelAction
In the old way because all gravitated around the workspace actions to which
specific mouse buttons could have been bound, it allowed one to specify in
the configuration file settings which would have led to weird situations
that also had undesirable results.
For example the same mouse button (for example left) could have been
assigned to all workspace actions: 'select windows', 'show window list menu'
and 'show applications menu' which of course were not only impossible to
accomplish while still having a properly working workspace, but they also
allowed one to specify some settings in the configuration file that were
never in fact translatable to proper workspace actions.
To void this kind of user interface inconsistency, the new options now
gravitate around the physical device (the mouse and its buttons) to which
specific workspace actions can be bound. This way, even if one assigns the
same action to all mouse buttons, that situation while gives redundant and
unpractical settings it will still translatable to proper workspace actions:
all buttons will execute the same action, but a button will execute only one
action at a time.
The new options take the following values:
all Mouse...ButtonAction can have one of the following values:
None, SelectWindows, OpenApplicationsMenu or OpenWindowListMenu
MouseWheelAction can be one of None or SwitchWorkspaces
If you had the default actions bound to mouse buttons before, then it will
work for you without any intervention in the configuration files.
Else you need to use WPrefs.app to bind the actions to the mouse buttons
again to your old settings. Also if you want to change the mouse wheel
behavior regarding workspaces you can now (use WPrefs.app to do this).
Client supplied icons
---------------------
Window Maker saves the client supplied icons in ~/GNUstep/.AppInfo/WindowMaker
in XPM format for later use when the app is no longer running (to have the
image to display for docked icons for example).
Until recently the XPM images saved by Window Maker were incorrect, but a
recent fix in the code to save XPM's fixed them. But with this fix, all
previously saved XPM's in that directory are no longer readable (they give
wrong images on screen or fail to load).
To avoid the need for the user to fix this by hand editing WMWindowAttributes
and removing all references to icons in ~/GNUstep/.AppInfo/WindowMaker which
can be annoying, new code was added to Window Maker to permit the regeneration
of images in ~/GNUstep/.AppInfo/WindowMaker if they are missing.
With this addition, all you need to do to fix your old broken images, is to
delete all *.xpm files from ~/GNUstep/.AppInfo/WindowMaker. Next time the
application that is supplying an icon image will start the icon will be
recreated if missing, but this time it will be saved with the new XPM save
code which produces good XPM images.
All the rest of the process is transparent to the user.
Hermes library support
----------------------
If configure finds hermes library (an optimized pixel format conversion
library) installed it will use it to do the pixel format conversion in
the wraster library for some cases (TrueColor visuals without dithering).
Currently the hermes routines cannot convert to an indexed destination,
so we can't use hermes for PseudoColor, GrayScale and StaticGray visuals.
Also hermes only does dithering for just 2 combinations of source/destination
bits/masks none of them useful to out needs so for dithering we still
use out routines.
The Hermes library is completely optional, you can build Window Maker
without having it, it just speeds up the things a little for some
situations.
hermes library is available here: http://www.clanlib.org/hermes/
--- 0.64.0
No Polling of Configuration Files
---------------------------------
Running Window Maker with one of -nopolling or --no-polling command line
options will make it not to poll every 3 seconds for changes in its
configuration files (good for laptops to let them spin disks down when idle).
Note:
For the ones used with Jim Knoble's 'no polling' patch, this is the same,
except that the need to #define ENABLE_NO_POLLING in wconfig.h was removed
and the behaviour is always available if you use the command line option.
--- 0.63.0
Interwoven Gradient
-------------------
interwoven gradients rip^Winspired on blackbox. Will render a texture that
interweaves 2 different ones.
(igradient, from1, to1, thickness1, from2, to2, thickness2)
Will render a interwoven texture with the 2 specified gradients,
with each section having the specified thickness.
wmagnify
--------
The wmagnify utility will magnify the area on teh screen where
your mouse pointer is located, updating it in real-time.
tip: maximize it horizontally, make it Omnipresent and Always at Bottom.
Then leave it in the bottom of the screen.
workspace border
----------------
2 options (WorkspaceBorder and WorkspaceBorderSize) were added to allow one to
set a small (0..5 pixels) border for the workspace. This border will not be
covered by windows when maximizing, allowing one to easily access the clip
or map a menu using the mouse in the border area, even when there are
windows maximized in both horizontal and vertical directions.
WorkspaceBorder can be one of (None, LeftRight, TopBottom, AllDirections)
while WorkspaceBorderSize is the size in pixles of the border not to be
covered by windows when maximizing (usually a small amount 0..5 pixles).
Both options can be set using WPrefs.app in the "Miscelaneous Ergonomic
Preferences" section. WPrefs will always limit WorkspaceBorderSize in the
(0..5) range.
Note that if "full screen maximization" option is set for a window, that
window will ignore this border area, maximizing to full screen.
--- 0.62.0
Optimizations!!
---------------
Code for converting wrlib images into X Pixmaps was optimized in many ways,
both in the original C code and in assembly for Pentium(tm) processors (with
and without MMX(tm)). Depending on the bit depth/color mode and CPU model,
performance increases can go up to 150%
Weendoze Window Cycling (alt-tab)
---------------------------------
Window cycling was changed to weendoze style.
NoBorder Window Attribute
--------------------------
The NoBorder window attribute (to be put in
~/GNUstep/Defaults/WindowAttributes) was added and will remove the
1 pixel border around windows.
Removed "Keep Attracted Icons" option from Clip's menu
------------------------------------------------------
Since this option brought more confusion than usefulness among users, and
since it was usable only in a very limited context, being able to fill up
the Clip very easily, it was removed.
An alternative way of gaining the same functionality is to use the "Keep icon"
entry in the Clip's main menu. Or select multiple icons before calling that
entry, to make it apply to more than one icon.
Note: "Keep icon", as the obsoleted "Keep Attracted Icons" had nothing to do
with holding icons in Clip, while the application is running. Once they
are attracted, they are kept until the application close. Using
"Keep icon", will only assure that the icon will be kept, even after the
application is closed.
Please don't ask for this option back. It's error prone, and very unintuitive.
Considering it's very restrictive usability, and it's very ambiguous topic, it
does not need a special entry in the Clip's menu, taking in count that there
are already better alternative ways of gaining the same functionality.
Removed DisplayFont Option
---------------------------
The font for the geometry size will be controlled by the default
WINGs font (SystemFont in WMGLOBAL) now.
Others
------
- added DONT_SCALE_ICONS compile time option
- added --dont-restore cmd line option. When passed to wmaker, it
wont restore the state saved previously.
--- 0.61.1
New libPropList
---------------
new libPropList-0.9.1 is REQUIRED to build Window Maker 0.61.1.
go grab it and install it first.
--- 0.60.1
Window Edge Attraction
----------------------
Window edge attraction was now added.
Attraction = YES/NO;
will enable/disable gravity to edge's boder.
The strength of gravity can be controled by modify `EdgeResistance' value
in WindowMaker configuration file.
Titlebar Draw String Plugin
---------------------------
FTitleColor, UTitleColor, PTitleColor, MenuTitleColor can be assigend with
drawstring plugin instead of plain color. For example:
FTitleColor = (
function,
libwmfun.so,
drawPlainString,
gold,
black,
gray49
);
will invoke function drawplainstring from libwmfun.so and pass 3 colors for
arguments. To code new plugin, please see plugin.h for more informations.
--- 0.60.0
User Menu
---------
The user menu is now a compile time option disabled by default.
Supply --enable-usermenu to configure to enable it.
root menu INCOMPATIBLE changes
------------------------------
EXEC <program> will execute the named program
SHEXEC <command> will execute the shell command.
If you want to execute something like blabla > /dev/null, then use SHEXEC
Dont forget to update your menus.
New Option For setstyle
-----------------------
The --ignore flag will tell setstyle to not change the option that is
specified, when modifying the Window Maker configurations. For example:
setstyle --ignore MenuStyle sometheme.themed will cause the MenuStyle
option to not be changed.
setstyle --ignore FTitleBack --ignore UTitleBack --ignore PTitleBack bla.themed
will load the theme, but keep the titlebar background related options as
before.
MultiByte Text Support Changes
------------------------------
The --enable-kanji configure option is not needed anymore and was removed.
To enable support for multibyte text, you must:
- set the LANG environment variable to the appropriate value
- change the font configurations to contain font sets in the appropriate
encodings in both ~/G/D/WindowMaker and ~/G/D/WMGLOBAL (for WPrefs)
- set the MultiByteText option to YES in both of the above files
New Options
-----------
WorkspaceNameDisplayPosition =
none/center/top/bottom/topleft/topright/bottomleft/bottomright
SmoothWorkspaceBack = YES/NO
will enable smoothing of scaled workspace background images.
Application User Menu Path Changes
NEWS for veteran WindowMaker users
----------------------------------
Default configuration for user specific menus installed in
/usr/local/share/WindowMaker/UserMenus or $(datadir)/WindowMaker/UserMenus
and ~/GNUstep/Library/WindowMaker/UserMenus.
Omnipresent icons in Clip
-------------------------
Added ability to set icons docked in Clip to be omnipresent on all workspaces.
To set/reset this flag use the clip menu.
The Clip menu changed in the following way:
- if you bring up the menu from the Clip's main icon, it will contain as
before the "Rename Workspace" entry in the second position.
- however, if you bring up the menu from any other icon in clip, the
"Rename Workspace" menu entry is replaced by "Omnipresent" or
"Toggle Omnipresent" depending on the context.
This entry will work in the following way, depending on the context:
1. If there is no icon selected in the clip, then the menu will contain the
entry named "Omnipresent" which will be checked accordingly to the current
state of the icon (omnipresent or not), and will let you change the
omnipresent state of the icon you brought the menu from.
2. If one or more icons are already selected when the Clip menu is called, the
entry will be named "Toggle Omnipresent" and will apply to all selected
icons trying to toggle their omnipresent state. The icons which will be
succesfully changed to their new state as requested, will be unselected,
while the ones that will fail for some reason to gain their new state,
will remain selected.
In both cases if there is no success in setting what user requested a panel
will inform user of the failure.
(Note: trying to set an icon to not-omnipresent will never fail. Failures can
be met only when trying to set omnipresent for an icon).
The icons set to omnipresent will be marked with a triangle in the upper left
corner, having the color of the IconTitleColor.
An icon can be set to omnipresent, only if its position is free in all the
workspaces, else you will be informed of the problem and asked to fix it first.
Also when dragging an omnipresent icon around in Clip, all the icons docked in
all the workspaces are shown while the dragging is done, to let one easily see
where are free slots in all workspaces.
For advanced users, there is also a shortcut to set/reset the omnipresent
state of an icon: just use "Shift+MiddleButton" (button2) on the icon you want
to change.
In this case only the mark in the upper left corner will appear in case of
success, or nothing will happen if icon cannot be made omnipresent (advanced
users are expected to know why the icon failed to be made omnipresent, so they
don't need a panel to explain them why ;) ).
Now before you load your gun to start a flame war because this is against your
principles you love so much, please sit down and think that this is a feature,
which, if you don't use, the old behaviour of the Clip is totally preserved.
It just adds some extra capabilities to the Clip for people who think that this
is useful.
XDND drop on dock support
-------------------------
Support for XDE on dock is now replaced by XDND.
To enable, edit src/wconfig.h
--- 0.53.0
New Options
-----------
** MenuStyle
MenuStyle=<style>; will change the menu texture style.
<style> can be:
normal (default): for the traditional one texture per item, with bevels in
each
singleTexture: for a single texture that spans the whole menu, with bevels
in each item
flat: singleTexture without the bevels
** ResizebarBack
ResizebarBack=<texture>;
where <texture> is any of the textures you normally use in titlebars and
other places.
If the style file/theme does not contain a ResizebarBack option, setstyle
will automatically hack it so that wmaker will make the theme work like
before.
New crash dialog panel
----------------------
From now on, whenever a fatal situation appears, Window Maker will display a
dialog panel to the user and let him choose what to do.
The options are:
- Abort and leave a core file (usefull for debugging and getting backtraces)
- Restart Window Maker (default behaviour)
- Start alternate window manager (the one defined as fallback, or if not
possible fvwm or twm in this order).
If it will not be able to restart or start the alternate window manager, it
will abort and leave the core file.
Application User Menu
---------------------
Applications with an appicon can have a user defined menu.
This menu will emulate keyboard events, and will be sent to the applications'
window(s), thus the application must accept key combinations (CTRL+N for
instance).
To enable this feature, #define USER_MENU in src/wconfig.h and place menu
files in ~/GNUstep/Defaults/UserMenus (/usr/local/etc/WindowMaker/UserMenus
globally).
The user menu is in PropList format and the filename is in:
<instance name>.<class name>.menu or application's main window.
(Example: the menu for xcalc would be - xcalc.XCalc.menu)
Example user menu syntax:
(
"Calculator",
("Put 1", SHORTCUT, "2"),
("Functions",
("Put 2", SHORTCUT, "2"),
("Put 3,4 and 5", SHORTCUT, (3,4,5))
),
("Exit", SHORTCUT, "Control+q")
)
--- 0.52.0
Appearance Editing in WPrefs
----------------------------
Added Appearance/Texture editing capability in WPrefs. Workspace background
selection is not yet finished.
Themes
------
Removed all themes from the source tree, and moved them in a separate package.
You can download the new package from the same place as this package:
ftp://ftp.windowmaker.org/pub/beta/srcs/
Look after WindowMaker-extra-<version-number>.tar.gz
Also WindowMaker-extra pack include the old WindowMaker-data.tar.gz which only
contained icons.
Look for the greatest version number when you download this package.
get-wraster-flags script change
-------------------------------
The name of the options passed to get-wraster-flags changed, to allow a better
name compatibility with the naming conventions used by other software.
The name change was as follows:
--lflags was changed in --ldflags
To allow backward compatibility, with already written software, the old
--lflags option is still recognized, but you are encouraged to move the the
new --ldflags.
--- 0.51.2
New Themes
----------
Added 2 new cool themes (actually I added in 0.51.1, but forgot
to put it here...) from largo (LeetWM) and BadlandZ (STEP2000).
Full Screen Maximization
------------------------
The FullMaximize window attribute will allow the window to
be maximized to the full size of the screen (ignoring anything
like titlebar, resizebar, dock, panels etc). It should be usefull
for programs that must use the whole screen, like games or things
like presentation programs.
--- 0.51.1
KDE Application Menu script
---------------------------
wkdemenu.pl is a converter from KDE application menu structures to wmaker
menu that can be used as a piped menu. Look wkdemenu.sh for how to use it.
Window Edge Resistance
----------------------
Window edge resistance was now added. No, feature freeze hasn't been
removed. Its just part of the edge resistance rewrite ;)
New Theme
---------
Added SteelBlueSilk theme
Installation Path Changes
-------------------------
Default configuration data installed in /usr/local/etc/WindowMaker
or $(sysconfdir)/WindowMaker
--- 0.51.0
Window Maker has become a GNU program (part of the GNU Project).
Title text drop shadow
----------------------
drop shadow option added for titlebar text. This is a compile time
option which needs to be defined in src/wconfig.h after you run
configure and before you run make.
New options and syntax for your WindowMaker domain file are:
Shadow = yes/no;
FShadowColor = <color>;
PShadowColor = <color>;
UShadowColor = <color>;
MShadowColor = <color>;
The shadow option is dynamic (no need for a restart).
MShadowColor is for the menu title text.
libPropList
-----------
WARNING!!! libPropList was removed from the Window Maker distribution
and is being distributed separately. If you dont have it installed yet,
get it from ftp.windowmaker.org/pub/libs and install before building
Window Maker.
signal handling change
----------------------
SIGHUP will exit wmaker instead of restarting it!!! This is because
GNOME expects the window manager to exit instead of restarting...
Complaints should go to gnome people. SIGUSR1 will restart wmaker now.
script change
-------------
WINGs-flags was removed, and replaced by get-wraster-flags.
Please remove WINGs-flags from your system, since it was obsoloted by
get-wraster-flags.
Continuing to use WINGs-flags can lead to hazardous effects, since is no
longer updated.
docklib
-------
docklib is a little library for making dock applets. It's in the
docklib-0.0.tar.gz file. Unpack it and read the README file there.
Option Changes
--------------
Removed OnTopTransients option
Added OpenTransientOnOwnerWorkspace
Olwm Hint Support
-----------------
OPEN LOOK(tm)/olwm hints support was added.
Read the appropriate section in the README file.
--- 0.50.1
New option for WorkspaceBack. mpixmap is the same as spixmap, but
it will scale the pixmap by keeping the aspect ratio (maximize or maxpect).
The option only works for workspace backgrounds.
Also added IGNORE_PPOSITION compile time flag, which is equivalent
to NoPPosition from fvwm.
--- 0.50.0
KDE and GNOME
-------------
Added full support for GNOME and KWM hints.
Read the INSTALL file to see how enable them.
Everything in the so called GNOME window manager bla bla bla pseudo-spec is
implemented.
As for KDE stuff, it implements 90% of everything kwm does, adds some
Window Maker specific extensions to it and still uses half of the memory
kwm does, which should be enough to let you dump kwm ;) For details on what
exactly is implemented, see comments in src/kwm.c Read the README.KDE file
for more information.
WARNING: Some KDE hints are badly designed, so doing things like using
kpanel's desktop switcher/pager and Window Maker's internal workspace
management functions to create, destroy and rename workspaces at the same
time might cause unknown effects. To be on the safe side, only
use either of them to manage workspaces. Switching workspaces is hopefully,
safe, so you can switch workspaces from wherever you want.
Workspace Specific Background Images
------------------------------------
Use the WorkspaceSpecificBack to set background images for specific
workspaces. The WorkspaceBack is used as the default background image.
Example:
WorkspaceSpecificBack = ((solid, red), (cpixmap, ship.jpg, gray), (),
(dgradient, red, blue))
This will set the background image of workspace 1 to (solid, 0),
2 to ship.jpg and 4 to a gradient. Workspace 3 and other workspaces
will have the image defined by WorkspaceBack.
Note that this uses quite some memory...
setstyle/getstyle
-----------------
setstyle now accepts the -nofonts flag, which will load the style
file ignoring all font related options.
Example:
setstyle -nofonts Blabla.style
getstyle can be used to create theme packs. See the usage in the
WindowMaker/README.themes file.
New Texture Type
----------------
Textured gradients will tile a texture pixmap and combine it with a gradient,
using an arbitrary opaqueness.
Syntax is (thgradient, <file>, <opaqueness>, <color1>, <color2>)
(tvgradient, <file>, <opaqueness>, <color1>, <color2>)
(tdgradient, <file>, <opaqueness>, <color1>, <color2>)
where:
<color1> and <color2> are the colors for the gradient,
<file> is the texture file and
<opaqueness> is the opaqueness to merge the texture witht the gradient,
ranging from 0 to 255.
Example:
(thgradient, "BlueImage.jpeg", 120, white, black)
The BlackTexture style and Checker theme are examples.
Hints:
You can use any type of pixmap file for this, but small (like 64x32)
grayscale pixmap files should get the best results (fast and low memory
usage). You can use color pixmaps, but it is harder to get the desired effect
with them.
Be warned that this texture type is the slowest.
New Options
-----------
IconTitleBack and IconTitleColor control the color of the
miniwindow title. Both of them are colors.
Example:
IconTitleColor=white;
IconTitleBack=black;
Since this introduces an incompatibility in themes and getting flamed by the
themes ppl isn't the most pleasant thing ("Whaddafuk you're thinking!? You
just broke 500 themes!!!" ;) the setstyle command was hacked so that it will
make old themes work as before, by trying to automatically set the above
options. Note that in some cases it will not have exactly the same results as
before.
StartMaximized window attribute. Will maximize the window when it
is mapped.
AutoRaiseLower option for the Clip. This allows automatic Raise/Lower of the
Clip icons when the mouse pointer enter/leave the Clip. To avoid unwanted
raising/lowering there is a time threshold before raising/lowering.
The thresholds can be changed in wconfig.h by changing one or both of
AUTO_LOWER_DELAY and AUTO_RAISE_DELAY (expressed in miliseconds).
For example if you set AUTO_RAISE_DELAY to 0, then the Clip will be raised as
soon as the mouse pointer enters it's area. Setting AUTO_RAISE_DELAY to a very
big value, will make the Clip to practically do not auto raise unless clicked,
but to be automatically lowered after AUTO_LOWER_DELAY (ms) when leaved.
New ThemePack Format
--------------------
Starting with this version, a new format of themes is being supported.
Before you open pine and start composing your flame, rest assured that
the old format is still supported. The new format is documented
in the WindowMaker/README.themes file.
Root Menu
---------
The -noext option for OPEN_MENU will strip whatever is after the last .
in file names that appear on the opened directory. So,
OPEN_MENU ~/bg WITH xv -root -quit
will create a menu with all the images in ~/bg without the extension.
--- 0.20.3
Icon (miniwindow) stacking
--------------------------
If you want miniwindows to reside under normal windows, edit
wconfig.h and change WNormalLevel (just grep for it) to
WDesktopLevel
5 Button Mouse
--------------
If you have a 5 button mouse and want to give some utility for
the extra 2 buttons, edit the appropriate line in src/wconfig.h
Clicking Button4 in the root window will switch you to the previous
workspace and Button5 will do that for the next.
Option Changes
--------------
put NoWindowOverDock back
KeepOnBottom window attribute
-static command line option
---------------------------
wmaker -static will start Window Maker in static mode. This will
prevent wmaker from checking or making any configuration changes.
That makes it possible to run wmaker before running wmaker.inst
Hysteresis for menu item selection
----------------------------------
Hopefully it's intelligent enough, so you won't notice it.
In case you want to know what's it, it's equivalent to that
(insanely long) 2 second delay present in that Windoze95 menu,
but more usefull than annoying (I hope :). To see it, do the following
with your current wmaker version and later with 0.20.3:
- open the apps menu and stick it
- click in the item for the "Workspaces" submenu and hold
- drag the mouse to the 4th or bigger entry (like "Workspace 4") in a
straight line, trying to select the target item before the submenu
is unmapped when you dragged over other items in the main menu
Window Shortcuts
----------------
Window shortcuts are shortcuts to arbitrary windows. You can make up to 4
shortcuts. To assign a previously bound shortcut to a window use the "Select
Shortcut" submenu in the window commands menu. If the shortcut is not yet
assigned for any window, you can hit the shortcut to assign it to the active
window. The shortcut will do the same as clicking in an entry in the window
list menu. The keys for the shortcuts are defined in the ~/G/D/WindowMaker
file or in WPrefs.app
Option names are:
WindowShortcut1Key through WindowShortcut4Key
--- 0.20.2
The name of WindowMaker was changed to Window Maker.
Window creation animation disabled by default.
xdaliclock -shape
-----------------
If you use it edit src/wconfig.h and #define OPTIMIZE_SHAPE or disable the
titlebar and resizebar for the window. OPTIMIZE_SHAPE will remove the
flickering for xdaliclock and other programs that change their shapes often,
but will increase network traffic considerably. So, if you use xdaliclock
from a remote machine it can get slow.
Applications Menu
-----------------
The applications menu will now use the shell in the SHELL environment
variable to execute EXEC menu commands. If it is unset (I think it's always
automatically set by the shell program) it will use /bin/sh
Extra fancy icon kaboom :)
--------------------------
Edit src/wconfig.h and #define ICON_KABOOM_EXTRA to get
more effects for the icon undocking animation.
Options for superfluous stuff are even more superfluous, so this
will not become runtime.
XDE drag and drop support
-------------------------
Support for XDE drag and drop was added (by "]d" <id@maliwan.org>).
To enable, edit src/wconfig.h
The support works with gtk 1.1.2
libPropList
-----------
libPropList will now be built automatically by wmaker. Wich means
the (simplified) building process is now:
./configure
make
make install
instead of:
tar xzf libPropList.tar.gz
(cd libPropList; make)
make
make install
You also don't need to worry about GNOME libPropList incompatibilities
anymore.
Bug with focus lost in sloppy focus fixed
-----------------------------------------
The bug only occurs in sloppy or auto focus modes, with AutoFocus disabled
and Superfluous enabled. There is no easy/clean way to fix this, so Window
Maker will disable the animation of window creation if the focus mode is
either sloppy or auto AND AutoFocus=NO.
If you want the animation, enable AutoFocus or use manual focus mode
(prefered).
The NoWindowUnderDock option was removed
----------------------------------------
To obtain the same result, use the "Keep Dock On Top" option in the dock menu.
Persistent Program Suplied Icons
--------------------------------
Application supplied icons are now stored, so that the dock will keep
showing them after the app is exited. The icons are stored at
~/GNUstep/.AppInfo/WindowMaker/
Sound support
-------------
Sound support is now on by default. Even if you don't use sound the overhead
is very small, and has no impact on performance. If you still want to
optimize it and remove a few hundred of bytes, then use --disable-sound or
--enable-sound=no options when you configure Window Maker.
--- 0.20.0
Multihead support. wmaker will now manage all screens that are attached to the
display.
------------------------------------------------------------------------------
It does so from a single process (instead of spawning a new process for each
screen, like fvwm does). This keeps memory usage a lot lower than fvwm.
@@ -978,7 +27,6 @@ exitscript
~/G/L/W/exitscript will be called automatically when wmaker is exited.
New runtime options
-------------------
@@ -1007,7 +55,6 @@ New theme
A new theme named Night, is available in this distribution.
--- 0.19.3
GIF support was added. You will need libgif 2.2 to use it.

422
README
View File

@@ -1,261 +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
]d
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), OPEN LOOK(tm), KDE and GNOME are also supported.
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.
OpenL**k support
================
I guess many users, mainly from the academic world, have to use
applications written using the OpenL**k toolkits, so having support
for these apps must be of some use.
To enable, use --enable-openlook when doing the configure. Note that
not everything is implemented.
Implemented stuff include decoration hints and the push-pin. Not implemented
stuff include _SUN_WINDOW_STATE (the compose led state stuff), drag and drop
interest stuff, header (not sure what's it) and footer strings.
Please give me feedback if something doesn't work. If the feature is
already implemented, but is not working because of a bug, I'll try to
have that fixed. If it's a non-implemented feature and you mention that
it's important (ie: not just cosmetical), I'll consider implementing it.
The "out" state of the pushpin is emulated as a pushed-in close button.
Just click on the button to make it pushed-out, which corresponds
to the pinned-in state of the pushpin. If you push again in the pushed-out
close button, it will act as a normal close button: it will close the window.
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
@@ -263,132 +148,41 @@ 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.
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 Window Maker and *really* like it, please consider making my day
by sending me a music CD (or a MiniDisc or even a MP3 CDR) 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.
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:

View File

@@ -1,53 +0,0 @@
Information on Using Window Maker with GNOME
--------------------------------------------
Status of GNOME support
-----------------------
GNOME window manager protocols seem to be a work in progress.
Things still change fairly frequently, so, the stuff implemented
may not reflect the latest protocol. If something doesn't work,
that's probably because the protocols have changed again and I still
didn't have time to reimplement everything or noticed that it
changed. If that happens, please tell me exactly what doesn't work.
Other than that, the so called "GNOME Window Manager Compliance - How to
write a GNOME compliant Window Manager" document, says this:
"There are currently a set of other hints available that are, at the
current time, not essential and therefore not documented here. It is,
however envisaged that they will be finalized and added to this
document, but for now are not needed."
Since they are non-essential and undocumented they are not yet implemented.
Implemented stuff:
- GNOME window manager hints
- Motif window manager hints
On the works:
- R6 style session management
Compilation/Installation
------------------------
To compile Window Maker with GNOME support, just configure it as:
./configure --enable-gnome
before compiling.
Also, do not disable mwm hints support (they are enabled by default).
Configuration
-------------
In WPrefs, go to the last section and toggle the "Disable miniwindows" option.

View File

@@ -1,125 +0,0 @@
Information on Using Window Maker with KDE
------------------------------------------
Window Maker supports almost all KDE/KWM specific client
communication protocols, so you can simply replace kwm with
Window Maker, if you think these advantages are worthy:
Window Maker KWM
=============================================================================
Looks NEXTSTEP(tm)/NEXTSTEP(tm) Original, but reminds
enhanced Windows(tm)
Decoration solid, gradient, multi-color solid, vertical and
Textures gradient, pixmaps, textured horizontal gradient,
gradient - all gradients are pixmap
supported in horizontal,
vertical and diagonal
directions
Configurable No Yes, but not totally
Titlebar Buttons
Mini CLI Yes, but limited Yes
Window Specific Yes In KDE 1.1, yes.
Configuration In KDE 1.0, no.
Quick Keyboard Yes In KDE 1.1, yes
Navigation In KDE 1.0, no.
Pager KDE pagers will work as Yes
well as GNOME pagers
Session Not yet supported, but Yes, old (pre-X11R6) style
Management X11R6 style SM is being worked.
Dock kpanel, GNOME panel and Dock kpanel
Built-in Yes No
krootbgwm
GNOME support Yes No
Memory Usage(1) 1.85Mb In KDE 1.0, 3.13Mb
In KDE 1.1, probably more
(1) Memory usage was tested by running wmaker and kwm at the same machine
with the same windows, on the same screen and similar window texture
configurations (at different times, of course). I looked in the output of
ps -m, in the SIZE field, right after starting the window managers.
Enabling KDE Support
--------------------
To enable KDE support in Window Maker, you must compile it after
configuring it as follows:
./configure --enable-kde
Then, just replace kwm with wmaker in your startkde script.
If you are going to use Window Makers sound server, comment out
kwmsound in startkde. Also if wmaker sets your root window
background, comment out kbgndwm, kde's wallpaper setter.
Make sure to disable workspace background setting in KDE. If you
wont be using Window Maker themes anyway, you can set
WorkspaceBack = (none);
in ~/GNUstep/Defaults/WindowMaker
Enhancing Integration
---------------------
Window Maker adds some extensions to KDE's messaging stuff, so you can run
Window Maker specific commands from places like kpanel, krootwm or even
kwmcom. Recently KDE developers have kindly added support for these extensions
in the more recent KDE versions from CVS. The added stuff are the following
kwm like commands:
wm:wmaker - select Window Maker support mode
wmaker:info - show info panel
wmaker:legal - show legal panel
wmaker:arrangeIcons - arrange icons
wmaker:showAll - show all windows
wmaker:hideOthers - hide others
wmaker:restart - restart wmaker
wmaker:exit - exit wmaker
You can test them with kwmcom, like:
kwmcom wmaker:info
Problems
--------
* kpanel will not be kept always on top. That's because kpanel is an
OverrideRedirect window, so Window Maker can't do anything about that.
Before requesting for a hack to work around that in Window Maker, please
request the kpanel author to fix it.
* because the KDE protocol for letting the window manager know the usable
window region is broken, you might find some problems with the window
positioning/maximization code and kpanel's position.
* It seems kpanel (and maybe KDE in general) doesn't like dynamically
changing the number of workspaces. So, don't create or destroy workspaces
while running on KDE, unless you really need.
* If kpanel, kwmpager or kpager becomes confused about the number of
windows present, restart them.
* Wmaker opens windows by default under/over the panel, when the panel is
at top or left of screen. Use the GUI configuration tool WPrefs to change
this.
* Some commands, such as cascade windows and rearrange windows are not
yet implemented.

View File

@@ -1,86 +0,0 @@
# README.definable-cursor: How to use definable-cursor patch for Window Maker
# created 1999-Apr-24 14:53 jmk
# autodate: 1999-Apr-24 16:29
__________________________________________________
|O| Definable Mouse Cursors for Window Maker |X|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The definable-cursor patch for Window Maker
<http://www.windowmaker.org/> 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.
This README describes how to apply the patch to Window Maker and how to
use the features it enables.
____________________________
|O| Applying the Patch |X|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The definable-cursor patch is available from
<http://www.pobox.com/~jmknoble/WindowMaker/patches/>.
To apply the patch, do the following (where `XX' is the version of
Window Maker you're patching):
(0) gzip -dc WindowMaker-XX.tar.gz | tar -xvf -
(1) cd ./WindowMaker-XX
(2) patch </wherever/you/put/WindowMaker-XX-definable-cursor.patch
(3) Build Window Maker according to the instructions in the
accompanying `INSTALL' file.
___________________________________
|O| Defining Your Own Cursors |X|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
A cursor specification is one of:
(none)
(builtin, <cursor-name>)
(bitmap, <bitmap-filename>, <mask-filename>)
where <cursor-name> uses the same syntax as for `xsetroot -cursor_name',
and <bitmap-filename> and <mask-filename> are the same as for
`xsetroot -cursor'; <bitmap-filename> and <mask-filename> are searched
for along WM's PixmapPath. If you use `(none)', the cursor will be
inherited from the parent window (which often ends up being the root
window).
You can set the following cursor types (they're shown here with their
defaults):
NormalCursor = (builtin, left_ptr);
MoveCursor = (builtin, fleur);
ResizeCursor = (builtin, sizing);
WaitCursor = (builtin, watch);
______________________
|O| Random Notes |X|
^^^^^^^^^^^^^^^^^^^^^^
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, see
<http://www.pobox.com/~jmknoble/WindowMaker/cursors/>.
For an example
--jim
%%%%%%%%%%%%%%% jim knoble %%%%%%%% jmknoble@pobox.com %%%%%%%%%%%%%%%%%

379
README.pt
View File

@@ -1,379 +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.
Suporte ao OpenL**k
===================
Acredito que muitos usuários, principalmente os do mundo acadêmico,
tenham que usar aplicações escritas em toolkits OpenL**k, então o suporte
para estes aplicativos deve ser de algum uso.
Para ativar, use o --enable-openlook quando rodar o configure. Note
que nem tudo está implementado.
As opções implementadas incluem hints de decoração e o push-pin.
Coisas não implementadas incluem _SUN_WINDOW_STATE (the compose led
state stuff), coisas relacionadas ao "drag and drop", cabeçalho (não
tenho certeza do que é) e o string footer.
Por favor me dêem retorno se algo não funcionar. Se a opção já está
implementada, mas não está funcionando por causa de um bug, eu tentarei
corrigí-la. Se é uma característica ainda não implementada e você mencionar
que é importante (ie: não somente cosmética), eu considerarei a sua
implementação.
O estado "out" do pushpin é emulado como um botão de fechar pressionado.
Clique no botão para fazer com que ele fique despressionado, o que
corresponde ao estado "pinned-in" do pushpin. Se você pressionar de novo
o botão de fechar despressionado, ele vai agir como um botão de fechar
normal: vai fechar a janela.
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>

58
TODO
View File

@@ -1,56 +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
- add multiline support for balloons
- remove colors_per_channel stuff from wmaker after?
- 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:
===========
- put a "Do not save workspace state" in the exit confirmation dialog
- 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 were NULL.NULL
- 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,5 +0,0 @@
Makefile Makefile.in
get-wings-flags get-wutil-flags
.libs
.psrc .inslog2 tca.map tca.log
*.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,433 +1,3 @@
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).
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,3 +0,0 @@
Makefile Makefile.in
.psrc .inslog2 tca.map tca.log
*.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
.libs
.psrc .inslog2 tca.map tca.log
*.rpt

View File

@@ -1,31 +0,0 @@
## automake input file for WINGs - Examples
AUTOMAKE_OPTIONS = no-dependencies
noinst_PROGRAMS = connect server fontl puzzle
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
@LIBPL@
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@ @LIBPL@
server_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.a
server_LDADD = $(top_builddir)/WINGs/libWUtil.a @LIBRARY_SEARCH_PATH@ \
@NETLIBS@ @LIBPL@
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,196 +0,0 @@
/*
* WINGs connect.c: example how to create a network client using WMConnection
*
* Copyright (c) 1999-2001 Dan Pascu
*
*/
#include <stdio.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, /* didCatchException */
connectionDidDie, /* didDie */
didInitialize, /* didInitialize */
didReceiveInput, /* didReceiveInput */
NULL /* didTimeout */
};
void
wAbort(Bool foo) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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,241 +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, y, 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,730 +0,0 @@
/*
* WINGs server.c: example how to create a network server using WMConnection
*
* Copyright (c) 2001 Dan Pascu
*
*/
#include <stdio.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, /* didCatchException */
connectionDidDie, /* didDie */
NULL, /* didInitialize */
didReceiveInput, /* didReceiveInput */
connectionDidTimeout /* didTimeout */
};
void
wAbort(Bool foo) /*FOLD00*/
{
exit(1);
}
static void
printHelp(char *progname) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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)
{
proplist_t userList;
char *id;
int i, time;
userList = WMGetUDAllKeys(timeDB);
for (i=0; i<PLGetNumberOfElements(userList); i++) {
id = PLGetString(PLGetArrayElement(userList, i));
time = WMGetUDIntegerForKey(timeDB, id);
sendUpdateMessage(cPtr, id, time);
}
PLRelease(userList);
}
static void
setTimeForUser(WMConnection *cPtr, char *cmdArgs) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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);
}
#if 0
static Bool
isDifferent(char *str1, char *str2) /*FOLD00*/
{
if ((!str1 && !str2) || (str1 && str2 && strcmp(str1, str2)==0))
return False;
return True;
}
#endif
int
main(int argc, char **argv) /*FOLD00*/
{
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");
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,3 +0,0 @@
Makefile Makefile.in
.libs
test

View File

@@ -1,33 +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
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 \
@LIBPL@
test_LDADD = wtableview.o wtabledelegates.o $(LDADD)

View File

@@ -1,128 +0,0 @@
#include <WINGs/WINGs.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++) {
col1[i] = "teste";
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);
}
main(int argc, char **argv)
{
WMScreen *scr;
WMWindow *win;
WMTableView *table;
WMTableColumn *col;
WMTableColumnDelegate *colDeleg;
WMInitializeApplication("test", &argc, argv);
scr = WMOpenScreen(NULL);
win = WMCreateWindow(scr, "eweq");
WMResizeWidget(win, 400, 200);
WMMapWidget(win);
table = WMCreateTableView(win);
WMResizeWidget(table, 400, 200);
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);
}

View File

@@ -1,626 +0,0 @@
#include <WINGs/WINGs.h>
#include "wtableview.h"
#include "wtabledelegates.h"
typedef struct {
WMTableView *table;
WMFont *font;
GC gc;
GC selGc;
GC selTextGc;
} StringData;
typedef struct {
WMTableView *table;
GC selGc;
} PixmapData;
typedef struct {
WMTextField *widget;
WMTableView *table;
WMFont *font;
GC gc;
GC selGc;
GC selTextGc;
} StringEditorData;
typedef struct {
WMPopUpButton *widget;
WMTableView *table;
WMFont *font;
char **options;
int count;
GC gc;
GC selGc;
GC selTextGc;
} EnumSelectorData;
typedef struct {
WMButton *widget;
WMTableView *table;
Bool state;
GC gc;
} BooleanSwitchData;
static char *SelectionColor = "#bbbbcc";
static void stringDraw(WMScreen *scr, Drawable d, GC gc,
GC sgc, GC stgc, 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) {
XClearArea(dpy, d, rects[0].x, rects[0].y,
rects[0].width, rects[0].height,
False);
WMDrawString(scr, d, gc, font, x, y,
data, strlen(data));
} else {
XFillRectangles(dpy, d, sgc, rects, 1);
WMDrawString(scr, d, stgc, font, x, y,
data, strlen(data));
}
XSetClipMask(dpy, gc, None);
}
static void pixmapDraw(WMScreen *scr, Drawable d, GC gc,
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) {
XClearArea(dpy, d, rects[0].x, rects[0].y,
rects[0].width, rects[0].height,
False);
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, 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);
}
}
XSetClipMask(dpy, gc, None);
}
/* ---------------------------------------------------------------------- */
static void SECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedSECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, 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->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->selTextGc = WMColorGC(WMBlackColor(scr));
data->gc = WMColorGC(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)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedESCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, 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->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->selTextGc = WMColorGC(WMBlackColor(scr));
data->gc = WMColorGC(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)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
WMScreen *scr = WMWidgetScreen(table);
if (i) {
pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, WMGetSystemPixmap(scr, WSICheckMark),
WMTableViewRectForCell(table, column, row), False);
} else {
pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, NULL,
WMTableViewRectForCell(table, column, row), False);
}
}
static void selectedBSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = (int)WMTableViewDataForCell(table, column, row);
WMScreen *scr = WMWidgetScreen(table);
if (i) {
pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, WMGetSystemPixmap(scr, WSICheckMark),
WMTableViewRectForCell(table, column, row), True);
} else {
pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, 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(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)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, 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->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->selTextGc = WMColorGC(WMBlackColor(scr));
data->gc = WMColorGC(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)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
pixmapDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->selGc,
(WMPixmap*)WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedPCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
pixmapDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
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->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,
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->selGc, pix, rect,
selected);
rect.pos.x += size.width-1;
rect.size.width = owidth-size.width+1;
}
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
str, rect, selected);
}
static void PSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
drawPSCell(self, column, row, False);
}
static void selectedPSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
drawPSCell(self, 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->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
data->selTextGc = WMColorGC(WMBlackColor(scr));
data->gc = WMColorGC(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

View File

@@ -1,976 +0,0 @@
#include <WINGs/WINGsP.h>
#include <X11/cursorfont.h>
#include "wtableview.h"
const char *WMTableViewSelectionDidChangeNotification = "WMTableViewSelectionDidChangeNotification";
struct W_TableColumn {
WMTableView *table;
WMWidget *titleW;
char *title;
int width;
int minWidth;
int maxWidth;
void *id;
WMTableColumnDelegate *delegate;
unsigned resizable:1;
unsigned editable:1;
};
static void handleResize(W_ViewDelegate *self, WMView *view);
static void rearrangeHeader(WMTableView *table);
static WMRange rowsInRect(WMTableView *table, WMRect rect);
WMTableColumn *WMCreateTableColumn(char *title)
{
WMTableColumn *col = wmalloc(sizeof(WMTableColumn));
col->table = NULL;
col->titleW = NULL;
col->width = 50;
col->minWidth = 5;
col->maxWidth = 0;
col->id = NULL;
col->title = wstrdup(title);
col->delegate = NULL;
col->resizable = 1;
col->editable = 0;
return col;
}
void WMSetTableColumnId(WMTableColumn *column, void *id)
{
column->id = id;
}
void *WMGetTableColumnId(WMTableColumn *column)
{
return column->id;
}
void WMSetTableColumnWidth(WMTableColumn *column, unsigned width)
{
if (column->maxWidth == 0)
column->width = WMAX(column->minWidth, width);
else
column->width = WMAX(column->minWidth, WMIN(column->maxWidth, width));
if (column->table) {
rearrangeHeader(column->table);
}
}
void WMSetTableColumnDelegate(WMTableColumn *column,
WMTableColumnDelegate *delegate)
{
column->delegate = delegate;
}
void WMSetTableColumnConstraints(WMTableColumn *column,
unsigned minWidth, unsigned maxWidth)
{
wassertr(maxWidth == 0 || minWidth <= maxWidth);
column->minWidth = minWidth;
column->maxWidth = maxWidth;
if (column->width < column->minWidth)
WMSetTableColumnWidth(column, column->minWidth);
else if (column->width > column->maxWidth && column->maxWidth != 0)
WMSetTableColumnWidth(column, column->maxWidth);
}
void WMSetTableColumnEditable(WMTableColumn *column, Bool flag)
{
column->editable = flag;
}
WMTableView *WMGetTableColumnTableView(WMTableColumn *column)
{
return column->table;
}
struct W_TableView {
W_Class widgetClass;
WMView *view;
WMFrame *header;
WMLabel *corner;
WMScrollView *scrollView;
WMView *tableView;
WMArray *columns;
WMArray *splitters;
WMArray *selectedRows;
int tableWidth;
int rows;
GC gridGC;
WMColor *gridColor;
Cursor splitterCursor;
void *dataSource;
WMTableViewDelegate *delegate;
WMAction *action;
void *clientData;
void *clickedColumn;
int clickedRow;
int editingRow;
unsigned headerHeight;
unsigned rowHeight;
unsigned dragging:1;
unsigned drawsGrid:1;
unsigned canSelectRow:1;
unsigned canSelectMultiRows:1;
unsigned canDeselectRow:1;
};
static W_Class tableClass = 0;
static W_ViewDelegate viewDelegate = {
NULL,
NULL,
handleResize,
NULL,
NULL
};
static void handleEvents(XEvent *event, void *data);
static void handleTableEvents(XEvent *event, void *data);
static void scrollObserver(void *self, WMNotification *notif)
{
WMTableView *table = (WMTableView*)self;
WMRect rect;
int i, x;
rect = WMGetScrollViewVisibleRect(table->scrollView);
x = 0;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
WMTableColumn *column;
WMView *splitter;
column = WMGetFromArray(table->columns, i);
WMMoveWidget(column->titleW, x - rect.pos.x, 0);
x += W_VIEW_WIDTH(WMWidgetView(column->titleW)) + 1;
splitter = WMGetFromArray(table->splitters, i);
W_MoveView(splitter, x - rect.pos.x - 1, 0);
}
}
static void splitterHandler(XEvent *event, void *data)
{
WMTableColumn *column = (WMTableColumn*)data;
WMTableView *table = column->table;
int done = 0;
int cx, ox, offsX;
WMPoint pos;
WMScreen *scr = WMWidgetScreen(table);
GC gc = scr->ixorGC;
Display *dpy = WMScreenDisplay(scr);
int h = WMWidgetHeight(table) - 22;
Window w = WMViewXID(table->view);
pos = WMGetViewPosition(WMWidgetView(column->titleW));
offsX = pos.x + column->width;
ox = cx = offsX;
XDrawLine(dpy, w, gc, cx+20, 0, cx+20, h);
while (!done) {
XEvent ev;
WMMaskEvent(dpy, ButtonMotionMask|ButtonReleaseMask, &ev);
switch (ev.type) {
case MotionNotify:
ox = cx;
if (column->width + ev.xmotion.x < column->minWidth)
cx = pos.x + column->minWidth;
else if (column->maxWidth > 0
&& column->width + ev.xmotion.x > column->maxWidth)
cx = pos.x + column->maxWidth;
else
cx = offsX + ev.xmotion.x;
XDrawLine(dpy, w, gc, ox+20, 0, ox+20, h);
XDrawLine(dpy, w, gc, cx+20, 0, cx+20, h);
break;
case ButtonRelease:
column->width = cx - pos.x;
done = 1;
break;
}
}
XDrawLine(dpy, w, gc, cx+20, 0, cx+20, h);
rearrangeHeader(table);
}
WMTableView *WMCreateTableView(WMWidget *parent)
{
WMTableView *table = wmalloc(sizeof(WMTableView));
WMScreen *scr = WMWidgetScreen(parent);
memset(table, 0, sizeof(WMTableView));
if (!tableClass) {
tableClass = W_RegisterUserWidget();
}
table->widgetClass = tableClass;
table->view = W_CreateView(W_VIEW(parent));
if (!table->view)
goto error;
table->view->self = table;
table->view->delegate = &viewDelegate;
table->headerHeight = 20;
table->scrollView = WMCreateScrollView(table);
if (!table->scrollView)
goto error;
WMResizeWidget(table->scrollView, 10, 10);
WMSetScrollViewHasVerticalScroller(table->scrollView, True);
WMSetScrollViewHasHorizontalScroller(table->scrollView, True);
{
WMScroller *scroller;
scroller = WMGetScrollViewHorizontalScroller(table->scrollView);
WMAddNotificationObserver(scrollObserver, table,
WMScrollerDidScrollNotification,
scroller);
}
WMMoveWidget(table->scrollView, 1, 2+table->headerHeight);
WMMapWidget(table->scrollView);
table->header = WMCreateFrame(table);
WMMoveWidget(table->header, 22, 2);
WMMapWidget(table->header);
WMSetFrameRelief(table->header, WRFlat);
table->corner = WMCreateLabel(table);
WMResizeWidget(table->corner, 20, table->headerHeight);
WMMoveWidget(table->corner, 2, 2);
WMMapWidget(table->corner);
WMSetLabelRelief(table->corner, WRRaised);
WMSetWidgetBackgroundColor(table->corner, scr->darkGray);
table->tableView = W_CreateView(W_VIEW(parent));
if (!table->tableView)
goto error;
table->tableView->self = table;
W_ResizeView(table->tableView, 100, 1000);
W_MapView(table->tableView);
table->tableView->flags.dontCompressExpose = 1;
table->gridColor = WMCreateNamedColor(scr, "#cccccc", False);
/* table->gridColor = WMGrayColor(scr);*/
{
XGCValues gcv;
gcv.foreground = WMColorPixel(table->gridColor);
gcv.dashes = 1;
gcv.line_style = LineOnOffDash;
table->gridGC = XCreateGC(WMScreenDisplay(scr), W_DRAWABLE(scr),
GCForeground, &gcv);
}
table->editingRow = -1;
table->clickedRow = -1;
table->drawsGrid = 1;
table->rowHeight = 16;
WMSetScrollViewLineScroll(table->scrollView, table->rowHeight);
table->tableWidth = 1;
table->columns = WMCreateArray(4);
table->splitters = WMCreateArray(4);
table->selectedRows = WMCreateArray(16);
table->splitterCursor = XCreateFontCursor(WMScreenDisplay(scr),
XC_sb_h_double_arrow);
table->canSelectRow = 1;
WMCreateEventHandler(table->view, ExposureMask|StructureNotifyMask,
handleEvents, table);
WMCreateEventHandler(table->tableView, ExposureMask|ButtonPressMask|
ButtonReleaseMask|ButtonMotionMask,
handleTableEvents, table);
WMSetScrollViewContentView(table->scrollView, table->tableView);
return table;
error:
if (table->scrollView)
WMDestroyWidget(table->scrollView);
if (table->tableView)
W_DestroyView(table->tableView);
if (table->view)
W_DestroyView(table->view);
wfree(table);
return NULL;
}
void WMAddTableViewColumn(WMTableView *table, WMTableColumn *column)
{
WMScreen *scr = WMWidgetScreen(table);
column->table = table;
WMAddToArray(table->columns, column);
if (!column->titleW) {
column->titleW = WMCreateLabel(table);
WMSetLabelRelief(column->titleW, WRRaised);
WMSetLabelFont(column->titleW, scr->boldFont);
WMSetLabelTextColor(column->titleW, scr->white);
WMSetWidgetBackgroundColor(column->titleW, scr->darkGray);
WMSetLabelText(column->titleW, column->title);
W_ReparentView(WMWidgetView(column->titleW),
WMWidgetView(table->header), 0, 0);
if (W_VIEW_REALIZED(table->view))
WMRealizeWidget(column->titleW);
WMMapWidget(column->titleW);
}
{
WMView *splitter = W_CreateView(WMWidgetView(table->header));
W_SetViewBackgroundColor(splitter, WMWhiteColor(scr));
if (W_VIEW_REALIZED(table->view))
W_RealizeView(splitter);
W_ResizeView(splitter, 2, table->headerHeight-1);
W_MapView(splitter);
W_SetViewCursor(splitter, table->splitterCursor);
WMCreateEventHandler(splitter, ButtonPressMask|ButtonReleaseMask,
splitterHandler, column);
WMAddToArray(table->splitters, splitter);
}
rearrangeHeader(table);
}
void WMSetTableViewHeaderHeight(WMTableView *table, unsigned height)
{
table->headerHeight = height;
handleResize(NULL, table->view);
}
void WMSetTableViewDelegate(WMTableView *table, WMTableViewDelegate *delegate)
{
table->delegate = delegate;
}
void WMSetTableViewAction(WMTableView *table, WMAction *action, void *clientData)
{
table->action = action;
table->clientData = clientData;
}
void *WMGetTableViewClickedColumn(WMTableView *table)
{
return table->clickedColumn;
}
int WMGetTableViewClickedRow(WMTableView *table)
{
return table->clickedRow;
}
WMArray *WMGetTableViewSelectedRows(WMTableView *table)
{
return table->selectedRows;
}
WMView *WMGetTableViewDocumentView(WMTableView *table)
{
return table->tableView;
}
void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row)
{
return (*table->delegate->valueForCell)(table->delegate, column, row);
}
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data)
{
(*table->delegate->setValueForCell)(table->delegate, column, row, data);
}
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row)
{
WMRect rect;
int i;
rect.pos.x = 0;
rect.pos.y = row * table->rowHeight;
rect.size.height = table->rowHeight;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
WMTableColumn *col;
col = WMGetFromArray(table->columns, i);
if (col == column) {
rect.size.width = col->width;
break;
}
rect.pos.x += col->width;
}
return rect;
}
void WMSetTableViewDataSource(WMTableView *table, void *source)
{
table->dataSource = source;
}
void *WMGetTableViewDataSource(WMTableView *table)
{
return table->dataSource;
}
void WMSetTableViewBackgroundColor(WMTableView *table, WMColor *color)
{
W_SetViewBackgroundColor(table->tableView, color);
}
void WMSetTableViewGridColor(WMTableView *table, WMColor *color)
{
WMReleaseColor(table->gridColor);
table->gridColor = WMRetainColor(color);
XSetForeground(WMScreenDisplay(WMWidgetScreen(table)), table->gridGC,
WMColorPixel(color));
}
void WMSetTableViewRowHeight(WMTableView *table, int height)
{
table->rowHeight = height;
WMRedisplayWidget(table);
}
void WMScrollTableViewRowToVisible(WMTableView *table, int row)
{
WMScroller *scroller;
WMRange range;
WMRect rect;
int newY, tmp;
rect = WMGetScrollViewVisibleRect(table->scrollView);
range = rowsInRect(table, rect);
scroller = WMGetScrollViewVerticalScroller(table->scrollView);
if (row < range.position) {
newY = row * table->rowHeight - rect.size.height / 2;
} else if (row >= range.position + range.count) {
newY = row * table->rowHeight - rect.size.height / 2;
} else {
return;
}
tmp = table->rows*table->rowHeight - rect.size.height;
newY = WMAX(0, WMIN(newY, tmp));
WMScrollViewScrollPoint(table->scrollView, rect.pos.x, newY);
}
static void drawGrid(WMTableView *table, WMRect rect)
{
WMScreen *scr = WMWidgetScreen(table);
Display *dpy = WMScreenDisplay(scr);
int i;
int y1, y2;
int x1, x2;
int xx;
Drawable d = W_VIEW_DRAWABLE(table->tableView);
GC gc = table->gridGC;
#if 0
char dashl[1] = {1};
XSetDashes(dpy, gc, 0, dashl, 1);
y1 = (rect.pos.y/table->rowHeight - 1)*table->rowHeight;
y2 = y1 + (rect.size.height/table->rowHeight+2)*table->rowHeight;
#endif
y1 = 0;
y2 = W_VIEW_HEIGHT(table->tableView);
xx = 0;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
WMTableColumn *column;
if (xx >= rect.pos.x && xx <= rect.pos.x+rect.size.width) {
XDrawLine(dpy, d, gc, xx, y1, xx, y2);
}
column = WMGetFromArray(table->columns, i);
xx += column->width;
}
XDrawLine(dpy, d, gc, xx, y1, xx, y2);
x1 = rect.pos.x;
x2 = WMIN(x1 + rect.size.width, xx);
if (x2 <= x1)
return;
#if 0
XSetDashes(dpy, gc, (rect.pos.x&1), dashl, 1);
#endif
y1 = rect.pos.y - rect.pos.y%table->rowHeight;
y2 = y1 + rect.size.height + table->rowHeight;
for (i = y1; i <= y2; i += table->rowHeight) {
XDrawLine(dpy, d, gc, x1, i, x2, i);
}
}
static WMRange columnsInRect(WMTableView *table, WMRect rect)
{
WMTableColumn *column;
int width;
int i , j;
int totalColumns = WMGetArrayItemCount(table->columns);
WMRange range;
j = 0;
width = 0;
for (i = 0; i < totalColumns; i++) {
column = WMGetFromArray(table->columns, i);
if (j == 0) {
if (width <= rect.pos.x && width + column->width > rect.pos.x) {
range.position = i;
j = 1;
}
} else {
range.count++;
if (width > rect.pos.x + rect.size.width) {
break;
}
}
width += column->width;
}
range.count = WMAX(1, WMIN(range.count, totalColumns - range.position));
return range;
}
static WMRange rowsInRect(WMTableView *table, WMRect rect)
{
WMRange range;
int rh = table->rowHeight;
int dif;
dif = rect.pos.y % rh;
range.position = WMAX(0, (rect.pos.y - dif) / rh);
range.count = WMAX(1, WMIN((rect.size.height + dif) / rh, table->rows));
return range;
}
static void drawRow(WMTableView *table, int row, WMRect clipRect)
{
int i;
WMRange cols = columnsInRect(table, clipRect);
WMTableColumn *column;
for (i = cols.position; i < cols.position+cols.count; i++) {
column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->drawCell);
if (WMFindInArray(table->selectedRows, NULL, (void*)row) != WANotFound)
(*column->delegate->drawSelectedCell)(column->delegate, column, row);
else
(*column->delegate->drawCell)(column->delegate, column, row);
}
}
static void drawFullRow(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->drawCell);
if (WMFindInArray(table->selectedRows, NULL, (void*)row) != WANotFound)
(*column->delegate->drawSelectedCell)(column->delegate, column, row);
else
(*column->delegate->drawCell)(column->delegate, column, row);
}
}
static void setRowSelected(WMTableView *table, unsigned row, Bool flag)
{
int repaint = 0;
if (WMFindInArray(table->selectedRows, NULL, (void*)row) != WANotFound) {
if (!flag) {
WMRemoveFromArray(table->selectedRows, (void*)row);
repaint = 1;
}
} else {
if (flag) {
WMAddToArray(table->selectedRows, (void*)row);
repaint = 1;
}
}
if (repaint && row < table->rows) {
drawFullRow(table, row);
}
}
static void repaintTable(WMTableView *table, int x, int y,
int width, int height)
{
WMRect rect;
WMRange rows;
int i;
wassertr(table->delegate && table->delegate->numberOfRows);
i = (*table->delegate->numberOfRows)(table->delegate, table);
if (i != table->rows) {
table->rows = i;
W_ResizeView(table->tableView, table->tableWidth,
table->rows * table->rowHeight + 1);
}
if (x >= table->tableWidth-1)
return;
rect.pos = wmkpoint(x,y);
rect.size = wmksize(width, height);
if (table->drawsGrid) {
drawGrid(table, rect);
}
rows = rowsInRect(table, rect);
for (i = rows.position;
i < WMIN(rows.position+rows.count + 1, table->rows);
i++) {
drawRow(table, i, rect);
}
}
static void stopRowEdit(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
table->editingRow = -1;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
if (column->delegate && column->delegate->endCellEdit)
(*column->delegate->endCellEdit)(column->delegate, column, row);
}
}
void WMEditTableViewRow(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
if (table->editingRow >= 0) {
stopRowEdit(table, table->editingRow);
}
table->editingRow = row;
if (row < 0)
return;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
if (column->delegate && column->delegate->beginCellEdit)
(*column->delegate->beginCellEdit)(column->delegate, column, row);
}
}
void WMSelectTableViewRow(WMTableView *table, int row)
{
if (table->clickedRow >= 0)
setRowSelected(table, table->clickedRow, False);
if (row >= table->rows) {
return;
}
setRowSelected(table, row, True);
table->clickedRow = row;
if (table->action)
(*table->action)(table, table->clientData);
WMPostNotificationName(WMTableViewSelectionDidChangeNotification,
table, NULL);
}
void WMReloadTableView(WMTableView *table)
{
WMRect rect = WMGetScrollViewVisibleRect(table->scrollView);
if (table->editingRow >= 0)
stopRowEdit(table, table->editingRow);
/* when this is called, nothing in the table can be assumed to be
* like the last time we accessed it (ie, rows might have disappeared) */
WMEmptyArray(table->selectedRows);
if (table->clickedRow >= 0) {
table->clickedRow = -1;
if (table->action)
(*table->action)(table, table->clientData);
WMPostNotificationName(WMTableViewSelectionDidChangeNotification,
table, NULL);
}
repaintTable(table, 0, 0,
W_VIEW_WIDTH(table->tableView), rect.size.height);
}
void WMNoteTableViewNumberOfRowsChanged(WMTableView *table)
{
WMReloadTableView(table);
}
static void handleTableEvents(XEvent *event, void *data)
{
WMTableView *table = (WMTableView*)data;
int row;
switch (event->type) {
case ButtonPress:
if (event->xbutton.button == Button1) {
row = event->xbutton.y/table->rowHeight;
if (row != table->clickedRow) {
setRowSelected(table, table->clickedRow, False);
setRowSelected(table, row, True);
table->clickedRow = row;
table->dragging = 1;
}
}
break;
case MotionNotify:
if (table->dragging && event->xmotion.y >= 0) {
row = event->xmotion.y/table->rowHeight;
if (table->clickedRow != row && row >= 0 && row < table->rows) {
setRowSelected(table, table->clickedRow, False);
setRowSelected(table, row, True);
table->clickedRow = row;
}
}
break;
case ButtonRelease:
if (event->xbutton.button == Button1) {
if (table->action)
(*table->action)(table, table->clientData);
WMPostNotificationName(WMTableViewSelectionDidChangeNotification,
table, NULL);
table->dragging = 0;
}
break;
case Expose:
repaintTable(table, event->xexpose.x, event->xexpose.y,
event->xexpose.width, event->xexpose.height);
break;
}
}
static void handleEvents(XEvent *event, void *data)
{
WMTableView *table = (WMTableView*)data;
WMScreen *scr = WMWidgetScreen(table);
switch (event->type) {
case Expose:
W_DrawRelief(scr, W_VIEW_DRAWABLE(table->view), 0, 0,
W_VIEW_WIDTH(table->view), W_VIEW_HEIGHT(table->view),
WRSunken);
if (event->xexpose.serial == 0) {
WMRect rect = WMGetScrollViewVisibleRect(table->scrollView);
repaintTable(table, rect.pos.x, rect.pos.y,
rect.size.width, rect.size.height);
}
break;
}
}
static void handleResize(W_ViewDelegate *self, WMView *view)
{
int width;
int height;
WMTableView *table = view->self;
width = W_VIEW_WIDTH(view) - 2;
height = W_VIEW_HEIGHT(view) - 3;
height -= table->headerHeight; /* table header */
if (table->corner)
WMResizeWidget(table->corner, 20, table->headerHeight);
if (table->scrollView) {
WMMoveWidget(table->scrollView, 1, table->headerHeight + 2);
WMResizeWidget(table->scrollView, width, height);
}
if (table->header)
WMResizeWidget(table->header, width - 21, table->headerHeight);
}
static void rearrangeHeader(WMTableView *table)
{
int width;
int count;
int i;
/*WMRect rect = WMGetScrollViewVisibleRect(table->scrollView);*/
width = 0;
count = WMGetArrayItemCount(table->columns);
for (i = 0; i < count; i++) {
WMTableColumn *column = WMGetFromArray(table->columns, i);
WMView *splitter = WMGetFromArray(table->splitters, i);
WMMoveWidget(column->titleW, width, 0);
WMResizeWidget(column->titleW, column->width-1, table->headerHeight);
width += column->width;
W_MoveView(splitter, width-1, 0);
}
wassertr(table->delegate && table->delegate->numberOfRows);
table->rows = table->delegate->numberOfRows(table->delegate, table);
W_ResizeView(table->tableView, width+1,
table->rows * table->rowHeight + 1);
table->tableWidth = width + 1;
}

View File

@@ -1,116 +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);
void (*drawSelectedCell)(struct WMTableColumnDelegate *self,
WMTableColumn *column, int row);
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);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -2,53 +2,58 @@
AUTOMAKE_OPTIONS = no-dependencies
SUBDIRS = WINGs . 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 @LIBPL@
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
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 \
dragdestination.c \
dragsource.c \
error.c \
findfile.c \
handlers.c \
hashtable.c \
host.c \
international.c \
memory.c \
misc.c \
notification.c \
selection.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 \
wevent.c \
wfilepanel.c \
@@ -58,49 +63,28 @@ libWINGs_a_SOURCES = \
widgets.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 \
string.c \
tree.c \
userdefaults.c \
usleep.c \
wapplication.c \
wutil.c
usleep.c
##
## Find a better way than $(GFXFLAGS) to inform widgets.c wich of
## tiff or xpm images should be used
INCLUDES = -I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \
@LIBPL_INC_PATH@
wcolorpanel.o: wcolorpanel.c
$(COMPILE) -c -DRGBTXT="\"@X_LIBRARY_PATH@/X11/rgb.txt\"" $<

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,77 +0,0 @@
*** 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
@@ -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,3 +0,0 @@
Makefile Makefile.in
.psrc .inslog2 tca.map tca.log
*.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,10 +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.
- optimize color allocation for repeated colors
- make it work in 8bpp

View File

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

View File

@@ -1,21 +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 \
@LIBPL@
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\" @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,123 +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 "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;
WMInitializeApplication("WMFile", &argc, argv);
ProgName = argv[0];
if (!dpy) {
puts("could not open display");
exit(1);
}
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;
}

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,926 +0,0 @@
#ifndef _WUTIL_H_
#define _WUTIL_H_
#include <X11/Xlib.h>
#include <limits.h>
#include <sys/types.h>
/* SunOS 4.x Blargh.... */
#ifndef NULL
#define NULL ((void*)0)
#endif
/*
* 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
#if (!defined (__GNUC__) || __GNUC__ < 2 || \
__GNUC_MINOR__ < (defined (__cplusplus) ? 6 : 4))
#define __ASSERT_FUNCTION ((char *) 0)
#else
#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
#endif
#ifdef NDEBUG
#define wassertr(expr) {}
#define wassertrv(expr, val) {}
#else /* !NDEBUG */
#ifdef DEBUG
#include <assert.h>
#define wassertr(expr) assert(expr)
#define wassertrv(expr, val) assert(expr)
#else /* !DEBUG */
#define wassertr(expr) \
if (!(expr)) { \
wwarning("%s line %i (%s): assertion %s failed",\
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
return;\
}
#define wassertrv(expr, val) \
if (!(expr)) { \
wwarning("%s line %i (%s): assertion %s failed",\
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
return (val);\
}
#endif /* !DEBUG */
#endif /* !NDEBUG */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef enum {
WMPostWhenIdle = 1,
WMPostASAP = 2,
WMPostNow = 3
} WMPostingStyle;
typedef enum {
WNCNone = 0,
WNCOnName = 1,
WNCOnSender = 2
} WMNotificationCoalescing;
/* The possible states for connections */
typedef enum {
WCNotConnected=0,
WCListening,
WCInProgress,
WCFailed,
WCConnected,
WCTimedOut,
WCDied,
WCClosed
} WMConnectionState;
/* The possible states for connection timeouts */
typedef enum {
WCTNone=0,
WCTWhileOpening,
WCTWhileSending
} WMConnectionTimeoutState;
enum {
WBNotFound = INT_MIN, /* element was not found in WMBag */
WANotFound = -1 /* element was not found in WMArray */
};
typedef struct W_Array WMArray;
typedef struct W_Bag WMBag;
typedef struct W_Data WMData;
typedef struct W_TreeNode WMTreeNode;
typedef struct W_HashTable WMDictionary;
typedef struct W_HashTable WMHashTable;
typedef struct W_UserDefaults WMUserDefaults;
typedef struct W_Notification WMNotification;
typedef struct W_NotificationQueue WMNotificationQueue;
typedef struct W_Host WMHost;
typedef struct W_Connection WMConnection;
/* Some typedefs for the handler stuff */
typedef void *WMHandlerID;
typedef void WMCallback(void *data);
typedef void WMInputProc(int fd, int mask, void *clientData);
typedef int WMCompareDataProc(const void *item1, const void *item2);
typedef void WMFreeDataProc(void *data);
/* Used by WMBag or WMArray for matching data */
typedef int WMMatchDataProc(void *item, void *cdata);
typedef struct {
int position;
int count;
} WMRange;
/* 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 int WMArrayIterator;
typedef void *WMBagIterator;
#if 0
typedef struct {
char character; /* the escape character */
char *value; /* value to place */
} WMSEscapes;
#endif
/* The connection callbacks */
typedef struct ConnectionDelegate {
void *data;
void (*didCatchException)(struct ConnectionDelegate *self,
WMConnection *cPtr);
void (*didDie)(struct ConnectionDelegate *self, WMConnection *cPtr);
void (*didInitialize)(struct ConnectionDelegate *self, WMConnection *cPtr);
void (*didReceiveInput)(struct ConnectionDelegate *self, WMConnection *cPtr);
void (*didTimeout)(struct ConnectionDelegate *self, WMConnection *cPtr);
} ConnectionDelegate;
typedef void WMNotificationObserverAction(void *observerData,
WMNotification *notification);
/*......................................................................*/
typedef void (waborthandler)(int);
waborthandler* wsetabort(waborthandler*);
/* don't free the returned string */
char* wstrerror(int errnum);
void wmessage(const char *msg, ...);
void wwarning(const char *msg, ...);
void wfatal(const char *msg, ...);
void wsyserror(const char *msg, ...);
void wsyserrorwithcode(int error, const char *msg, ...);
char* wfindfile(char *paths, char *file);
char* wfindfileinlist(char **path_list, char *file);
char* wfindfileinarray(proplist_t array, 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 wfree(void *ptr);
void wrelease(void *ptr);
void* wretain(void *ptr);
char* wstrdup(char *str);
/* Concatenate str1 with str2 and return that in a newly malloc'ed string.
* str1 and str2 can be any strings including static and constant strings.
* str1 and str2 will not be modified.
* Free the returned string when you're done with it. */
char* wstrconcat(char *str1, char *str2);
/* This will append src to dst, and return dst. dst MUST be either NULL
* or a string that was a result of a dynamic allocation (malloc, realloc
* wmalloc, wrealloc, ...). dst CANNOT be a static or a constant string!
* Modifies dst (no new string is created except if dst==NULL in which case
* it is equivalent to calling wstrdup(src) ).
* The returned address may be different from the original address of dst,
* so always assign the returned address to avoid dangling pointers. */
char* wstrappend(char *dst, char *src);
void wtokensplit(char *command, char ***argv, int *argc);
char* wtokennext(char *word, char **next);
char* wtokenjoin(char **list, int count);
void wtokenfree(char **tokens, int count);
char* wtrimspace(char *s);
WMRange wmkrange(int start, int count);
#ifdef ANSI_C_DOESNT_LIKE_IT_THIS_WAY
#define wmkrange(position, count) (WMRange){(position), (count)}
#endif
char* wusergnusteppath();
char* wdefaultspathfordomain(char *domain);
void wusleep(unsigned int microsec);
#if 0
int wsprintesc(char *buffer, int length, char *format, WMSEscapes **escapes,
int count);
#endif
/*......................................................................*/
/* Event handlers: timer, idle, input */
WMHandlerID WMAddTimerHandler(int milliseconds, WMCallback *callback,
void *cdata);
WMHandlerID WMAddPersistentTimerHandler(int milliseconds, WMCallback *callback,
void *cdata);
void WMDeleteTimerWithClientData(void *cdata);
void WMDeleteTimerHandler(WMHandlerID handlerID);
WMHandlerID WMAddIdleHandler(WMCallback *callback, void *cdata);
void WMDeleteIdleHandler(WMHandlerID handlerID);
WMHandlerID WMAddInputHandler(int fd, int condition, WMInputProc *proc,
void *clientData);
void WMDeleteInputHandler(WMHandlerID handlerID);
/* This function is used _only_ if you create a non-GUI program.
* For GUI based programs use WMNextEvent()/WMHandleEvent() instead.
* This function will handle all input/timer/idle events, then return.
*/
void WHandleEvents();
/*......................................................................*/
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, const void *key, const 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);
void* WMNextHashEnumeratorKey(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 wfree() */
extern const WMHashTableCallbacks WMStringPointerHashCallbacks;
/* keys are strings, bug they are not copied */
/*......................................................................*/
/*
* WMArray use an array to store the elements.
* Item indexes may be only positive integer numbers.
* The array cannot contain holes in it.
*
* Pros:
* Fast [O(1)] access to elements
* Fast [O(1)] push/pop
*
* Cons:
* A little slower [O(n)] for insertion/deletion of elements that
* aren't in the end
*/
WMArray* WMCreateArray(int initialSize);
WMArray* WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc *destructor);
WMArray* WMCreateArrayWithArray(WMArray *array);
#define WMDuplicateArray(array) WMCreateArrayWithArray(array)
void WMEmptyArray(WMArray *array);
void WMFreeArray(WMArray *array);
int WMGetArrayItemCount(WMArray *array);
/* appends other to array. other remains unchanged */
void WMAppendArray(WMArray *array, WMArray *other);
/* add will place the element at the end of the array */
void WMAddToArray(WMArray *array, void *item);
#define WMPushInArray(array, item) WMAddToArray(array, item)
/* insert will increment the index of elements after it by 1 */
void WMInsertInArray(WMArray *array, int index, void *item);
/* replace and set will return the old item WITHOUT calling the
* destructor on it even if its available. Free the returned item yourself.
*/
void* WMReplaceInArray(WMArray *array, int index, void *item);
#define WMSetInArray(array, index, item) WMReplaceInArray(array, index, item)
/* delete and remove will remove the elements and cause the elements
* after them to decrement their indexes by 1. Also will call the
* destructor on the deleted element if there's one available.
*/
int WMDeleteFromArray(WMArray *array, int index);
#define WMRemoveFromArray(array, item) WMRemoveFromArrayMatching(array, NULL, item)
int WMRemoveFromArrayMatching(WMArray *array, WMMatchDataProc *match, void *cdata);
void* WMGetFromArray(WMArray *array, int index);
#define WMGetFirstInArray(array, item) WMFindInArray(array, NULL, item)
/* pop will return the last element from the array, also removing it
* from the array. The destructor is NOT called, even if available.
* Free the returned element if needed by yourself
*/
void* WMPopFromArray(WMArray *array);
int WMFindInArray(WMArray *array, WMMatchDataProc *match, void *cdata);
int WMCountInArray(WMArray *array, void *item);
/* comparer must return:
* < 0 if a < b
* > 0 if a > b
* = 0 if a = b
*/
void WMSortArray(WMArray *array, WMCompareDataProc *comparer);
void WMMapArray(WMArray *array, void (*function)(void*, void*), void *data);
WMArray* WMGetSubarrayWithRange(WMArray* array, WMRange aRange);
void* WMArrayFirst(WMArray *array, WMArrayIterator *iter);
void* WMArrayLast(WMArray *array, WMArrayIterator *iter);
/* The following 2 functions assume that the array doesn't change between calls */
void* WMArrayNext(WMArray *array, WMArrayIterator *iter);
void* WMArrayPrevious(WMArray *array, WMArrayIterator *iter);
/* The following 2 macros assume that the array doesn't change in the for loop */
#define WM_ITERATE_ARRAY(array, var, i) \
for (var = WMArrayFirst(array, &(i)); (i) != WANotFound; \
var = WMArrayNext(array, &(i)))
#define WM_ETARETI_ARRAY(array, var, i) \
for (var = WMArrayLast(array, &(i)); (i) != WANotFound; \
var = WMArrayPrevious(array, &(i)))
/*..........................................................................*/
/*
* Tree bags use a red-black tree for storage.
* Item indexes may be any integer number.
*
* Pros:
* O(lg n) insertion/deletion/search
* Good for large numbers of elements with sparse indexes
*
* Cons:
* O(lg n) insertion/deletion/search
* Slow for storing small numbers of elements
*/
#define WMCreateBag(size) WMCreateTreeBag()
#define WMCreateBagWithDestructor(size, d) WMCreateTreeBagWithDestructor(d)
WMBag* WMCreateTreeBag(void);
WMBag* WMCreateTreeBagWithDestructor(WMFreeDataProc *destructor);
int WMGetBagItemCount(WMBag *bag);
void WMAppendBag(WMBag *bag, WMBag *other);
void WMPutInBag(WMBag *bag, void *item);
/* insert will increment the index of elements after it by 1 */
void WMInsertInBag(WMBag *bag, int index, void *item);
/* erase will remove the element from the bag,
* but will keep the index of the other elements unchanged */
int WMEraseFromBag(WMBag *bag, int index);
/* delete and remove will remove the elements and cause the elements
* after them to decrement their indexes by 1 */
int WMDeleteFromBag(WMBag *bag, int index);
int WMRemoveFromBag(WMBag *bag, void *item);
void* WMGetFromBag(WMBag *bag, int index);
void* WMReplaceInBag(WMBag *bag, int index, void *item);
#define WMSetInBag(bag, index, item) WMReplaceInBag(bag, index, item)
/* comparer must return:
* < 0 if a < b
* > 0 if a > b
* = 0 if a = b
*/
void WMSortBag(WMBag *bag, WMCompareDataProc *comparer);
void WMEmptyBag(WMBag *bag);
void WMFreeBag(WMBag *bag);
void WMMapBag(WMBag *bag, void (*function)(void*, void*), void *data);
int WMGetFirstInBag(WMBag *bag, void *item);
int WMCountInBag(WMBag *bag, void *item);
int WMFindInBag(WMBag *bag, WMMatchDataProc *match, void *cdata);
void* WMBagFirst(WMBag *bag, WMBagIterator *ptr);
void* WMBagLast(WMBag *bag, WMBagIterator *ptr);
/* The following 4 functions assume that the bag doesn't change between calls */
void* WMBagNext(WMBag *bag, WMBagIterator *ptr);
void* WMBagPrevious(WMBag *bag, WMBagIterator *ptr);
void* WMBagIteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr);
int WMBagIndexForIterator(WMBag *bag, WMBagIterator ptr);
/* The following 2 macros assume that the bag doesn't change in the for loop */
#define WM_ITERATE_BAG(bag, var, i) \
for (var = WMBagFirst(bag, &(i)); (i) != NULL; \
var = WMBagNext(bag, &(i)))
#define WM_ETARETI_BAG(bag, var, i) \
for (var = WMBagLast(bag, &(i)); (i) != NULL; \
var = WMBagPrevious(bag, &(i)))
/*-------------------------------------------------------------------------*/
/* WMData handling */
/* Creating/destroying data */
WMData* WMCreateDataWithCapacity(unsigned capacity);
WMData* WMCreateDataWithLength(unsigned length);
WMData* WMCreateDataWithBytes(void *bytes, unsigned length);
/* destructor is a function called to free the data when releasing the data
* object, or NULL if no freeing of data is necesary. */
WMData* WMCreateDataWithBytesNoCopy(void *bytes, unsigned length,
WMFreeDataProc *destructor);
WMData* WMCreateDataWithData(WMData *aData);
WMData* WMRetainData(WMData *aData);
void WMReleaseData(WMData *aData);
/* Adjusting capacity */
void WMSetDataCapacity(WMData *aData, unsigned capacity);
void WMSetDataLength(WMData *aData, unsigned length);
void WMIncreaseDataLengthBy(WMData *aData, unsigned extraLength);
/* Accessing data */
const void* WMDataBytes(WMData *aData);
void WMGetDataBytes(WMData *aData, void *buffer);
void WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length);
void WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange);
WMData* WMGetSubdataWithRange(WMData *aData, WMRange aRange);
/* Testing data */
Bool WMIsDataEqualToData(WMData *aData, WMData *anotherData);
unsigned WMGetDataLength(WMData *aData);
/* Adding data */
void WMAppendDataBytes(WMData *aData, void *bytes, unsigned length);
void WMAppendData(WMData *aData, WMData *anotherData);
/* Modifying data */
void WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes);
void WMResetDataBytesInRange(WMData *aData, WMRange aRange);
void WMSetData(WMData *aData, WMData *anotherData);
void WMSetDataFormat(WMData *aData, unsigned format);
unsigned WMGetDataFormat(WMData *aData);
/* Storing data */
/*--------------------------------------------------------------------------*/
/* Generic Tree and TreeNode */
WMTreeNode* WMCreateTreeNode(void *data);
WMTreeNode* WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor);
WMTreeNode* WMInsertItemInTree(WMTreeNode *parent, int index, void *item);
#define WMAddItemToTree(parent, item) WMInsertItemInTree(parent, -1, item)
WMTreeNode* WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *aNode);
#define WMAddNodeToTree(parent, aNode) WMInsertNodeInTree(parent, -1, aNode)
void WMDestroyTreeNode(WMTreeNode *aNode);
void WMDeleteLeafForTreeNode(WMTreeNode *aNode, int index);
void WMRemoveLeafForTreeNode(WMTreeNode *aNode, void *leaf);
void* WMReplaceDataForTreeNode(WMTreeNode *aNode, void *newData);
void* WMGetDataForTreeNode(WMTreeNode *aNode);
int WMGetTreeNodeDepth(WMTreeNode *aNode);
WMTreeNode* WMGetParentForTreeNode(WMTreeNode *aNode);
/* Sort only the leaves of the passed node */
void WMSortLeavesForTreeNode(WMTreeNode *aNode, WMCompareDataProc *comparer);
/* Sort all tree recursively starting from the passed node */
void WMSortTree(WMTreeNode *aNode, WMCompareDataProc *comparer);
/* Returns the first node which matches node's data with cdata by 'match' */
WMTreeNode* WMFindInTree(WMTreeNode *aTree, WMMatchDataProc *match, void *cdata);
/* Returns first tree node that has data == cdata */
#define WMGetFirstInTree(aTree, cdata) WMFindInTree(atree, NULL, cdata)
/*--------------------------------------------------------------------------*/
/* Dictionaries */
/*
WMDictionary* WMCreateDictionaryFromElements(void *key, void *value, ...);
#define WMGetDictionaryEntryForKey(dict, key) WMHashGet(dict, key)
WMArray* WMGetAllDictionaryKeys(WMDictionary *dPtr);
*/
/*--------------------------------------------------------------------------*/
WMNotification* WMCreateNotification(const char *name, void *object, void *clientData);
void WMReleaseNotification(WMNotification *notification);
WMNotification* WMRetainNotification(WMNotification *notification);
void* WMGetNotificationClientData(WMNotification *notification);
void* WMGetNotificationObject(WMNotification *notification);
const char* WMGetNotificationName(WMNotification *notification);
void WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
void *observer, const char *name, void *object);
void WMPostNotification(WMNotification *notification);
void WMRemoveNotificationObserver(void *observer);
void WMRemoveNotificationObserverWithName(void *observer, const char *name,
void *object);
void WMPostNotificationName(const char *name, void *object, void *clientData);
WMNotificationQueue* WMGetDefaultNotificationQueue(void);
WMNotificationQueue* WMCreateNotificationQueue(void);
void WMDequeueNotificationMatching(WMNotificationQueue *queue,
WMNotification *notification,
unsigned mask);
void WMEnqueueNotification(WMNotificationQueue *queue,
WMNotification *notification,
WMPostingStyle postingStyle);
void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
WMNotification *notification,
WMPostingStyle postingStyle,
unsigned coalesceMask);
/*......................................................................*/
WMUserDefaults* WMGetStandardUserDefaults(void);
WMUserDefaults* WMGetDefaultsFromPath(char *path);
void WMSynchronizeUserDefaults(WMUserDefaults *database);
void WMSaveUserDefaults(WMUserDefaults *database);
void WMEnableUDPeriodicSynchronization(WMUserDefaults *database, Bool enable);
/* Returns a PLArray with all keys in the user defaults database.
* Free the returned array with PLRelease() when no longer needed,
* but do not free the elements of the array! They're just references. */
proplist_t WMGetUDAllKeys(WMUserDefaults *database);
proplist_t WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName);
void WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
char *defaultName);
void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName);
char* WMGetUDStringForKey(WMUserDefaults *database, char *defaultName);
int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName);
float 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);
extern char *WMUserDefaultsDidChangeNotification;
/*-------------------------------------------------------------------------*/
/* WMHost: host handling */
WMHost* WMGetCurrentHost();
WMHost* WMGetHostWithName(char* name);
WMHost* WMGetHostWithAddress(char* address);
WMHost* WMRetainHost(WMHost *hPtr);
void WMReleaseHost(WMHost *hPtr);
/*
* Host cache management
* If enabled, only one object representing each host will be created, and
* a shared instance will be returned by all methods that return a host.
* Enabled by default.
*/
void WMSetHostCacheEnabled(Bool flag);
Bool WMIsHostCacheEnabled();
void WMFlushHostCache();
/*
* Compare hosts: Hosts are equal if they share at least one address
*/
Bool WMIsHostEqualToHost(WMHost* hPtr, WMHost* anotherHost);
/*
* Host names.
* WMGetHostName() will return first name (official) if a host has several.
* WMGetHostNames() will return a R/O WMArray with all the names of the host.
*/
char* WMGetHostName(WMHost* hPtr);
/* The returned array is R/O. Do not modify it, and do not free it! */
WMArray* WMGetHostNames(WMHost* hPtr);
/*
* Host addresses.
* Addresses are represented as "Dotted Decimal" strings, e.g. "192.42.172.1"
* WMGetHostAddress() will return an arbitrary address if a host has several.
* WMGetHostAddresses() will return a R/O WMArray with all addresses of the host.
*/
char* WMGetHostAddress(WMHost* hPtr);
/* The returned array is R/O. Do not modify it, and do not free it! */
WMArray* WMGetHostAddresses(WMHost* hPtr);
/*-------------------------------------------------------------------------*/
/* WMConnection functions */
WMConnection* WMCreateConnectionAsServerAtAddress(char *host, char *service,
char *protocol);
WMConnection* WMCreateConnectionToAddress(char *host, char *service,
char *protocol);
WMConnection* WMCreateConnectionToAddressAndNotify(char *host, char *service,
char *protocol);
void WMCloseConnection(WMConnection *cPtr);
void WMDestroyConnection(WMConnection *cPtr);
WMConnection* WMAcceptConnection(WMConnection *listener);
/* Release the returned data! */
WMData* WMGetConnectionAvailableData(WMConnection *cPtr);
int WMSendConnectionData(WMConnection *cPtr, WMData *data);
Bool WMEnqueueConnectionData(WMConnection *cPtr, WMData *data);
#define WMFlushConnection(cPtr) WMSendConnectionData((cPtr), NULL)
void WMSetConnectionDelegate(WMConnection *cPtr, ConnectionDelegate *delegate);
/* Connection info */
char* WMGetConnectionAddress(WMConnection *cPtr);
char* WMGetConnectionService(WMConnection *cPtr);
char* WMGetConnectionProtocol(WMConnection *cPtr);
Bool WMSetConnectionNonBlocking(WMConnection *cPtr, Bool flag);
Bool WMSetConnectionCloseOnExec(WMConnection *cPtr, Bool flag);
void* WMGetConnectionClientData(WMConnection *cPtr);
void WMSetConnectionClientData(WMConnection *cPtr, void *data);
unsigned int WMGetConnectionFlags(WMConnection *cPtr);
void WMSetConnectionFlags(WMConnection *cPtr, unsigned int flags);
int WMGetConnectionSocket(WMConnection *cPtr);
WMConnectionState WMGetConnectionState(WMConnection *cPtr);
WMConnectionTimeoutState WMGetConnectionTimeoutState(WMConnection *cPtr);
WMArray* WMGetConnectionUnsentData(WMConnection *cPtr);
#define WMGetConnectionQueuedData(cPtr) WMGetConnectionUnsentData(cPtr)
/*
* Passing timeout==0 in the SetTimeout functions below, will reset that
* timeout to its default value.
*/
/* The default timeout inherited by all WMConnection operations, if none set */
void WMSetConnectionDefaultTimeout(unsigned int timeout);
/* Global timeout for all WMConnection objects, for opening a new connection */
void WMSetConnectionOpenTimeout(unsigned int timeout);
/* Connection specific timeout for sending out data */
void WMSetConnectionSendTimeout(WMConnection *cPtr, unsigned int timeout);
/* Global variables */
extern int WCErrorCode;
/*-------------------------------------------------------------------------*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif

View File

@@ -1,14 +1,12 @@
#ifndef _WINGSP_H_
#define _WINGSP_H_
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <WINGs/WINGs.h>
#include "WINGs.h"
#include "WUtil.h"
#if WINGS_H_VERSION < 20010117
#if WINGS_H_VERSION < 980922
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
#endif
@@ -18,13 +16,9 @@
#include <string.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define DOUBLE_BUFFER
#define WC_UserWidget 128
@@ -32,17 +26,20 @@ extern "C" {
#define SCROLLER_WIDTH 20
#define XDND_VERSION 4
/* internal messages */
#define WM_UPDATE_COLORWELL 130
typedef struct W_Application {
char *applicationName;
int argc;
char **argv;
char *resourcePath;
} W_Application;
#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 {
@@ -55,7 +52,6 @@ typedef struct W_Font {
short height;
short y;
short refCount;
char *name;
unsigned int notFontSet:1;
} W_Font;
@@ -89,32 +85,6 @@ typedef struct W_FocusInfo {
struct W_FocusInfo *next;
} W_FocusInfo;
struct W_DraggingInfo {
Window destinationWindow;
Window sourceWindow;
WMPoint location;
unsigned sourceOperation;
WMPixmap *image;
WMPoint imageLocation;
char **types;
Time timestamp;
int protocolVersion;
/* should be treated as internal data */
WMView *sourceView;
WMView *destView;
WMSize mouseOffset;
unsigned finished:1;
};
typedef struct W_Screen {
Display *display;
int screen;
@@ -136,9 +106,7 @@ typedef struct W_Screen {
W_FocusInfo *focusInfo;
RImage *applicationIconImage; /* image (can have alpha channel) */
struct W_Pixmap *applicationIconPixmap; /* pixmap - no alpha channel */
Window applicationIconWindow;
struct W_Pixmap *applicationIcon;
struct W_Window *windowList; /* list of windows in the app */
@@ -158,11 +126,6 @@ typedef struct W_Screen {
struct W_FontPanel *sharedFontPanel;
struct W_ColorPanel *sharedColorPanel;
Pixmap stipple;
struct W_View *dragSourceView;
struct W_DraggingInfo dragInfo;
/* colors */
W_Color *white;
@@ -182,19 +145,10 @@ typedef struct W_Screen {
GC ixorGC; /* IncludeInferiors XOR */
GC textFieldGC;
W_Font *normalFont;
W_Font *boldFont;
WMHashTable *fontCache;
Bool useMultiByte;
unsigned int ignoredModifierMask; /* modifiers to ignore when typing txt */
struct W_Balloon *balloon;
struct W_Pixmap *checkButtonImageOn;
struct W_Pixmap *checkButtonImageOff;
@@ -219,118 +173,51 @@ typedef struct W_Screen {
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 internalMessage; /* for ClientMessage */
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 xdndStatusAtom;
Atom xdndActionCopy;
Atom xdndActionMove;
Atom xdndActionLink;
Atom xdndActionAsk;
Atom xdndActionPrivate;
Atom wmIconDragOffsetAtom;
Atom wmStateAtom; /* WM_STATE */
/* 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 modal: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 */
@@ -338,23 +225,18 @@ typedef struct W_View {
struct W_View *nextSister; /* next on parent's children list */
WMArray *eventHandlers; /* event handlers for this window */
struct W_EventHandler *handlerList;/* list of event handlers for this window */
unsigned long attribFlags;
XSetWindowAttributes attribs;
void *hangedData; /* data holder for user program */
WMColor *backColor;
Cursor cursor;
Atom *droppableTypes;
#if 0
struct W_DragSourceProcs *dragSourceProcs;
struct W_DragDestinationProcs *dragDestinationProcs;
#endif
int helpContext;
struct {
unsigned int realized:1;
unsigned int mapped:1;
@@ -376,7 +258,6 @@ typedef struct W_View {
unsigned int pendingRelease3:1;
unsigned int pendingRelease4:1;
unsigned int pendingRelease5:1;
unsigned int xdndHintSet:1;
} flags;
int refCount;
@@ -385,27 +266,31 @@ typedef struct 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;
int defaultFontSize;
Bool useMultiByte;
char *floppyPath;
unsigned doubleClickDelay;
unsigned mouseWheelUp;
unsigned mouseWheelDown;
} _WINGsConfiguration;
extern _WINGsConfiguration WINGsConfiguration;
_WINGsConfiguration WINGsConfiguration;
@@ -417,21 +302,13 @@ extern _WINGsConfiguration WINGsConfiguration;
#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_GC(c) (c)->gc
#define W_FONTID(f) (f)->font->fid
#define W_DRAWABLE(scr) (scr)->rcontext->drawable
#define W_DRAWABLE(scr) (scr)->rootWin
W_View *W_GetViewForXWindow(Display *display, Window window);
@@ -440,8 +317,6 @@ 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);
@@ -449,12 +324,7 @@ 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_ReparentView(W_View *view, W_View *newParent);
void W_MapView(W_View *view);
@@ -472,15 +342,11 @@ 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_CleanUpEvents(W_View *view);
void W_CallDestroyHandlers(W_View *view);
@@ -503,12 +369,14 @@ 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);
@@ -517,34 +385,10 @@ void W_InitApplication(WMScreen *scr);
void W_InitNotificationCenter(void);
W_Class W_RegisterUserWidget(void);
W_Class W_RegisterUserWidget(W_ViewProcedureTable *procTable);
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);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _WINGSP_H_ */
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,366 +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)
{
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

@@ -2,8 +2,6 @@
#include "WINGsP.h"
#include <X11/Xlocale.h>
#include <proplist.h>
@@ -11,35 +9,11 @@ _WINGsConfiguration WINGsConfiguration;
#define SYSTEM_FONT "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-medium-r-*-*-%d-*-*-*-*-*-*-*"
#define SYSTEM_FONT "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*"
#define BOLD_SYSTEM_FONT "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-bold-r-*-*-%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
@@ -52,92 +26,24 @@ W_ReadConfigurations(void)
defaults = WMGetStandardUserDefaults();
if (defaults) {
char *buttonName;
unsigned button;
char *str;
WINGsConfiguration.systemFont =
WMGetUDStringForKey(defaults, "SystemFont");
WINGsConfiguration.boldSystemFont =
WMGetUDStringForKey(defaults, "BoldSystemFont");
WINGsConfiguration.useMultiByte = False;
str = WMGetUDStringForKey(defaults, "MultiByteText");
if (str) {
if (strcasecmp(str, "YES") == 0) {
WINGsConfiguration.useMultiByte = True;
} else if (strcasecmp(str, "AUTO") == 0) {
char *locale;
/* if it's a multibyte language (japanese, chinese or korean)
* then set it to True */
locale = setlocale(LC_CTYPE, NULL);
if (locale != NULL
&& (strncmp(locale, "ja", 2) == 0
|| strncmp(locale, "zh", 2) == 0
|| strncmp(locale, "ko", 2) == 0)) {
WINGsConfiguration.useMultiByte = True;
}
}
}
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");
WMGetUDIntegerForKey(defaults, "DoubleClickTime");
}
if (!WINGsConfiguration.systemFont) {
WINGsConfiguration.systemFont = SYSTEM_FONT;
}
if (!WINGsConfiguration.boldSystemFont) {
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
}
if (!WINGsConfiguration.floppyPath) {
WINGsConfiguration.floppyPath = FLOPPY_PATH;
}
if (WINGsConfiguration.doubleClickDelay == 0) {
WINGsConfiguration.doubleClickDelay = 250;
}
if (WINGsConfiguration.mouseWheelUp == 0) {
WINGsConfiguration.mouseWheelUp = Button4;
}
if (WINGsConfiguration.mouseWheelDown == 0) {
WINGsConfiguration.mouseWheelDown = Button5;
}
if (WINGsConfiguration.defaultFontSize == 0) {
WINGsConfiguration.defaultFontSize = 12;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,350 +0,0 @@
/*
* WINGs WMData function library
*
* Copyright (c) 1999-2000 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) /*FOLD00*/
{
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) /*FOLD00*/
{
WMData *aData;
aData = WMCreateDataWithCapacity(length);
if (length>0) {
memset(aData->bytes, 0, length);
aData->length = length;
}
return aData;
}
WMData*
WMCreateDataWithBytes(void *bytes, unsigned length) /*FOLD00*/
{
WMData *aData;
aData = WMCreateDataWithCapacity(length);
aData->length = length;
memcpy(aData->bytes, bytes, length);
return aData;
}
WMData*
WMCreateDataWithBytesNoCopy(void *bytes, unsigned length, /*FOLD00*/
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) /*FOLD00*/
{
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) /*FOLD00*/
{
aData->retainCount++;
return aData;
}
void
WMReleaseData(WMData *aData) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
WMSetDataLength(aData, aData->length + extraLength);
}
/* Accessing data */
const void*
WMDataBytes(WMData *aData) /*FOLD00*/
{
return aData->bytes;
}
void
WMGetDataBytes(WMData *aData, void *buffer) /*FOLD00*/
{
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) /*FOLD00*/
{
wassertr(aData->length > 0);
wassertr(length <= aData->length);
memcpy(buffer, aData->bytes, length);
}
void
WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
return aData->length;
}
/* Adding data */
void
WMAppendDataBytes(WMData *aData, void *bytes, unsigned length) /*FOLD00*/
{
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) /*FOLD00*/
{
if (anotherData->length > 0)
WMAppendDataBytes(aData, anotherData->bytes, anotherData->length);
}
/* Modifying data */
void
WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes) /*FOLD00*/
{
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) /*FOLD00*/
{
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) /*FOLD00*/
{
unsigned length = anotherData->length;
WMSetDataCapacity(aData, length);
if (length > 0)
memcpy(aData->bytes, anotherData->bytes, length);
aData->length = length;
}
/* Storing data */

View File

@@ -1,222 +0,0 @@
#include <X11/Xatom.h>
#include "WINGsP.h"
/* dropping */
typedef struct W_DNDTargetInfo {
/* data types accepted for drops */
Atom *dropTypes;
int dropTypeCount;
} DNDTargetInfo;
static Atom XDNDversion = XDND_VERSION;
static void
realizedObserver(void *self, WMNotification *notif)
{
WMView *view = (WMView*)WMGetNotificationObject(notif);
XChangeProperty(W_VIEW_SCREEN(view)->display, W_VIEW_DRAWABLE(view),
W_VIEW_SCREEN(view)->xdndAwareAtom,
XA_ATOM, 32, PropModeReplace,
(unsigned char*)&XDNDversion, 1);
WMRemoveNotificationObserver(self);
}
void
W_SetXdndAwareProperty(WMScreen *scr, WMView *view, Atom *types, int typeCount)
{
Display *dpy = scr->display;
view = W_TopLevelOfView(view);
if (!view->flags.xdndHintSet) {
view->flags.xdndHintSet = 1;
if (view->flags.realized) {
XChangeProperty(dpy, W_VIEW_DRAWABLE(view), scr->xdndAwareAtom,
XA_ATOM, 32, PropModeReplace,
(unsigned char*)&XDNDversion, 1);
} else {
WMAddNotificationObserver(realizedObserver,
/* just use as an id */
&view->dragDestinationProcs,
WMViewRealizedNotification,
view);
}
}
}
void
WMRegisterViewForDraggedTypes(WMView *view, char *acceptedTypes[])
{
Atom *types;
int typeCount;
int i;
typeCount = 0;
while (acceptedTypes[typeCount++]);
types = wmalloc(sizeof(Atom)*(typeCount+1));
for (i = 0; i < typeCount; i++) {
types[i] = XInternAtom(W_VIEW_SCREEN(view)->display,
acceptedTypes[i], False);
}
types[i] = 0;
view->droppableTypes = types;
W_SetXdndAwareProperty(W_VIEW_SCREEN(view), view, types, typeCount);
}
void
WMUnregisterViewDraggedTypes(WMView *view)
{
if (view->droppableTypes != NULL)
wfree(view->droppableTypes);
view->droppableTypes = NULL;
}
/***********************************************************************/
static unsigned defDraggingEntered(WMView *self, WMDraggingInfo *info)
{
printf("%x drag entered\n", W_VIEW_DRAWABLE(self));
return WDOperationNone;
}
static unsigned defDraggingUpdated(WMView *self, WMDraggingInfo *info)
{
printf("%x drag updat\n", W_VIEW_DRAWABLE(self));
return WDOperationNone;
}
static void defDraggingExited(WMView *self, WMDraggingInfo *info)
{
printf("%x drag exit\n", W_VIEW_DRAWABLE(self));
}
static Bool defPrepareForDragOperation(WMView *self, WMDraggingInfo *info)
{
printf("%x drag prep\n", W_VIEW_DRAWABLE(self));
return False;
}
static Bool defPerformDragOperation(WMView *self, WMDraggingInfo *info)
{
printf("%x drag perf\n", W_VIEW_DRAWABLE(self));
return False;
}
static void defConcludeDragOperation(WMView *self, WMDraggingInfo *info)
{
printf("%x drag concl\n", W_VIEW_DRAWABLE(self));
}
void
WMSetViewDragDestinationProcs(WMView *view, WMDragDestinationProcs *procs)
{
if (view->dragDestinationProcs == NULL) {
view->dragDestinationProcs = wmalloc(sizeof(WMDragDestinationProcs));
} else {
free(view->dragDestinationProcs);
}
*view->dragDestinationProcs = *procs;
/*XXX fill in non-implemented stuffs */
if (procs->draggingEntered == NULL) {
view->dragDestinationProcs->draggingEntered = defDraggingEntered;
}
if (procs->draggingUpdated == NULL) {
view->dragDestinationProcs->draggingUpdated = defDraggingUpdated;
}
if (procs->draggingExited == NULL) {
view->dragDestinationProcs->draggingExited = defDraggingExited;
}
if (procs->prepareForDragOperation == NULL) {
view->dragDestinationProcs->prepareForDragOperation =
defPrepareForDragOperation;
}
if (procs->performDragOperation == NULL) {
view->dragDestinationProcs->performDragOperation =
defPerformDragOperation;
}
if (procs->concludeDragOperation == NULL) {
view->dragDestinationProcs->concludeDragOperation =
defConcludeDragOperation;
}
}
WMPoint WMGetDraggingInfoImageLocation(WMDraggingInfo *info)
{
return info->imageLocation;
}
static void
receivedData(WMView *view, Atom selection, Atom target, Time timestamp,
void *cdata, WMData *data)
{
}
Bool WMRequestDroppedData(WMView *view, WMDraggingInfo *info, char *type,
WMDropDataCallback *callback)
{
#if 0
WMScreen *scr = W_VIEW_SCREEN(view);
if (info->finished) {
return False;
}
if (type != NULL) {
if (!WMRequestSelection(scr->dragInfo.destView,
scr->xdndSelectionAtom,
XInternAtom(scr->display, type, False),
scr->dragInfo.timestamp,
receivedData, &scr->dragInfo)) {
wwarning("could not request data for dropped data");
/* send finished message */
sendClientMessage(scr->display, source,
scr->xdndFinishedAtom,
scr->dragInfo.destinationWindow,
0, 0, 0, 0);
}
} else {
/* send finished message */
sendClientMessage(scr->display, source,
scr->xdndFinishedAtom,
scr->dragInfo.destinationWindow,
0, 0, 0, 0);
}
#endif
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/*
* Window Maker miscelaneous function library
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
@@ -27,63 +27,33 @@
#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];
sprintf (buf, "Unknown error %d", errnum);
return buf;
#else /* no strerror() and no sys_errlist[] */
static char buf[] = "Error 12345678901234567890";
sprintf(buf, "Error %d", errnum);
return buf;
#endif
}
/*********************************************************************
* Prints a message with variable arguments
/**************************************************************************
* Prints a fatal error message with variable arguments and terminates
*
* msg - message to print with optional formatting
* ... - arguments to use on formatting
*********************************************************************/
void
wmessage(const char *msg, ...)
* ... - arguments to use on formatting
**************************************************************************/
void
wfatal(const char *msg, ...)
{
va_list args;
char buf[MAXLINE];
va_start(args, msg);
vsnprintf(buf, MAXLINE-3, msg, args);
vsprintf(buf, msg, args);
strcat(buf,"\n");
fflush(stdout);
fputs(_WINGS_progname, stderr);
fputs(": ",stderr);
fputs(" fatal error: ",stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
fflush(NULL);
va_end(args);
}
@@ -103,46 +73,18 @@ wwarning(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, stderr);
fputs(" warning: ",stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
fflush(NULL);
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
**************************************************************************/
void
wfatal(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, stderr);
fputs(" fatal error: ",stderr);
fputs(buf, stderr);
fflush(stdout);
fflush(stderr);
va_end(args);
}
/*********************************************************************
* Prints a system error message with variable arguments
*
@@ -154,49 +96,23 @@ 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, 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, 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,5 +1,5 @@
/*
* Window Maker miscelaneous function library
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
@@ -189,13 +189,13 @@ wfindfile(char *paths, char *file)
return NULL;
if (*file=='/' || *file=='~' || *file=='$' || !paths) {
if (access(file, F_OK)<0) {
if (access(file, R_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, F_OK)<0) {
wfree(fullpath);
if (access(fullpath, R_OK)<0) {
free(fullpath);
return NULL;
} else {
return fullpath;
@@ -217,12 +217,12 @@ wfindfile(char *paths, char *file)
strcat(path, "/");
strcat(path, file);
fullpath = wexpandpath(path);
wfree(path);
free(path);
if (fullpath) {
if (access(fullpath, F_OK)==0) {
if (access(fullpath, R_OK)==0) {
return fullpath;
}
wfree(fullpath);
free(fullpath);
}
tmp=&(tmp[len+1]);
if (*tmp==0) break;
@@ -243,13 +243,13 @@ wfindfileinlist(char **path_list, char *file)
return NULL;
if (*file=='/' || *file=='~' || !path_list) {
if (access(file, F_OK)<0) {
if (access(file, R_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, F_OK)<0) {
wfree(fullpath);
if (access(fullpath, R_OK)<0) {
free(fullpath);
return NULL;
} else {
return fullpath;
@@ -269,13 +269,13 @@ wfindfileinlist(char **path_list, char *file)
strcat(path, file);
/* expand tilde */
fullpath = wexpandpath(path);
wfree(path);
free(path);
if (fullpath) {
/* check if file exists */
if (access(fullpath, F_OK)==0) {
/* check if file is readable */
if (access(fullpath, R_OK)==0) {
return fullpath;
}
wfree(fullpath);
free(fullpath);
}
}
return NULL;
@@ -283,64 +283,3 @@ wfindfileinlist(char **path_list, char *file)
char*
wfindfileinarray(proplist_t 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<PLGetNumberOfElements(array); i++) {
proplist_t prop;
char *p;
prop = PLGetArrayElement(array, i);
if (!prop)
continue;
p = PLGetString(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

@@ -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()

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();
/* --oldway-- return ((inputfd < 0) ? (count > 0) : FD_ISSET(inputfd, &rset));*/
return (count > 0);
#else /* not HAVE_SELECT, not HAVE_POLL */
Neither select nor poll. You lose.
#endif /* HAVE_SELECT */
#endif /* HAVE_POLL */
}

View File

@@ -21,8 +21,8 @@
typedef struct HashItem {
const void *key;
const void *data;
void *key;
void *data;
struct HashItem *next; /* collided item list */
} HashItem;
@@ -114,7 +114,7 @@ rebuildTable(WMHashTable *table)
oldArray[i] = next;
}
}
wfree(oldArray);
free(oldArray);
}
@@ -149,7 +149,7 @@ WMResetHashTable(WMHashTable *table)
while (item) {
tmp = item->next;
RELKEY(table, item);
wfree(item);
free(item);
item = tmp;
}
}
@@ -157,7 +157,7 @@ WMResetHashTable(WMHashTable *table)
table->itemCount = 0;
if (table->size > INITIAL_CAPACITY) {
wfree(table->table);
free(table->table);
table->size = INITIAL_CAPACITY;
table->table = wmalloc(sizeof(HashItem*)*table->size);
}
@@ -175,13 +175,13 @@ WMFreeHashTable(WMHashTable *table)
item = table->table[i];
while (item) {
tmp = item->next;
RELKEY(table, item->key);
wfree(item);
RELKEY(table, item);
free(item);
item = tmp;
}
}
wfree(table->table);
wfree(table);
free(table->table);
free(table);
}
@@ -211,7 +211,7 @@ WMHashGet(WMHashTable *table, const void *key)
}
}
if (item)
return (void*)item->data;
return item->data;
else
return NULL;
}
@@ -219,7 +219,7 @@ WMHashGet(WMHashTable *table, const void *key)
void*
WMHashInsert(WMHashTable *table, const void *key, const void *data)
WMHashInsert(WMHashTable *table, void *key, void *data)
{
unsigned h;
HashItem *item;
@@ -247,14 +247,14 @@ WMHashInsert(WMHashTable *table, const void *key, const void *data)
}
if (replacing) {
const void *old;
void *old;
old = item->data;
item->data = data;
RELKEY(table, item->key);
item->key = DUPKEY(table, key);
return (void*)old;
return old;
} else {
HashItem *nitem;
@@ -296,7 +296,7 @@ deleteFromList(HashTable *table, HashItem *item, const void *key)
next = item->next;
RELKEY(table, item->key);
wfree(item);
free(item);
table->itemCount--;
@@ -337,7 +337,7 @@ WMEnumerateHashTable(WMHashTable *table)
void*
WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
{
const void *data = NULL;
void *data = NULL;
/* this assumes the table doesn't change between
* WMEnumerateHashTable() and WMNextHashEnumeratorItem() calls */
@@ -357,34 +357,7 @@ WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next;
}
return (void*)data;
}
void*
WMNextHashEnumeratorKey(WMHashEnumerator *enumerator)
{
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;
return data;
}
@@ -419,7 +392,7 @@ const WMHashTableCallbacks WMStringHashCallbacks = {
(hashFunc)hashString,
(isEqualFunc)compareStrings,
(retainFunc)wstrdup,
(releaseFunc)wfree
(releaseFunc)free
};

View File

@@ -1,310 +0,0 @@
/*
* WINGs WMHost function library
*
* Copyright (c) 1999-2001 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 "../src/config.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;
}
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

@@ -1,5 +1,5 @@
/*
* Window Maker miscelaneous function library
* WindowMaker miscelaneous function library
*
* Copyright (c) 1997 Alfredo K. Kojima
*
@@ -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,29 +45,18 @@ 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
tmp = malloc(size);
if (tmp == NULL) {
if (Aborting) {
fputs("Really Bad Error: recursive malloc() failure.", stderr);
puts("Real Bad Error: recursive malloc() failure.");
exit(-1);
} else {
wfatal("virtual memory exhausted");
@@ -111,42 +69,18 @@ wmalloc(size_t size)
}
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;
}
@@ -180,19 +114,6 @@ wretain(void *ptr)
}
void
wfree(void *ptr)
{
#ifdef TEST_WITH_GC
GC_free(ptr);
#else
free(ptr);
#endif
}
void
wrelease(void *ptr)
{
@@ -208,8 +129,8 @@ wrelease(void *ptr)
printf("RELEASING %p\n", ptr);
#endif
WMHashRemove(table, ptr);
wfree(refcount);
wfree(ptr);
free(refcount);
free(ptr);
}
#ifdef VERBOSE
else {
@@ -230,35 +151,19 @@ wstrdup(char *str)
char*
wstrconcat(char *str1, char *str2)
wstrappend(char *dst, char *src)
{
char *str;
if (!str1)
return wstrdup(str2);
else if (!str2)
return wstrdup(str1);
str = wmalloc(strlen(str1)+strlen(str2)+1);
strcpy(str, str1);
strcat(str, str2);
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;
}
char*
wstrappend(char *dst, char *src)
{
if (!dst)
return wstrdup(src);
else if (!src || *src==0)
return dst;
dst = wrealloc(dst, strlen(dst)+strlen(src)+1);
strcat(dst, src);
return dst;
}

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
* Demo user widget for WINGs.
*
* Author: Alfredo K. Kojima
*
* This file is in the public domain.
*
*
* Copyright (c) 1998 Alfredo K. Kojima
*/
@@ -14,7 +12,7 @@
*
*
*/
#include <WINGs/WINGsP.h>
#include "WINGsP.h"
/*
* Our public header.
@@ -50,13 +48,12 @@ 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,
static W_ViewProcedureTable _MyWidgetViewProcedures = {
NULL,
NULL,
NULL
@@ -76,7 +73,7 @@ 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;
@@ -98,7 +95,7 @@ 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
@@ -108,15 +105,12 @@ CreateMyWidget(WMWidget *parent)
*/
mPtr->view = W_CreateView(W_VIEW(parent));
if (!mPtr->view) {
wfree(mPtr);
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.
*/
@@ -150,7 +144,7 @@ paintMyWidget(_MyWidget *mPtr)
color = WMWhiteColor(scr);
W_PaintText(mPtr->view, mPtr->view->window, scr->normalFont, 0, 0,
mPtr->view->size.width, WACenter, WMColorGC(color),
mPtr->view->size.width, WACenter, W_GC(color),
False, mPtr->text, strlen(mPtr->text));
WMReleaseColor(color);
@@ -200,7 +194,7 @@ SetMyWidgetText(MyWidget *mPtr, char *text)
CHECK_CLASS(mPtr, myWidgetClass);
if (mPtr->text)
wfree(mPtr->text);
free(mPtr->text);
mPtr->text = wstrdup(text);
@@ -219,9 +213,9 @@ destroyMyWidget(_MyWidget *mPtr)
*/
if (mPtr->text)
wfree(mPtr->text);
free(mPtr->text);
wfree(mPtr);
free(mPtr);
}

View File

@@ -1,6 +1,6 @@
/*
* Header for demo widget.
* Header foy demo widget.
*
*/

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,7 +38,7 @@ WMGetNotificationClientData(WMNotification *notification)
WMNotification*
WMCreateNotification(const char *name, void *object, void *clientData)
WMCreateNotification(char *name, void *object, void *clientData)
{
Notification *nPtr;
@@ -62,7 +60,7 @@ WMReleaseNotification(WMNotification *notification)
notification->refCount--;
if (notification->refCount < 1) {
wfree(notification);
free(notification);
}
}
@@ -82,7 +80,7 @@ typedef struct NotificationObserver {
WMNotificationObserverAction *observerAction;
void *observer;
const char *name;
char *name;
void *object;
struct NotificationObserver *prev; /* for tables */
@@ -119,7 +117,7 @@ W_InitNotificationCenter(void)
void
WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
void *observer, const char *name, void *object)
void *observer, char *name, void *object)
{
NotificationObserver *oRec, *rec;
@@ -133,8 +131,7 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
/* 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 */
@@ -152,16 +149,14 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
notificationCenter->nilList = oRec;
} else if (!name) {
/* any message coming from object */
rec = (NotificationObserver*)WMHashInsert(notificationCenter->objectTable,
object, oRec);
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);
rec = WMHashInsert(notificationCenter->nameTable, name, oRec);
oRec->next = rec;
if (rec) {
rec->prev = oRec;
@@ -178,14 +173,12 @@ WMPostNotification(WMNotification *notification)
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;
if (!orec->object || !notification->object
|| orec->object == notification->object) {
if (!orec->object || orec->object == notification->object) {
/* tell the observer */
if (orec->observerAction) {
(*orec->observerAction)(orec->observer, notification);
@@ -196,8 +189,7 @@ WMPostNotification(WMNotification *notification)
}
/* 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;
@@ -225,14 +217,16 @@ WMPostNotification(WMNotification *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
@@ -250,8 +244,7 @@ WMRemoveNotificationObserver(void *observer)
notificationCenter->nilList = orec->next;
} else if (!orec->name) {
/* any message coming from object */
rec = (NotificationObserver*)WMHashGet(notificationCenter->objectTable,
orec->object);
rec = WMHashGet(notificationCenter->objectTable, orec->object);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
@@ -263,8 +256,7 @@ WMRemoveNotificationObserver(void *observer)
}
} else {
/* name && (object || !object) */
rec = (NotificationObserver*)WMHashGet(notificationCenter->nameTable,
orec->name);
rec = WMHashGet(notificationCenter->nameTable, orec->name);
if (rec==orec) {
/* replace table entry */
if (orec->next) {
@@ -280,7 +272,7 @@ WMRemoveNotificationObserver(void *observer)
if (orec->next)
orec->next->prev = orec->prev;
wfree(orec);
free(orec);
orec = tmp;
}
@@ -290,17 +282,12 @@ 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;
@@ -309,66 +296,57 @@ WMRemoveNotificationObserverWithName(void *observer, const char *name, void *obj
if (notificationCenter->nilList == orec)
notificationCenter->nilList = orec->next;
} else if (!name) {
rec = (NotificationObserver*)WMHashGet(notificationCenter->objectTable, orec->object);
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);
WMHashInsert(notificationCenter->objectTable, orec->object,
orec->next);
} else {
WMHashRemove(notificationCenter->objectTable,
orec->object);
}
}
} else {
rec = (NotificationObserver*)WMHashGet(notificationCenter->nameTable,
orec->name);
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);
WMHashInsert(notificationCenter->nameTable, orec->name,
orec->next);
} else {
WMHashRemove(notificationCenter->nameTable,
orec->name);
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;
}
free(orec);
}
orec = tmp;
}
/* reinsert the list to the table */
if (newList) {
WMHashInsert(notificationCenter->observerTable, observer, newList);
}
}
void
WMPostNotificationName(const char *name, void *object, void *clientData)
WMPostNotificationName(char *name, void *object, void *clientData)
{
WMNotification *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,76 +382,20 @@ 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)
{
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);
}
@@ -490,54 +405,10 @@ WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
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,241 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <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, y, 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 < 5; 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

@@ -6,423 +6,288 @@
#include "WINGsP.h"
#define MAX_PROPERTY_SIZE 8*1024
#if 0
typedef struct SelectionHandler {
WMView *view;
typedef struct W_SelectionHandler {
WMWidget *widget;
Atom selection;
Time timestamp;
WMSelectionProcs procs;
void *data;
struct {
unsigned delete_pending:1;
unsigned done_pending:1;
} flags;
} SelectionHandler;
typedef struct SelectionCallback {
WMView *view;
Atom selection;
Atom target;
Time timestamp;
WMSelectionCallback *callback;
void *data;
struct {
unsigned delete_pending:1;
unsigned done_pending:1;
} flags;
} SelectionCallback;
WMArray *selCallbacks = NULL;
WMArray *selHandlers = NULL;
void
WMDeleteSelectionHandler(WMView *view, Atom selection, Time timestamp)
{
SelectionHandler *handler;
Display *dpy = W_VIEW_SCREEN(view)->display;
Window win = W_VIEW_DRAWABLE(view);
WMArrayIterator iter;
if (!selHandlers)
return;
WM_ITERATE_ARRAY(selHandlers, handler, iter) {
if (handler->view == view
&& (handler->selection == selection || selection == None)
&& (handler->timestamp == timestamp || timestamp == CurrentTime)) {
if (handler->flags.done_pending) {
handler->flags.delete_pending = 1;
return;
}
WMRemoveFromArray(selHandlers, handler);
break;
}
}
XGrabServer(dpy);
if (XGetSelectionOwner(dpy, selection) == win) {
XSetSelectionOwner(dpy, selection, None, timestamp);
}
XUngrabServer(dpy);
}
void
WMDeleteSelectionCallback(WMView *view, Atom selection, Time timestamp)
{
SelectionCallback *handler;
WMArrayIterator iter;
if (!selCallbacks)
return;
WM_ITERATE_ARRAY(selCallbacks, handler, iter) {
if (handler->view == view
&& (handler->selection == selection || selection == 0)
&& (handler->timestamp == timestamp || timestamp == CurrentTime)) {
if (handler->flags.done_pending) {
handler->flags.delete_pending = 1;
return;
}
WMRemoveFromArray(selCallbacks, handler);
break;
}
}
}
static Bool gotError = 0;
/*
static int
errorHandler(XErrorEvent *error)
{
return 0;
}
*/
static Bool
writeSelection(Display *dpy, Window requestor, Atom property, Atom type,
WMData *data)
{
int format;
format = WMGetDataFormat(data);
if (format == 0)
format = 8;
/*
printf("write to %x: %s\n", requestor, XGetAtomName(dpy, property));
*/
gotError = False;
#ifndef __sgi
if (!XChangeProperty(dpy, requestor, property, type, format,
PropModeReplace, WMDataBytes(data),
WMGetDataLength(data)))
return False;
#else
/* in sgi seems this seems to return void */
XChangeProperty(dpy, requestor, property, type, format,
PropModeReplace, WMDataBytes(data), WMGetDataLength(data));
void *clientData;
WMSelectionProc *proc;
WMHandlerID timerID;
W_SelectionHandler *next;
W_SelectionHandler *prev;
} W_SelectionHandler;
#endif
XFlush(dpy);
#define SELECTION_TIMEOUT 2000
#define MAX_PROPERTY_SIZE 10*1024
#if 0
return !gotError;
void
WMWriteSelectionToClipboard(WMSelection *selection)
{
}
WMSelection*
WMCreateSelectionWithData(WMData *data, Atom type)
{
}
#endif
#if 0
#define MAX_PROPERTY_SIZE 100*1024
static void
handleSelectionEvent(XEvent *event, void *data)
{
W_SelectionHandler *handler = (W_SelectionHandler*)data;
char *data = NULL;
Atom type;
int format, result;
unsigned long numItems, bytesAfter;
WMScreen *scr = WMWidgetScreen(handler->widget);
WMDeleteTimerHandler(handler->timerID);
if (handler->next)
handler->next->prev = handler->prev;
if (handler->prev)
handler->prev->next = handler->next;
if (handler == WMWidgetScreen(handler->widget)->selectionHandlerList)
WMWidgetScreen(handler->widget)->selectionHandlerList = handler->next;
if (event->xselection.property == None) {
char *name = XGetAtomName(event->xselection.display,
handler->selection);
char *form = XGetAtomName(event->xselection.display, handler->type);
wwarning("error retrieving selection %s with form %s\n", name, form);
if (name)
XFree(name);
if (form)
XFree(form);
free(handler);
return;
}
if (XGetWindowProperty(event->xselection.display,
event->xselection.requestor, handler->property,
0, MAX_PROPERTY_SIZE, False, AnyPropertyType,
&type, &format, &numItems, &bytesAfter,
&data) != Success || type == None) {
if (data)
XFree(data);
free(handler);
return;
}
if (bytesAfter!=0) {
wwarning("data in selection is too large");
if (data)
XFree(data);
free(handler);
return;
}
if (type == XA_STRING || type == scr->compoundTextAtom) {
if (format!=8) {
wwarning("string in selection has format %i, which is invalid",
format);
if (data)
XFree(data);
free(handler);
return;
}
(*handler->proc)();
}
}
static void
notifySelection(XEvent *event, Atom prop)
timeoutHandler(void *data)
{
XEvent ev;
/*
printf("envent to %x\n", event->xselectionrequest.requestor);
*/
ev.xselection.type = SelectionNotify;
ev.xselection.serial = 0;
ev.xselection.send_event = True;
ev.xselection.display = event->xselectionrequest.display;
ev.xselection.requestor = event->xselectionrequest.requestor;
ev.xselection.target = event->xselectionrequest.target;
ev.xselection.selection = event->xselectionrequest.selection;
ev.xselection.property = prop;
ev.xselection.time = event->xselectionrequest.time;
XSendEvent(event->xany.display, event->xselectionrequest.requestor,
False, 0, &ev);
XFlush(event->xany.display);
}
W_SelectionHandler *handler = (W_SelectionHandler*)data;
static void
handleRequestEvent(XEvent *event)
{
SelectionHandler *handler;
WMArrayIterator iter;
WMArray *copy;
Bool handledRequest = False;
WM_ITERATE_ARRAY(selHandlers, handler, iter) {
switch (event->type) {
case SelectionClear:
if (W_VIEW_DRAWABLE(handler->view)
!= event->xselectionclear.window) {
break;
}
handler->flags.done_pending = 1;
if (handler->procs.selectionLost)
handler->procs.selectionLost(handler->view,
handler->selection,
handler->data);
handler->flags.done_pending = 0;
handler->flags.delete_pending = 1;
break;
case SelectionRequest:
if (W_VIEW_DRAWABLE(handler->view)
!= event->xselectionrequest.owner) {
break;
}
if (handler->procs.convertSelection != NULL
&& handler->selection == event->xselectionrequest.selection) {
Atom atom;
WMData *data;
Atom prop;
/* they're requesting for something old.. maybe another handler
* can handle it */
if (event->xselectionrequest.time < handler->timestamp
&& event->xselectionrequest.time != CurrentTime) {
break;
}
handler->flags.done_pending = 1;
data = handler->procs.convertSelection(handler->view,
handler->selection,
event->xselectionrequest.target,
handler->data,
&atom);
if (data == NULL) {
break;
}
handledRequest = True;
prop = event->xselectionrequest.property;
/* obsolete clients that don't set the property field */
if (prop == None)
prop = event->xselectionrequest.target;
if (!writeSelection(event->xselectionrequest.display,
event->xselectionrequest.requestor,
prop, atom, data)) {
WMReleaseData(data);
notifySelection(event, None);
break;
}
WMReleaseData(data);
notifySelection(event, prop);
if (handler->procs.selectionDone != NULL) {
handler->procs.selectionDone(handler->view,
handler->selection,
event->xselectionrequest.target,
handler->data);
}
handler->flags.done_pending = 0;
if (!handledRequest) {
notifySelection(event, None);
}
}
break;
}
}
/* delete handlers */
copy = WMDuplicateArray(selHandlers);
WM_ITERATE_ARRAY(copy, handler, iter) {
if (handler && handler->flags.delete_pending) {
WMDeleteSelectionHandler(handler->view, handler->selection,
handler->timestamp);
}
}
WMFreeArray(copy);
}
static WMData*
getSelectionData(Display *dpy, Window win, Atom where)
{
WMData *wdata;
unsigned char *data;
Atom rtype;
unsigned bits;
unsigned long len, bytes;
if (XGetWindowProperty(dpy, win, where, 0, MAX_PROPERTY_SIZE,
False, AnyPropertyType, &rtype, &bits, &len,
&bytes, &data)!=Success) {
return NULL;
}
wdata = WMCreateDataWithBytesNoCopy(data, len, (WMFreeDataProc*)XFree);
if (wdata == NULL) {
return NULL;
}
WMSetDataFormat(wdata, bits);
return wdata;
}
static void
handleNotifyEvent(XEvent *event)
{
SelectionCallback *handler;
WMArrayIterator iter;
WMArray *copy;
WMData *data;
WM_ITERATE_ARRAY(selCallbacks, handler, iter) {
if (W_VIEW_DRAWABLE(handler->view) != event->xselection.requestor
&& handler->selection == event->xselection.selection) {
continue;
}
handler->flags.done_pending = 1;
if (event->xselection.property == None) {
data = NULL;
} else {
data = getSelectionData(event->xselection.display,
event->xselection.requestor,
event->xselection.property);
}
(*handler->callback)(handler->view, handler->selection,
handler->target, handler->timestamp,
handler->data, data);
if (data != NULL) {
WMReleaseData(data);
}
handler->flags.done_pending = 0;
handler->flags.delete_pending = 1;
}
/* delete callbacks */
copy = WMDuplicateArray(selCallbacks);
WM_ITERATE_ARRAY(copy, handler, iter) {
if (handler && handler->flags.delete_pending) {
WMDeleteSelectionCallback(handler->view, handler->selection,
handler->timestamp);
}
}
WMFreeArray(copy);
wwarning("selection timed out");
WMDeleteEventHandler(WMWidgetView(handler->widget), SelectionNotifyMask,
handleSelectionEvent, data);
if (handler->next)
handler->next->prev = handler->prev;
if (handler->prev)
handler->prev->next = handler->next;
if (handler == WMWidgetScreen(handler->widget)->selectionHandlerList)
WMWidgetScreen(handler->widget)->selectionHandlerList = handler->next;
}
void
W_HandleSelectionEvent(XEvent *event)
WMGetSelection(WMWidget *widget, Atom selection, Atom type, Atom property,
WMSelectionProc *proc, void *clientData, Time time)
{
if (event->type == SelectionNotify) {
handleNotifyEvent(event);
WMScreen *scr = WMWidgetScreen(widget);
void *data;
Atom rtype;
int bits;
unsigned long len, bytes;
unsigned char *data;
int buffer = -1;
switch (selection) {
case XA_CUT_BUFFER0:
buffer = 0;
break;
case XA_CUT_BUFFER1:
buffer = 1;
break;
case XA_CUT_BUFFER2:
buffer = 2;
break;
case XA_CUT_BUFFER3:
buffer = 3;
break;
case XA_CUT_BUFFER4:
buffer = 4;
break;
case XA_CUT_BUFFER5:
buffer = 5;
break;
case XA_CUT_BUFFER6:
buffer = 6;
break;
case XA_CUT_BUFFER7:
buffer = 7;
break;
}
if (buffer >= 0) {
char *data;
int size;
data = XFetchBuffer(scr->display, &size, buffer);
} else {
handleRequestEvent(event);
W_SelectionHandler *handler;
XDeleteProperty(scr->display, WMWidgetXID(widget), selection);
XConvertSelection(scr->display, selection, type, property,
WMWidgetXID(widget), time);
handler = wmalloc(sizeof(W_SelectionHandler));
handler->widget = widget;
handler->selection = selection;
handler->type = type;
handler->property = property;
handler->clientData = clientData;
handler->proc = proc;
handler->timerID = WMAddTimerHandler(SELECTION_TIMEOUT,
timeoutHandler, handler);
handler->next = scr->selectionHandlerList;
handler->prev = NULL;
if (scr->selectionHandlerList)
scr->selectionHandlerList->prev = handler;
scr->selectionHandlerList = handler;
WMCreateEventHandler(WMWidgetView(widget), SelectionNotifyMask,
handleSelectionEvent, handler);
}
}
#endif
Bool
WMCreateSelectionHandler(WMView *view, Atom selection, Time timestamp,
WMSelectionProcs *procs, void *cdata)
static void
timeoutHandler(void *data)
{
SelectionHandler *handler;
Display *dpy = W_VIEW_SCREEN(view)->display;
XSetSelectionOwner(dpy, selection, W_VIEW_DRAWABLE(view), timestamp);
if (XGetSelectionOwner(dpy, selection) != W_VIEW_DRAWABLE(view))
return False;
handler = malloc(sizeof(SelectionHandler));
if (handler == NULL)
return False;
handler->view = view;
handler->selection = selection;
handler->timestamp = timestamp;
handler->procs = *procs;
handler->data = cdata;
memset(&handler->flags, 0, sizeof(handler->flags));
if (selHandlers == NULL) {
selHandlers = WMCreateArrayWithDestructor(4, wfree);
}
WMAddToArray(selHandlers, handler);
return True;
*(int*)data = 1;
}
Bool
WMRequestSelection(WMView *view, Atom selection, Atom target, Time timestamp,
WMSelectionCallback *callback, void *cdata)
char*
W_GetTextSelection(WMScreen *scr, Atom selection)
{
SelectionCallback *handler;
if (XGetSelectionOwner(W_VIEW_SCREEN(view)->display, selection) == None)
return False;
int buffer = -1;
handler = wmalloc(sizeof(SelectionCallback));
handler->view = view;
handler->selection = selection;
handler->target = target;
handler->timestamp = timestamp;
handler->callback = callback;
handler->data = cdata;
memset(&handler->flags, 0, sizeof(handler->flags));
if (selCallbacks == NULL) {
selCallbacks = WMCreateArrayWithDestructor(4, wfree);
switch (selection) {
case XA_CUT_BUFFER0:
buffer = 0;
break;
case XA_CUT_BUFFER1:
buffer = 1;
break;
case XA_CUT_BUFFER2:
buffer = 2;
break;
case XA_CUT_BUFFER3:
buffer = 3;
break;
case XA_CUT_BUFFER4:
buffer = 4;
break;
case XA_CUT_BUFFER5:
buffer = 5;
break;
case XA_CUT_BUFFER6:
buffer = 6;
break;
case XA_CUT_BUFFER7:
buffer = 7;
break;
}
if (buffer >= 0) {
char *data;
int size;
WMAddToArray(selCallbacks, handler);
data = XFetchBuffer(scr->display, &size, buffer);
if (!XConvertSelection(W_VIEW_SCREEN(view)->display, selection, target,
W_VIEW_SCREEN(view)->clipboardAtom,
W_VIEW_DRAWABLE(view), timestamp)) {
return False;
return data;
} else {
unsigned char *data;
int bits;
Atom rtype;
unsigned long len, bytes;
WMHandlerID timer;
int timeout = 0;
XEvent ev;
XDeleteProperty(scr->display, scr->groupLeader, scr->clipboardAtom);
XConvertSelection(scr->display, selection, XA_STRING,
scr->clipboardAtom, scr->groupLeader,
scr->lastEventTime);
timer = WMAddTimerHandler(1000, timeoutHandler, &timeout);
while (!XCheckTypedWindowEvent(scr->display, scr->groupLeader,
SelectionNotify, &ev) && !timeout);
if (!timeout) {
WMDeleteTimerHandler(timer);
} else {
wwarning("selection retrieval timed out");
return NULL;
}
/* nobody owns the selection */
if (ev.xselection.property == None) {
return NULL;
}
if (XGetWindowProperty(scr->display, scr->groupLeader,
scr->clipboardAtom, 0, MAX_PROPERTY_SIZE,
False, XA_STRING, &rtype, &bits, &len,
&bytes, &data)!=Success) {
return NULL;
}
if (rtype!=XA_STRING || bits!=8) {
wwarning("invalid data in text selection");
if (data)
XFree(data);
return NULL;
}
return data;
}
return True;
}

View File

@@ -1,178 +0,0 @@
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "WUtil.h"
#define PRC_ALPHA 0
#define PRC_BLANK 1
#define PRC_ESCAPE 2
#define PRC_DQUOTE 3
#define PRC_EOS 4
#define PRC_SQUOTE 5
typedef struct {
short nstate;
short output;
} DFA;
static DFA mtable[9][6] = {
{{3,1},{0,0},{4,0},{1,0},{8,0},{6,0}},
{{1,1},{1,1},{2,0},{3,0},{5,0},{1,1}},
{{1,1},{1,1},{1,1},{1,1},{5,0},{1,1}},
{{3,1},{5,0},{4,0},{1,0},{5,0},{6,0}},
{{3,1},{3,1},{3,1},{3,1},{5,0},{3,1}},
{{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */
{{6,1},{6,1},{7,0},{6,1},{5,0},{3,0}},
{{6,1},{6,1},{6,1},{6,1},{5,0},{6,1}},
{{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */
};
char*
wtokennext(char *word, char **next)
{
char *ptr;
char *ret, *t;
int state, ctype;
t = ret = wmalloc(strlen(word)+1);
ptr = word;
state = 0;
*t = 0;
while (1) {
if (*ptr==0)
ctype = PRC_EOS;
else if (*ptr=='\\')
ctype = PRC_ESCAPE;
else if (*ptr=='"')
ctype = PRC_DQUOTE;
else if (*ptr=='\'')
ctype = PRC_SQUOTE;
else if (*ptr==' ' || *ptr=='\t')
ctype = PRC_BLANK;
else
ctype = PRC_ALPHA;
if (mtable[state][ctype].output) {
*t = *ptr; t++;
*t = 0;
}
state = mtable[state][ctype].nstate;
ptr++;
if (mtable[state][0].output<0) {
break;
}
}
if (*ret==0)
t = NULL;
else
t = wstrdup(ret);
wfree(ret);
if (ctype==PRC_EOS)
*next = NULL;
else
*next = ptr;
return t;
}
/* separate a string in tokens, taking " and ' into account */
void
wtokensplit(char *command, char ***argv, int *argc)
{
char *token, *line;
int count;
count = 0;
line = command;
do {
token = wtokennext(line, &line);
if (token) {
if (count == 0)
*argv = wmalloc(sizeof(char**));
else
*argv = wrealloc(*argv, (count+1)*sizeof(char**));
(*argv)[count++] = token;
}
} while (token!=NULL && line!=NULL);
*argc = count;
}
char*
wtokenjoin(char **list, int count)
{
int i, j;
char *flat_string, *wspace;
j = 0;
for (i=0; i<count; i++) {
if (list[i]!=NULL && list[i][0]!=0) {
j += strlen(list[i]);
if (strpbrk(list[i], " \t"))
j += 2;
}
}
flat_string = wmalloc(j+count+1);
*flat_string = 0;
for (i=0; i<count; i++) {
if (list[i]!=NULL && list[i][0]!=0) {
if (i>0)
strcat(flat_string, " ");
wspace = strpbrk(list[i], " \t");
if (wspace)
strcat(flat_string, "\"");
strcat(flat_string, list[i]);
if (wspace)
strcat(flat_string, "\"");
}
}
return flat_string;
}
void
wtokenfree(char **tokens, int count)
{
while (--count) wfree(tokens[count]);
wfree(tokens);
}
char*
wtrimspace(char *s)
{
char *t;
char *c;
while (isspace(*s) && *s) s++;
t = s+strlen(s)-1;
while (t > s && isspace(*t)) t--;
c = wmalloc(t-s+2);
memcpy(c, s, t-s+1);
c[t-s+1] = 0;
return c;
}

View File

@@ -1,6 +1,7 @@
#include <WINGs/WINGs.h>
#include <WINGs.h>
#include <WUtil.h>
#include "mywidget.h"

View File

@@ -1,279 +0,0 @@
#include <string.h>
#include "WUtil.h"
typedef struct W_TreeNode {
void *data;
/*unsigned int uflags:16;*/
WMArray *leaves;
int depth;
struct W_TreeNode *parent;
WMFreeDataProc *destructor;
} W_TreeNode;
void
destroyNode(void *data)
{
WMTreeNode *aNode = (WMTreeNode*) data;
if (aNode->destructor) {
(*aNode->destructor)(aNode->data);
}
if (aNode->leaves) {
WMFreeArray(aNode->leaves);
}
wfree(aNode);
}
WMTreeNode*
WMCreateTreeNode(void *data)
{
return WMCreateTreeNodeWithDestructor(data, NULL);
}
WMTreeNode*
WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor)
{
WMTreeNode *aNode;
aNode = (WMTreeNode*) wmalloc(sizeof(W_TreeNode));
memset(aNode, 0, sizeof(W_TreeNode));
aNode->destructor = destructor;
aNode->data = data;
aNode->parent = NULL;
aNode->depth = 0;
aNode->leaves = NULL;
/*aNode->leaves = WMCreateArrayWithDestructor(1, destroyNode);*/
return aNode;
}
WMTreeNode*
WMInsertItemInTree(WMTreeNode *parent, int index, void *item)
{
WMTreeNode *aNode;
wassertrv(parent!=NULL, NULL);
aNode = WMCreateTreeNodeWithDestructor(item, parent->destructor);
aNode->parent = parent;
aNode->depth = parent->depth+1;
if (!parent->leaves) {
parent->leaves = WMCreateArrayWithDestructor(1, destroyNode);
}
if (index < 0) {
WMAddToArray(parent->leaves, aNode);
} else {
WMInsertInArray(parent->leaves, index, aNode);
}
return aNode;
}
static void
updateNodeDepth(WMTreeNode *aNode, int depth)
{
int i;
aNode->depth = depth;
if (aNode->leaves) {
for (i=0; i<WMGetArrayItemCount(aNode->leaves); i++) {
updateNodeDepth(WMGetFromArray(aNode->leaves, i), depth+1);
}
}
}
WMTreeNode*
WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *aNode)
{
wassertrv(parent!=NULL, NULL);
wassertrv(aNode!=NULL, NULL);
aNode->parent = parent;
updateNodeDepth(aNode, parent->depth+1);
if (!parent->leaves) {
parent->leaves = WMCreateArrayWithDestructor(1, destroyNode);
}
if (index < 0) {
WMAddToArray(parent->leaves, aNode);
} else {
WMInsertInArray(parent->leaves, index, aNode);
}
return aNode;
}
void
WMDestroyTreeNode(WMTreeNode *aNode)
{
wassertr(aNode!=NULL);
if (aNode->parent && aNode->parent->leaves) {
WMRemoveFromArray(aNode->parent->leaves, aNode);
} else {
destroyNode(aNode);
}
}
void
WMDeleteLeafForTreeNode(WMTreeNode *aNode, int index)
{
wassertr(aNode!=NULL);
wassertr(aNode->leaves!=NULL);
WMDeleteFromArray(aNode->leaves, index);
}
static int
sameData(void *item, void *data)
{
return (((WMTreeNode*)item)->data == data);
}
void
WMRemoveLeafForTreeNode(WMTreeNode *aNode, void *leaf)
{
int index;
wassertr(aNode!=NULL);
wassertr(aNode->leaves!=NULL);
index = WMFindInArray(aNode->leaves, sameData, leaf);
if (index != WANotFound) {
WMDeleteFromArray(aNode->leaves, index);
}
}
void*
WMReplaceDataForTreeNode(WMTreeNode *aNode, void *newData)
{
void *old;
wassertrv(aNode!=NULL, NULL);
old = aNode->data;
aNode->data = newData;
return old;
}
void*
WMGetDataForTreeNode(WMTreeNode *aNode)
{
return aNode->data;
}
int
WMGetTreeNodeDepth(WMTreeNode *aNode)
{
return aNode->depth;
}
WMTreeNode*
WMGetParentForTreeNode(WMTreeNode *aNode)
{
return aNode->parent;
}
void
WMSortLeavesForTreeNode(WMTreeNode *aNode, WMCompareDataProc *comparer)
{
wassertr(aNode!=NULL);
if (aNode->leaves) {
WMSortArray(aNode->leaves, comparer);
}
}
static void
sortLeavesForNode(WMTreeNode *aNode, WMCompareDataProc *comparer)
{
int i;
if (!aNode->leaves)
return;
WMSortArray(aNode->leaves, comparer);
for (i=0; i<WMGetArrayItemCount(aNode->leaves); i++) {
sortLeavesForNode(WMGetFromArray(aNode->leaves, i), comparer);
}
}
void
WMSortTree(WMTreeNode *aNode, WMCompareDataProc *comparer)
{
wassertr(aNode!=NULL);
sortLeavesForNode(aNode, comparer);
}
static WMTreeNode*
findNodeInTree(WMTreeNode *aNode, WMMatchDataProc *match, void *cdata)
{
if (match==NULL) {
if (aNode->data == cdata) {
return aNode;
}
} else {
if ((*match)(aNode->data, cdata)) {
return aNode;
}
}
if (aNode->leaves) {
WMTreeNode *leaf;
int i;
for (i=0; i<WMGetArrayItemCount(aNode->leaves); i++) {
leaf = findNodeInTree(WMGetFromArray(aNode->leaves, i), match, cdata);
if (leaf) {
return leaf;
}
}
}
return NULL;
}
WMTreeNode*
WMFindInTree(WMTreeNode *aTree, WMMatchDataProc *match, void *cdata)
{
wassertrv(aTree!=NULL, NULL);
return findNodeInTree(aTree, match, cdata);
}

View File

@@ -1,22 +1,17 @@
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <sys/stat.h>
#include "../src/config.h"
#include "WINGs.h"
#include "WUtil.h"
#include <proplist.h>
typedef struct W_UserDefaults {
proplist_t defaults;
proplist_t appDomain;
proplist_t searchListArray;
@@ -24,52 +19,35 @@ typedef struct W_UserDefaults {
char dirty;
char dontSync;
char *path; /* where is db located */
time_t timestamp; /* last modification time */
struct W_UserDefaults *next;
} UserDefaults;
static UserDefaults *sharedUserDefaults = NULL;
char *WMUserDefaultsDidChangeNotification = "WMUserDefaultsDidChangeNotification";
extern char *WMGetApplicationName();
#define DEFAULTS_DIR "/Defaults"
#define UD_SYNC_INTERVAL 2000
char*
wusergnusteppath()
{
static char *path = NULL;
char *path;
char *gspath;
int pathlen;
if (!path) {
gspath = getenv("GNUSTEP_USER_ROOT");
if (gspath) {
gspath = wexpandpath(gspath);
pathlen = strlen(gspath) + 4;
path = wmalloc(pathlen);
strcpy(path, gspath);
wfree(gspath);
} else {
pathlen = strlen(wgethomedir()) + 10;
path = wmalloc(pathlen);
strcpy(path, wgethomedir());
strcat(path, "/GNUstep");
}
gspath = getenv("GNUSTEP_USER_ROOT");
if (gspath) {
gspath = wexpandpath(gspath);
pathlen = strlen(gspath) + 4;
path = wmalloc(pathlen);
strcpy(path, gspath);
free(gspath);
} else {
pathlen = strlen(wgethomedir()) + 10;
path = wmalloc(pathlen);
strcpy(path, wgethomedir());
strcat(path, "/GNUstep");
}
return path;
@@ -85,6 +63,7 @@ wdefaultspathfordomain(char *domain)
gspath = wusergnusteppath();
path = wmalloc(strlen(gspath)+strlen(DEFAULTS_DIR)+strlen(domain)+4);
strcpy(path, gspath);
free(gspath);
strcat(path, DEFAULTS_DIR);
strcat(path, "/");
strcat(path, domain);
@@ -94,332 +73,106 @@ wdefaultspathfordomain(char *domain)
static void
#ifndef HAVE_ATEXIT
saveDefaultsChanges(int foo, void *bar)
#else
saveDefaultsChanges(void)
#endif
{
/* save the user defaults databases */
UserDefaults *tmp = sharedUserDefaults;
while (tmp) {
WMSynchronizeUserDefaults(tmp);
tmp = tmp->next;
}
}
/* set to save changes in defaults when program is exited */
static void
registerSaveOnExit(void)
{
static Bool registeredSaveOnExit = False;
if (!registeredSaveOnExit) {
#ifndef HAVE_ATEXIT
on_exit(saveDefaultsChanges, (void*)NULL);
#else
atexit(saveDefaultsChanges);
#endif
registeredSaveOnExit = True;
}
}
static void
synchronizeUserDefaults(void *foo)
{
UserDefaults *database = sharedUserDefaults;
while (database) {
if (!database->dontSync)
WMSynchronizeUserDefaults(database);
database = database->next;
}
WMAddTimerHandler(UD_SYNC_INTERVAL, synchronizeUserDefaults, NULL);
}
static void
addSynchronizeTimerHandler(void)
{
static Bool initialized = False;
if (!initialized) {
WMAddTimerHandler(UD_SYNC_INTERVAL, synchronizeUserDefaults, NULL);
initialized = True;
}
}
void
WMEnableUDPeriodicSynchronization(WMUserDefaults *database, Bool enable)
{
database->dontSync = !enable;
}
void
WMSynchronizeUserDefaults(WMUserDefaults *database)
{
Bool fileIsNewer = False, release = False;
char *path;
struct stat stbuf;
if (!database->path) {
path = wdefaultspathfordomain(WMGetApplicationName());
release = True;
} else {
path = database->path;
}
if (stat(path, &stbuf) >= 0 && stbuf.st_mtime > database->timestamp)
fileIsNewer = True;
if (database->appDomain && (database->dirty || fileIsNewer)) {
/*fprintf(stderr, "syncing: %s %d %d\n", path, database->dirty, fileIsNewer);*/
PLShallowSynchronize(database->appDomain);
database->dirty = 0;
if (stat(path, &stbuf) >= 0)
database->timestamp = stbuf.st_mtime;
if (fileIsNewer) {
WMPostNotificationName(WMUserDefaultsDidChangeNotification,
database, NULL);
}
}
if (release)
wfree(path);
}
void
WMSaveUserDefaults(WMUserDefaults *database)
{
if (database->appDomain) {
struct stat stbuf;
char *path;
Bool release = False;
PLSave(database->appDomain, YES);
database->dirty = 0;
if (!database->path) {
path = wdefaultspathfordomain(WMGetApplicationName());
release = True;
} else {
path = database->path;
}
if (stat(path, &stbuf) >= 0)
database->timestamp = stbuf.st_mtime;
if (release)
wfree(path);
if (sharedUserDefaults && sharedUserDefaults->dirty) {
PLSave(sharedUserDefaults->appDomain, YES);
}
}
WMUserDefaults*
WMGetStandardUserDefaults(void)
{
WMUserDefaults *defaults;
proplist_t domain;
proplist_t key;
struct stat stbuf;
char *path;
int i;
{
if (!sharedUserDefaults) {
WMUserDefaults *defaults;
proplist_t domain;
proplist_t key;
char *path;
int i;
if (sharedUserDefaults) {
defaults = sharedUserDefaults;
while (defaults) {
/* Trick, path == NULL only for StandardUserDefaults db */
if (defaults->path == NULL)
return defaults;
defaults = defaults->next;
}
defaults = wmalloc(sizeof(WMUserDefaults));
memset(defaults, 0, sizeof(WMUserDefaults));
defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
defaults->searchList = wmalloc(sizeof(proplist_t)*3);
/* application domain */
key = PLMakeString(WMGetApplicationName());
defaults->searchList[0] = key;
/* temporary kluge */
if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
domain = NULL;
path = NULL;
} else {
path = wdefaultspathfordomain(PLGetString(key));
domain = PLGetProplistWithPath(path);
}
if (!domain) {
proplist_t p;
domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
if (path) {
p = PLMakeString(path);
PLSetFilename(domain, p);
PLRelease(p);
}
}
if (path)
free(path);
defaults->appDomain = domain;
if (domain)
PLInsertDictionaryEntry(defaults->defaults, key, domain);
PLRelease(key);
/* global domain */
key = PLMakeString("WMGLOBAL");
defaults->searchList[1] = key;
path = wdefaultspathfordomain(PLGetString(key));
domain = PLGetProplistWithPath(path);
free(path);
if (!domain)
domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
if (domain)
PLInsertDictionaryEntry(defaults->defaults, key, domain);
PLRelease(key);
/* terminate list */
defaults->searchList[2] = NULL;
defaults->searchListArray=PLMakeArrayFromElements(NULL,NULL);
i = 0;
while (defaults->searchList[i]) {
PLAppendArrayElement(defaults->searchListArray,
defaults->searchList[i]);
i++;
}
sharedUserDefaults = defaults;
/* set to save changes in defaults when program is exited */
atexit(saveDefaultsChanges);
}
/* we didn't found the database we are looking for. Go read it. */
defaults = wmalloc(sizeof(WMUserDefaults));
memset(defaults, 0, sizeof(WMUserDefaults));
defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
defaults->searchList = wmalloc(sizeof(proplist_t)*3);
/* application domain */
key = PLMakeString(WMGetApplicationName());
defaults->searchList[0] = key;
/* temporary kluge */
if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
domain = NULL;
path = NULL;
} else {
path = wdefaultspathfordomain(PLGetString(key));
if (stat(path, &stbuf) >= 0)
defaults->timestamp = stbuf.st_mtime;
domain = PLGetProplistWithPath(path);
}
if (!domain) {
proplist_t p;
domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
if (path) {
p = PLMakeString(path);
PLSetFilename(domain, p);
PLRelease(p);
}
}
if (path)
wfree(path);
defaults->appDomain = domain;
if (domain)
PLInsertDictionaryEntry(defaults->defaults, key, domain);
PLRelease(key);
/* global domain */
key = PLMakeString("WMGLOBAL");
defaults->searchList[1] = key;
path = wdefaultspathfordomain(PLGetString(key));
domain = PLGetProplistWithPath(path);
wfree(path);
if (!domain)
domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
if (domain)
PLInsertDictionaryEntry(defaults->defaults, key, domain);
PLRelease(key);
/* terminate list */
defaults->searchList[2] = NULL;
defaults->searchListArray = PLMakeArrayFromElements(NULL,NULL);
i = 0;
while (defaults->searchList[i]) {
PLAppendArrayElement(defaults->searchListArray,
defaults->searchList[i]);
i++;
}
if (sharedUserDefaults)
defaults->next = sharedUserDefaults;
sharedUserDefaults = defaults;
addSynchronizeTimerHandler();
registerSaveOnExit();
return defaults;
return sharedUserDefaults;
}
WMUserDefaults*
WMGetDefaultsFromPath(char *path)
{
WMUserDefaults *defaults;
proplist_t domain;
proplist_t key;
struct stat stbuf;
char *name;
int i;
assert(path != NULL);
if (sharedUserDefaults) {
defaults = sharedUserDefaults;
while (defaults) {
if (defaults->path && strcmp(defaults->path, path) == 0)
return defaults;
defaults = defaults->next;
}
}
/* we didn't found the database we are looking for. Go read it. */
defaults = wmalloc(sizeof(WMUserDefaults));
memset(defaults, 0, sizeof(WMUserDefaults));
defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
defaults->searchList = wmalloc(sizeof(proplist_t)*2);
/* the domain we want, go in the first position */
name = strrchr(path, '/');
if (!name)
name = path;
else
name++;
key = PLMakeString(name);
defaults->searchList[0] = key;
if (stat(path, &stbuf) >= 0)
defaults->timestamp = stbuf.st_mtime;
domain = PLGetProplistWithPath(path);
if (!domain) {
proplist_t p;
domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
p = PLMakeString(path);
PLSetFilename(domain, p);
PLRelease(p);
}
defaults->path = wstrdup(path);
defaults->appDomain = domain;
if (domain)
PLInsertDictionaryEntry(defaults->defaults, key, domain);
PLRelease(key);
/* terminate list */
defaults->searchList[1] = NULL;
defaults->searchListArray = PLMakeArrayFromElements(NULL,NULL);
i = 0;
while (defaults->searchList[i]) {
PLAppendArrayElement(defaults->searchListArray,
defaults->searchList[i]);
i++;
}
if (sharedUserDefaults)
defaults->next = sharedUserDefaults;
sharedUserDefaults = defaults;
addSynchronizeTimerHandler();
registerSaveOnExit();
return defaults;
}
/* Returns a PLArray with all keys in the user defaults database.
* Free the returned array with PLRelease() when no longer needed,
* but do not free the elements of the array! They're just references. */
proplist_t
WMGetUDAllKeys(WMUserDefaults *database)
{
return PLGetAllDictionaryKeys(database->appDomain);
}
proplist_t
WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName)
@@ -482,7 +235,7 @@ WMGetUDStringForKey(WMUserDefaults *database, char *defaultName)
if (!PLIsString(val))
return NULL;
return PLGetString(val);
return wstrdup(PLGetString(val));
}
@@ -513,7 +266,7 @@ WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName)
float
int
WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
{
proplist_t val;
@@ -522,12 +275,16 @@ WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
val = WMGetUDObjectForKey(database, defaultName);
if (!val || !PLIsString(val))
if (!val)
return 0.0;
if (!(str = PLGetString(val)))
if (!PLIsString(val))
return 0.0;
str = PLGetString(val);
if (!str)
return 0.0;
if (sscanf(str, "%f", &value)!=1)
return 0.0;
@@ -644,7 +401,7 @@ WMSetUDSearchList(WMUserDefaults *database, proplist_t list)
PLRelease(database->searchList[i]);
i++;
}
wfree(database->searchList);
free(database->searchList);
}
if (database->searchListArray) {
PLRelease(database->searchListArray);

View File

@@ -7,19 +7,17 @@
# include <sys/time.h>
#endif
#ifdef _AIX
#include <sys/select.h>
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#include <unistd.h>
#include <string.h>
#if defined(HAVE_SELECT)
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
void
wusleep(unsigned int microsecs)

View File

@@ -4,10 +4,38 @@
#include "WINGsP.h"
#include <X11/Xutil.h>
/* Xmd.h which is indirectly included by GNUstep.h defines BOOL,
* but libPropList also defines it. So we do this kluge to get rid of BOOL
* temporarily */
#ifdef BOOL
# define WINGS_BOOL
# undef BOOL
#endif
#include "GNUstep.h"
#ifdef WINGS_BOOL
# define BOOL
# undef WINGS_BOOL
#endif
extern void W_ReadConfigurations(void);
extern void W_InitNotificationCenter(void);
typedef struct W_Application {
char *applicationName;
int argc;
char **argv;
char *resourcePath;
} W_Application;
struct W_Application WMApplication;
@@ -44,6 +72,9 @@ WMInitializeApplication(char *applicationName, int *argc, char **argv)
/* initialize notification center */
W_InitNotificationCenter();
/* read general configuration data for WINGs */
W_ReadConfigurations();
}
@@ -51,7 +82,7 @@ void
WMSetResourcePath(char *path)
{
if (WMApplication.resourcePath)
wfree(WMApplication.resourcePath);
free(WMApplication.resourcePath);
WMApplication.resourcePath = wstrdup(path);
}
@@ -84,7 +115,7 @@ checkFile(char *path, char *folder, char *ext, char *resource)
strcat(ret, resource);
if (access(ret, F_OK)!=0) {
wfree(ret);
free(ret);
ret = NULL;
}
@@ -128,18 +159,18 @@ WMPathForResourceOfType(char *resource, char *ext)
} else {
path = NULL;
}
wfree(tmp);
free(tmp);
if (path)
return path;
}
appdir = wmalloc(strlen(WMApplication.applicationName)+10);
appdir = wmalloc(strlen(WMApplication.applicationName)+8);
sprintf(appdir, "Apps/%s.app", WMApplication.applicationName);
if (getenv("GNUSTEP_USER_ROOT")) {
path = checkFile(getenv("GNUSTEP_USER_ROOT"), appdir, ext, resource);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
}
@@ -147,8 +178,9 @@ WMPathForResourceOfType(char *resource, char *ext)
tmp = wusergnusteppath();
if (tmp) {
path = checkFile(tmp, appdir, ext, resource);
free(tmp);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
}
@@ -156,14 +188,14 @@ WMPathForResourceOfType(char *resource, char *ext)
if (getenv("GNUSTEP_LOCAL_ROOT")) {
path = checkFile(getenv("GNUSTEP_LOCAL_ROOT"), appdir, ext, resource);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
}
path = checkFile("/usr/local/GNUstep", appdir, ext, resource);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
@@ -171,14 +203,14 @@ WMPathForResourceOfType(char *resource, char *ext)
if (getenv("GNUSTEP_SYSTEM_ROOT")) {
path = checkFile(getenv("GNUSTEP_SYSTEM_ROOT"), appdir, ext, resource);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
}
path = checkFile("/usr/GNUstep", appdir, ext, resource);
if (path) {
wfree(appdir);
free(appdir);
return path;
}
@@ -186,3 +218,84 @@ WMPathForResourceOfType(char *resource, char *ext)
}
/********************* WMScreen related stuff ********************/
void
WMSetApplicationIconImage(WMScreen *scr, WMPixmap *icon)
{
if (scr->applicationIcon)
WMReleasePixmap(scr->applicationIcon);
scr->applicationIcon = WMRetainPixmap(icon);
if (scr->groupLeader) {
XWMHints *hints;
hints = XGetWMHints(scr->display, scr->groupLeader);
hints->flags |= IconPixmapHint|IconMaskHint;
hints->icon_pixmap = icon->pixmap;
hints->icon_mask = icon->mask;
XSetWMHints(scr->display, scr->groupLeader, hints);
XFree(hints);
}
}
WMPixmap*
WMGetApplicationIconImage(WMScreen *scr)
{
return scr->applicationIcon;
}
void
WMSetApplicationHasAppIcon(WMScreen *scr, Bool flag)
{
scr->aflags.hasAppIcon = flag;
}
void
W_InitApplication(WMScreen *scr)
{
Window leader;
XClassHint *classHint;
XWMHints *hints;
leader = XCreateSimpleWindow(scr->display, scr->rootWin, -1, -1,
1, 1, 0, 0, 0);
if (!scr->aflags.simpleApplication) {
classHint = XAllocClassHint();
classHint->res_name = "groupLeader";
classHint->res_class = WMApplication.applicationName;
XSetClassHint(scr->display, leader, classHint);
XFree(classHint);
XSetCommand(scr->display, leader, WMApplication.argv,
WMApplication.argc);
hints = XAllocWMHints();
hints->flags = WindowGroupHint;
hints->window_group = leader;
if (scr->applicationIcon) {
hints->flags |= IconPixmapHint;
hints->icon_pixmap = scr->applicationIcon->pixmap;
if (scr->applicationIcon->mask) {
hints->flags |= IconMaskHint;
hints->icon_mask = scr->applicationIcon->mask;
}
}
XSetWMHints(scr->display, leader, hints);
XFree(hints);
}
scr->groupLeader = leader;
}

View File

@@ -1,185 +0,0 @@
#include <unistd.h>
#include "WINGsP.h"
#include <X11/Xutil.h>
/* Xmd.h which is indirectly included by GNUstep.h defines BOOL,
* but libPropList also defines it. So we do this kluge to get rid of BOOL
* temporarily */
#ifdef BOOL
# define WINGS_BOOL
# undef BOOL
#endif
#include "GNUstep.h"
#ifdef WINGS_BOOL
# define BOOL
# undef WINGS_BOOL
#endif
extern struct W_Application WMApplication;
void
WMSetApplicationIconWindow(WMScreen *scr, Window window)
{
scr->applicationIconWindow = window;
if (scr->groupLeader) {
XWMHints *hints;
hints = XGetWMHints(scr->display, scr->groupLeader);
hints->flags |= IconWindowHint;
hints->icon_window = window;
XSetWMHints(scr->display, scr->groupLeader, hints);
XFree(hints);
}
}
void
WMSetApplicationIconImage(WMScreen *scr, RImage *image)
{
WMPixmap *icon;
if (scr->applicationIconImage == image)
return;
if (scr->applicationIconImage)
RReleaseImage(scr->applicationIconImage);
scr->applicationIconImage = RRetainImage(image);
/* TODO: check whether we should set the pixmap only if there's none yet */
if (image!=NULL && (icon=WMCreatePixmapFromRImage(scr, image, 128))!=NULL) {
WMSetApplicationIconPixmap(scr, icon);
WMReleasePixmap(icon);
}
}
RImage*
WMGetApplicationIconImage(WMScreen *scr)
{
return scr->applicationIconImage;
}
void
WMSetApplicationIconPixmap(WMScreen *scr, WMPixmap *icon)
{
if (scr->applicationIconPixmap == icon)
return;
if (scr->applicationIconPixmap)
WMReleasePixmap(scr->applicationIconPixmap);
scr->applicationIconPixmap = WMRetainPixmap(icon);
if (scr->groupLeader) {
XWMHints *hints;
hints = XGetWMHints(scr->display, scr->groupLeader);
hints->flags |= IconPixmapHint|IconMaskHint;
hints->icon_pixmap = (icon!=NULL ? icon->pixmap : None);
hints->icon_mask = (icon!=NULL ? icon->mask : None);
XSetWMHints(scr->display, scr->groupLeader, hints);
XFree(hints);
}
}
WMPixmap*
WMGetApplicationIconPixmap(WMScreen *scr)
{
return scr->applicationIconPixmap;
}
WMPixmap*
WMCreateApplicationIconBlendedPixmap(WMScreen *scr, RColor *color)
{
WMPixmap *pix;
if (scr->applicationIconImage) {
RColor gray;
gray.red = 0xae;
gray.green = 0xaa;
gray.blue = 0xae;
gray.alpha = 0;
if (!color)
color = &gray;
pix = WMCreateBlendedPixmapFromRImage(scr, scr->applicationIconImage,
color);
} else {
pix = NULL;
}
return pix;
}
void
WMSetApplicationHasAppIcon(WMScreen *scr, Bool flag)
{
scr->aflags.hasAppIcon = flag;
}
void
W_InitApplication(WMScreen *scr)
{
Window leader;
XClassHint *classHint;
XWMHints *hints;
leader = XCreateSimpleWindow(scr->display, scr->rootWin, -1, -1,
1, 1, 0, 0, 0);
if (!scr->aflags.simpleApplication) {
classHint = XAllocClassHint();
classHint->res_name = "groupLeader";
classHint->res_class = WMApplication.applicationName;
XSetClassHint(scr->display, leader, classHint);
XFree(classHint);
XSetCommand(scr->display, leader, WMApplication.argv,
WMApplication.argc);
hints = XAllocWMHints();
hints->flags = WindowGroupHint;
hints->window_group = leader;
/* This code will never actually be reached, because to have
* scr->applicationIconPixmap set we need to have a screen first,
* but this function is called in the screen creation process.
* -Dan
*/
if (scr->applicationIconPixmap) {
hints->flags |= IconPixmapHint;
hints->icon_pixmap = scr->applicationIconPixmap->pixmap;
if (scr->applicationIconPixmap->mask) {
hints->flags |= IconMaskHint;
hints->icon_mask = scr->applicationIconPixmap->mask;
}
}
XSetWMHints(scr->display, leader, hints);
XFree(hints);
}
scr->groupLeader = leader;
}

View File

@@ -1,481 +0,0 @@
#include "../src/config.h"
#include "WINGsP.h"
#ifdef SHAPE
#include <X11/extensions/shape.h>
#endif
typedef struct W_Balloon {
W_View *view;
WMHashTable *table; /* Table from view ptr to text */
WMColor *backColor;
WMColor *textColor;
WMFont *font;
WMHandlerID timer; /* timer for showing balloon */
WMHandlerID noDelayTimer;
int delay;
Window forWindow; /* window for which the balloon
* is being show in the moment */
struct {
WMAlignment alignment:2;
unsigned enabled:1;
unsigned noDelay:1;
} flags;
} Balloon;
#define DEFAULT_WIDTH 60
#define DEFAULT_HEIGHT 14
#define DEFAULT_ALIGNMENT WALeft
#define DEFAULT_DELAY 500
#define NO_DELAY_DELAY 150
static void destroyBalloon(Balloon *bPtr);
static void handleEvents(XEvent *event, void *data);
static void showText(Balloon *bPtr, int x, int y, int w, int h, char *text);
struct W_Balloon*
W_CreateBalloon(WMScreen *scr)
{
Balloon *bPtr;
bPtr = wmalloc(sizeof(Balloon));
memset(bPtr, 0, sizeof(Balloon));
bPtr->view = W_CreateUnmanagedTopView(scr);
if (!bPtr->view) {
wfree(bPtr);
return NULL;
}
bPtr->view->self = bPtr;
bPtr->textColor = WMRetainColor(bPtr->view->screen->black);
WMCreateEventHandler(bPtr->view, StructureNotifyMask, handleEvents, bPtr);
W_ResizeView(bPtr->view, DEFAULT_WIDTH, DEFAULT_HEIGHT);
bPtr->flags.alignment = DEFAULT_ALIGNMENT;
bPtr->table = WMCreateHashTable(WMIntHashCallbacks);
bPtr->delay = DEFAULT_DELAY;
bPtr->flags.enabled = 1;
return bPtr;
}
void
WMSetBalloonTextAlignment(WMScreen *scr, WMAlignment alignment)
{
scr->balloon->flags.alignment = alignment;
}
void
WMSetBalloonTextForView(char *text, WMView *view)
{
char *oldText = NULL;
WMScreen *scr = view->screen;
if (text) {
oldText = WMHashInsert(scr->balloon->table, view, wstrdup(text));
} else {
oldText = WMHashGet(scr->balloon->table, view);
WMHashRemove(scr->balloon->table, view);
}
if (oldText) {
wfree(oldText);
}
}
void
WMSetBalloonFont(WMScreen *scr, WMFont *font)
{
Balloon *bPtr = scr->balloon;
if (bPtr->font!=NULL)
WMReleaseFont(bPtr->font);
if (font)
bPtr->font = WMRetainFont(font);
else
bPtr->font = NULL;
}
void
WMSetBalloonTextColor(WMScreen *scr, WMColor *color)
{
Balloon *bPtr = scr->balloon;
if (bPtr->textColor)
WMReleaseColor(bPtr->textColor);
bPtr->textColor = WMRetainColor(color);
}
void
WMSetBalloonDelay(WMScreen *scr, int delay)
{
scr->balloon->delay = delay;
}
void
WMSetBalloonEnabled(WMScreen *scr, Bool flag)
{
scr->balloon->flags.enabled = flag;
W_UnmapView(scr->balloon->view);
}
static void
clearNoDelay(void *data)
{
Balloon *bPtr = (Balloon*)data;
bPtr->flags.noDelay = 0;
bPtr->noDelayTimer = NULL;
}
void
W_BalloonHandleLeaveView(WMView *view)
{
Balloon *bPtr = view->screen->balloon;
if (bPtr->forWindow == view->window) {
if (bPtr->view->flags.mapped) {
W_UnmapView(bPtr->view);
bPtr->noDelayTimer = WMAddTimerHandler(NO_DELAY_DELAY,
clearNoDelay, bPtr);
}
if (bPtr->timer)
WMDeleteTimerHandler(bPtr->timer);
bPtr->timer = NULL;
bPtr->forWindow = None;
}
}
/*
* botar balao perto do cursor
* so mapear balao se o mouse ficar parado pelo delay
*
*/
static void
showBalloon(void *data)
{
char *text;
WMView *view = (WMView*)data;
Balloon *bPtr = view->screen->balloon;
int x, y;
Window foo;
bPtr->timer = NULL;
text = WMHashGet(bPtr->table, view);
if (!text)
return;
XTranslateCoordinates(view->screen->display, view->window,
view->screen->rootWin, 0, 0, &x, &y, &foo);
if (!bPtr->view->flags.realized)
W_RealizeView(bPtr->view);
showText(bPtr, x, y, view->size.width, view->size.height, text);
bPtr->flags.noDelay = 1;
}
void
W_BalloonHandleEnterView(WMView *view)
{
Balloon *bPtr = view->screen->balloon;
char *text;
if (!bPtr->flags.enabled)
return;
text = WMHashGet(bPtr->table, view);
if (!text) {
if (bPtr->view->flags.realized)
W_UnmapView(bPtr->view);
return;
}
if (bPtr->timer)
WMDeleteTimerHandler(bPtr->timer);
bPtr->timer = NULL;
if (bPtr->noDelayTimer)
WMDeleteTimerHandler(bPtr->noDelayTimer);
bPtr->noDelayTimer = NULL;
bPtr->forWindow = view->window;
if (bPtr->flags.noDelay) {
bPtr->timer = NULL;
showBalloon(view);
} else {
bPtr->timer = WMAddTimerHandler(bPtr->delay, showBalloon, view);
}
}
#define TOP 0
#define BOTTOM 1
#define LEFT 0
#define RIGHT 2
#define TLEFT (TOP|LEFT)
#define TRIGHT (TOP|RIGHT)
#define BLEFT (BOTTOM|LEFT)
#define BRIGHT (BOTTOM|RIGHT)
#define SPACE 12
static void
drawBalloon(Display *dpy, Pixmap pix, GC gc, int x, int y, int w, int h,
int side)
{
int rad = h*3/10;
XPoint pt[3];
XFillArc(dpy, pix, gc, x, y, rad, rad, 90*64, 90*64);
XFillArc(dpy, pix, gc, x, y+h-1-rad, rad, rad, 180*64, 90*64);
XFillArc(dpy, pix, gc, x+w-1-rad, y, rad, rad, 0*64, 90*64);
XFillArc(dpy, pix, gc, x+w-1-rad, y+h-1-rad, rad, rad, 270*64, 90*64);
XFillRectangle(dpy, pix, gc, x, y+rad/2, w, h-rad);
XFillRectangle(dpy, pix, gc, x+rad/2, y, w-rad, h);
if (side & BOTTOM) {
pt[0].y = y+h-1;
pt[1].y = y+h-1+SPACE;
pt[2].y = y+h-1;
} else {
pt[0].y = y;
pt[1].y = y-SPACE;
pt[2].y = y;
}
if (side & RIGHT) {
pt[0].x = x+w-h+2*h/16;
pt[1].x = x+w-h+11*h/16;
pt[2].x = x+w-h+7*h/16;
} else {
pt[0].x = x+h-2*h/16;
pt[1].x = x+h-11*h/16;
pt[2].x = x+h-7*h/16;
}
XFillPolygon(dpy, pix, gc, pt, 3, Convex, CoordModeOrigin);
}
static Pixmap
makePixmap(WMScreen *scr, int width, int height, int side, Pixmap *mask)
{
Display *dpy = WMScreenDisplay(scr);
Pixmap bitmap;
Pixmap pixmap;
int x, y;
WMColor *black = WMBlackColor(scr);
WMColor *white = WMWhiteColor(scr);
bitmap = XCreatePixmap(dpy, scr->rootWin, width+SPACE, height+SPACE, 1);
XSetForeground(dpy, scr->monoGC, 0);
XFillRectangle(dpy, bitmap, scr->monoGC, 0, 0, width+SPACE, height+SPACE);
pixmap = XCreatePixmap(dpy, scr->rootWin, width+SPACE, height+SPACE,
scr->depth);
XFillRectangle(dpy, pixmap, WMColorGC(black), 0, 0,
width+SPACE, height+SPACE);
if (side & BOTTOM) {
y = 0;
} else {
y = SPACE;
}
x = 0;
XSetForeground(dpy, scr->monoGC, 1);
drawBalloon(dpy, bitmap, scr->monoGC, x, y, width, height, side);
drawBalloon(dpy, pixmap, WMColorGC(white), x+1, y+1, width-2, height-2,
side);
*mask = bitmap;
WMReleaseColor(black);
WMReleaseColor(white);
return pixmap;
}
static void
showText(Balloon *bPtr, int x, int y, int h, int w, char *text)
{
WMScreen *scr = bPtr->view->screen;
Display *dpy = WMScreenDisplay(scr);
int width;
int height;
Pixmap pixmap;
Pixmap mask;
WMFont *font = bPtr->font ? bPtr->font : scr->normalFont;
int textHeight;
int side = 0;
int ty;
int bx, by;
{
int w;
char *ptr, *ptr2;
ptr2 = ptr = text;
width = 0;
while (ptr && ptr2) {
ptr2 = strchr(ptr, '\n');
if (ptr2) {
w = WMWidthOfString(font, ptr, ptr2 - ptr);
} else {
w = WMWidthOfString(font, ptr, strlen(ptr));
}
if (w > width)
width = w;
ptr = ptr2 + 1;
}
}
width += 16;
textHeight = W_GetTextHeight(font, text, width, False);
height = textHeight + 4;
if (height < 16)
height = 16;
if (width < height)
width = height;
if (x + width > scr->rootView->size.width) {
side = RIGHT;
bx = x - width + w/2;
if (bx < 0)
bx = 0;
} else {
side = LEFT;
bx = x + w/2;
}
if (bx + width > scr->rootView->size.width)
bx = scr->rootView->size.width - width;
if (y - (height + SPACE) < 0) {
side |= TOP;
by = y+h-1;
ty = SPACE;
} else {
side |= BOTTOM;
by = y - (height + SPACE);
ty = 0;
}
pixmap = makePixmap(scr, width, height, side, &mask);
W_PaintText(bPtr->view, pixmap, font, 8, ty + (height - textHeight)/2,
width, bPtr->flags.alignment,
WMColorGC(bPtr->textColor ? bPtr->textColor : scr->black),
False, text, strlen(text));
XSetWindowBackgroundPixmap(dpy, bPtr->view->window, pixmap);
W_ResizeView(bPtr->view, width, height+SPACE);
XFreePixmap(dpy, pixmap);
#ifdef SHAPE
XShapeCombineMask(dpy, bPtr->view->window, ShapeBounding, 0, 0, mask,
ShapeSet);
#endif
XFreePixmap(dpy, mask);
W_MoveView(bPtr->view, bx, by);
W_MapView(bPtr->view);
}
static void
handleEvents(XEvent *event, void *data)
{
Balloon *bPtr = (Balloon*)data;
switch (event->type) {
case DestroyNotify:
destroyBalloon(bPtr);
break;
}
}
static void
destroyBalloon(Balloon *bPtr)
{
WMHashEnumerator e;
char *str;
e = WMEnumerateHashTable(bPtr->table);
while ((str = WMNextHashEnumeratorItem(&e))) {
wfree(str);
}
WMFreeHashTable(bPtr->table);
if (bPtr->textColor)
WMReleaseColor(bPtr->textColor);
if (bPtr->font)
WMReleaseFont(bPtr->font);
wfree(bPtr);
}

View File

@@ -1,272 +0,0 @@
#include "WINGsP.h"
typedef struct {
WMView *view;
int minSize;
int maxSize;
int space;
unsigned expand:1;
unsigned fill:1;
unsigned end:1;
} SubviewItem;
typedef struct W_Box {
W_Class widgetClass;
W_View *view;
SubviewItem *subviews;
int subviewCount;
short borderWidth;
unsigned horizontal:1;
} Box;
#define DEFAULT_WIDTH 40
#define DEFAULT_HEIGHT 40
static void destroyBox(Box *bPtr);
static void handleEvents(XEvent *event, void *data);
static void didResize(struct W_ViewDelegate*, WMView*);
static W_ViewDelegate delegate = {
NULL,
NULL,
didResize,
NULL,
NULL
};
WMBox*
WMCreateBox(WMWidget *parent)
{
Box *bPtr;
bPtr = wmalloc(sizeof(Box));
memset(bPtr, 0, sizeof(Box));
bPtr->widgetClass = WC_Box;
bPtr->view = W_CreateView(W_VIEW(parent));
if (!bPtr->view) {
wfree(bPtr);
return NULL;
}
bPtr->view->self = bPtr;
bPtr->view->delegate = &delegate;
WMCreateEventHandler(bPtr->view, StructureNotifyMask,
handleEvents, bPtr);
WMResizeWidget(bPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT);
bPtr->subviews = NULL;
bPtr->subviewCount = 0;
return bPtr;
}
static void
rearrange(WMBox *box)
{
int i;
int x, y;
int xe, ye;
int w = 1, h = 1;
int total;
int expands = 0;
x = box->borderWidth;
y = box->borderWidth;
if (box->horizontal) {
ye = box->borderWidth;
xe = WMWidgetWidth(box) - box->borderWidth;
h = WMWidgetHeight(box) - 2 * box->borderWidth;
total = WMWidgetWidth(box) - 2 * box->borderWidth;
} else {
xe = box->borderWidth;
ye = WMWidgetHeight(box) - box->borderWidth;
w = WMWidgetWidth(box) - 2 * box->borderWidth;
total = WMWidgetHeight(box) - 2 * box->borderWidth;
}
if (w <= 0 || h <= 0 || total <= 0) {
return;
}
for (i = 0; i < box->subviewCount; i++) {
total -= box->subviews[i].minSize;
total -= box->subviews[i].space;
if (box->subviews[i].expand) {
expands++;
}
}
for (i = 0; i < box->subviewCount; i++) {
if (box->horizontal) {
w = box->subviews[i].minSize;
if (box->subviews[i].expand)
w += total/expands;
} else {
h = box->subviews[i].minSize;
if (box->subviews[i].expand)
h += total/expands;
}
if (!box->subviews[i].end) {
W_MoveView(box->subviews[i].view, x, y);
}
W_ResizeView(box->subviews[i].view, w, h);
if (box->horizontal) {
if (box->subviews[i].end)
xe -= w + box->subviews[i].space;
else
x += w + box->subviews[i].space;
} else {
if (box->subviews[i].end)
ye -= h + box->subviews[i].space;
else
y += h + box->subviews[i].space;
}
if (box->subviews[i].end) {
W_MoveView(box->subviews[i].view, xe, ye);
}
}
}
void
WMSetBoxBorderWidth(WMBox *box, unsigned width)
{
if (box->borderWidth != width) {
box->borderWidth = width;
rearrange(box);
}
}
void
WMAddBoxSubview(WMBox *bPtr, WMView *view, Bool expand, Bool fill,
int minSize, int maxSize, int space)
{
int i = bPtr->subviewCount;
bPtr->subviewCount++;
if (!bPtr->subviews)
bPtr->subviews = wmalloc(sizeof(SubviewItem));
else
bPtr->subviews = wrealloc(bPtr->subviews,
bPtr->subviewCount*sizeof(SubviewItem));
bPtr->subviews[i].view = view;
bPtr->subviews[i].minSize = minSize;
bPtr->subviews[i].maxSize = maxSize;
bPtr->subviews[i].expand = expand;
bPtr->subviews[i].fill = fill;
bPtr->subviews[i].space = space;
bPtr->subviews[i].end = 0;
rearrange(bPtr);
}
void
WMAddBoxSubviewAtEnd(WMBox *bPtr, WMView *view, Bool expand, Bool fill,
int minSize, int maxSize, int space)
{
int i = bPtr->subviewCount;
bPtr->subviewCount++;
if (!bPtr->subviews)
bPtr->subviews = wmalloc(sizeof(SubviewItem));
else
bPtr->subviews = wrealloc(bPtr->subviews,
bPtr->subviewCount*sizeof(SubviewItem));
bPtr->subviews[i].view = view;
bPtr->subviews[i].minSize = minSize;
bPtr->subviews[i].maxSize = maxSize;
bPtr->subviews[i].expand = expand;
bPtr->subviews[i].fill = fill;
bPtr->subviews[i].space = space;
bPtr->subviews[i].end = 1;
rearrange(bPtr);
}
void
WMRemoveBoxSubview(WMBox *bPtr, WMView *view)
{
int i;
for (i = 0; i < bPtr->subviewCount; i++) {
if (bPtr->subviews[i].view == view) {
memmove(&bPtr->subviews[i], &bPtr->subviews[i+1],
(bPtr->subviewCount - i - 1) * sizeof(void*));
bPtr->subviewCount--;
break;
}
}
rearrange(bPtr);
}
void
WMSetBoxHorizontal(WMBox *box, Bool flag)
{
/* make sure flag is either 0 or 1 no matter what true value was passed */
flag = ((flag==0) ? 0 : 1);
if (box->horizontal != flag) {
box->horizontal = flag;
rearrange(box);
}
}
static void
destroyBox(Box *bPtr)
{
WMRemoveNotificationObserver(bPtr);
wfree(bPtr);
}
static void
didResize(struct W_ViewDelegate *delegate, WMView *view)
{
rearrange(view->self);
}
static void
handleEvents(XEvent *event, void *data)
{
Box *bPtr = (Box*)data;
CHECK_CLASS(data, WC_Box);
switch (event->type) {
case DestroyNotify:
destroyBox(bPtr);
break;
case ConfigureNotify:
rearrange(bPtr);
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -13,16 +13,10 @@ typedef struct W_Button {
char *altCaption;
WMFont *font;
WMColor *textColor;
WMColor *altTextColor;
WMColor *disTextColor;
W_Pixmap *image;
W_Pixmap *altImage;
W_Pixmap *dimage;
void *clientData;
WMAction *action;
@@ -103,6 +97,13 @@ static void handleEvents(XEvent *event, void *data);
static void handleActionEvents(XEvent *event, void *data);
W_ViewProcedureTable _ButtonViewProcedures = {
NULL,
NULL,
NULL
};
static char *WMPushedRadioNotification="WMPushedRadioNotification";
@@ -121,7 +122,7 @@ WMCreateCustomButton(WMWidget *parent, int behaviourMask)
bPtr->view = W_CreateView(W_VIEW(parent));
if (!bPtr->view) {
wfree(bPtr);
free(bPtr);
return NULL;
}
bPtr->view->self = bPtr;
@@ -230,71 +231,14 @@ WMCreateButton(WMWidget *parent, WMButtonType type)
}
static void
updateDisabledMask(WMButton *bPtr)
{
WMScreen *scr = WMWidgetScreen(bPtr);
Display *dpy = scr->display;
if (bPtr->image) {
XGCValues gcv;
bPtr->dimage->mask = XCreatePixmap(dpy, scr->stipple,
bPtr->dimage->width,
bPtr->dimage->height, 1);
XSetForeground(dpy, scr->monoGC, 0);
XFillRectangle(dpy, bPtr->dimage->mask, scr->monoGC, 0, 0,
bPtr->dimage->width, bPtr->dimage->height);
gcv.foreground = 1;
gcv.background = 0;
gcv.stipple = scr->stipple;
gcv.fill_style = FillStippled;
gcv.clip_mask = bPtr->image->mask;
gcv.clip_x_origin = 0;
gcv.clip_y_origin = 0;
XChangeGC(dpy, scr->monoGC, GCForeground|GCBackground|GCStipple
|GCFillStyle|GCClipMask|GCClipXOrigin|GCClipYOrigin, &gcv);
XFillRectangle(dpy, bPtr->dimage->mask, scr->monoGC, 0, 0,
bPtr->dimage->width, bPtr->dimage->height);
gcv.fill_style = FillSolid;
gcv.clip_mask = None;
XChangeGC(dpy, scr->monoGC, GCFillStyle|GCClipMask, &gcv);
}
}
void
WMSetButtonImageDefault(WMButton *bPtr)
{
WMSetButtonImage (bPtr, WMWidgetScreen(bPtr)->buttonArrow);
WMSetButtonAltImage (bPtr, WMWidgetScreen(bPtr)->pushedButtonArrow);
}
void
WMSetButtonImage(WMButton *bPtr, WMPixmap *image)
{
if (bPtr->image!=NULL)
WMReleasePixmap(bPtr->image);
bPtr->image = WMRetainPixmap(image);
if (bPtr->dimage) {
bPtr->dimage->pixmap = None;
WMReleasePixmap(bPtr->dimage);
bPtr->dimage = NULL;
}
if (image) {
bPtr->dimage = WMCreatePixmapFromXPixmaps(WMWidgetScreen(bPtr),
image->pixmap, None,
image->width, image->height,
image->depth);
updateDisabledMask(bPtr);
}
if (bPtr->view->flags.realized) {
paintButton(bPtr);
}
@@ -344,7 +288,7 @@ void
WMSetButtonText(WMButton *bPtr, char *text)
{
if (bPtr->caption)
wfree(bPtr->caption);
free(bPtr->caption);
if (text!=NULL) {
bPtr->caption = wstrdup(text);
@@ -363,7 +307,7 @@ void
WMSetButtonAltText(WMButton *bPtr, char *text)
{
if (bPtr->altCaption)
wfree(bPtr->altCaption);
free(bPtr->altCaption);
if (text!=NULL) {
bPtr->altCaption = wstrdup(text);
@@ -377,46 +321,14 @@ WMSetButtonAltText(WMButton *bPtr, char *text)
}
void
WMSetButtonTextColor(WMButton *bPtr, WMColor *color)
{
if (bPtr->textColor)
WMReleaseColor(bPtr->textColor);
bPtr->textColor = WMRetainColor(color);
}
void
WMSetButtonAltTextColor(WMButton *bPtr, WMColor *color)
{
if (bPtr->altTextColor)
WMReleaseColor(bPtr->altTextColor);
bPtr->altTextColor = WMRetainColor(color);
}
void
WMSetButtonDisabledTextColor(WMButton *bPtr, WMColor *color)
{
if (bPtr->disTextColor)
WMReleaseColor(bPtr->disTextColor);
bPtr->disTextColor = WMRetainColor(color);
}
void
WMSetButtonSelected(WMButton *bPtr, int isSelected)
{
bPtr->flags.selected = isSelected;
if (bPtr->view->flags.realized) {
paintButton(bPtr);
}
if (bPtr->groupIndex > 0)
WMPostNotificationName(WMPushedRadioNotification, bPtr, NULL);
}
}
@@ -485,15 +397,15 @@ WMPerformButtonClick(WMButton *bPtr)
XFlush(WMScreenDisplay(WMWidgetScreen(bPtr)));
wusleep(20000);
}
bPtr->flags.pushed = 0;
if (bPtr->groupIndex > 0) {
if (bPtr->groupIndex>0) {
WMPostNotificationName(WMPushedRadioNotification, bPtr, NULL);
}
if (bPtr->action)
(*bPtr->action)(bPtr, bPtr->clientData);
bPtr->flags.pushed = 0;
if (bPtr->view->flags.mapped)
paintButton(bPtr);
@@ -581,28 +493,16 @@ static void
paintButton(Button *bPtr)
{
W_Screen *scrPtr = bPtr->view->screen;
GC gc;
WMReliefType relief;
int offset;
char *caption;
WMPixmap *image;
WMColor *textColor;
GC gc;
GC textGC;
gc = NULL;
caption = bPtr->caption;
if (bPtr->flags.enabled) {
textColor = (bPtr->textColor!=NULL
? bPtr->textColor : scrPtr->black);
} else {
textColor = (bPtr->disTextColor!=NULL
? bPtr->disTextColor : scrPtr->darkGray);
}
if (bPtr->flags.enabled || !bPtr->dimage)
image = bPtr->image;
else
image = bPtr->dimage;
image = bPtr->image;
offset = 0;
if (bPtr->flags.bordered)
relief = WRRaised;
@@ -610,47 +510,47 @@ paintButton(Button *bPtr)
relief = WRFlat;
if (bPtr->flags.selected) {
if (bPtr->flags.stateLight) {
gc = WMColorGC(scrPtr->white);
textColor = scrPtr->black;
}
if (bPtr->flags.stateLight)
gc = W_GC(scrPtr->white);
if (bPtr->flags.stateChange) {
if (bPtr->altCaption)
if (bPtr->altCaption) {
caption = bPtr->altCaption;
}
if (bPtr->altImage)
image = bPtr->altImage;
if (bPtr->altTextColor)
textColor = bPtr->altTextColor;
}
}
if (bPtr->flags.statePush && bPtr->flags.bordered) {
relief = WRSunken;
offset = 1;
}
}
if (bPtr->flags.pushed) {
if (bPtr->flags.pushIn) {
relief = WRPushed;
offset = 1;
}
if (bPtr->flags.pushLight) {
gc = WMColorGC(scrPtr->white);
textColor = scrPtr->black;
}
if (bPtr->flags.pushLight)
gc = W_GC(scrPtr->white);
if (bPtr->flags.pushChange) {
if (bPtr->altCaption)
if (bPtr->altCaption) {
caption = bPtr->altCaption;
}
if (bPtr->altImage)
image = bPtr->altImage;
if (bPtr->altTextColor)
textColor = bPtr->altTextColor;
}
}
W_PaintTextAndImage(bPtr->view, True, WMColorGC(textColor),
if (bPtr->flags.enabled)
textGC = W_GC(scrPtr->black);
else
textGC = W_GC(scrPtr->darkGray);
W_PaintTextAndImage(bPtr->view, True, textGC,
(bPtr->font!=NULL ? bPtr->font : scrPtr->normalFont),
relief, caption, bPtr->flags.alignment, image,
bPtr->flags.imagePosition, gc, offset);
@@ -728,14 +628,17 @@ handleActionEvents(XEvent *event, void *data)
case ButtonPress:
if (event->xbutton.button == Button1) {
bPtr->flags.prevSelected = bPtr->flags.selected;
bPtr->flags.wasPushed = 0;
bPtr->flags.pushed = 1;
if (bPtr->groupIndex>0) {
if (!bPtr->flags.selected)
doclick = 1;
bPtr->flags.pushed = 1;
bPtr->flags.selected = 1;
dopaint = 1;
break;
}
bPtr->flags.wasPushed = 0;
bPtr->flags.pushed = 1;
bPtr->flags.prevSelected = bPtr->flags.selected;
bPtr->flags.selected = !bPtr->flags.selected;
dopaint = 1;
@@ -749,8 +652,7 @@ handleActionEvents(XEvent *event, void *data)
case ButtonRelease:
if (event->xbutton.button == Button1) {
if (bPtr->flags.pushed) {
if (bPtr->groupIndex==0 ||
(bPtr->flags.selected && bPtr->groupIndex > 0))
if (bPtr->groupIndex==0)
doclick = 1;
dopaint = 1;
if (bPtr->flags.springLoaded) {
@@ -770,10 +672,10 @@ handleActionEvents(XEvent *event, void *data)
paintButton(bPtr);
if (doclick) {
if (bPtr->flags.selected && bPtr->groupIndex > 0) {
if (bPtr->flags.selected && bPtr->groupIndex>0) {
WMPostNotificationName(WMPushedRadioNotification, bPtr, NULL);
}
if (bPtr->action)
(*bPtr->action)(bPtr, bPtr->clientData);
}
@@ -787,7 +689,7 @@ destroyButton(Button *bPtr)
if (bPtr->flags.addedObserver) {
WMRemoveNotificationObserver(bPtr);
}
if (bPtr->timer)
WMDeleteTimerHandler(bPtr->timer);
@@ -795,33 +697,18 @@ destroyButton(Button *bPtr)
WMReleaseFont(bPtr->font);
if (bPtr->caption)
wfree(bPtr->caption);
free(bPtr->caption);
if (bPtr->altCaption)
wfree(bPtr->altCaption);
if (bPtr->textColor)
WMReleaseColor(bPtr->textColor);
if (bPtr->altTextColor)
WMReleaseColor(bPtr->altTextColor);
if (bPtr->disTextColor)
WMReleaseColor(bPtr->disTextColor);
free(bPtr->altCaption);
if (bPtr->image)
WMReleasePixmap(bPtr->image);
if (bPtr->dimage) {
/* yuck.. kluge */
bPtr->dimage->pixmap = None;
WMReleasePixmap(bPtr->dimage);
}
if (bPtr->altImage)
WMReleasePixmap(bPtr->altImage);
wfree(bPtr);
free(bPtr);
}

View File

@@ -31,6 +31,7 @@ findCloseColor(WMScreen *scr, unsigned short red, unsigned short green,
WMColor *color;
XColor xcolor;
RColor rcolor;
XGCValues gcv;
rcolor.red = red>>8;
rcolor.green = green>>8;
@@ -48,7 +49,11 @@ findCloseColor(WMScreen *scr, unsigned short red, unsigned short green,
color->refCount = 1;
color->color = xcolor;
color->flags.exact = 1;
color->gc = NULL;
gcv.foreground = color->color.pixel;
gcv.graphics_exposures = False;
color->gc = XCreateGC(scr->display, scr->rcontext->drawable,
GCForeground|GCGraphicsExposures, &gcv);
return color;
}
@@ -60,6 +65,7 @@ createRGBColor(WMScreen *scr, unsigned short red, unsigned short green,
unsigned short blue)
{
WMColor *color;
XGCValues gcv;
XColor xcolor;
xcolor.red = red;
@@ -75,7 +81,11 @@ createRGBColor(WMScreen *scr, unsigned short red, unsigned short green,
color->refCount = 1;
color->color = xcolor;
color->flags.exact = 1;
color->gc = NULL;
gcv.foreground = color->color.pixel;
gcv.graphics_exposures = False;
color->gc = XCreateGC(scr->display, scr->rcontext->drawable,
GCForeground|GCGraphicsExposures, &gcv);
return color;
}
@@ -106,10 +116,8 @@ WMCreateNamedColor(WMScreen *scr, char *name, Bool exact)
if (!XParseColor(scr->display, scr->colormap, name, &xcolor))
return NULL;
if (scr->visual->class == TrueColor)
exact = True;
if (!exact || !(color=createRGBColor(scr, xcolor.red, xcolor.green,
xcolor.blue))) {
color = findCloseColor(scr, xcolor.red, xcolor.green, xcolor.blue);
@@ -138,9 +146,8 @@ WMReleaseColor(WMColor *color)
if (color->refCount < 1) {
XFreeColors(color->screen->display, color->screen->colormap,
&(color->color.pixel), 1, 0);
if (color->gc)
XFreeGC(color->screen->display, color->gc);
wfree(color);
XFreeGC(color->screen->display, color->gc);
free(color);
}
}
@@ -149,8 +156,7 @@ void
WMPaintColorSwatch(WMColor *color, Drawable d, int x, int y,
unsigned int width, unsigned int height)
{
XFillRectangle(color->screen->display, d, WMColorGC(color),
x, y, width, height);
XFillRectangle(color->screen->display, d, color->gc, x, y, width, height);
}
@@ -164,16 +170,6 @@ WMColorPixel(WMColor *color)
GC
WMColorGC(WMColor *color)
{
if (!color->gc) {
XGCValues gcv;
WMScreen *scr = color->screen;
gcv.foreground = color->color.pixel;
gcv.graphics_exposures = False;
color->gc = XCreateGC(scr->display, scr->rcontext->drawable,
GCForeground|GCGraphicsExposures, &gcv);
}
return color->gc;
}
@@ -230,6 +226,7 @@ WMGrayColor(WMScreen *scr)
LIGHT_STIPPLE_HEIGHT);
color = createRGBColor(scr, 0xffff, 0xffff, 0xffff);
XFreeGC(scr->display, color->gc);
gcv.foreground = white->color.pixel;
gcv.background = black->color.pixel;
@@ -271,6 +268,7 @@ WMDarkGrayColor(WMScreen *scr)
DARK_STIPPLE_HEIGHT);
color = createRGBColor(scr, 0, 0, 0);
XFreeGC(scr->display, color->gc);
gcv.foreground = white->color.pixel;
gcv.background = black->color.pixel;
@@ -320,8 +318,8 @@ WMGetColorRGBDescription(WMColor *color)
{
char *str = wmalloc(32);
sprintf(str, "#%02x%02x%02x", color->color.red>>8, color->color.green>>8,
color->color.blue>>8);
sprintf(str, "rgb:%4x/%4x/%4x", color->color.red, color->color.green,
color->color.blue);
return str;
}

File diff suppressed because it is too large Load Diff

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