From 9af1c6c415de367e16c6b4ac23e5893dfac844bd Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Oct 1998 14:43:47 +0000 Subject: [PATCH] Updating to version 0.20.2 Many bug fixes. --- AUTHORS | 17 +- BUGFORM | 12 +- BUGS | 9 +- ChangeLog | 55 +- FAQ | 119 +++- FAQ.I18N | 7 + INSTALL | 151 ++--- Install | 95 ++- MIRRORS | 27 +- Makefile.am | 11 +- Makefile.in | 12 +- NEWS | 97 ++- README | 214 +++++-- TODO | 27 +- WINGs/ChangeLog | 7 + WINGs/Makefile.am | 8 +- WINGs/Makefile.in | 10 +- WINGs/README | 4 +- WINGs/Resources/Makefile.in | 2 - WINGs/WINGs.h | 21 +- WINGs/WINGsP.h | 4 +- WINGs/WUtil.h | 18 +- WINGs/error.c | 11 +- WINGs/findfile.c | 2 +- WINGs/memory.c | 2 +- WINGs/usleep.c | 9 +- WINGs/wbrowser.c | 7 +- WINGs/wevent.c | 77 ++- WINGs/wfilepanel.c | 11 +- WINGs/widgets.c | 12 +- WINGs/wtest.c | 2 +- WINGs/wtextfield.c | 23 +- WINGs/wwindow.c | 6 - WPrefs.app/Configurations.c | 8 +- WPrefs.app/Expert.c | 2 +- WPrefs.app/Focus.c | 2 +- WPrefs.app/Icons.c | 2 +- WPrefs.app/KeyboardSettings.c | 2 +- WPrefs.app/KeyboardShortcuts.c | 2 +- WPrefs.app/Makefile.am | 8 +- WPrefs.app/Makefile.in | 13 +- WPrefs.app/Menu.c | 12 +- WPrefs.app/MenuGuru.c | 2 +- WPrefs.app/MenuPreferences.c | 2 +- WPrefs.app/MouseSettings.c | 6 +- WPrefs.app/Paths.c | 2 +- WPrefs.app/Preferences.c | 4 +- WPrefs.app/README | 10 +- WPrefs.app/Text.c | 2 +- WPrefs.app/TextureAndColor.c | 67 +- WPrefs.app/TexturePanel.c | 1027 ++++++++++++++++++++++++++++++ WPrefs.app/TexturePanel.h | 55 ++ WPrefs.app/TexturePanel.icons | 601 ++++++++++++++++++ WPrefs.app/WPrefs.c | 43 +- WPrefs.app/WPrefs.h | 2 +- WPrefs.app/WPrefs.xpm | 2 +- WPrefs.app/WindowHandling.c | 19 +- WPrefs.app/Workspace.c | 8 +- WPrefs.app/main.c | 2 +- WPrefs.app/po/Makefile.am | 2 +- WPrefs.app/po/Makefile.in | 4 +- WPrefs.app/po/README | 1 + WPrefs.app/po/fr.po | 2 +- WPrefs.app/po/ja.po | 1169 +++++++++++++++++++++++++++++++++++ WPrefs.app/tiff/Makefile.in | 2 - WPrefs.app/xpm/Makefile.in | 2 - WindowMaker/Backgrounds/Makefile.in | 2 - WindowMaker/Defaults/Makefile.am | 2 +- WindowMaker/Defaults/Makefile.in | 4 +- WindowMaker/Defaults/WMState | 4 +- WindowMaker/Defaults/WMState.in | 4 +- WindowMaker/Defaults/WindowMaker | 7 +- WindowMaker/Defaults/WindowMaker.in | 7 +- WindowMaker/IconSets/Makefile.in | 2 - WindowMaker/Icons/Makefile.in | 2 - WindowMaker/Makefile.am | 6 +- WindowMaker/Makefile.in | 8 +- WindowMaker/Pixmaps/Makefile.in | 2 - WindowMaker/README | 9 + WindowMaker/Sounds/Makefile.am | 6 - WindowMaker/Sounds/Makefile.in | 210 ------- WindowMaker/Styles/Makefile.am | 1 - WindowMaker/Styles/Makefile.in | 3 - WindowMaker/Styles/Rainbow | 15 - WindowMaker/Themes/Makefile.in | 2 - WindowMaker/exitscript.sh | 6 + WindowMaker/menu | 9 +- WindowMaker/menu.el | 65 +- WindowMaker/{menu => menu.sl} | 148 +++-- WindowMaker/plmenu | 10 +- WindowMaker/plmenu.in | 10 +- configure | 974 +++++++++++++++++++---------- configure.in | 375 +++++++---- doc/Makefile.in | 2 - doc/geticonset.1x | 4 +- doc/getstyle.1x | 4 +- doc/seticons.1x | 6 +- doc/setstyle.1x | 6 +- doc/wdwrite.1x | 2 +- doc/wmaker.1x | 51 +- doc/wmsetbg.1x | 9 +- doc/wxcopy.1x | 30 +- doc/wxpaste.1x | 32 +- libPropList.tar.gz | Bin 98985 -> 0 bytes mkpatch | 13 +- po/Makefile.in | 2 - po/README | 4 +- po/cs.po | 22 +- po/el.po | 824 ++++++++++++++---------- po/ro.po | 21 +- po/tr.po | 2 +- src/GNUstep.h | 12 +- src/Makefile.am | 12 +- src/Makefile.in | 17 +- src/WindowMaker.h | 35 +- src/actions.c | 286 +++------ src/actions.h | 2 +- src/appicon.c | 15 +- src/appicon.h | 2 +- src/application.c | 135 ++-- src/application.h | 2 +- src/appmenu.c | 2 +- src/appmenu.h | 2 +- src/balloon.c | 8 +- src/balloon.h | 2 +- src/client.c | 56 +- src/client.h | 6 +- src/colormap.c | 3 +- src/config.h | 2 +- src/defaults.c | 602 ++++++------------ src/defaults.h | 2 +- src/dialog.c | 52 +- src/dialog.h | 2 +- src/dock.c | 310 +++++----- src/dock.h | 2 +- src/dockedapp.c | 4 +- src/event.c | 364 +++++------ src/framewin.c | 213 ++++--- src/framewin.h | 2 +- src/funcs.h | 18 +- src/icon.c | 133 +++- src/icon.h | 9 +- src/keybind.h | 2 +- src/list.c | 2 +- src/main.c | 61 +- src/menu.c | 13 +- src/menu.h | 3 +- src/misc.c | 81 ++- src/motif.h | 2 +- src/moveres.c | 20 +- src/pixmap.c | 6 +- src/pixmap.h | 8 +- src/placement.c | 10 +- src/properties.c | 41 +- src/properties.h | 2 +- src/proplist.c | 4 +- src/resources.c | 2 +- src/resources.h | 2 +- src/rootmenu.c | 54 +- src/screen.c | 12 +- src/screen.h | 12 +- src/session.c | 4 +- src/session.h | 2 +- src/shutdown.c | 6 +- src/stacking.c | 6 +- src/stacking.h | 2 +- src/startup.c | 158 +++-- src/superfluous.c | 197 ++++-- src/superfluous.h | 5 +- src/switchmenu.c | 2 +- src/texture.c | 68 +- src/texture.h | 5 +- src/wconfig.h | 106 +++- src/wconfig.h.in | 106 +++- src/wcore.c | 7 +- src/wcore.h | 2 +- src/wdefaults.c | 4 +- src/wdefaults.h | 2 +- src/window.c | 579 ++++++++++++----- src/window.h | 33 +- src/winmenu.c | 6 +- src/winspector.c | 15 +- src/winspector.h | 2 +- src/workspace.c | 6 +- src/workspace.h | 2 +- src/xutil.c | 7 +- test/Makefile.in | 2 - util/Makefile.am | 24 +- util/Makefile.in | 25 +- util/README | 3 + util/dockit | 298 --------- util/wm-oldmenu2new | 203 ++++++ util/wmaker.inst.in | 57 +- util/wmsetbg.c | 33 +- util/wxcopy.c | 102 ++- util/wxpaste.c | 177 +++++- wmlib/Makefile.in | 2 - wrlib/Makefile.am | 1 + wrlib/Makefile.in | 5 +- wrlib/context.c | 98 +-- wrlib/convert.c | 297 +++++---- wrlib/convolve.c | 2 +- wrlib/draw.c | 4 +- wrlib/gif.c | 48 +- wrlib/gradient.c | 4 +- wrlib/jpeg.c | 8 +- wrlib/load.c | 22 +- wrlib/misc.c | 66 +- wrlib/nxpm.c | 228 ++++++- wrlib/png.c | 17 +- wrlib/ppm.c | 18 +- wrlib/raster.c | 42 +- wrlib/save.c | 49 ++ wrlib/test.c | 7 +- wrlib/testdraw.c | 14 +- wrlib/testgrad.c | 9 +- wrlib/tiff.c | 8 +- wrlib/view.c | 7 +- wrlib/wraster.h | 44 +- wrlib/xpixmap.c | 36 +- wrlib/xpm.c | 55 +- wrlib/xutil.c | 58 +- 222 files changed, 8881 insertions(+), 4276 deletions(-) create mode 100644 WPrefs.app/TexturePanel.c create mode 100644 WPrefs.app/TexturePanel.h create mode 100644 WPrefs.app/TexturePanel.icons create mode 100644 WPrefs.app/po/ja.po delete mode 100755 WindowMaker/Sounds/Makefile.am delete mode 100755 WindowMaker/Sounds/Makefile.in delete mode 100755 WindowMaker/Styles/Rainbow create mode 100755 WindowMaker/exitscript.sh copy WindowMaker/{menu => menu.sl} (63%) delete mode 100644 libPropList.tar.gz delete mode 100755 util/dockit create mode 100755 util/wm-oldmenu2new create mode 100644 wrlib/save.c diff --git a/AUTHORS b/AUTHORS index 104a08ff..5a213570 100644 --- a/AUTHORS +++ b/AUTHORS @@ -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 WindowMaker: +patches, bug fixes and other stuff for Window Maker: ABE Shige I18N support, diagonal and vertical gradient, cosmetic additions to @@ -15,7 +15,7 @@ Fix for cascade window placement Peter Bentley fixed WM_STATE handling bug, fixed some memory leaks, made application menus -be mapped near the windows for non-click-to-focus modes. +be mapped near the windows for non-click-to-focus modes, timer bug Ulf Betlehem Window resize with Meta-Click3, fixed OpaqueMove to send only 1 synth. @@ -28,7 +28,7 @@ Rob Clark Text input field, 15bpp support Sylvain CORRE -bug fix for MkLinux/PPC, bug fix for cpixmap in wmsetbg +bug fix for MkLinux/PPC Frederic Devernay dock fix for openwindows, made asclock be friendlier with colorcell impaired @@ -63,6 +63,9 @@ HIDEKI Fujimoto FreeBSD portability, icon arrangement fixes, dock initialization bug fix, some I18N related fixes +Pascal Hofstee +WINGs bug fixes + Robert A. Holak bug fix @@ -72,6 +75,9 @@ Workspace change bug fix Sudish Joseph Modifier binding fix and other bug fixes +Luke Kendall +menu format converter, various enhancements to wxcopy and wxpaste + Bradley M Keryan EMACS/keypad like cursor movement for WINGs textfield @@ -136,6 +142,9 @@ Ture Pelsson various portability fixes, replaced busy wait with select() in event handling code, fixed problem with some misbehaved kids after a fork(). +Toby Sargeant +menu format converter + Carsten Schaar SCO portability, german locale, autoconf enhancements @@ -168,7 +177,7 @@ FRBall dgradient fix "]d" -Window list menu miniaturized/hidden hints +Window list menu miniaturized/hidden hints, XDE support Trae Mc Combs BlueWaves.jpeg background image in BlueWaves theme. diff --git a/BUGFORM b/BUGFORM index 36db5fb9..c8402781 100644 --- a/BUGFORM +++ b/BUGFORM @@ -3,10 +3,12 @@ --------------------------- -If you find a bug please fill this form and send it to + 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 + + 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 0. Before reporting this bug I already: @@ -34,7 +36,7 @@ http://windowmaker.org/cgi-bin/bugs [ ] --disable-shape [ ] --disable-xpm [ ] --disable-tiff -[ ] --disable-png +[ ] --disable-png [ ] --enable-single-icon [ ] Others: ....................... @@ -68,4 +70,6 @@ X Server Vendor: ...................... Color Depth: ................. WindowMaker Version (run "wmaker -version"): ......................... +11. backtrace if the bug made Window Maker crash. The README file +has instructions to make one. diff --git a/BUGS b/BUGS index 62c63260..18cc6881 100644 --- a/BUGS +++ b/BUGS @@ -1,10 +1,13 @@ - the app menu does not update after a style/theme change without restart. -- the animation of shade puts ImageMagick/display in a weird state - during startup, transient windows should be miniaturized with their owners not in their own icons -- shaped windows don't resize very well - stacking code is buggy (or XFree is buggy) - WINGs has problems in some platforms (SGI, Sun etc.) Anyone on these systems want to fix it? - save session doesnt work on some platforms (Alpha and Sparc) -- GNUSTEP_WM_ATTR in WINGs has problems on Alpha boxes +- 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. diff --git a/ChangeLog b/ChangeLog index b466af50..45241911 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,57 @@ +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: ............................. @@ -36,7 +90,6 @@ Changes since version 0.19.3: - AIX bug compatibility in XmbTextEntents() - fixed jpeg loading bug - Changes since version 0.19.2: ............................. diff --git a/FAQ b/FAQ index f6418f49..0628acd5 100644 --- a/FAQ +++ b/FAQ @@ -5,6 +5,9 @@ http://www.dpo.uab.edu/~grapeape/wmfaq.html or http://wm.gnu.net/wmfaq/ -------------------------- +This version was slightly modified by me (Alfredo). Chris, I enclosed +my changes with "###". Please add the changes to your official version. + Summary of Contents: Introduction @@ -21,8 +24,10 @@ Installation - How do I get libjpeg to work? - How do I get libpng to work? - Does wmsound work with 0.1x.x? - - How do I switch CDE's windowmanager to use WindowMaker? + - Can I use WindowMaker with KDE or GNOME or CDE? + - How do I switch CDE's windowmanager to use WindowMaker? - Do I need to rerun wmaker.inst with every new version of WindowMaker? + - When I run wmaker it quits complaing about something __register_frame_info. Usage - What is an appicon? @@ -76,10 +81,12 @@ Programming Miscellaneous Questions - Is there a pager for WindowMaker? - - Can I have folders like in AfterStep? + - Can I have folders like in AfterStep? - What exactly are Themes? - How do I install a Theme? - - How do I make a Theme? + - How do I make a Theme? + - Why don't you distribute {normal diff,xdelta} patches? + ======================================================================== @@ -241,6 +248,32 @@ or at http://wm.gnu.net/files.html#wmsound + +### New, possibly with some errors + +Can I use WindowMaker with KDE or GNOME or CDE? +---------------------------------- + +Contrary to a lot of people thinks, KDE is NOT a window manager. KDE is +a suite of various applications that includes a custom window manager. +The same is true for CDE. + +Now, answering the question: Yes, you can use WindowMaker in these +environments. To use WindowMaker with GNOME, you don't need to do anything +special. To use it with CDE, read the answer for "How do I switch CDE's +windowmanager to use WindowMaker?" + +To use it with KDE, read it's documentation to get rid of kwm (and possibly +kpanel) and replace it with wmaker. Then, start WPrefs.app, go to "Mouse +Preferences" and set the "Disable mouse actions" check box. You will need to +restart WindowMaker to make this change take effect. The "Disable mouse +actions" change is needed to allow you to use krootwm, wich enables you to +use kfm's desktop icons, but will prevent you from accessing WindowMaker's +Applications and Window List menus with the mouse. + +### + + How do I switch CDE's window-manager to use WindowMaker? ---------------------------------- Method 1: @@ -321,6 +354,16 @@ The only problem I have at the moment is I seem to get multiple copies of asclock running when I log in again. +### New +You can also use the normal "Exit Session" command from the WM root menu +and place additional commands required to shutdown CDE in +~/GNUstep/Library/WindowMaker/exitscript + +So, if you add "dtaction ExitSession" in that file, the command to +shutdown CDE will be automatically executed when you exit WindowMaker. +### + + Do I need to rerun wmaker.inst with every new version of WindowMaker? ---------------------------------- Dan Pascu reveals the answer: @@ -337,7 +380,14 @@ So even if new options are added, they will reflect in the user configuration. Only if user wishes to change the default behavior, he needs to add that option to the config file. +### New +When I run wmaker it quits complaing about something __register_frame_info. +----------------------------------------------------------- +This seems to be related to pgcc, gcc-2.8.0 or something. Try using gcc +2.7.x to compile wmaker. + +### -=-=-=- Usage: @@ -361,7 +411,7 @@ indicating when it is close enough to dock, and where it will be placed. To make sure this application will be there next time you start up windowmaker, exit windowmaker with the "exit session" option. - +### Obsoleted What is the button in the middle of the Clip? ---------------------------------- Dan Pascu gives this insightful answer: @@ -371,7 +421,7 @@ Dan Pascu gives this insightful answer: In 0.15.x, the light now means that the Clip is in its expanded stateto show any appicons attached to it. When collapsed, it expands when you drag an appicon near it to dock. - +### What is the difference between the 'Exit' and 'Exit Session' Options? ---------------------------------- @@ -403,7 +453,9 @@ How do I rename workspaces? Right click on the "desktop" (root window) to show the menu (don't hold the button down). Go to the workspaces menu and hold the Control key down and click on the workspace you would like to rename and type the name. - +### New +If you use the clip, use the "Rename Workspace" command in the clip menu. +### How can I resize a window if the window is larger than my currect desktop? @@ -430,7 +482,12 @@ You docked xyz using dockit. Dockit does not generate correct application icons most of the time. The only way to get around it is to edit ~/GNUstep/Defaults/WMState and set ForcedDock = YES; in the entry for xyz. If you use rxvt, upgrade to rxvt 2.4.6 or newer. - +### New +There is another better way to dock applications that do not have an appicon, +wich is by using the "Emulate Application Icon" option in the +"Advanced Options" section of the attributes panel. If you turn this option +ON and restart that application, you should get a dockable application icon. +### -=-=-=-=-=-=-=- Configuration: @@ -523,10 +580,13 @@ transparent parts of your icon. How do you dock that doesn't have an appicon in the new version of WindowMaker? ---------------------------------- -Use the tcl script dockit which is included with WindowMaker 0.15.x. By default -you can run it by double clicking on the main dock icon. Note that dockit -can generate problematic appicons. - +### Updated +Open the window commands menu for the main window of the application +(the first window that is opened by the app and also causes the whole +application to exit, when it is closed), choose "Attributes..." and +go to the "Advanced Options" section. Then, check ON the +"Emulate Application Icon" check box. +### How do I get x11amp to not have a title bar? (or any other program for that matter?) @@ -776,8 +836,8 @@ For example: rxvt -name foo -e irc -Then, go to the Attributes menu (right click on titlebar (or hit F10) and choose -'Attributes...') +Then, go to the Attributes menu (right click on titlebar (or hit Control+Esc +and choose 'Attributes...') Then choose 'Advanced Options' from the listbox and enable 'Don't Bind Keyboard shortcuts'. Click 'Save' and 'Apply' and you should be able to run your session without the @@ -905,3 +965,36 @@ To make a Theme.tar.gz, these are the steps I take: 4.Now give it to your friends! +### New + +Why don't you distribute {normal diff,xdelta} patches? +------------------------------------------------------------ + +Whenever possible plain diff patches are distributed. If the new +version has new binary files, normal diff won't be able to handle +them, so a patch package is distributed, instead. We don't use +xdelta because: +- most systems do not have xdelta installed; +- xdelta is picky and require the file to be patched to be +exactly the same as the one used to make the patch. The patch package +scheme used is much more flexible. + +We do not distribute a simple diff with the binary files separately +(and variations, like uuencoding the binary files) because: +- it is more complicated and error prone to require the user to manually +move the files to the correct places; +- the current patch package scheme *does* distribute the binary files +and diff files separately. If the user wants to install everything by +hand, nobody will object to that; +- sooner or later someone will certainly ask for a script to automate the +file moving stuff. + +So we hacked a script (mkpatch) that automatically creates a patch package +with the normal text diff file, a list of removed files and the binary files +that have changed or been added, plus a script that does the patching +automatically. If you don't like the script, you can apply the patch and +move the files manually. Or download the whole distribution. + +### + + diff --git a/FAQ.I18N b/FAQ.I18N index b33379a2..baab0aa7 100644 --- a/FAQ.I18N +++ b/FAQ.I18N @@ -8,6 +8,13 @@ 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 diff --git a/INSTALL b/INSTALL index 56085194..b5d78915 100644 --- a/INSTALL +++ b/INSTALL @@ -1,5 +1,5 @@ -Installation Instructions for WindowMaker + Installation Instructions for Window Maker @@ -21,8 +21,10 @@ SUPPORTED PLATFORMS - OSF/1 - HP-UX - AIX 4.1.4 / IBM PowerPC +- AIX 5.3 - DEC Alpha/Digital UNIX 4.x - XFree86 / OS/2 +- Corel Netwinder Patches to make it work on other platforms are welcome. @@ -30,32 +32,33 @@ Patches to make it work on other platforms are welcome. REQUIREMENTS: ============= -The following software is required to use WindowMaker +The following software is required to use Window Maker - X11R6.x - WindowMaker can be compiled in older versions of X, like X11R5 + Window Maker 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. + trouble using the dock. Upgrading the client libraries (Xlib, Xt etc) + will help if you can't upgrade the server. -If you will build WindowMaker, make sure you have gcc and the X header files +If you will build Window Maker, 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. +including Window Maker. OPTIONAL: ========= -These libraries are not required to make WindowMaker work, but they +These libraries are not required to make Window Maker 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. Tell me if you made wmaker work with some library with a version older than the stated here. -- libXPM 4.7 +- libXPM 4.7 or newer Older versions may not work!!! Available at ftp://sunsite.unc.edu/pub/Linux/libs/X/ @@ -69,7 +72,7 @@ with a version older than the stated here. For TIFF image support. You can get it at ftp://ftp.sgi.com/graphics/tiff -- libjpeg 6.0.1 +- libjpeg 6.0.1 or newer For JPEG image support - libgif 2.2 or libungif @@ -87,13 +90,18 @@ CONFIGURE OPTIONS: ================== These options can be passed to the configure script to enable/disable -some WindowMaker features. Example: +some Window Maker features. Example: ./configure --enable-kanji -will configure WindowMaker with kanji characters support compiled in. +will configure Window Maker with kanji (and other multi-byte) characters +support compiled in. +To get a list of other options, run ./configure --help + +--enable-sound enable support of sound effects module + --disable-xpm disables use of the XPM library even if it is available on your system. @@ -108,7 +116,7 @@ will configure WindowMaker with kanji characters support compiled in. --disable-shape disables shaped windows (for oclock, xeyes etc.) --enable-debug adds extra debugging information. Do not use it - unless you're debugging WindowMaker. + unless you're debugging Window Maker. --enable-kanji support to display Kanji characters, Korean, Chinese and other languagues that require special characters. @@ -118,6 +126,9 @@ will configure WindowMaker with kanji characters support compiled in. supported at all by the developers. If you have some trouble with it, contact it's author: Christopher Seawood +--disable-shm disable use of the MIT shared memory extension. This will + slow down texture generation. + PLATFORM SPECIFIC NOTES: ======================== @@ -128,8 +139,10 @@ PLATFORM SPECIFIC NOTES: 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 + Sun's cpp lacks some features needed by Window Maker and it can cause problems when parsing the config files. + You also might need to use the --with-gfx-libs and --with-gfx-incs + to supply the directory where libtiff is located. - RedHat Linux Make sure you don't have the LANG and LINGUAS environment variables @@ -159,8 +172,8 @@ INSTALLATION: 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. +You can get the file at ftp://ftp.windowmaker.org. This file is optional +and only have a few icons. autoconf and automake @@ -172,34 +185,9 @@ 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: +Build Window Maker +------------------ + For a quick start, type the following in your shell prompt: ./configure make @@ -208,12 +196,12 @@ then, login as root and type: make install -or if you want to strip the binaries from debugging symbols and make them +or if you want to strip the debugging symbols from the binaries and make them smaller, you can instead type: make install-strip -This will build and install WindowMaker with default parameters. +This will build and install Window Maker with default parameters. If you want to customize some compile-time options, you can do the following. @@ -225,9 +213,6 @@ following. to get a complete listing of other options that are available. - Note that the WPrefs.app installation path is configured - in a different way. Look at WPrefs/README for information. - 2. Run configure with the options you want. For example, if you want to use the --enable-kanji option, type: @@ -236,44 +221,38 @@ following. 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 WindowMaker. Just type: + 4. Compile. 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 WindowMaker in your system. - Again, type: + root password :-(" section) and install Window Maker in your system: su root make install + User specific configuration --------------------------- -These instructions do not need to be followed when upgrading WindowMaker +These instructions do not need to be followed when upgrading Window Maker from an older version, unless stated differently in the NEWS file. -Every user on your system that wishes to run WindowMaker must do the +Every user on your system that wishes to run Window Maker must do the following: - 1. Install WindowMaker configuration files in your home directory. + 1. Install Window Maker configuration files in your home directory. Type: wmaker.inst - wmaker.inst will install WindowMaker configuration files and will -setup X to automatically launch WindowMaker at startup. - - 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...". + wmaker.inst will install Window Maker configuration files and will +setup X to automatically launch Window Maker at startup. - The $HOME/GNUstep/Library/WindowMaker/menu file is the definition of -the root menu. Edit it according to the applications you have installed. + That's it! + + You can type "man wmaker" to get some general help for configuration +and other stuff. -Read the User Guide for a more in depth explanation of WindowMaker. -The User Guide is avaiable at http://windowmaker.org +Read the User Guide for a more in-depth explanation of Window Maker. You might want to take a look at the FAQ too. @@ -283,14 +262,17 @@ 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 WindowMaker . Example: +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: -./configure --prefix=/home/jshmoe +./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Apps If you use national language support, you must also supply the --with-nlsdir option, as: -./configure --prefix=/home/jshmoe --with-nlsdir=/home/jshmoe/lib/locale +./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Apps \ + --with-nlsdir=/home/jshmoe/lib/locale Then make /home/jshmoe/bin be included in your search path and run bin/wmaker.inst @@ -299,10 +281,10 @@ bin/wmaker.inst UPGRADING ========= -If you are upgrading from an older version of WindowMaker: +If you are upgrading from an older version of Window Maker: - 1. Configure and build WindowMaker as always - 2. Install WindowMaker (but do not run wmaker.inst) + 1. Configure and build Window Maker as always + 2. Install Window Maker (but do not run wmaker.inst) 3. Read the NEWS file and update your configuration files, if necessary. @@ -314,12 +296,6 @@ 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. -== When I try to start X after installing wmaker, I get this: -exec: wmaker: not found - -You probably are using a brain-damaged distribution. Add /usr/local/bin -into your path environment variable (editing .cshrc or .profile) - == Error during build of libPropList make: *** No rule to make target `libPropList.a.c', needed by @@ -332,8 +308,7 @@ automake 1.3 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. +ftp://prep.ai.mit.edu or any mirror. == configure doesn't detect libtiff, or other graphic libraries. @@ -367,17 +342,18 @@ 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...") -* WindowMaker is not finding cpp (the C preprocessor). If your cpp is +* Window Maker 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. + LOCALES/INTERNATIONALIZATION ============================ -WindowMaker has national language support. +Window Maker has national language support. To enable national language support, you must compile -WindowMaker with some additional parameters. +Window Maker 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 @@ -405,7 +381,7 @@ for other languages. 2 - Additionally, if your language uses multi-byte characters, such as Japanese or Korean, you must supply the --enable-kanji flag to configure. -3 - Configure, build and install WindowMaker normally. +3 - Configure, build and install Window Maker 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 @@ -422,7 +398,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, WindowMaker searches for them in the +For menu definition files, Window Maker searches for them in the following order (for brazilian portuguese, in this case): menu.pt_BR @@ -452,4 +428,5 @@ 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) diff --git a/Install b/Install index 4ef270a6..9942ce4f 100755 --- a/Install +++ b/Install @@ -19,21 +19,36 @@ perai() { } +perform() { + result= + eval $* + if [ "$result" != 0 ]; 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 "========================" -echo "WindowMaker Installation" -echo "========================" +echo "NOTE: If this script fails, read the INSTALL file and" +echo "install by hand." echo -echo "NOTE: If the installation procedure fails, read the INSTALL file and do" -echo "the installation manually." +echo "Please read the INSTALL and FAQ files before e-mailing " +echo "questions." perai if test "$USER" != "root"; then - echo "Warning: you must run this script as the root user." - perai echo - echo "Be sure to specify an installation path where you have" - echo "write persmission." + echo "Warning: you must run this script as root to install" + echo "Window Maker. Hit - to quit this script." + perai echo fi @@ -122,17 +137,18 @@ fi done=0 while [ $done = 0 ]; do echo - echo "Where do you want to install WindowMaker? [$PREFIX]" + echo "Where do you want to install Window Maker? [$PREFIX]" echo "Don't change it if you don't know what you're doing." - echo "(The default path will install WindowMaker in " - echo "$PREFIX/bin, $PREFIX/lib etc.)" + 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 -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 WindowMaker into \"$foo\"" + echo "Hmm... I don't think you really want to install Window Maker into \"$foo\"" echo else done=1 @@ -142,60 +158,41 @@ while [ $done = 0 ]; do done=1 fi echo - echo "$PREFIX/bin must be in the PATH environment variable of all users who use WindowMaker" + echo "$PREFIX/bin must be in the PATH environment variable of all users who use Window Maker" perai done OPTIONS="$OPTIONS --prefix=$PREFIX" -###################### Build libPropList - -if [ ! -d libPropList ]; then - gzip -d -c libPropList.tar.gz | tar xf - -fi - -echo "-----------------------" -echo "Building libPropList..." -echo "-----------------------" -cd libPropList -if [ ! -f config.status ]; then - ./configure -fi -make -cd .. - -if [ ! -f libPropList/libPropList.a ]; then - echo "Build of libPropList was not successfull. " - exit -fi - ##################### Configure echo "--------------------------" -echo "Configuring WindowMaker..." +echo "Configuring Window Maker..." echo "--------------------------" if [ `uname -s` = "SCO_SV" ]; then echo "CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS" - CFLAGS="$CFLAGS -belf -DANSICPP" ./configure $OPTIONS + + perform CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS else echo "CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS" - CFLAGS="$CFLAGS $GCCFLAGS" ./configure $OPTIONS + + perform CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS fi #################### Compile -echo "------------------------" -echo "Compiling WindowMaker..." -echo "------------------------" -(cd src; make clean) -make - echo "-------------------------" -echo "Installing WindowMaker..." +echo "Compiling Window Maker..." echo "-------------------------" +perform (cd src; make clean) +perform make + +echo "--------------------------" +echo "Installing Window Maker..." +echo "--------------------------" -make install +perform make install echo echo "Installation Finished!" diff --git a/MIRRORS b/MIRRORS index 9bde2fb1..9dd368e0 100644 --- a/MIRRORS +++ b/MIRRORS @@ -41,8 +41,16 @@ Contact: Adam Jacob Third Party WindowMaker Distribution Packages ============================================= -RedHat/RPM ----------- +Debian GNU/Linux (deb) +---------------------- + +Contact: Marcelo Magallon +Sites: +http://master.debian.org/~mmagallo/packages/wmaker/ + + +RedHat Linux (RPM) +------------------ Contact: Jim Knoble Sites: @@ -51,4 +59,19 @@ ftp://ftp.redhat.com/pub/contrib/SRPMS/ ftp://ftp.redhat.com/pub/contrib/i386/ +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/ + diff --git a/Makefile.am b/Makefile.am index 60618dcd..944ce06b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,14 +1,7 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc +SUBDIRS = libPropList 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 - -libPropList.tar.gz: - -(cd libPropList; $(MAKE) distclean) - -rm -f libPropList.tar.gz - tar cf libPropList.tar libPropList - gzip -9 libPropList.tar - + mkpatch diff --git a/Makefile.in b/Makefile.in index b1e90f2c..040104ed 100644 --- a/Makefile.in +++ b/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -91,10 +89,10 @@ X_LOCALE = @X_LOCALE@ pixmapdir = @pixmapdir@ wprefsdir = @wprefsdir@ -SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc +SUBDIRS = libPropList 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 + mkpatch ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ./src/config.h @@ -311,12 +309,6 @@ 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: diff --git a/NEWS b/NEWS index a14d1607..df8dadee 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,103 @@ -NEWS for veteran WindowMaker users ----------------------------------- +NEWS for veteran Window Maker users +----------------------------------- + +--- 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" ). +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 "Floating Dock" 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/ + --- 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. @@ -27,6 +118,7 @@ exitscript ~/G/L/W/exitscript will be called automatically when wmaker is exited. + New runtime options ------------------- @@ -55,6 +147,7 @@ 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. diff --git a/README b/README index 2ecb2f72..9560af59 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ - WindowMaker X11 Window Manager + Window Maker X11 Window Manager @@ -14,108 +14,114 @@ Matthew Hawkins + + Description =========== -WindowMaker is a window manager designed to emulate the look and feel of +Window Maker 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). +Window Maker was previously called WindowMaker. -User Guide -========== +Window Maker has no connection with Windowmaker, the software for +making windows and doors. + + +Documentation +============= + +* README files all over the source tree have info related to the stuff +in the directories. + +* INSTALL has installation instructions and some troubleshooting tips. + +* 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 -The WindowMaker User's Guide can be downloaded from the official ftp + +*** User Guide + +The Window Maker 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. +*** man pages -o Install is a script for configuring and compiling WindowMaker in a easy -way. +Type "man wmaker" in the shell prompt to get general help about Window Maker -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. +Directories & Files in the Source Tree +====================================== -o NEWS is a list of user visible changes since the last version. Read it if -you are upgrading. +* Install is a script for configuring and compiling Window Maker in a easy +way (not that the normal way is difficult, but...). -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. +* AUTHORS: the credits -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. +* TODO: plans for the future -o test/ contains a simple test program that shows some of the things that can -be done with WindowMaker and wmlib +* util/ has various utility programs. -o wrlib/ contains the library used to do image manipulation (loading, -dithering etc.) in WindowMaker. It can be used in other applications. +* WPrefs.app/ is the configuration program. -o util/ contains various utility programs. +* src/wconfig.h has compile time options you can change to select some +options/features and other stuff. -o WPrefs/ contains the source code for the WindowMaker Preferences utility. -Read the WPrefs/README file before using it. +* WINGs/ NEXTSTEP lookalike widget library -o Configuration options can be found in the ~/GNUstep/Defaults/* files -(after installation). The menus can be configured in -~/GNUstep/Library/WindowMaker/menu +* wrlib/ image processing library -o The default configuration files for the system are installed by default in -/usr/local/share/WindowMaker, along with some other data files. +* po/ has message catalogs wich are the translated versions of the messages +displayed by Window Maker. -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 Mailing List ============ -There is a mailing list for discussing WindowMaker at +There is a mailing list for discussing Window Maker at wmaker@linuxcenter.com To subscribe to it, send a message containing: subscribe -in the subject and the body of the message to wmaker-request@linuxcenter.com +in the body of the message to wmaker-request@linuxcenter.com -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 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. -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. +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. -Running multiple instances of WindowMaker -========================================= +Running multiple instances of Window Maker +========================================== -It is not a good idea to run more than one instance of WindowMaker +It is not a good idea to run more than one instance of Window Maker from the same user (so that wmaker will use the same configuration -files) at the same time. You might get unexpected behaviour when WindowMaker +files) at the same time. You might get unexpected behaviour when Window Maker updates it's configuration files. @@ -126,21 +132,20 @@ Sound is supported for Linux and FreeBSD systems with the use of a separately distributed module. You can download it at: http://www.frontiernet.net/~southgat/wmsound -Note that you must compile WindowMaker with the --enable-sound configure +Note that you must compile Window Maker with the --enable-sound configure flag and set the DisableSound option to NO. Performance Tuning ================== -If you want to diminish WindowMaker's memory usage and improve performance, +If you want to diminish Window Maker'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 @@ -148,16 +153,91 @@ 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 +====================== + +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 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 the 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. The default +for Window Maker is to restart another window manager when it crashes, +so you will not get a core file. You need to edit the src/wconfig.h +file *after* running configure and change the line that looks like: + +#undef NO_EMERGENCY_AUTORESTART + +to: + +#define NO_EMERGENCY_AUTORESTART + +Then, in the src directory type: +make CFLAGS=-g +make install + +and wait for Window Maker to be installed. + +Once having Window Maker installed, start X and reproduce the bug so +that Window Maker crashes. When it does crash, type the following from +your shell: + +script +gdb 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 ========== -WindowMaker is copyrighted by Alfredo K. Kojima and is licensed through the +Window Maker is copyrighted by Alfredo K. Kojima and is licensed through the GNU General Public License. Read the COPYING file for the complete license. NeXT, OpenStep and NEXTSTEP are a trademarks of NeXT Computer, Inc. @@ -168,16 +248,16 @@ Authors 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 WindowMaker/README +can be found in po/README and Window Maker/README If you have any comments, fixes and bug reports (filled BUGFORMs) send them -to kojima@windowmaker.org +to developers@windowmaker.org Musicware ========= -If you use WindowMaker and *really* like it, please consider making my day +If you use Window Maker 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 diff --git a/TODO b/TODO index 05535ca5..16d49894 100644 --- a/TODO +++ b/TODO @@ -3,43 +3,44 @@ 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 stacking. buggy again (maybe XFree 3.2 bug) - fix RemakeStackList() to account for transient windows -- 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: =========== +- support for X11R6.4 extension for getting extra visual info in wrlib's + automatic best context guessing +- ICCCM 2.0 stuff (although nobody is 2.0 compliant, AFAIK. Not even twm) +- rewrite menu traversal code +- histeresys in menu item selection +- 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 wc? -- -statefile cmd arg to specify path for WMState file (multiple instance +- remake internal string processing to use wchar? unicode? +- -stateprefix cmd arg to specify sufix for WMState domain (multiple instance support) +- R6 style session management (or something to make wmaker compatible/aware + of it) + Maybe some day: =============== -- virtual desktop +- virtual workspace - 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 diff --git a/WINGs/ChangeLog b/WINGs/ChangeLog index 63232afe..018a5fa2 100644 --- a/WINGs/ChangeLog +++ b/WINGs/ChangeLog @@ -1,6 +1,13 @@ changes since wmaker 0.20.0: ............................ +- added generic object field for WMListItem. This is for hanging generic + clientdata + + +changes since wmaker 0.20.0: +............................ + - changed WMGetFilePanelFile() with WMGetFilePanelFileName() - made SavePanel diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 4b30e0f5..99c65704 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -6,7 +6,7 @@ SUBDIRS = Resources LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \ - -lm @LIBPL_LIBS@ + -lm -L$(top_builddir)/libPropList -lPropList lib_LIBRARIES = libWINGs.a @@ -78,13 +78,13 @@ libWINGs_a_SOURCES = \ findfile.c \ hashtable.c \ memory.c \ - usleep.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)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \ +INCLUDES = @XCFLAGS@ -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \ -DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList diff --git a/WINGs/Makefile.in b/WINGs/Makefile.in index 3c65312b..a1e0336f 100644 --- a/WINGs/Makefile.in +++ b/WINGs/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -96,7 +94,7 @@ AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = Resources LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \ - -lm @LIBPL_LIBS@ + -lm -L$(top_builddir)/libPropList -lPropList lib_LIBRARIES = libWINGs.a @@ -165,11 +163,11 @@ libWINGs_a_SOURCES = \ findfile.c \ hashtable.c \ memory.c \ - usleep.c + usleep.c -INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \ +INCLUDES = @XCFLAGS@ -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \ -DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../src/config.h CONFIG_CLEAN_FILES = diff --git a/WINGs/README b/WINGs/README index cf879a78..2aa262f1 100644 --- a/WINGs/README +++ b/WINGs/README @@ -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 WindowMaker window + Some of it's functions are designed to support the Window Maker window manager (see http://windowmaker.org) In fact, it's primary role is to -support WindowMaker. All other uses of it are just an added bonus. +support Window Maker. 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, diff --git a/WINGs/Resources/Makefile.in b/WINGs/Resources/Makefile.in index 880e3279..8930bd8b 100644 --- a/WINGs/Resources/Makefile.in +++ b/WINGs/Resources/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WINGs/WINGs.h b/WINGs/WINGs.h index f2816dba..f8291189 100644 --- a/WINGs/WINGs.h +++ b/WINGs/WINGs.h @@ -6,7 +6,7 @@ #include #include -#define WINGS_H_VERSION 980922 +#define WINGS_H_VERSION 980930 @@ -286,6 +286,7 @@ typedef struct W_FontPanel WMFontPanel; /* item for WMList */ typedef struct WMListItem { char *text; + void *clientData; /* ptr for user clientdata. */ struct WMListItem *nextPtr; @@ -393,6 +394,12 @@ void WMScreenMainLoop(WMScreen *scr); RContext *WMScreenRContext(WMScreen *scr); +Display *WMScreenDisplay(WMScreen *scr); + +int WMScreenDepth(WMScreen *scr); + + + void WMSetApplicationIconImage(WMScreen *app, WMPixmap *icon); WMPixmap *WMGetApplicationIconImage(WMScreen *app); @@ -434,11 +441,11 @@ WMHandlerID WMAddInputHandler(int fd, int condition, WMInputProc *proc, void WMDeleteInputHandler(WMHandlerID handlerID); /* ....................................................................... */ - +/* void WMDragImageFromView(WMView *view, WMPixmap *image, WMPoint atLocation, WMSize mouseOffset, XEvent *event, Bool slideBack); - +*/ /* ....................................................................... */ @@ -547,8 +554,6 @@ int WMWidthOfString(WMFont *font, char *text, int length); WMScreen *WMWidgetScreen(WMWidget *w); -Display *WMScreenDisplay(WMScreen *scr); - void WMUnmapWidget(WMWidget *w); void WMMapWidget(WMWidget *w); @@ -898,6 +903,10 @@ WMScroller *WMGetScrollViewHorizontalScroller(WMScrollView *sPtr); WMScroller *WMGetScrollViewVerticalScroller(WMScrollView *sPtr); +void WMSetScrollViewLineScroll(WMScrollView *sPtr, int amount); + +void WMSetScrollViewPageScroll(WMScrollView *sPtr, int amount); + /* ....................................................................... */ WMSlider *WMCreateSlider(WMWidget *parent); @@ -963,7 +972,7 @@ void WMDestroyInputPanel(WMInputPanel *panel); /* ....................................................................... */ /* only 1 instance per WMScreen */ -WMOpenPanel *WMGetOpenPanel(WMScreen *app); +WMOpenPanel *WMGetOpenPanel(WMScreen *scrPtr); WMSavePanel *WMGetSavePanel(WMScreen *scrPtr); diff --git a/WINGs/WINGsP.h b/WINGs/WINGsP.h index a0c6f445..537e4f6f 100644 --- a/WINGs/WINGsP.h +++ b/WINGs/WINGsP.h @@ -6,7 +6,7 @@ #include "WINGs.h" #include "WUtil.h" -#if WINGS_H_VERSION < 980922 +#if WINGS_H_VERSION < 980930 #error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it. #endif @@ -234,8 +234,8 @@ typedef struct W_View { #if 0 struct W_DragSourceProcs *dragSourceProcs; struct W_DragDestinationProcs *dragDestinationProcs; -#endif int helpContext; +#endif struct { unsigned int realized:1; diff --git a/WINGs/WUtil.h b/WINGs/WUtil.h index 6de4fb85..48908c16 100644 --- a/WINGs/WUtil.h +++ b/WINGs/WUtil.h @@ -5,6 +5,13 @@ #include + +/* 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 @@ -65,7 +72,12 @@ typedef struct { } WMHashTableCallbacks; - +#if 0 +typedef struct { + char character; /* the escape character */ + char *value; /* value to place */ +} WMSEscapes; +#endif typedef void WMNotificationObserverAction(void *observerData, @@ -105,6 +117,10 @@ char *wdefaultspathfordomain(char *domain); void wusleep(unsigned int microsec); +#if 0 +int wsprintesc(char *buffer, int length, char *format, WMSEscapes **escapes, + int count); +#endif /*......................................................................*/ diff --git a/WINGs/error.c b/WINGs/error.c index 8728c8a6..a6e7abad 100644 --- a/WINGs/error.c +++ b/WINGs/error.c @@ -1,5 +1,5 @@ /* - * WindowMaker miscelaneous function library + * Window Maker miscelaneous function library * * Copyright (c) 1997 Alfredo K. Kojima * @@ -53,7 +53,8 @@ wfatal(const char *msg, ...) fputs(_WINGS_progname, stderr); fputs(" fatal error: ",stderr); fputs(buf, stderr); - fflush(NULL); + fflush(stdout); + fflush(stderr); va_end(args); } @@ -79,7 +80,8 @@ wwarning(const char *msg, ...) fputs(_WINGS_progname, stderr); fputs(" warning: ",stderr); fputs(buf, stderr); - fflush(NULL); + fflush(stdout); + fflush(stderr); va_end(args); } @@ -109,7 +111,8 @@ wsyserror(const char *msg, ...) strcat(buf, strerror(error)); strcat(buf,"\n"); fputs(buf, stderr); - fflush(NULL); + fflush(stderr); + fflush(stdout); #else perror(buf); #endif diff --git a/WINGs/findfile.c b/WINGs/findfile.c index 98db38ec..e0f7453a 100644 --- a/WINGs/findfile.c +++ b/WINGs/findfile.c @@ -1,5 +1,5 @@ /* - * WindowMaker miscelaneous function library + * Window Maker miscelaneous function library * * Copyright (c) 1997 Alfredo K. Kojima * diff --git a/WINGs/memory.c b/WINGs/memory.c index 5888d24c..e76e4154 100644 --- a/WINGs/memory.c +++ b/WINGs/memory.c @@ -1,5 +1,5 @@ /* - * WindowMaker miscelaneous function library + * Window Maker miscelaneous function library * * Copyright (c) 1997 Alfredo K. Kojima * diff --git a/WINGs/usleep.c b/WINGs/usleep.c index 16a8d688..4c5246de 100644 --- a/WINGs/usleep.c +++ b/WINGs/usleep.c @@ -7,17 +7,16 @@ # include #endif -#ifdef _AIX -#include -#endif - #ifdef HAVE_SYS_TYPES_H # include #endif + #if defined(HAVE_SELECT) - +#ifdef HAVE_SYS_SELECT_H +# include +#endif void wusleep(unsigned int microsecs) diff --git a/WINGs/wbrowser.c b/WINGs/wbrowser.c index 44a3ba27..cc966dd4 100644 --- a/WINGs/wbrowser.c +++ b/WINGs/wbrowser.c @@ -435,9 +435,10 @@ paintItem(WMList *lPtr, Drawable d, char *text, int state, WMRect *rect) width, height); else XClearArea(scr->display, d, x, y, width, height, False); - - W_PaintText(view, d, scr->normalFont, x+4, y, width, - WALeft, W_GC(scr->black), False, text, strlen(text)); + + if (text) + W_PaintText(view, d, scr->normalFont, x+4, y, width, + WALeft, W_GC(scr->black), False, text, strlen(text)); if (state & WLDSIsBranch) { XDrawLine(scr->display, d, W_GC(scr->darkGray), x+width-11, y+3, diff --git a/WINGs/wevent.c b/WINGs/wevent.c index 3c906cd0..6c992e63 100644 --- a/WINGs/wevent.c +++ b/WINGs/wevent.c @@ -31,7 +31,7 @@ extern _WINGsConfiguration WINGsConfiguration; typedef struct TimerHandler { WMCallback *callback; /* procedure to call */ - unsigned long msec; /* when to call the callback */ + struct timeval when; /* when to call the callback */ void *clientData; struct TimerHandler *next; } TimerHandler; @@ -114,22 +114,32 @@ static WMEventHook *extraEventHandler=NULL; #define idlePending() (idleHandler) - -/* return current time in milliseconds */ #ifdef HAVE_GETTIMEOFDAY -static unsigned long -rightNow(void) { - struct timeval tv; - - gettimeofday(&tv, NULL); - - return 1000L*(unsigned long)tv.tv_sec + (unsigned long)tv.tv_usec/1000L; +static void +rightNow(struct timeval *tv) { + gettimeofday(tv, NULL); } #else /* !HAVE_GETTIMEOFDAY */ -# define rightNow() (1000*(unsigned long)time(NULL)) +# define rightNow(tv) (tv)->tv_sec==time(NULL),(tv)->tv_usec=0 #endif /* !HAVE_GETTIMEOFDAY */ +/* 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))) + + +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; +} + + WMHandlerID WMAddTimerHandler(int milliseconds, WMCallback *callback, void *cdata) { @@ -139,17 +149,18 @@ WMAddTimerHandler(int milliseconds, WMCallback *callback, void *cdata) if (!handler) return NULL; - handler->msec = rightNow()+milliseconds; + rightNow(&handler->when); + addmillisecs(&handler->when, milliseconds); handler->callback = callback; handler->clientData = cdata; /* insert callback in queue, sorted by time left */ - if (!timerHandler || timerHandler->msec >= handler->msec) { + if (!timerHandler || !IS_AFTER(handler->when, timerHandler->when)) { /* first in the queue */ handler->next = timerHandler; timerHandler = handler; } else { tmp = timerHandler; - while (tmp->next && tmp->next->msec < handler->msec) { + while (tmp->next && IS_AFTER(handler->when, tmp->next->when)) { tmp = tmp->next; } handler->next = tmp->next; @@ -341,12 +352,11 @@ static void checkTimerHandlers() { TimerHandler *handler; - unsigned long now = rightNow(); - - if (!timerHandler || (timerHandler->msec > now)) - return; + struct timeval now; + + rightNow(&now); - while (timerHandler && timerHandler->msec <= now) { + while (timerHandler && IS_AFTER(now, timerHandler->when)) { handler = timerHandler; timerHandler = timerHandler->next; handler->next = NULL; @@ -357,22 +367,26 @@ checkTimerHandlers() -static unsigned long -msToNextTimerEvent() +static void +delayUntilNextTimerEvent(struct timeval *delay) { - unsigned long now; + struct timeval now; if (!timerHandler) { /* The return value of this function is only valid if there _are_ timers active. */ - return 0; + delay->tv_sec = 0; + delay->tv_usec = 0; + return; } - now = rightNow(); - if (timerHandler->msec < now) { - return 0; + rightNow(&now); + if (IS_AFTER(now, timerHandler->when)) { + delay->tv_sec = 0; + delay->tv_usec = 0; } else { - return timerHandler->msec - now; + delay->tv_sec = timerHandler->when.tv_sec - now.tv_sec; + delay->tv_usec = timerHandler->when.tv_usec - now.tv_usec; } } @@ -693,7 +707,6 @@ W_WaitForEvent(Display *dpy, unsigned long xeventmask) #ifndef HAVE_SELECT #error This_system_does_not_have_select(2)_and_is_not_supported #endif - unsigned long milliseconds; struct timeval timeout; struct timeval *timeoutPtr; fd_set rset, wset, eset; @@ -730,9 +743,7 @@ W_WaitForEvent(Display *dpy, unsigned long xeventmask) * next timer expires. */ if (timerPending()) { - milliseconds = msToNextTimerEvent(); - timeout.tv_sec = milliseconds / 1000; - timeout.tv_usec = (milliseconds % 1000) * 1000; + delayUntilNextTimerEvent(&timeout); timeoutPtr = &timeout; } else { timeoutPtr = (struct timeval*)0; @@ -841,9 +852,7 @@ WMMaskEvent(Display *dpy, long mask, XEvent *event) * next timer expires. */ if (timerPending()) { - milliseconds = msToNextTimerEvent(); - timeout.tv_sec = milliseconds / 1000; - timeout.tv_usec = (milliseconds % 1000) * 1000; + delayUntilNextTimerEvent(&timeout); timeoutOrInfty = &timeout; } else { timeoutOrInfty = (struct timeval*)0; diff --git a/WINGs/wfilepanel.c b/WINGs/wfilepanel.c index 8ff656e9..6608f6e8 100644 --- a/WINGs/wfilepanel.c +++ b/WINGs/wfilepanel.c @@ -243,6 +243,9 @@ WMGetSavePanel(WMScreen *scrPtr) void WMFreeFilePanel(WMFilePanel *panel) { + if (panel == WMWidgetScreen(panel->win)->sharedSavePanel) { + WMWidgetScreen(panel->win)->sharedSavePanel = NULL; + } if (panel == WMWidgetScreen(panel->win)->sharedOpenPanel) { WMWidgetScreen(panel->win)->sharedOpenPanel = NULL; } @@ -501,8 +504,12 @@ getCurrentFileName(WMFilePanel *panel) if (path[len-1]=='/') { file = WMGetTextFieldText(panel->fileField); tmp = wmalloc(strlen(path)+strlen(file)+8); - strcpy(tmp, path); - strcat(tmp, file); + if (file[0]!='/') { + strcpy(tmp, path); + strcat(tmp, file); + } else + strcpy(tmp, file); + free(file); free(path); return tmp; diff --git a/WINGs/widgets.c b/WINGs/widgets.c index 69ec62e1..99649c13 100644 --- a/WINGs/widgets.c +++ b/WINGs/widgets.c @@ -421,7 +421,8 @@ loadPixmaps(WMScreen *scr) image = RLoadImage(scr->rcontext, WINGS_IMAGES_FILE, 0); if (!image) { - wwarning("WINGs: could not load widget images file: %s", RErrorString); + wwarning("WINGs: could not load widget images file: %s", + RMessageForError(RErrorCode)); return False; } /* make it have a gray background */ @@ -653,6 +654,8 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context) scrPtr->rootView = W_CreateRootView(scrPtr); + W_InitApplication(scrPtr); + return scrPtr; } @@ -886,6 +889,13 @@ WMScreenDisplay(WMScreen *scr) } +int +WMScreenDepth(WMScreen *scr) +{ + return scr->depth; +} + + void WMRedisplayWidget(WMWidget *w) { diff --git a/WINGs/wtest.c b/WINGs/wtest.c index 905777cd..a466c621 100644 --- a/WINGs/wtest.c +++ b/WINGs/wtest.c @@ -424,7 +424,7 @@ int main(int argc, char **argv) * * Put the testSomething() function you want to test here. */ -#if 0 +#if 1 testOpenFilePanel(scr); testFontPanel(scr); testList(scr); diff --git a/WINGs/wtextfield.c b/WINGs/wtextfield.c index 67751c1e..d74518b4 100644 --- a/WINGs/wtextfield.c +++ b/WINGs/wtextfield.c @@ -573,9 +573,9 @@ handleEvents(XEvent *event, void *data) #endif paintTextField(tPtr); - WMPostNotificationName(WMTextDidBeginEditingNotification, tPtr, NULL); + WMPostNotificationName(WMTextDidBeginEditingNotification, tPtr, NULL); - tPtr->flags.notIllegalMovement = 0; + tPtr->flags.notIllegalMovement = 0; break; case FocusOut: @@ -588,8 +588,8 @@ handleEvents(XEvent *event, void *data) paintTextField(tPtr); if (!tPtr->flags.notIllegalMovement) { - WMPostNotificationName(WMTextDidEndEditingNotification, tPtr, - WMIllegalTextMovement); + WMPostNotificationName(WMTextDidEndEditingNotification, tPtr, + (void*)WMIllegalTextMovement); } break; @@ -614,7 +614,6 @@ handleTextFieldKeyPress(TextField *tPtr, XEvent *event) int count, refresh = 0; int control_pressed = 0; int changed; - WMNotification *notif; WMScreen *scr = tPtr->view->screen; changed = 0; @@ -629,29 +628,27 @@ handleTextFieldKeyPress(TextField *tPtr, XEvent *event) switch (ksym) { case XK_Tab: if (event->xkey.state & ShiftMask) { - notif = WMCreateNotification(WMTextDidEndEditingNotification, - tPtr, (void*)WMBacktabTextMovement); if (tPtr->view->prevFocusChain) { W_SetFocusOfTopLevel(W_TopLevelOfView(tPtr->view), tPtr->view->prevFocusChain); tPtr->flags.notIllegalMovement = 1; } + WMPostNotificationName(WMTextDidEndEditingNotification, tPtr, + (void*)WMBacktabTextMovement); } else { - notif = WMCreateNotification(WMTextDidEndEditingNotification, - tPtr, (void*)WMTabTextMovement); if (tPtr->view->nextFocusChain) { W_SetFocusOfTopLevel(W_TopLevelOfView(tPtr->view), tPtr->view->nextFocusChain); tPtr->flags.notIllegalMovement = 1; } + WMPostNotificationName(WMTextDidEndEditingNotification, + tPtr, (void*)WMTabTextMovement); } - WMPostNotification(notif); - WMReleaseNotification(notif); break; case XK_Return: - WMPostNotificationName(WMTextDidEndEditingNotification, tPtr, - (void*)WMReturnTextMovement); + WMPostNotificationName(WMTextDidEndEditingNotification, tPtr, + (void*)WMReturnTextMovement); break; case WM_EMACSKEY_LEFT: diff --git a/WINGs/wwindow.c b/WINGs/wwindow.c index ef6e1cc5..bb5cb36c 100644 --- a/WINGs/wwindow.c +++ b/WINGs/wwindow.c @@ -149,7 +149,6 @@ WMWindow* WMCreateWindowWithStyle(WMScreen *screen, char *name, int style) { _Window *win; - static int initedApp = 0; win = wmalloc(sizeof(_Window)); memset(win, 0, sizeof(_Window)); @@ -175,11 +174,6 @@ WMCreateWindowWithStyle(WMScreen *screen, char *name, int style) W_ResizeView(win->view, DEFAULT_WIDTH, DEFAULT_HEIGHT); - if (!initedApp) { - W_InitApplication(screen); - initedApp = 1; - } - WMAddNotificationObserver(realizeObserver, win, WMViewRealizedNotification, win->view); diff --git a/WPrefs.app/Configurations.c b/WPrefs.app/Configurations.c index f9556cf2..8095f809 100644 --- a/WPrefs.app/Configurations.c +++ b/WPrefs.app/Configurations.c @@ -1,6 +1,6 @@ /* Configurations.c- misc. configurations * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -127,6 +127,7 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, { RImage *icon; char *path; + RColor gray = {0xae,0xaa,0xae}; *icon1 = NULL; *icon2 = NULL; @@ -148,10 +149,11 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, free(path); return; } + RCombineImageWithColor(icon, &gray); if (xis) { - RCombineImages(icon, xis); + RCombineImagesWithOpaqueness(icon, xis, 180); if (!(*icon2 = WMCreatePixmapFromRImage(scr, icon, 127))) - wwarning(_("could not process icon %s:"), file, RErrorString); + wwarning(_("could not process icon %s:"), file, RMessageForError(RErrorCode)); } RDestroyImage(icon); free(path); diff --git a/WPrefs.app/Expert.c b/WPrefs.app/Expert.c index 9ad23c8c..b337571e 100644 --- a/WPrefs.app/Expert.c +++ b/WPrefs.app/Expert.c @@ -1,6 +1,6 @@ /* Expert.c- expert user options * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/Focus.c b/WPrefs.app/Focus.c index d9f53512..dc51450d 100644 --- a/WPrefs.app/Focus.c +++ b/WPrefs.app/Focus.c @@ -1,6 +1,6 @@ /* Focus.c- input and colormap focus stuff * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/Icons.c b/WPrefs.app/Icons.c index e7a99ccb..bf262407 100644 --- a/WPrefs.app/Icons.c +++ b/WPrefs.app/Icons.c @@ -1,6 +1,6 @@ /* Icons.c- icon preferences * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/KeyboardSettings.c b/WPrefs.app/KeyboardSettings.c index 8afb178b..324764d3 100644 --- a/WPrefs.app/KeyboardSettings.c +++ b/WPrefs.app/KeyboardSettings.c @@ -1,6 +1,6 @@ /* KeyboardSettings.c- keyboard options (equivalent to xset) * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/KeyboardShortcuts.c b/WPrefs.app/KeyboardShortcuts.c index 4ec68c64..4f168427 100644 --- a/WPrefs.app/KeyboardShortcuts.c +++ b/WPrefs.app/KeyboardShortcuts.c @@ -1,6 +1,6 @@ /* KeyboardShortcuts.c- keyboard shortcut bindings * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/Makefile.am b/WPrefs.app/Makefile.am index 86aae9fd..a8334833 100644 --- a/WPrefs.app/Makefile.am +++ b/WPrefs.app/Makefile.am @@ -12,7 +12,7 @@ wpdatadir = @wprefsdir@ wpdata_DATA = WPrefs.tiff WPrefs.xpm -EXTRA_DIST = $(wpdata_DATA) +EXTRA_DIST = $(wpdata_DATA) TexturePanel.icons WPrefs_SOURCES = \ main.c \ @@ -31,6 +31,8 @@ WPrefs_SOURCES = \ Preferences.c \ Text.c \ TextureAndColor.c \ + TexturePanel.c \ + TexturePanel.h \ WindowHandling.c \ Workspace.c \ double.c \ @@ -48,14 +50,14 @@ INCLUDES = \ -I$(top_srcdir)/wrlib \ -I$(top_srcdir)/WINGs \ @XCFLAGS@ \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList WPrefs_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a WPrefs_LDADD = \ -L$(top_builddir)/WINGs -lWINGs\ -L$(top_builddir)/wrlib -lwraster \ - @LIBPL_LIBS@ \ + -L$(top_builddir)/libPropList -lPropList \ @XLFLAGS@ \ @GFXLIBS@ \ @XLIBS@ \ diff --git a/WPrefs.app/Makefile.in b/WPrefs.app/Makefile.in index 2c938d72..faf9b064 100644 --- a/WPrefs.app/Makefile.in +++ b/WPrefs.app/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -105,7 +103,7 @@ wpdatadir = @wprefsdir@ wpdata_DATA = WPrefs.tiff WPrefs.xpm -EXTRA_DIST = $(wpdata_DATA) +EXTRA_DIST = $(wpdata_DATA) TexturePanel.icons WPrefs_SOURCES = \ main.c \ @@ -124,6 +122,8 @@ WPrefs_SOURCES = \ Preferences.c \ Text.c \ TextureAndColor.c \ + TexturePanel.c \ + TexturePanel.h \ WindowHandling.c \ Workspace.c \ double.c \ @@ -140,14 +140,14 @@ INCLUDES = \ -I$(top_srcdir)/wrlib \ -I$(top_srcdir)/WINGs \ @XCFLAGS@ \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList WPrefs_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a WPrefs_LDADD = \ -L$(top_builddir)/WINGs -lWINGs\ -L$(top_builddir)/wrlib -lwraster \ - @LIBPL_LIBS@ \ + -L$(top_builddir)/libPropList -lPropList \ @XLFLAGS@ \ @GFXLIBS@ \ @XLIBS@ \ @@ -169,7 +169,8 @@ X_PRE_LIBS = @X_PRE_LIBS@ WPrefs_OBJECTS = main.o WPrefs.o Configurations.o Expert.o Focus.o \ Icons.o KeyboardSettings.o KeyboardShortcuts.o Menu.o MenuPreferences.o \ MouseSettings.o Paths.o Preferences.o Text.o TextureAndColor.o \ -WindowHandling.o Workspace.o double.o MenuGuru.o xmodifier.o +TexturePanel.o WindowHandling.o Workspace.o double.o MenuGuru.o \ +xmodifier.o WPrefs_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) diff --git a/WPrefs.app/Menu.c b/WPrefs.app/Menu.c index f6fc32cc..21eeef92 100644 --- a/WPrefs.app/Menu.c +++ b/WPrefs.app/Menu.c @@ -1,6 +1,6 @@ /* Menu.c- menu definition * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -1280,9 +1280,8 @@ showData(_Panel *panel) strcat(menuPath, "/Defaults/WMRootMenu"); menu = PLGetProplistWithPath(menuPath); - free(menuPath); - if (!PLIsArray(menu)) { + if (!menu || !PLIsArray(menu)) { sprintf(buffer, _("The format of the current menu in ~/G/D/WMRootMenu " "is not supported by WPrefs. A new menu will be created.\n" "You can also replace ~/G/D/WMRootMenu with ~/G/L/W/plmenu " @@ -1303,8 +1302,11 @@ showData(_Panel *panel) } else { pmenu = preProcessMenu(menu, &hasWSMenu); } - PLSetFilename(pmenu, PLGetFilename(menu)); - PLRelease(menu); + PLSetFilename(pmenu, menuPath); + free(menuPath); + + if (menu) + PLRelease(menu); if (panel->itemClipboard) { PLRelease(panel->itemClipboard); diff --git a/WPrefs.app/MenuGuru.c b/WPrefs.app/MenuGuru.c index 7373c270..c34d1e9d 100644 --- a/WPrefs.app/MenuGuru.c +++ b/WPrefs.app/MenuGuru.c @@ -1,6 +1,6 @@ /* MenuGuru.c- OPEN_MENU definition "guru" assistant * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/MenuPreferences.c b/WPrefs.app/MenuPreferences.c index 87e42810..e4cd6d21 100644 --- a/WPrefs.app/MenuPreferences.c +++ b/WPrefs.app/MenuPreferences.c @@ -1,6 +1,6 @@ /* MenuPreferences.c- menu related preferences * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/MouseSettings.c b/WPrefs.app/MouseSettings.c index 222eb931..115a71ce 100644 --- a/WPrefs.app/MouseSettings.c +++ b/WPrefs.app/MouseSettings.c @@ -1,6 +1,6 @@ /* MouseSettings.c- mouse options (some are equivalent to xset) * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -738,8 +738,8 @@ createPanel(Panel *p) WMSetFrameTitle(panel->grabF, _("Mouse Grab Modifier")); panel->grabP = WMCreatePopUpButton(panel->grabF); - WMResizeWidget(panel->grabP, 120, 20); - WMMoveWidget(panel->grabP, 60, 25); + WMResizeWidget(panel->grabP, 160, 20); + WMMoveWidget(panel->grabP, 40, 25); fillModifierPopUp(panel->grabP); diff --git a/WPrefs.app/Paths.c b/WPrefs.app/Paths.c index b49c0f7b..9878172d 100644 --- a/WPrefs.app/Paths.c +++ b/WPrefs.app/Paths.c @@ -1,6 +1,6 @@ /* Paths.c- pixmap/icon paths * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/Preferences.c b/WPrefs.app/Preferences.c index bfb32837..900f4ce1 100644 --- a/WPrefs.app/Preferences.c +++ b/WPrefs.app/Preferences.c @@ -1,6 +1,6 @@ /* Preferences.c- misc personal preferences * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -192,7 +192,7 @@ createPanel(Panel *p) panel->raisB = WMCreateSwitchButton(panel->optF); WMResizeWidget(panel->raisB, 440, 20); WMMoveWidget(panel->raisB, 20, 25); - WMSetButtonText(panel->raisB, _("Raise window when switching focus with keyboard.")); + WMSetButtonText(panel->raisB, _("Raise window when switching focus with keyboard (CirculateRaise).")); WMMapSubwidgets(panel->optF); diff --git a/WPrefs.app/README b/WPrefs.app/README index 6e4d2ed1..06a19544 100644 --- a/WPrefs.app/README +++ b/WPrefs.app/README @@ -67,9 +67,8 @@ By default, WPrefs.app will be installed in the GNUstep applications directory, which is /usr/local/GNUstep/Apps. If you want to install it somewhere else, like in /some_weird_path/Apps, set the GNUSTEP_LOCAL_ROOT environment variable to some_weird_path before running configure for -WindowMaker. Leave this variable always set (make it be set from your -.profile or .tcshrc or whatever), or WPrefs.app will not find it's resource -files (like icons). +WindowMaker. You can also configure Window Maker supplying the --with-appspath +option to configure, like ./configure --with-appspath=/usr/GNUstep/Apps If you change your mind after installing, you can move the .app directory to one of the following GNUstep/Apps directories: @@ -91,6 +90,9 @@ Credits User interface design, programming and a few icons: Alfredo K. Kojima +Additional programming: + James Thompson + Icon and image artwork: Marco van Hylckama Vlieg @@ -99,7 +101,7 @@ WindowMaker ----------- If for some weird reason you end up with this preferences program and -don't have WindowMaker yet, you can get more information about it at +don't have Window Maker yet, you can get more information about it at http://windowmaker.org and download it at ftp://ftp.windowmaker.org diff --git a/WPrefs.app/Text.c b/WPrefs.app/Text.c index b75cbfa2..7c48752f 100644 --- a/WPrefs.app/Text.c +++ b/WPrefs.app/Text.c @@ -1,6 +1,6 @@ /* Text.c- text/font settings * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/TextureAndColor.c b/WPrefs.app/TextureAndColor.c index 78d303ae..1b792011 100644 --- a/WPrefs.app/TextureAndColor.c +++ b/WPrefs.app/TextureAndColor.c @@ -1,6 +1,6 @@ /* TextureAndColor.c- color/texture for titlebar etc. * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -23,18 +23,20 @@ #include "WPrefs.h" +#include "TexturePanel.h" + typedef struct _Panel { WMFrame *frame; - char *sectionName; + char *sectionName; CallbackRec callbacks; - + WMWindow *win; - + WMPopUpButton *secP; - + WMLabel *prevL; - + /* window titlebar */ WMFrame *focF; WMColorWell *focC; @@ -42,14 +44,14 @@ typedef struct _Panel { WMTextField *focT; WMLabel *foc2L; WMButton *focB; - + WMFrame *unfF; WMColorWell *unfC; WMLabel *unfL; WMTextField *unfT; WMLabel *unf2L; WMButton *unfB; - + WMFrame *ownF; WMColorWell *ownC; WMLabel *ownL; @@ -61,7 +63,7 @@ typedef struct _Panel { WMFrame *backF; WMTextField *backT; WMButton *backB; - + WMFrame *textF; WMColorWell *textC; @@ -80,7 +82,7 @@ typedef struct _Panel { WMLabel *seltL; WMColorWell *selbC; WMLabel *selbL; - + /* workspace/clip */ WMFrame *workF; WMTextField *workT; @@ -97,7 +99,7 @@ typedef struct _Panel { WMTextField *iconT; WMButton *iconB; - + Pixmap preview; Pixmap ftitle; Pixmap utitle; Pixmap otitle; @@ -123,10 +125,53 @@ typedef struct _Panel { #define EVERYTHING 0xff +static Pixmap +renderTexture(_Panel *panel, char *texture, int width, int height, + Bool bordered) +{ + return None; +} + + static void updatePreviewBox(_Panel *panel, int elements) { + WMScreen *scr = WMWidgetScreen(panel->win); + Display *dpy = WMScreenDisplay(scr); + /* RContext *rc = WMScreenRContext(scr);*/ + int refresh = 0; + char *tmp; + + if (!panel->preview) { + panel->preview = XCreatePixmap(dpy, WMWidgetXID(panel->win), + 220-4, 185-4, WMScreenDepth(scr)); + + refresh = -1; + } + + if (elements & FTITLE) { + if (panel->ftitle) + XFreePixmap(dpy, panel->ftitle); + + tmp = WMGetTextFieldText(panel->focT); + panel->ftitle = renderTexture(panel, tmp, 180, 20, True); + free(tmp); + } + + /* have to repaint everything to make things simple, eliminating + * clipping stuff */ + if (refresh) { + + } + if (refresh<0) { + WMPixmap *pix; + pix = WMCreatePixmapFromXPixmaps(scr, panel->preview, None, + 220-4, 185-4, WMScreenDepth(scr)); + + WMSetLabelImage(panel->prevL, pix); + WMReleasePixmap(pix); + } } diff --git a/WPrefs.app/TexturePanel.c b/WPrefs.app/TexturePanel.c new file mode 100644 index 00000000..95af43f7 --- /dev/null +++ b/WPrefs.app/TexturePanel.c @@ -0,0 +1,1027 @@ +/* TexturePanel.c- texture editting panel + * + * WPrefs - WindowMaker Preferences Program + * + * Copyright (c) 1998 Alfredo K. Kojima + * Copyright (c) 1998 James Thompson + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + * + */ + +#include +#include +#include +#include + +#include + +#include +#include + + +#include "TexturePanel.h" +#include "TexturePanel.icons" + +typedef struct _TexturePanel { + WMWindow *win; + + WMFrame *typeF; + WMButton *tsoliB; + WMButton *tgradB; + WMButton *tpixmB; + + WMButton *okB; + WMButton *cancB; + + /* solid */ + WMFrame *scolorF; + WMColorWell *scolorW; + + /* gradient */ + WMFrame *gcolorF; + WMList *gcolorLs; + WMColorWell *gcolorW; + WMButton *gaddB; + WMButton *gremB; + WMButton *gupdB; + + WMFrame *gdirF; + WMButton *ghorB; + WMButton *gverB; + WMButton *gdiaB; + + /* pixmap */ + WMFrame *pimagF; + WMLabel *pimagL; + WMTextField *pimagT; + WMButton *pbrowB; + + WMFrame *pcolorF; + WMColorWell *pcolorW; + + WMFrame *pmodeF; + WMButton *pscalB; + WMButton *ptileB; + + WMAction *okAction; + void *okData; + + WMAction *cancelAction; + void *cancelData; + +} _TexturePanel; + + + +char *WMGetColorWellRGBString(WMColorWell *cPtr) { + char *rgbString; + WMColor *color; + + + rgbString = wmalloc(13); + color = WMGetColorWellColor(cPtr); + + if (color) { + sprintf(rgbString,"rgb:%02x/%02x/%02x", + (WMRedComponentOfColor(color) >> 8), + (WMGreenComponentOfColor(color) >> 8), + (WMBlueComponentOfColor(color) >> 8)); + } + + return rgbString; +} + + + +/* + *-------------------------------------------------------------------------- + * Private Functions + *-------------------------------------------------------------------------- + */ +static void buttonCallback(WMWidget *self, void *data); +static void renderTextureButtons (_TexturePanel *panel); +static void paintListItem(WMList *lPtr, Drawable d, char *text, int state, WMRect *rect); +static void notificationObserver(void *self, WMNotification *notif); + +static void +notificationObserver(void *self, WMNotification *notif) +{ + _TexturePanel *panel = (_TexturePanel*)self; + void *object = WMGetNotificationObject(notif); + char *text; + + if (WMGetNotificationName(notif) == WMTextDidChangeNotification) { + if (object == panel->pimagT) { + text = WMGetTextFieldText(panel->pimagT); + if (strlen(text)) { + WMSetButtonEnabled(panel->okB, True); + } else { + WMSetButtonEnabled(panel->okB, False); + } + free(text); + } + } +} + + +static void +paintListItem(WMList *lPtr, Drawable d, char *text, int state, WMRect *rect) +{ + WMScreen *scr; + int width, height, x, y; + GC gc; + Display *dpy; + + scr = WMWidgetScreen(lPtr); + dpy = WMScreenDisplay(scr); + + width = rect->size.width; + height = rect->size.height; + x = rect->pos.x; + y = rect->pos.y; + + if (state & WLDSSelected) + XFillRectangle(dpy, d, WMColorGC(WMWhiteColor(scr)), x, y,width, height); + else + XClearArea(WMScreenDisplay(scr), d, x, y, width, height, False); + + gc = XCreateGC(dpy, RootWindow(dpy, 0),0,NULL); + WMSetColorInGC(WMCreateNamedColor(scr, text, True),gc); + XFillRectangle (dpy, d, gc,x+5,y+3,width-8,height-6); + XFreeGC(dpy,gc); +} + + +static void +buttonCallback(WMWidget *self, void *data) +{ + _TexturePanel *panel = (_TexturePanel*)data; + char *text, *color; + WMOpenPanel *op; + int itemRow; + + WMSetButtonEnabled(panel->okB, True); + + /* Global Buttons */ + + if (self == panel->okB) { + if (panel->okAction) { + (*panel->okAction)(self, panel->okData); + } else { + wwarning ("Texture panel OK button undefined"); + } + } else if (self == panel->cancB) { + if (panel->cancelAction) { + (*panel->cancelAction)(self, panel->cancelData); + } else { + wwarning ("Texture panel CANCEL button undefined"); + } + } else if (self == panel->tsoliB) { + WMMapWidget(panel->scolorF); + WMUnmapWidget(panel->gcolorF); + WMUnmapWidget(panel->gdirF); + WMUnmapWidget(panel->pimagF); + WMUnmapWidget(panel->pcolorF); + WMUnmapWidget(panel->pmodeF); + } else if (self == panel->tgradB) { + WMMapWidget(panel->gcolorF); + WMMapWidget(panel->gdirF); + WMUnmapWidget(panel->scolorF); + WMUnmapWidget(panel->pimagF); + WMUnmapWidget(panel->pcolorF); + WMUnmapWidget(panel->pmodeF); + } else if (self == panel->tpixmB) { + WMMapWidget(panel->pimagF); + WMMapWidget(panel->pcolorF); + WMMapWidget(panel->pmodeF); + WMUnmapWidget(panel->gcolorF); + WMUnmapWidget(panel->gdirF); + WMUnmapWidget(panel->scolorF); + + text = WMGetTextFieldText(panel->pimagT); + if (!strlen(text)) { + WMSetButtonEnabled(panel->okB, False); + } + free(text); + + /* Gradient Panel Buttons */ + + } else if (self == panel->gaddB) { + color = WMGetColorWellRGBString(panel->gcolorW); + itemRow = WMGetListSelectedItemRow(panel->gcolorLs); + WMInsertListItem(panel->gcolorLs,itemRow, color); + free(color); + renderTextureButtons(panel); + + } else if (self == panel->gremB) { + if (WMGetListNumberOfRows(panel->gcolorLs) != 1) { + itemRow = WMGetListSelectedItemRow(panel->gcolorLs); + WMRemoveListItem(panel->gcolorLs,itemRow); + renderTextureButtons(panel); + } + + } else if (self == panel->gupdB) { + color = WMGetColorWellRGBString(panel->gcolorW); + itemRow = WMGetListSelectedItemRow(panel->gcolorLs); + WMRemoveListItem(panel->gcolorLs,itemRow); + WMInsertListItem(panel->gcolorLs,itemRow, color); + free(color); + renderTextureButtons(panel); + + /* Pixmap Panel Buttons */ + + } else if (self == panel->pbrowB) { + + op = WMGetOpenPanel(WMWidgetScreen(panel->pbrowB)); + if (WMRunModalOpenPanelForDirectory(op, NULL, "/usr/local", NULL, NULL)) { + char *path; + path = WMGetFilePanelFileName(op); + WMSetTextFieldText(panel->pimagT, path); + if (strlen(path)) { + WMSetButtonEnabled(panel->okB, True); + } + free(path); + } + WMFreeFilePanel(op); + } + +} + +#if 0 + +static void +changePanel(WMWidget *self, void *data) +{ + _TexturePanel *panel = (_TexturePanel*)data; + char *text = NULL; + + WMSetButtonEnabled(panel->okB, True); + if (self == panel->tsoliB) { + WMMapWidget(panel->scolorF); + WMUnmapWidget(panel->gcolorF); + WMUnmapWidget(panel->gdirF); + WMUnmapWidget(panel->pimagF); + WMUnmapWidget(panel->pcolorF); + WMUnmapWidget(panel->pmodeF); + } else if (self == panel->tgradB) { + WMMapWidget(panel->gcolorF); + WMMapWidget(panel->gdirF); + WMUnmapWidget(panel->scolorF); + WMUnmapWidget(panel->pimagF); + WMUnmapWidget(panel->pcolorF); + WMUnmapWidget(panel->pmodeF); + } else { + WMMapWidget(panel->pimagF); + WMMapWidget(panel->pcolorF); + WMMapWidget(panel->pmodeF); + WMUnmapWidget(panel->gcolorF); + WMUnmapWidget(panel->gdirF); + WMUnmapWidget(panel->scolorF); + + text = WMGetTextFieldText(panel->pimagT); + if (!strlen(text)) { + WMSetButtonEnabled(panel->okB, False); + } + free(text); + } + +} + +static void +modifyGradientList(WMWidget *self, void *data) +{ + _TexturePanel *panel = (_TexturePanel*)data; + char *color = NULL; + int itemRow; + + itemRow = WMGetListSelectedItemRow(panel->gcolorLs); + + color = WMGetColorWellRGBString(panel->gcolorW); + + if (self == panel->gaddB) { + WMInsertListItem(panel->gcolorLs,itemRow, color); + } else if (self == panel->gremB) { + if (WMGetListNumberOfRows(panel->gcolorLs) != 1) { + WMRemoveListItem(panel->gcolorLs,itemRow); + } + + } else { + WMRemoveListItem(panel->gcolorLs,itemRow); + WMInsertListItem(panel->gcolorLs,itemRow, color); + } + free (color); + + renderTextureButtons(panel); +} +#endif + + +static void +renderTextureButtons(_TexturePanel *panel) +{ + RColor **colors = NULL; + XColor color; + WMPixmap *icon; + RImage *imgh, *imgv, *imgd; + WMScreen *scr; + + int i, listRows; + + scr = WMWidgetScreen(panel->gcolorLs); + listRows = WMGetListNumberOfRows(panel->gcolorLs); + colors = wmalloc(sizeof(RColor*)*(listRows+1)); + + for (i=0; i < listRows; i++) { + if (!XParseColor(WMScreenDisplay(scr), (WMScreenRContext(scr))->cmap, + wstrdup(WMGetListItem(panel->gcolorLs, i)->text),&color)) { + wfatal("could not parse color \"%s\"\n", WMGetListItem(panel->gcolorLs, i)->text); + exit(1); + } else { + colors[i] = malloc(sizeof(RColor)); + colors[i]->red = color.red >> 8; + colors[i]->green = color.green >> 8; + colors[i]->blue = color.blue >> 8; + } + } + colors[i] = NULL; + + imgh = RRenderMultiGradient(50, 20, colors, RGRD_HORIZONTAL); + if (!imgh) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, imgh, 120); + RDestroyImage(imgh); + WMSetButtonImage(panel->ghorB, icon); + WMReleasePixmap(icon); + } + + imgv = RRenderMultiGradient(50, 20, colors, RGRD_VERTICAL); + if (!imgv) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, imgv, 120); + RDestroyImage(imgv); + WMSetButtonImage(panel->gverB, icon); + WMReleasePixmap(icon); + } + + imgd = RRenderMultiGradient(50, 20, colors, RGRD_DIAGONAL); + if (!imgd) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, imgd, 120); + RDestroyImage(imgd); + WMSetButtonImage(panel->gdiaB, icon); + WMReleasePixmap(icon); + } + + free(colors); +} + + +/* + *-------------------------------------------------------------------------- + * Public functions + *-------------------------------------------------------------------------- + */ +void +DestroyTexturePanel(TexturePanel *panel) +{ + WMUnmapWidget(panel->win); + WMDestroyWidget(panel->win); + free(panel); +} + + +void +ShowTexturePanel(TexturePanel *panel) +{ + WMMapWidget(panel->win); +} + + +void +HideTexturePanel(TexturePanel *panel) +{ + WMUnmapWidget(panel->win); +} + +void +SetTexturePanelOkAction(TexturePanel *panel, WMAction *action, void *clientData) +{ + panel->okAction = action; + panel->okData = clientData; +} + + +void +SetTexturePanelCancelAction(TexturePanel *panel, WMAction *action, void *clientData) +{ + panel->cancelAction = action; + panel->cancelData = clientData; +} + +void +SetTexturePanelTexture(TexturePanel *panel, char *texture) +{ + char *parseString; + char *parseStringPosition; + char *enclosures = "( )"; + char *seperators = " ,\""; + char *filename; + + WMSetButtonSelected(panel->tsoliB, False); + WMSetButtonSelected(panel->tgradB, False); + WMSetButtonSelected(panel->tpixmB, False); + + parseString = wstrdup(texture); + parseStringPosition = parseString; + + parseStringPosition = strtok(parseStringPosition,seperators); + wwarning ("Parsing..."); + + while (parseStringPosition) { + + if (!strpbrk(parseStringPosition,enclosures)) { + if (strcasecmp(parseStringPosition,"solid") == 0) { + wwarning("Switch to solid"); + WMPerformButtonClick(panel->tsoliB); + + parseStringPosition = strtok(NULL,seperators); + + while (parseStringPosition) { + if (!strpbrk(parseStringPosition,enclosures)) { + WMSetColorWellColor(panel->scolorW,WMCreateNamedColor(WMWidgetScreen(panel->scolorW), parseStringPosition, True)); + } + parseStringPosition = strtok(NULL,seperators); + } + + } else if ((strstr(parseStringPosition,"pixmap")) && (strcasecmp(strstr(parseStringPosition,"pixmap"),"pixmap") == 0)) { + WMSetButtonSelected(panel->ptileB, False); + WMSetButtonSelected(panel->pscalB, False); + + WMPerformButtonClick(panel->tpixmB); + + if (tolower(*parseStringPosition) == 't') { + wwarning ("Switch to Tiled Pixmap"); + WMPerformButtonClick(panel->ptileB); + } else { + wwarning ("Switch to Scaled Pixmap"); + WMPerformButtonClick(panel->pscalB); + } + + + filename = NULL; + parseStringPosition = strtok(NULL,seperators); + do { + if (filename) filename = wstrappend(filename," "); + filename = wstrappend(filename,parseStringPosition); + parseStringPosition = strtok(NULL,seperators); + } while (!strstr(parseStringPosition,"rgb:")); + + WMSetTextFieldText(panel->pimagT, filename); + free(filename); + + /* parseStringPosition = strtok(NULL,seperators); */ + + WMSetColorWellColor(panel->pcolorW,WMCreateNamedColor(WMWidgetScreen(panel->scolorW), parseStringPosition, True)); + + } else if ((strstr(parseStringPosition,"gradient")) && (strcasecmp(strstr(parseStringPosition,"gradient"),"gradient") == 0)) { + WMSetButtonSelected(panel->ghorB, False); + WMSetButtonSelected(panel->gverB, False); + WMSetButtonSelected(panel->gdiaB, False); + + WMPerformButtonClick(panel->tgradB); + + if (strstr(parseStringPosition,"h")) { + WMPerformButtonClick(panel->ghorB); + } else if (strstr(parseStringPosition,"v")) { + WMPerformButtonClick(panel->gverB); + } else { + WMPerformButtonClick(panel->gdiaB); + } + + WMClearList(panel->gcolorLs); + + parseStringPosition = strtok(NULL,seperators); + while (parseStringPosition) { + if (!strpbrk(parseStringPosition,enclosures)) { + WMAddListItem(panel->gcolorLs, parseStringPosition); + WMSetColorWellColor(panel->gcolorW,WMCreateNamedColor(WMWidgetScreen(panel->scolorW), parseStringPosition, True)); + } + parseStringPosition = strtok(NULL,seperators); + } + } else { + wfatal("Unknown Texture Type"); + } + + while (parseStringPosition) { + parseStringPosition = strtok(NULL,seperators); + } + + } + + parseStringPosition = strtok(NULL,seperators); + } + renderTextureButtons (panel); + free(parseString); +} + + +char* +GetTexturePanelTextureString(TexturePanel *panel) +{ + char *colorString = NULL; + char *start = "( "; + char *finish = " )"; + char *seperator = ", "; + char *quote = "\""; + int i, listRows; + + colorString = wstrappend(colorString,start); + + if (WMGetButtonSelected(panel->tsoliB)) { + colorString = wstrappend(colorString,"solid"); + colorString = wstrappend(colorString,seperator); + colorString = wstrappend(colorString, quote); + colorString = wstrappend(colorString,WMGetColorWellRGBString(panel->scolorW)); + colorString = wstrappend(colorString, quote); + + } else if (WMGetButtonSelected(panel->tgradB)) { + listRows = WMGetListNumberOfRows(panel->gcolorLs); + + if (listRows > 2) { + colorString = wstrappend(colorString,"m"); + } + if (WMGetButtonSelected(panel->ghorB)) { + colorString = wstrappend(colorString,"hgradient"); + } else if (WMGetButtonSelected(panel->gverB)) { + colorString = wstrappend(colorString,"vgradient"); + } else { + colorString = wstrappend(colorString,"dgradient"); + } + + for (i=0; i < listRows; i++) { + colorString = wstrappend(colorString, seperator); + colorString = wstrappend(colorString, quote); + colorString = wstrappend(colorString, wstrdup(WMGetListItem(panel->gcolorLs, i)->text)); + colorString = wstrappend(colorString, quote); + } + } else if (WMGetButtonSelected(panel->tpixmB)) { + if (WMGetButtonSelected(panel->pscalB)) { + colorString = wstrappend(colorString,"spixmap"); + } else { + colorString = wstrappend(colorString,"tpixmap"); + } + colorString = wstrappend(colorString,seperator); + colorString = wstrappend(colorString, WMGetTextFieldText(panel->pimagT)); + colorString = wstrappend(colorString,seperator); + colorString = wstrappend(colorString, quote); + colorString = wstrappend(colorString, WMGetColorWellRGBString(panel->pcolorW)); + colorString = wstrappend(colorString, quote); + } + + colorString = wstrappend(colorString,finish); + + return colorString; +} + + +RImage* +RenderTexturePanelTexture(TexturePanel *panel, unsigned width, unsigned height) +{ + XColor color; + RContext *ctx; + RColor solidColor; + RColor **colors = NULL; + RImage *image=NULL, *fileImage; + WMScreen *scr; + WMColor *wellColor; + + int i, listRows, style; + + scr = WMWidgetScreen(panel->gcolorLs); + ctx = WMScreenRContext(scr); + + if (WMGetButtonSelected(panel->tsoliB)) { + + image = RCreateImage(width, height, 1); + wellColor = WMGetColorWellColor(panel->scolorW); + + solidColor.red = (WMRedComponentOfColor(wellColor) >> 8); + solidColor.green = (WMGreenComponentOfColor(wellColor) >> 8) ; + solidColor.blue = (WMBlueComponentOfColor(wellColor) >> 8); + solidColor.alpha = 0xff; + + WMReleaseColor(wellColor); + + RClearImage(image, &solidColor); + + } else if (WMGetButtonSelected(panel->tgradB)) { + + if (WMGetButtonSelected(panel->ghorB)) { + style = RGRD_HORIZONTAL; + } else if (WMGetButtonSelected(panel->gverB)) { + style = RGRD_VERTICAL; + } else { + style = RGRD_DIAGONAL; + } + + listRows = WMGetListNumberOfRows(panel->gcolorLs); + colors = wmalloc(sizeof(RColor*)*(listRows+1)); + + for (i=0; i < listRows; i++) { + if (!XParseColor(WMScreenDisplay(scr), ctx->cmap, + wstrdup(WMGetListItem(panel->gcolorLs, i)->text),&color)) { + wfatal("could not parse color \"%s\"\n", WMGetListItem(panel->gcolorLs, i)->text); + exit(1); + } else { + colors[i] = malloc(sizeof(RColor)); + colors[i]->red = color.red >> 8; + colors[i]->green = color.green >> 8; + colors[i]->blue = color.blue >> 8; + } + } + colors[i] = NULL; + + image = RRenderMultiGradient(width, height, colors, style); + + } else if (WMGetButtonSelected(panel->tpixmB)) { + + if (fopen(WMGetTextFieldText(panel->pimagT),"r")) { + + fileImage = RLoadImage(ctx, WMGetTextFieldText(panel->pimagT), 0); + if (WMGetButtonSelected(panel->pscalB)) { + image = RScaleImage(fileImage, width, height); + } else { + image = RMakeTiledImage(fileImage, width, height);; + } + } else { + wwarning ("Invalid File Name"); + return RCreateImage(1,1,1); + } + } + + return image; +} + +TexturePanel* +CreateTexturePanel(WMScreen *scr) +{ + RImage *image; + WMPixmap *icon; + WMColor *red; + TexturePanel *panel; + RColor white,black; + + white.red=255; + white.blue=255; + white.green=255; + white.alpha=255; + + black.red=0; + black.blue=0; + black.green=0; + black.alpha=0; + + panel = wmalloc(sizeof(_TexturePanel)); + memset(panel, 0, sizeof(_TexturePanel)); + red = WMCreateRGBColor(scr,100,100,100,True); + + panel->win = WMCreateWindow(scr, "textureBuilder"); + WMResizeWidget(panel->win, 275, 365); + WMSetWindowTitle(panel->win, "Texture Builder"); + + /***************** Generic stuff ****************/ + + panel->typeF = WMCreateFrame(panel->win); + WMResizeWidget(panel->typeF, 245, 80); + WMMoveWidget(panel->typeF, 15, 10); + WMSetFrameTitle(panel->typeF, "Texture Type"); + + panel->tsoliB = WMCreateButton(panel->typeF, WBTOnOff); + WMResizeWidget(panel->tsoliB, 48, 48); + WMMoveWidget(panel->tsoliB, 42, 20); + WMSetButtonImagePosition(panel->tsoliB, WIPImageOnly); + image = RGetImageFromXPMData(WMScreenRContext(scr), solid_xpm); + if (!image) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, image, 120); + RDestroyImage(image); + WMSetButtonImage(panel->tsoliB, icon); + WMReleasePixmap(icon); + } + WMSetButtonAction(panel->tsoliB, buttonCallback, panel); + + panel->tgradB = WMCreateButton(panel->typeF, WBTOnOff); + WMGroupButtons(panel->tsoliB, panel->tgradB); + WMResizeWidget(panel->tgradB, 48, 48); + WMMoveWidget(panel->tgradB, 98, 20); + WMSetButtonImagePosition(panel->tgradB, WIPImageOnly); + image = RGetImageFromXPMData(WMScreenRContext(scr), gradient_xpm); + if (!image) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, image, 120); + RDestroyImage(image); + WMSetButtonImage(panel->tgradB, icon); + WMReleasePixmap(icon); + } + WMSetButtonAction(panel->tgradB, buttonCallback, panel); + + panel->tpixmB = WMCreateButton(panel->typeF, WBTOnOff); + WMGroupButtons(panel->tsoliB, panel->tpixmB); + WMResizeWidget(panel->tpixmB, 48, 48); + WMMoveWidget(panel->tpixmB, 154, 20); + WMSetButtonImagePosition(panel->tpixmB, WIPImageOnly); + image = RGetImageFromXPMData(WMScreenRContext(scr), pixmap_xpm); + if (!image) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, image, 120); + RDestroyImage(image); + WMSetButtonImage(panel->tpixmB, icon); + WMReleasePixmap(icon); + } + WMSetButtonAction(panel->tpixmB, buttonCallback, panel); + + panel->okB = WMCreateCommandButton(panel->win); + WMResizeWidget(panel->okB, 70, 28); + WMMoveWidget(panel->okB, 110, 325); + WMSetButtonText(panel->okB, "OK"); + WMSetButtonAction(panel->okB,buttonCallback,panel); + + panel->cancB = WMCreateCommandButton(panel->win); + WMResizeWidget(panel->cancB, 70, 28); + WMMoveWidget(panel->cancB, 190, 325); + WMSetButtonText(panel->cancB, "Cancel"); + WMSetButtonAction(panel->cancB,buttonCallback,panel); + + WMMapSubwidgets(panel->typeF); + + /***************** Solid *****************/ + panel->scolorF = WMCreateFrame(panel->win); + WMResizeWidget(panel->scolorF, 245, 125); + WMMoveWidget(panel->scolorF, 15, 140); + WMSetFrameTitle(panel->scolorF, "Color"); + + panel->scolorW = WMCreateColorWell(panel->scolorF); + WMResizeWidget(panel->scolorW, 60, 45); + WMMoveWidget(panel->scolorW, 95, 40); + WMSetColorWellColor(panel->scolorW,WMCreateRGBColor(scr, 0xddff, 0xddff, 0, True)); + + WMMapSubwidgets(panel->scolorF); + + /***************** Gradient *****************/ + panel->gcolorF = WMCreateFrame(panel->win); + WMResizeWidget(panel->gcolorF, 245, 145); + WMMoveWidget(panel->gcolorF, 15, 95); + WMSetFrameTitle(panel->gcolorF, "Colors"); + + panel->gcolorLs = WMCreateList(panel->gcolorF); + WMResizeWidget(panel->gcolorLs, 120, 84); + WMMoveWidget(panel->gcolorLs, 20, 20); + + WMSetListUserDrawProc(panel->gcolorLs, paintListItem); + + WMAddListItem(panel->gcolorLs, "rgb:ff/ff/ff"); + WMAddListItem(panel->gcolorLs, "rgb:00/00/ff"); + + panel->gcolorW = WMCreateColorWell(panel->gcolorF); + WMResizeWidget(panel->gcolorW, 60, 45); + WMMoveWidget(panel->gcolorW, 160, 40); + WMSetColorWellColor(panel->gcolorW,WMCreateRGBColor(scr, 0xffff, 0, 0, True)); + + panel->gremB = WMCreateCommandButton(panel->gcolorF); + WMResizeWidget(panel->gremB, 64, 24); + WMMoveWidget(panel->gremB, 20, 110); + WMSetButtonText(panel->gremB, "Remove"); + WMSetButtonAction(panel->gremB,(WMAction*)buttonCallback,panel); + + panel->gupdB = WMCreateCommandButton(panel->gcolorF); + WMResizeWidget(panel->gupdB, 64, 24); + WMMoveWidget(panel->gupdB, 90, 110); + WMSetButtonText(panel->gupdB, "Update"); + WMSetButtonAction(panel->gupdB,(WMAction*)buttonCallback,panel); + + panel->gaddB = WMCreateCommandButton(panel->gcolorF); + WMResizeWidget(panel->gaddB, 64, 24); + WMMoveWidget(panel->gaddB, 160, 110); + WMSetButtonText(panel->gaddB, "Add"); + WMSetButtonAction(panel->gaddB,(WMAction*)buttonCallback,panel); + WMMapSubwidgets(panel->gcolorF); + + panel->gdirF = WMCreateFrame(panel->win); + WMResizeWidget(panel->gdirF, 245, 65); + WMMoveWidget(panel->gdirF, 15, 245); + WMSetFrameTitle(panel->gdirF, "Direction"); + + panel->ghorB = WMCreateButton(panel->gdirF, WBTOnOff); + WMResizeWidget(panel->ghorB, 64, 34); + WMMoveWidget(panel->ghorB, 20, 20); + WMSetButtonImagePosition(panel->ghorB, WIPImageOnly); + WMPerformButtonClick(panel->ghorB); + + + panel->gverB = WMCreateButton(panel->gdirF, WBTOnOff); + WMResizeWidget(panel->gverB, 64, 34); + WMMoveWidget(panel->gverB, 90, 20); + WMSetButtonImagePosition(panel->gverB, WIPImageOnly); + WMGroupButtons(panel->ghorB, panel->gverB); + + panel->gdiaB = WMCreateButton(panel->gdirF, WBTOnOff); + WMResizeWidget(panel->gdiaB, 64, 34); + WMMoveWidget(panel->gdiaB, 160, 20); + WMSetButtonImagePosition(panel->gdiaB, WIPImageOnly); + WMGroupButtons(panel->ghorB, panel->gdiaB); + + WMMapSubwidgets(panel->gdirF); + + /***************** Pixmap *****************/ + panel->pimagF = WMCreateFrame(panel->win); + WMResizeWidget(panel->pimagF, 245, 140); + WMMoveWidget(panel->pimagF, 15, 96); + WMSetFrameTitle(panel->pimagF, "Image"); + + panel->pimagL = WMCreateLabel(panel->pimagF); + WMResizeWidget(panel->pimagL, 220, 83); + WMMoveWidget(panel->pimagL, 10, 20); + WMSetLabelImagePosition(panel->pimagL, WIPImageOnly); + + panel->pimagT = WMCreateTextField(panel->pimagF); + WMResizeWidget(panel->pimagT, 147, 20); + WMMoveWidget(panel->pimagT, 10, 110); + + panel->pbrowB = WMCreateCommandButton(panel->pimagF); + WMResizeWidget(panel->pbrowB, 68, 24); + WMMoveWidget(panel->pbrowB, 165, 108); + WMSetButtonText(panel->pbrowB, "Browse..."); + WMSetButtonAction(panel->pbrowB,buttonCallback,panel); + + WMMapSubwidgets(panel->pimagF); + + panel->pcolorF = WMCreateFrame(panel->win); + WMResizeWidget(panel->pcolorF, 90, 75); + WMMoveWidget(panel->pcolorF, 15, 240); + WMSetFrameTitle(panel->pcolorF, "Color"); + + panel->pcolorW = WMCreateColorWell(panel->pcolorF); + WMResizeWidget(panel->pcolorW, 60, 45); + WMMoveWidget(panel->pcolorW, 15, 20); + WMSetColorWellColor(panel->pcolorW,WMCreateRGBColor(scr, 0x00, 0xddff, 0xffff, True)); + + + WMMapSubwidgets(panel->pcolorF); + + panel->pmodeF = WMCreateFrame(panel->win); + WMResizeWidget(panel->pmodeF, 145, 70); + WMMoveWidget(panel->pmodeF, 115, 245); + + panel->pscalB = WMCreateButton(panel->pmodeF, WBTOnOff); + WMResizeWidget(panel->pscalB, 54, 50); + WMMoveWidget(panel->pscalB, 10, 10); + WMSetButtonImagePosition(panel->pscalB, WIPImageOnly); + WMPerformButtonClick(panel->pscalB); + + image = RGetImageFromXPMData(WMScreenRContext(scr), scaled_xpm); + if (!image) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, image, 120); + RDestroyImage(image); + WMSetButtonImage(panel->pscalB, icon); + WMReleasePixmap(icon); + } + + panel->ptileB = WMCreateButton(panel->pmodeF, WBTOnOff); + WMResizeWidget(panel->ptileB, 54, 50); + WMMoveWidget(panel->ptileB, 75, 10); + WMSetButtonImagePosition(panel->ptileB, WIPImageOnly); + image = RGetImageFromXPMData(WMScreenRContext(scr), tiled_xpm); + if (!image) { + wwarning("internal error:%s", RMessageForError(RErrorCode)); + } else { + icon = WMCreatePixmapFromRImage(scr, image, 120); + RDestroyImage(image); + WMSetButtonImage(panel->ptileB, icon); + WMReleasePixmap(icon); + } + WMGroupButtons(panel->pscalB, panel->ptileB); + + WMMapSubwidgets(panel->pmodeF); + + WMRealizeWidget(panel->win); + WMMapSubwidgets(panel->win); + + WMPerformButtonClick(panel->tsoliB); + + WMMapWidget(panel->win); + + renderTextureButtons (panel); + + + /* register notification observers */ + WMAddNotificationObserver(notificationObserver, panel, + WMTextDidChangeNotification, + panel->pimagT); + + return panel; +} + + + +/* + *-------------------------------------------------------------------------- + * Test stuff + *-------------------------------------------------------------------------- + */ + +#ifdef test + +char *ProgName = "test"; + +void testOKButton(WMWidget *self, void *data){ + char *test; + Display *dpy; + Window win; + Pixmap pix; + RImage *image; + + TexturePanel *panel = (TexturePanel*)data; + test = GetTexturePanelTextureString(panel); + + wwarning(test); + + dpy = WMScreenDisplay(WMWidgetScreen(panel->okB)); + win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 250, 250, + 0, 0, 0); + XMapRaised(dpy, win); + XFlush(dpy); + + image = RenderTexturePanelTexture(panel, 250, 250); + + RConvertImage(WMScreenRContext(WMWidgetScreen(panel->okB)), image, &pix); + + XCopyArea(dpy, pix, win, (WMScreenRContext(WMWidgetScreen(panel->okB)))->copy_gc, 0, 0, image->width, image->height, + 0, 0); + + SetTexturePanelTexture(panel, test); + free (test); + +} +void testCancelButton(WMWidget *self, void *data){ + wwarning("Exiting test...."); + exit(0); +} + +void wAbort() +{ +exit(1); +} + +int main(int argc, char **argv) +{ + TexturePanel *panel; + + Display *dpy = XOpenDisplay(""); + WMScreen *scr; + + /* char *test; */ + + WMInitializeApplication("Test", &argc, argv); + + if (!dpy) { + wfatal("could not open display"); + exit(1); + } + + scr = WMCreateSimpleApplicationScreen(dpy); + + panel = CreateTexturePanel(scr); + + SetTexturePanelOkAction(panel,(WMAction*)testOKButton,panel); + SetTexturePanelCancelAction(panel,(WMAction*)testCancelButton,panel); + + ShowTexturePanel(panel); + + SetTexturePanelTexture(panel," ( tpixmap, ballot box.xpm, \"rgb:ff/de/ff\" ) "); + + WMScreenMainLoop(scr); + return 0; +} +#endif diff --git a/WPrefs.app/TexturePanel.h b/WPrefs.app/TexturePanel.h new file mode 100644 index 00000000..fe0d6ad8 --- /dev/null +++ b/WPrefs.app/TexturePanel.h @@ -0,0 +1,55 @@ +/* TexturePanel.h- texture editting panel + * + * WPrefs - WindowMaker Preferences Program + * + * Copyright (c) 1998 Alfredo K. Kojima + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#ifndef TEXTUREPANEL_H_ +#define TEXTUREPANEL_H_ + + + +typedef struct _TexturePanel TexturePanel; + + + +TexturePanel *CreateTexturePanel(WMScreen *scr); + +void DestroyTexturePanel(TexturePanel *panel); + +void ShowTexturePanel(TexturePanel *panel); + +void HideTexturePanel(TexturePanel *panel); + +void SetTexturePanelTexture(TexturePanel *panel, char *texture); + +char *GetTexturePanelTextureString(TexturePanel *panel); + +RImage *RenderTexturePanelTexture(TexturePanel *panel, unsigned width, + unsigned height); + +void SetTexturePanelOkAction(TexturePanel *panel, WMAction *action, + void *clientData); + +void SetTexturePanelCancelAction(TexturePanel *panel, WMAction *action, + void *clientData); + + +#endif + diff --git a/WPrefs.app/TexturePanel.icons b/WPrefs.app/TexturePanel.icons new file mode 100644 index 00000000..17e4e228 --- /dev/null +++ b/WPrefs.app/TexturePanel.icons @@ -0,0 +1,601 @@ +/* XPM */ +static char * scaled_xpm[] = { +"32 32 174 2", +" c #000000000000", +". c #C71BBAEA8617", +"X c #CF3CBEFB8E38", +"o c #CF3CC30B8E38", +"O c #D75CC30B9658", +"+ c #D75CC71B9658", +"@ c #CF3CBEFB9658", +"# c #D75CC71B9E79", +"$ c #B6DAAEBA8617", +"% c #A6999E7971C6", +"& c #8E388A286185", +"* c #C71BC30B9E79", +"= c #618561854103", +"- c #5965596538E3", +"; c #71C675D65144", +": c #861782076185", +"> c #9E79A2898617", +", c #69A66DB65144", +"< c #59655D754103", +"1 c #5144555530C2", +"2 c #4924451428A2", +"3 c #410341032081", +"4 c #5144514430C2", +"5 c #6185618538E3", +"6 c #4924492428A2", +"7 c #C71BBEFB8E38", +"8 c #CF3CBAEA8E38", +"9 c #BEFBB2CA8E38", +"0 c #B6DAAAAA8617", +"q c #9E79965869A6", +"w c #9658924869A6", +"e c #8E388A2869A6", +"r c #86178A2869A6", +"t c #A699A2898617", +"y c #5144596538E3", +"u c #30C234D31861", +"i c #38E33CF31861", +"p c #79E775D65144", +"a c #69A669A64924", +"s c #CF3CC71BA699", +"d c #71C671C64924", +"f c #BEFBB6DA8E38", +"g c #C71BBAEA8E38", +"h c #CF3CC30B9E79", +"j c #A699A28979E7", +"k c #69A665954103", +"l c #596561854103", +"z c #9658965871C6", +"x c #BEFBBAEA9E79", +"c c #38E338E31861", +"v c #9E79965879E7", +"b c #71C671C65144", +"n c #BEFBB6DA9E79", +"m c #9E79965871C6", +"M c #5965555530C2", +"N c #CF3CC30BA699", +"B c #DF7DCB2B9E79", +"V c #AEBAAAAA8E38", +"C c #28A22CB21040", +"Z c #DF7DD75CBEFB", +"A c #96588E3871C6", +"S c #9E799A6979E7", +"D c #69A6618538E3", +"F c #BEFBBAEA9658", +"G c #D75CCB2BA699", +"H c #96588A285965", +"J c #C71BB6DA8617", +"K c #BEFBAEBA8617", +"L c #5965596530C2", +"P c #618565954924", +"I c #A699A6998E38", +"U c #30C230C21040", +"Y c #49244D3430C2", +"T c #EFBEEBADC71B", +"R c #B6DAB2CA8E38", +"E c #DF7DDB6CB6DA", +"W c #BEFBB2CA79E7", +"Q c #BEFBAAAA71C6", +"! c #861775D64924", +"~ c #C71BB2CA8617", +"^ c #CF3CC71B9E79", +"/ c #A6999A6971C6", +"( c #B6DAB2CA9658", +") c #5965555538E3", +"_ c #DF7DD34CAEBA", +"` c #6185596538E3", +"' c #8E3882075965", +"] c #B6DAA69971C6", +"[ c #59654D341861", +"{ c #9658924871C6", +"} c #38E334D31861", +"| c #79E779E75965", +" . c #79E775D65965", +".. c #8E3879E74924", +"X. c #C71BBAEA9658", +"o. c #86177DF76185", +"O. c #B6DAAEBA9658", +"+. c #71C669A64103", +"@. c #C71BBEFB9E79", +"#. c #AEBAA6998617", +"$. c #96588E3869A6", +"%. c #A6999E798617", +"&. c #BEFBB2CA9658", +"*. c #DF7DCF3CA699", +"=. c #BEFBB6DA9658", +"-. c #861782075965", +";. c #A6999E7979E7", +":. c #30C22CB21040", +">. c #C71BC30BA699", +",. c #8E38861769A6", +"<. c #9E799A6971C6", +"1. c #79E779E75144", +"2. c #8E3886176185", +"3. c #BEFBBEFBA699", +"4. c #9658965879E7", +"5. c #4103492428A2", +"6. c #79E76DB64103", +"7. c #AEBAAAAA79E7", +"8. c #38E33CF32081", +"9. c #4924514430C2", +"0. c #38E3410328A2", +"q. c #B6DAAAAA79E7", +"w. c #69A669A64103", +"e. c #69A675D65965", +"r. c #618569A64924", +"t. c #BEFBB2CA8617", +"y. c #BEFBBAEA8E38", +"u. c #CF3CC30B9658", +"i. c #AEBAAAAA8617", +"p. c #71C679E75965", +"a. c #69A675D65144", +"s. c #8E38924871C6", +"d. c #71C675D65965", +"f. c #96589A6979E7", +"g. c #410341031861", +"h. c #8E3882075144", +"j. c #C71BBEFB9658", +"k. c #492445142081", +"l. c #BEFBAAAA79E7", +"z. c #AEBAA28979E7", +"x. c #8617861769A6", +"c. c #5144555538E3", +"v. c #AEBAA28971C6", +"b. c #9E7992486185", +"n. c #D75CCB2B9E79", +"m. c #AEBAA69979E7", +"M. c #86177DF75965", +"N. c #61855D7538E3", +"B. c #618561854924", +"V. c #208118610000", +"C. c #41033CF31040", +"Z. c #514459654103", +"A. c #4924555538E3", +"S. c #186120810000", +"D. c #38E330C20820", +"F. c #96588E386185", +"G. c #186114510000", +"H. c #4103492430C2", +"J. c #28A224920000", +"K. c #38E338E31040", +"L. c #38E334D31040", +"P. c #618569A65144", +"I. c #61855D754103", +"U. c #492441032081", +"Y. c #D75CCF3CAEBA", +"T. c #30C22CB20820", +"R. c #492441031861", +"E. c #B6DAA69979E7", +"W. c #79E77DF76185", +"Q. c #71C66DB64924", +"!. c #861775D65144", +"~. c #51444D342081", +"^. c #D75CCF3CA699", +"/. c #8E388E3871C6", +" ", +" ", +" . X o o X X O + @ # @ $ % & * = - ; : > , < 1 2 3 4 5 6 ", +" . 7 X o o X 8 O X @ @ 9 0 q w & e = r t y u i p a & s d ", +" . . . . . . + + f g # h j k 6 l : z x 1 c v b n m M N j ", +" . . X o O O 8 B @ g @ h 0 p 4 ; : > V C 6 Z A S s D F G ", +" . o o O O O H J O f K f F % L P ; I e U Y Y T , , R 0 E ", +" 7 7 X J W Q ! ~ B # @ ^ h / p = ; ( < U ) _ n ` s h ' h ", +" . . X O . ] [ H @ g @ f h 0 m a e { } | ) .N . .E M % ", +" o . W . X o ] ..@ g ^ X.F h ( L - : 1 n o.} O.o.o.O.w +. ", +" . . . X o o B / O @ f h h @.#.5 b $.4 t %.u o.Z k &.v 6 ", +" W . o o X . o O X *.f @ s =.=.-.p & = ;.O.U :.>., ,.V = ", +" . 7 . J . O O O ~ f # 9 F h h <.p 1.2.m t U 2 3.4.L 5.c ", +" 7 . . X X o + W @ 6.@ X.9 h $ 7.w p $.p & 3 y 5.8.9.0.9. ", +" . . X o o J X ~ + ! q.h =.9 X.q.q w.w p & u 5.1 5.l e.r. ", +" g 7 ~ ~ X X X + J # t.f g y.u.$ i.k p P e i , - p.r a.s. ", +" q.t.K + Q X ~ . X X g 8 f g u.* $ d 3 ; d.C 0.r.f.r , : ", +" p R g g ~ 8 X o o ] + X . g =.9 &.& P P , Y C p.e s.& & ", +" g.h.# g f X X ] + *.X ] o $ y.$ j.j 2.6 < d.8.p.P P : & ", +" k.k.h @ K @ *.g q.l.t.# 9 u.X i.j.z.{ c Y x.c.< c.9.m F ", +" 2.6 % @.g K q.q.v.b.b.$ n.v.y.t.j.m.S g.3 , , l 9.c.{ : ", +" #.M.p h G q.j.b.q.h.$ R R n.f t.@ 0 i.N.2 1 c.B.8.< r 9. ", +" d.S k @.i.m./ 9 V.C.7.p q y.~ t.y.y.R -.- Y Z.P 8.5.A.S. ", +" u e a ( k / p D.m.F.G.9 d j g t.K y.R { a 1 < Z.< H.9.0. ", +" C ,.2 d -.$.C.M T @.C.1.F.w t.X K v.0 $. .U 9.Z.8.H.< u ", +" 3 ; m { J.K.@.% 4 9 * K.L.j g 7 X 0 z.V n 1 8.P.A.r.9.5. ", +" I.| & :.U.C.@.E k.M.Y.1.U.k.H t.@ i.<.{ t P H.< 9., < l ", +" P b 3 K.@.=.k.M.G % d Y.#.T.R.E.j.R @.,.e I W.9.8.8.9.1 ", +" - O.u Q.h =.!.k._ G ` h =.K.~.j 0 0 N { { I < 0.c.= l 1 ", +" b U #._ M !.^.0 M / s k D.F.h./ w 2.m /.v , r.A.3 6 u L ", +" ", +" "}; +/* XPM */ +static char * tiled_xpm[] = { +"32 32 109 2", +" c #000000000000", +". c #C71BBAEA8617", +"X c #CF3CBEFB8E38", +"o c #CF3CBEFB9658", +"O c #BEFBAEBA8E38", +"+ c #71C675D65144", +"@ c #79E77DF75965", +"# c #8E388E3871C6", +"$ c #618561854103", +"% c #61855D754103", +"& c #8E388A2869A6", +"* c #9E799A6971C6", +"= c #A6999E7971C6", +"- c #D75CC30B9658", +"; c #BEFBB2CA79E7", +": c #C71BB6DA8E38", +"> c #BEFBB6DA8E38", +", c #71C66DB64924", +"< c #9E799E798617", +"1 c #41033CF32081", +"2 c #BEFBBAEA9E79", +"3 c #A699A2898617", +"4 c #9E79965871C6", +"5 c #A6999A6971C6", +"6 c #965882075144", +"7 c #BEFBB2CA8617", +"8 c #C71BBEFB9658", +"9 c #71C671C65144", +"0 c #71C675D65965", +"q c #51444D3430C2", +"w c #AEBAA6998E38", +"e c #96588A2869A6", +"r c #9E79924871C6", +"t c #AEBAA28979E7", +"y c #C71BBEFB8E38", +"u c #B6DAA69971C6", +"i c #BEFBB6DA9658", +"p c #69A66DB64924", +"a c #9E799E7979E7", +"s c #96588E3871C6", +"d c #96588E3869A6", +"f c #861782075965", +"g c #79E779E75144", +"h c #38E334D31861", +"j c #410345142081", +"k c #BEFBB6DA8617", +"l c #9E7992486185", +"z c #C71BB6DA9658", +"x c #C71BBAEA8E38", +"c c #86177DF75965", +"v c #4103451428A2", +"b c #4103492428A2", +"n c #5144596538E3", +"m c #51445D754103", +"M c #C71BB6DA8617", +"N c #CF3CBAEA8E38", +"B c #B6DAB2CA8E38", +"V c #69A661854103", +"C c #861786176185", +"Z c #B6DAAAAA8617", +"A c #8E3886176185", +"S c #59655D754103", +"D c #49244D3430C2", +"F c #5965555530C2", +"G c #861779E75144", +"H c #B6DAAAAA79E7", +"J c #AEBAA28971C6", +"K c #A6999E7979E7", +"L c #410341032081", +"P c #69A66DB65144", +"I c #96589A6971C6", +"U c #8E3882075965", +"Y c #8E3886175965", +"T c #5144514438E3", +"R c #4924555538E3", +"E c #596561854103", +"W c #79E775D65144", +"Q c #69A665954103", +"! c #8E388A286185", +"~ c #AEBAA69979E7", +"^ c #B6DAAEBA8617", +"/ c #4924514430C2", +"( c #4103410328A2", +") c #861782076185", +"_ c #4924492428A2", +"` c #B6DAAEBA8E38", +"' c #96588A285965", +"] c #A699A6998617", +"[ c #514459654103", +"{ c #4924492430C2", +"} c #96588A286185", +"| c #BEFBBAEA9658", +" . c #41033CF31040", +".. c #8E388E3869A6", +"X. c #86178A2869A6", +"o. c #5144555538E3", +"O. c #69A669A64924", +"+. c #A699965871C6", +"@. c #A699965869A6", +"#. c #71C669A64924", +"$. c #96588E386185", +"%. c #9658924871C6", +"&. c #618569A64924", +"*. c #86177DF75144", +"=. c #5965596530C2", +"-. c #96589A6979E7", +";. c #49244D3428A2", +":. c #59655D7538E3", +">. c #71C671C64924", +" ", +" ", +" . X X o o O + @ # $ % & * = . . X X o o O + @ # $ % & * ", +" X - ; o : > , + < 1 2 3 4 5 . X - ; o : > , + < 1 2 3 4 ", +" . . 6 7 o 8 4 9 0 q w e r t y . . 6 7 o 8 4 9 0 q w e r ", +" . X X u o 8 i $ p a % s 3 d y . X X u o 8 i $ p a % s 3 ", +" X . X X o 8 8 f g 3 h 3 + j k X . X X o 8 8 f g 3 h 3 + ", +" . X X : l z x = c c v b n m . . X X : l z x = c c v b n ", +" 7 M N N X : 8 B V + v + @ C l 7 M N N X : 8 B V + v + @ ", +" Z : X N X . > > A S D 0 @ * F Z : X N X . > > A S D 0 @ ", +" G x : H J 8 > > K L P n + I f G x : H J 8 > > K L P n + ", +" c 8 Z U Y = 8 : O % T R E E + c 8 Z U Y = 8 : O % T R E ", +" 9 f W Y Q ! ~ 7 ^ c D R / n ( 9 f W Y Q ! ~ 7 ^ c D R / ", +" ) _ G U ` _ ' x ~ ] D [ E E { ) _ G U ` _ ' x ~ ] D [ E ", +" Q A } 4 d | .Z i ..X.b o.p { Q A } 4 d | .Z i ..X.b o. ", +" O.3 +.@.} #.f $.A %.&.( j $ O.O.3 +.@.} #.f $.A %.&.( j ", +" X X X X o 5 *.=.O.-.$ ;.:.>.. X X X X o 5 *.=.O.-.$ ;.:. ", +" . X X o o O + @ # $ % & * = . . X X o o O + @ # $ % & * ", +" X - ; o : > , + < 1 2 3 4 5 . X - ; o : > , + < 1 2 3 4 ", +" . . 6 7 o 8 4 9 0 q w e r t y . . 6 7 o 8 4 9 0 q w e r ", +" . X X u o 8 i $ p a % s 3 d y . X X u o 8 i $ p a % s 3 ", +" X . X X o 8 8 f g 3 h 3 + j k X . X X o 8 8 f g 3 h 3 + ", +" . X X : l z > 5 f c v b n m . . X X : l z > 5 f c v b n ", +" 7 M N N X : 8 B V + v + @ C l 7 M N N X : 8 B V + v + @ ", +" Z : X N X M > > A S D 0 @ * F Z : X N X M > > A S D 0 @ ", +" G x : H J 8 > > K L P n + -.f G x : H J 8 > > K L P n + ", +" c 8 Z U Y = x : O % T R S E + c 8 Z U Y = x : O % T R S ", +" 9 f W Y Q ! ~ 7 ^ c D R / n ( 9 f W Y Q ! ~ 7 ^ c D R / ", +" ) _ G U ` _ ' x ~ ] D [ E E { ) _ G U ` _ ' x ~ ] D [ E ", +" Q A } 4 d | .Z i ..X.b o.p D Q A } 4 d | .Z i ..X.b o. ", +" ", +" "}; + +/* XPM */ +static char * pixmap_xpm[] = { +"32 32 79 1", +" c #000000000000", +". c #E79DCF3C8E38", +"X c #E79DBEFB9E79", +"o c #DF7DAEBAA699", +"O c #D75CA289A699", +"+ c #CF3C9A699E79", +"@ c #BEFB86179658", +"# c #E79DBAEAA699", +"$ c #D75C9248C71B", +"% c #CF3C8207C71B", +"& c #C71B75D6BEFB", +"* c #AEBA5965AEBA", +"= c #9E7941039658", +"- c #B6DA6DB69658", +"; c #D75C8617CF3C", +": c #C71B79E7C71B", +"> c #BEFB6DB6B6DA", +", c #A69949249E79", +"< c #96583CF39658", +"1 c #A6994D349E79", +"2 c #CF3C96589E79", +"3 c #BEFBCB2B8E38", +"4 c #B6DACB2B8E38", +"5 c #D75C9E79AEBA", +"6 c #B6DA6595B6DA", +"7 c #A6995144A699", +"8 c #B6DA6185AEBA", +"9 c #DF7DBEFB9658", +"0 c #C71BCB2B8E38", +"q c #69A6C30B8617", +"w c #9658C71B8617", +"e c #CF3C8E38AEBA", +"r c #9E7945149658", +"t c #CF3C8617B6DA", +"y c #DF7DCF3C8E38", +"u c #AEBA5555A699", +"i c #DF7DB2CAA699", +"p c #8617C71B8617", +"a c #B6DAB6DA8E38", +"s c #9E7949249E79", +"d c #BEFB69A6B6DA", +"f c #DF7D9E79B6DA", +"g c #A699C71B8617", +"h c #9E79B2CA8E38", +"j c #C71B8A28A699", +"k c #CF3C8A28B6DA", +"l c #DF7DAAAAAEBA", +"z c #71C6C30B8617", +"x c #79E7C30B8617", +"c c #DF7DCB2B8E38", +"v c #AEBAC71B8E38", +"b c #CF3CCB2B8E38", +"n c #9E79C71B8617", +"m c #8E38C71B8617", +"M c #D75CCB2B8E38", +"N c #DF7DBAEA8E38", +"B c #AEBA5D759E79", +"V c #C71B8E389E79", +"C c #E79DCB2B9658", +"Z c #E79DC71B9658", +"A c #A69951449E79", +"S c #BEFB75D6A699", +"D c #D75CA699AEBA", +"F c #AEBA5D75AEBA", +"G c #C71B75D6B6DA", +"H c #DF7DBAEA9E79", +"J c #D75C9A69B6DA", +"K c #96583CF38E38", +"L c #CF3C8207BEFB", +"P c #D75C9A69BEFB", +"I c #C71B71C6BEFB", +"U c #DF7DA289BEFB", +"Y c #B6DA5D75AEBA", +"T c #965838E38E38", +"R c #CF3C8617C71B", +"E c #E79DCF3C9658", +"W c #DF7DB6DAAEBA", +"Q c #CF3C7DF7C71B", +"! c #DF7DCF3C9658", +" ", +" ", +" ............................ ", +" ............................ ", +" ............................ ", +" .............XoO+@.......... ", +" ...........#$%&*=-.......... ", +" ..........X;:>,<12.......... ", +" ....34....5&6=<789.......... ", +" ....0qw...e8r=78t........... ", +" ....yqq4..2,=u6:i........... ", +" .....pqp..asud:f............ ", +" .....4qq.gqhjkl............4 ", +" ......pqgzxqxc.............x ", +" .......vq3wqqw............bq ", +" .......wn.3qqqc...........4q ", +" ......cqb..4zq4...........nm ", +" ......4z....Mgg...........y. ", +" ......gp.................... ", +" ......wp.................... ", +" ......mm.................... ", +" ......b..................... ", +" ...........N................ ", +" ...........BVC.............. ", +" ..........ZA,S9............. ", +" ..........DF=uGH............ ", +" ..........J>K16LZ........... ", +" ..........P&,=*If........... ", +" ..........U:YT76RE.......... ", +" ..........WQdsrFt!0430...... ", +" ", +" "}; + + +/* XPM */ +static char * gradient_xpm[] = { +"32 32 57 1", +" c #000000000000", +". c #E79DEBADE79D", +"X c #E79DE79DE79D", +"o c #DF7DE38DDF7D", +"O c #DF7DDF7DDF7D", +"+ c #D75CDB6CD75C", +"@ c #D75CD75CD75C", +"# c #CF3CCF3CCF3C", +"$ c #CF3CCB2BCF3C", +"% c #C71BC71BC71B", +"& c #C71BC30BC71B", +"* c #BEFBBEFBBEFB", +"= c #B6DAB6DAB6DA", +"- c #B6DAB2CAB6DA", +"; c #AEBAAEBAAEBA", +": c #AEBAAAAAAEBA", +"> c #A699A699A699", +", c #A699A289A699", +"< c #9E799E799E79", +"1 c #9E799A699E79", +"2 c #965896589658", +"3 c #965892489658", +"4 c #8E388E388E38", +"5 c #8E388A288E38", +"6 c #861786178617", +"7 c #79E77DF779E7", +"8 c #71C675D671C6", +"9 c #861782078617", +"0 c #79E779E779E7", +"q c #71C671C671C6", +"w c #69A669A669A6", +"e c #BEFBBAEABEFB", +"r c #69A66DB669A6", +"t c #618565956185", +"y c #618561856185", +"u c #59655D755965", +"i c #596559655965", +"p c #514455555144", +"a c #514451445144", +"s c #49244D344924", +"d c #492449244924", +"f c #492445144924", +"g c #410341034103", +"h c #41033CF34103", +"j c #38E338E338E3", +"k c #38E334D338E3", +"l c #30C230C230C2", +"z c #30C22CB230C2", +"x c #28A228A228A2", +"c c #28A2249228A2", +"v c #208120812081", +"b c #20811C712081", +"n c #186118611861", +"m c #104014511040", +"M c #104010401040", +"N c #08200C300820", +"B c #082008200820", +" ", +" ", +" .XoO+@#$%&**=-;:>,<123456778 ", +" XoO+@#$%&**=-;:>,<1235567788 ", +" oO+@#$%&**==;:>,<123456900qq ", +" O+@#$%&**=-;:>,<123456970qqw ", +" +@#$%&&ee--:>,<1234569788rrt ", +" @#$%&&e=-;:>,<1234569708rrty ", +" #$%&&e==;;>,<123456970qqwwyu ", +" $%&&ee-;:>,<1234569708qwwyui ", +" %&&ee-;;>,<1234569708rrttuip ", +" &&ee=-:>><1234569708qrttuipa ", +" &ee=;:>><1234569708qwwyyipas ", +" ee--::,<1234569708qrwyyipasd ", +" e=-:>,<1234569708qrwyyiiasdf ", +" =;;>><<234569708qrwyyipasdfg ", +" -;>,<1234569708qrwtuuppsdfgh ", +" ::,,1134559708qrwtuipasdfghj ", +" :><1234569708qrwtyiiaadfghjk ", +" ><<224566708qrwtyipasdfghjkl ", +" ,1234559708qrwtyuppssfghjklz ", +" 1224469708qrwtyupasdfghjklzx ", +" 224569908qrwtyupaaddghjklzxc ", +" 34466708qrwtyiipsdfghjklzxcv ", +" 3559700qrwtyuipsddghjklzxcvb ", +" 559778qrwtyuppssfggjklzxcvbn ", +" 59708qrwtyuipadfggjklzxcvbnm ", +" 9900qqwtyuppssffhjklzxcvbnmM ", +" 908qrwtyuipasfghjklzxcvbnmMN ", +" 00qqwtyuiaaddggjjlzxcvbnmMNB ", +" ", +" "}; + + +/* XPM */ +static char * solid_xpm[] = { +"32 32 2 1", +" c #000000000000", +". c #38E369A69658", +" ", +" ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ............................ ", +" ", +" "}; diff --git a/WPrefs.app/WPrefs.c b/WPrefs.app/WPrefs.c index 395e3d8c..574c133b 100644 --- a/WPrefs.app/WPrefs.c +++ b/WPrefs.app/WPrefs.c @@ -1,6 +1,6 @@ /* WPrefs.c- main window and other basic stuff * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -193,7 +193,7 @@ createMainWindow(WMScreen *scr) WPrefs.win = WMCreateWindow(scr, "wprefs"); WMResizeWidget(WPrefs.win, 520, 390); - WMSetWindowTitle(WPrefs.win, _("WindowMaker Preferences")); + WMSetWindowTitle(WPrefs.win, _("Window Maker Preferences")); WMSetWindowCloseAction(WPrefs.win, quit, NULL); WMSetWindowMaxSize(WPrefs.win, 520, 390); WMSetWindowMinSize(WPrefs.win, 520, 390); @@ -252,14 +252,14 @@ createMainWindow(WMScreen *scr) WMResizeWidget(WPrefs.nameL, FRAME_WIDTH-20, 30); WMMoveWidget(WPrefs.nameL, 10, 25); WMSetLabelFont(WPrefs.nameL, font); - WMSetLabelText(WPrefs.nameL, "WindowMaker Preferences Utility"); + WMSetLabelText(WPrefs.nameL, "Window Maker Preferences Utility"); WMReleaseFont(font); WPrefs.versionL = WMCreateLabel(WPrefs.banner); WMResizeWidget(WPrefs.versionL, FRAME_WIDTH-20, 20); WMMoveWidget(WPrefs.versionL, 10, 65); WMSetLabelTextAlignment(WPrefs.versionL, WACenter); - sprintf(buffer, _("Version %s for WindowMaker %s"), WVERSION, WMVERSION); + sprintf(buffer, _("Version %s for Window Maker %s"), WVERSION, WMVERSION); WMSetLabelText(WPrefs.versionL, buffer); WPrefs.statusL = WMCreateLabel(WPrefs.banner); @@ -269,11 +269,12 @@ createMainWindow(WMScreen *scr) WMSetLabelText(WPrefs.statusL, _("Starting...")); WPrefs.creditsL = WMCreateLabel(WPrefs.banner); - WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 40); - WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-40); + WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60); + WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60); WMSetLabelTextAlignment(WPrefs.creditsL, WACenter); WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n" - "Artwork: Marco van Hylckama Vlieg")); + "Artwork: Marco van Hylckama Vlieg\n" + "More Programming: James Thompson")); WMMapSubwidgets(WPrefs.win); @@ -465,7 +466,8 @@ Initialize(WMScreen *scr) tmp = RLoadImage(WMScreenRContext(scr), path, 0); if (!tmp) { - wwarning("could not load image file %s:%s", path, RErrorString); + wwarning("could not load image file %s:%s", path, + RMessageForError(RErrorCode)); } else { icon = WMCreatePixmapFromRImage(scr, tmp, 0); RDestroyImage(tmp); @@ -483,7 +485,7 @@ Initialize(WMScreen *scr) WMRealizeWidget(WPrefs.win); WMMapWidget(WPrefs.win); XFlush(WMScreenDisplay(scr)); - WMSetLabelText(WPrefs.statusL, _("Loading WindowMaker configuration files...")); + WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files...")); XFlush(WMScreenDisplay(scr)); loadConfigurations(scr, WPrefs.win); @@ -540,11 +542,11 @@ loadConfigurations(WMScreen *scr, WMWindow *mainw) if (!PLIsDictionary(db)) { PLRelease(db); db = NULL; - sprintf(mbuf, _("WindowMaker domain (%s) is corrupted!"), path); + sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path); WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL); } } else { - sprintf(mbuf, _("Could not load WindowMaker domain (%s) from defaults database."), + sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."), path); WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL); } @@ -552,32 +554,33 @@ loadConfigurations(WMScreen *scr, WMWindow *mainw) file = popen("wmaker -version", "r"); if (!file || !fgets(buffer, 1023, file)) { - wsyserror(_("could not extract version information from WindowMaker")); - wfatal(_("Make sure WindowMaker is in your search path.")); + wsyserror(_("could not extract version information from Window Maker")); + wfatal(_("Make sure Window Maker is in your search path.")); WMRunAlertPanel(scr, mainw, _("Error"), - _("Could not extract version from WindowMaker. Make sure it is correctly installed."), + _("Could not extract version from Window Maker. Make sure it is correctly installed."), _("OK"), NULL, NULL); exit(1); } if (file) pclose(file); - if (sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) { + if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3 + && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) { WMRunAlertPanel(scr, mainw, _("Error"), - _("Could not extract version from WindowMaker. Make sure it is correctly installed."), + _("Could not extract version from Window Maker. Make sure it is correctly installed."), _("OK"), NULL, NULL); exit(1); } if (v1 == 0 && (v2 < 18 || v3 < 0)) { - sprintf(mbuf, _("WPrefs only supports WindowMaker 0.18.0 or newer.\n" + sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n" "The version installed is %i.%i.%i\n"), v1, v2, v3); WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL); exit(1); } if (v1 > 1 || (v1 == 1 && (v2 > 0))) { - sprintf(mbuf, _("WindowMaker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."), + sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."), v1, v2, v3); WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL); } @@ -595,11 +598,11 @@ loadConfigurations(WMScreen *scr, WMWindow *mainw) if (!PLIsDictionary(gdb)) { PLRelease(gdb); gdb = NULL; - sprintf(mbuf, _("WindowMaker domain (%s) is corrupted!"), buffer); + sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer); WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL); } } else { - sprintf(mbuf, _("Could not load global WindowMaker domain (%s)."), + sprintf(mbuf, _("Could not load global Window Maker domain (%s)."), buffer); WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL); } diff --git a/WPrefs.app/WPrefs.h b/WPrefs.app/WPrefs.h index 096e85f0..b231434d 100644 --- a/WPrefs.app/WPrefs.h +++ b/WPrefs.app/WPrefs.h @@ -1,6 +1,6 @@ /* WPrefs.h- general definitions * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/WPrefs.xpm b/WPrefs.app/WPrefs.xpm index 0ce41299..d6d9c917 100644 --- a/WPrefs.app/WPrefs.xpm +++ b/WPrefs.app/WPrefs.xpm @@ -194,7 +194,7 @@ static char * image_name[] = { ". . . . . . ", ". . . . . . ", ". . . . . . ", -". . X o X O + @ # # # # # # $ % X X . . ", +". . o X O + @ # # # # # # $ % X . . ", ". . & * $ = - . X X X X X X X X . ; ; o . . ", ". . : > - , X X . X X X X X X X X . X o O , X . . ", ". . < 1 , X X X X . X X X X X X X X . X X X o X 2 . . ", diff --git a/WPrefs.app/WindowHandling.c b/WPrefs.app/WindowHandling.c index 37cee8c9..5becbbe8 100644 --- a/WPrefs.app/WindowHandling.c +++ b/WPrefs.app/WindowHandling.c @@ -1,6 +1,6 @@ /* WindowHandling.c- options for handling windows * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -44,7 +44,6 @@ typedef struct _Panel { WMFrame *maxiF; WMButton *miconB; - WMButton *mdockB; WMFrame *opaqF; WMButton *opaqB; @@ -99,11 +98,11 @@ getPlacement(char *str) if (strcasecmp(str, "auto")==0 || strcasecmp(str, "smart")==0) return 0; else if (strcasecmp(str, "random")==0) - return 3; + return 1; else if (strcasecmp(str, "manual")==0) return 2; else if (strcasecmp(str, "cascade")==0) - return 1; + return 3; else wwarning(_("bad option value %s in WindowPlacement. Using default value"), str); @@ -145,8 +144,6 @@ showData(_Panel *panel) WMSetButtonSelected(panel->opaqB, GetBoolForKey("OpaqueMove")); WMSetButtonSelected(panel->miconB, GetBoolForKey("NoWindowOverIcons")); - - WMSetButtonSelected(panel->mdockB, GetBoolForKey("NoWindowUnderDock")); } @@ -157,7 +154,6 @@ storeData(_Panel *panel) char x[16], y[16]; SetBoolForKey(WMGetButtonSelected(panel->miconB), "NoWindowOverIcons"); - SetBoolForKey(WMGetButtonSelected(panel->mdockB), "NoWindowUnderDock"); SetBoolForKey(WMGetButtonSelected(panel->opaqB), "OpaqueMove"); SetBoolForKey(WMGetButtonSelected(panel->tranB), "OnTopTransients"); SetStringForKey(placements[WMGetPopUpButtonSelectedItem(panel->placP)], @@ -296,15 +292,10 @@ createPanel(Panel *p) WMSetFrameTitle(panel->maxiF, _("When maximizing...")); panel->miconB = WMCreateSwitchButton(panel->maxiF); - WMResizeWidget(panel->miconB, 185, 20); + WMResizeWidget(panel->miconB, 185, 35); WMMoveWidget(panel->miconB, 10, 20); WMSetButtonText(panel->miconB, _("...do not resize over icons")); - - panel->mdockB = WMCreateSwitchButton(panel->maxiF); - WMResizeWidget(panel->mdockB, 185, 20); - WMMoveWidget(panel->mdockB, 10, 40); - WMSetButtonText(panel->mdockB, _("...do not resize over dock")); - + WMMapSubwidgets(panel->maxiF); /**************** Transients On Top ****************/ diff --git a/WPrefs.app/Workspace.c b/WPrefs.app/Workspace.c index fb9315d0..80b58db7 100644 --- a/WPrefs.app/Workspace.c +++ b/WPrefs.app/Workspace.c @@ -1,6 +1,6 @@ /* Workspace.c- workspace options * - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * @@ -64,6 +64,7 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, WMPixmap **icon1, WMPixmap **icon2) { RImage *icon; + RColor gray = {0xae,0xaa,0xae}; *icon1 = WMCreatePixmapFromFile(scr, file); if (!*icon1) { @@ -77,10 +78,11 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, *icon2 = NULL; return; } + RCombineImageWithColor(icon, &gray); if (xis) { - RCombineImages(icon, xis); + RCombineImagesWithOpaqueness(icon, xis, 180); if (!(*icon2 = WMCreatePixmapFromRImage(scr, icon, 127))) { - wwarning(_("could not process icon %s:"), file, RErrorString); + wwarning(_("could not process icon %s:"), file, RMessageForError(RErrorCode)); *icon2 = NULL; } } diff --git a/WPrefs.app/main.c b/WPrefs.app/main.c index 53421a3a..493fc6de 100644 --- a/WPrefs.app/main.c +++ b/WPrefs.app/main.c @@ -1,5 +1,5 @@ /* - * WPrefs - WindowMaker Preferences Program + * WPrefs - Window Maker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * diff --git a/WPrefs.app/po/Makefile.am b/WPrefs.app/po/Makefile.am index 8eb9a6ff..2ce570b4 100644 --- a/WPrefs.app/po/Makefile.am +++ b/WPrefs.app/po/Makefile.am @@ -4,7 +4,7 @@ CATALOGS = @WPMOFILES@ CLEANFILES = $(CATALOGS) -EXTRA_DIST = pt.po hr.po fr.po ko.po cs.po +EXTRA_DIST = pt.po hr.po fr.po ko.po cs.po ja.po POTFILES = \ $(top_builddir)/WPrefs/Configurations.c \ diff --git a/WPrefs.app/po/Makefile.in b/WPrefs.app/po/Makefile.in index 06a1a8d5..538bdf15 100644 --- a/WPrefs.app/po/Makefile.in +++ b/WPrefs.app/po/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -97,7 +95,7 @@ CATALOGS = @WPMOFILES@ CLEANFILES = $(CATALOGS) -EXTRA_DIST = pt.po hr.po fr.po ko.po cs.po +EXTRA_DIST = pt.po hr.po fr.po ko.po cs.po ja.po POTFILES = \ $(top_builddir)/WPrefs/Configurations.c \ diff --git a/WPrefs.app/po/README b/WPrefs.app/po/README index 446b02f2..3a675504 100644 --- a/WPrefs.app/po/README +++ b/WPrefs.app/po/README @@ -9,3 +9,4 @@ hr.po Croatian Toni Bili fr.po French Bastien NOCERA ko.po Korean Byeong-Chan, Kim cs.po Czech 3 David ©auer +ja.po Japanese Kazuhide Takahashi diff --git a/WPrefs.app/po/fr.po b/WPrefs.app/po/fr.po index 4233c8f9..bb4f2f34 100644 --- a/WPrefs.app/po/fr.po +++ b/WPrefs.app/po/fr.po @@ -681,7 +681,7 @@ msgstr "Cr #: ../../WPrefs/MouseSettings.c:756 msgid "could not rename file %s to %s\n" -msgstr "Changement de nom de %s à %s impossible" +msgstr "Changement de nom de %s à %s impossible\n" #: ../../WPrefs/MouseSettings.c:839 msgid "Mouse Preferences" diff --git a/WPrefs.app/po/ja.po b/WPrefs.app/po/ja.po new file mode 100644 index 00000000..9b20d7e8 --- /dev/null +++ b/WPrefs.app/po/ja.po @@ -0,0 +1,1169 @@ +msgid "" +msgstr "" +"Date: 1998-10-09 21:43:19+0900\n" +"From: Kazuhide Takahashi \n" +"Language-Team: Japanese\n" +"Content-Type: text/plain; charset=euc-jp\n" +"Xgettext-Options: --default-domain=WPrefs --add-comments --keyword=_\n" +"Files: ../../WPrefs.app/Configurations.c ../../WPrefs.app/Expert.c ../../WPrefs.app/Focus.c ../../WPrefs.app/KeyboardSettings.c ../../WPrefs.app/KeyboardShortcuts.c ../../WPrefs.app/Menu.c ../../WPrefs.app/MenuGuru.c ../../WPrefs.app/MenuPreferences.c ../../WPrefs.app/MouseSettings.c ../../WPrefs.app/Paths.c ../../WPrefs.app/Preferences.c ../../WPrefs.app/Text.c ../../WPrefs.app/TextureAndColor.c ../../WPrefs.app/WPrefs.c ../../WPrefs.app/WindowHandling.c ../../WPrefs.app/Workspace.c ../../WPrefs.app/main.c ../../WPrefs.app/xmodifier.c\n" + +#: ../../WPrefs.app/Configurations.c:141 ../../WPrefs.app/Configurations.c:147 ../../WPrefs.app/MouseSettings.c:510 ../../WPrefs.app/WindowHandling.c:274 ../../WPrefs.app/WindowHandling.c:286 ../../WPrefs.app/Workspace.c:70 ../../WPrefs.app/Workspace.c:76 +msgid "could not load icon %s" +msgstr "¥¢¥¤¥³¥ó %s ¤¬¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/Configurations.c:154 ../../WPrefs.app/Workspace.c:83 +msgid "could not process icon %s:" +msgstr "¥¢¥¤¥³¥ó %s ¤ò½èÍý¤Ç¤­¤Þ¤»¤ó¡£:" + +#: ../../WPrefs.app/Configurations.c:179 ../../WPrefs.app/Workspace.c:122 +msgid "could not load image file %s" +msgstr "¥¤¥á¡¼¥¸¥Õ¥¡¥¤¥ë %s ¤¬¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/Configurations.c:193 +msgid "Icon Slide Speed" +msgstr "¥¢¥¤¥³¥ó°Üư®ÅÙ" + +#: ../../WPrefs.app/Configurations.c:199 +msgid "Shade Animation Speed" +msgstr "¥·¥§¡¼¥É¥¢¥Ë¥á¡¼¥·¥ç¥ó®ÅÙ" + +#: ../../WPrefs.app/Configurations.c:232 ../../WPrefs.app/Configurations.c:244 ../../WPrefs.app/Focus.c:310 ../../WPrefs.app/Focus.c:321 ../../WPrefs.app/MenuPreferences.c:135 ../../WPrefs.app/MenuPreferences.c:146 ../../WPrefs.app/MenuPreferences.c:174 ../../WPrefs.app/MenuPreferences.c:189 ../../WPrefs.app/MouseSettings.c:538 ../../WPrefs.app/MouseSettings.c:549 ../../WPrefs.app/MouseSettings.c:604 ../../WPrefs.app/MouseSettings.c:615 ../../WPrefs.app/MouseSettings.c:651 ../../WPrefs.app/MouseSettings.c:666 ../../WPrefs.app/MouseSettings.c:682 ../../WPrefs.app/WPrefs.c:397 ../../WPrefs.app/WPrefs.c:415 +msgid "could not load icon file %s" +msgstr "Chargement de l'icone %s impossible." + +#: ../../WPrefs.app/Configurations.c:260 +msgid "Titlebar Style" +msgstr "¥¿¥¤¥È¥ë¥Ð¡¼¤Î¥¹¥¿¥¤¥ë" + +#: ../../WPrefs.app/Configurations.c:297 +msgid "Animations and Sound" +msgstr "¥¢¥Ë¥á¡¼¥·¥ç¥ó¤È¥µ¥¦¥ó¥É" + +#: ../../WPrefs.app/Configurations.c:303 +msgid "Animations" +msgstr "¥¢¥Ë¥á¡¼¥·¥ç¥ó" + +#: ../../WPrefs.app/Configurations.c:319 +msgid "Superfluous" +msgstr "Superfluous" + +#: ../../WPrefs.app/Configurations.c:335 +msgid "Sounds" +msgstr "¥µ¥¦¥ó¥É" + +#: ../../WPrefs.app/Configurations.c:352 +msgid "Note: sound requires a module distributed separately" +msgstr "¢¨¥µ¥¦¥ó¥Éµ¡Ç½¤Ë¤ÏÊÌÅӥ⥸¥å¡¼¥ë¤òÍÑ°Õ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£" + +#: ../../WPrefs.app/Configurations.c:362 +msgid "Dithering colormap for 8bpp" +msgstr "8bpp¤Ë¹ç¤ï¤»¸º¿§¤ò¹Ô¤¦" + +#: ../../WPrefs.app/Configurations.c:367 +msgid "Disable dithering in any visual/depth" +msgstr "Á´¤Æ¤Î¿§¿¼Å٤Ǹº¿§¤ò¹Ô¤ï¤Ê¤¤" + +#: ../../WPrefs.app/Configurations.c:388 +msgid "More colors for applications" +msgstr "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬»ÈÍѤ¹¤ë¿§¤òÁý¤ä¤¹" + +#: ../../WPrefs.app/Configurations.c:395 +msgid "More colors for WindowMaker" +msgstr "WindowMaker¤¬»ÈÍѤ¹¤ë¿§¤òÁý¤ä¤¹" + +#: ../../WPrefs.app/Configurations.c:448 +msgid "Other Configurations" +msgstr "¤½¤Î¾¤ÎÀßÄê" + +#: ../../WPrefs.app/Expert.c:70 +msgid "Do not set non-WindowMaker specific parameters (do not use xset)" +msgstr "WindowMaker°Ê³°¤Î¥Ñ¥é¥á¡¼¥¿¤òÍ¿¤¨¤Ê¤¤ (xset¤ò»È¤ï¤Ê¤¤)" + +#: ../../WPrefs.app/Expert.c:71 +msgid "Automatically save session when exiting WindowMaker" +msgstr "WindowMaker½ªÎ»»þ¤Ë»þưŪ¤Ë¥»¥Ã¥·¥ç¥ó¤òÊݸ" + +#: ../../WPrefs.app/Expert.c:72 +msgid "Use SaveUnder in window frames, icons, menus and other objects" +msgstr "" + +#: ../../WPrefs.app/Expert.c:73 +msgid "Disable cycling color highlighting of icons." +msgstr "" + +#: ../../WPrefs.app/Expert.c:103 +msgid "Expert User Preferences" +msgstr "¥¨¥­¥¹¥Ñ¡¼¥ÈÀßÄê" + +#: ../../WPrefs.app/Focus.c:79 +msgid "bad option value %s for option FocusMode. Using default Manual" +msgstr "¥Õ¥©¡¼¥«¥¹¥â¡¼¥É¥ª¥×¥·¥ç¥ó %s ¤Ï´Ö°ã¤¨¤Æ¤¤¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥ÈÃÍManual¤ò»È¤¤¤Þ¤¹¡£" + +#: ../../WPrefs.app/Focus.c:92 +msgid "bad option value %s for option ColormapMode. Using default Manual" +msgstr "¥«¥é¡¼¥Þ¥Ã¥×¥ª¥×¥·¥ç¥ó %s ¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£ ¥Ç¥Õ¥©¥ë¥ÈÃÍManual¤ò»È¤¤¤Þ¤¹¡£" + +#: ../../WPrefs.app/Focus.c:190 +msgid "" +"Click on the window to set\n" +"keyboard input focus." +msgstr "" +"¥¦¥£¥ó¥É¥¦¾å¤Ç¤Î¥¯¥ê¥Ã¥¯¤Ç\n" +"¥¤¥ó¥×¥Ã¥È¥Õ¥©¡¼¥«¥¹¤ò°ÜÆ°." + +#: ../../WPrefs.app/Focus.c:194 +msgid "" +"Set keyboard input focus to\n" +"the window under the mouse pointer,\n" +"including the root window." +msgstr "" +"¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò´Þ¤á¥¦¥£¥ó¥É¥¦¤Î\n" +"¾å¤Ë¥Þ¥¦¥¹¥«¡¼¥½¥ë¤¬¤¢¤ë»þ¤Ë¥¤¥ó\n" +"¥×¥Ã¥È¥Õ¥©¡¼¥«¥¹¤ò°ÜÆ°¡£" + +#: ../../WPrefs.app/Focus.c:199 +msgid "" +"Set keyboard input focus to\n" +"the window under the mouse pointer,\n" +"except the root window." +msgstr "" +"¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò½ü¤­¥¦¥£¥ó¥É¥¦¤Î\n" +"¾å¤Ë¥Þ¥¦¥¹¥«¡¼¥½¥ë¤¬¤¢¤ë»þ¤Ë¥¤¥ó\n" +"¥×¥Ã¥È¥Õ¥©¡¼¥«¥¹¤ò°ÜÆ°¡£" + +#: ../../WPrefs.app/Focus.c:243 +msgid "Input Focus Mode" +msgstr "¥¤¥ó¥×¥Ã¥È¥Õ¥©¡¼¥«¥¹¤Î¥â¡¼¥É" + +#: ../../WPrefs.app/Focus.c:248 +msgid "Click window to focus" +msgstr "¥¦¥£¥ó¥É¥¦¤Î¥¯¥ê¥Ã¥¯¤Ç" + +#: ../../WPrefs.app/Focus.c:249 +msgid "Focus follows mouse" +msgstr "¥Þ¥¦¥¹¥«¡¼¥½¥ë¤Î°ÜÆ°¤Ç" + +#: ../../WPrefs.app/Focus.c:250 +msgid "\"Sloppy\" focus" +msgstr "\"Sloppy\" ¥Õ¥©¡¼¥«¥¹" + +#: ../../WPrefs.app/Focus.c:265 +msgid "Install colormap in the window..." +msgstr "¥«¥é¡¼¥Þ¥Ã¥×¤Î¥¦¥£¥ó¥É¥¦¤Ø¤ÎÀßÄê..." + +#: ../../WPrefs.app/Focus.c:270 +msgid "...that has the input focus." +msgstr "...¥Õ¥©¡¼¥«¥¹¤¬°ÜÆ°¤·¤¿»þ¤Ë¡£" + +#: ../../WPrefs.app/Focus.c:275 +msgid "...that is under the mouse pointer." +msgstr "...¥Þ¥¦¥¹¥«¡¼¥½¥ë¤Î²¼¤Ë¤¢¤ë»þ¡£" + +#: ../../WPrefs.app/Focus.c:284 +msgid "Automatic Window Raise Delay" +msgstr "¼«Æ°Åª¤Ë¥¢¥¯¥Æ¥£¥Ö¤Ë¤¹¤ë¤Þ¤Ç¤Î»þ´Ö" + +#: ../../WPrefs.app/Focus.c:341 +msgid "msec" +msgstr "msec" + +#: ../../WPrefs.app/Focus.c:358 +msgid "Do not let aplications receive the click used to focus windows." +msgstr "" +"¥Õ¥©¡¼¥«¥¹°ÜÆ°¤Î¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯\n" +"¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ËÅϤµ¤Ê¤¤¡£" + +#: ../../WPrefs.app/Focus.c:364 +msgid "Automatically focus new windows." +msgstr "" +"¥Õ¥©¡¼¥«¥¹¤ò¼«Æ°Åª¤Ë¿·¤·¤¤¥¦¥£\n" +"¥ó¥É¥¦¤Ë°ÜÆ°¡£" + +#: ../../WPrefs.app/Focus.c:385 +msgid "Window Focus Preferences" +msgstr "¥¦¥£¥ó¥É¥¦¥Õ¥©¡¼¥«¥¹¤ÎÀßÄê" + +#: ../../WPrefs.app/KeyboardSettings.c:72 +msgid "Initial Key Repeat" +msgstr "¥­¡¼¥ê¥Ô¡¼¥È¤Î½é´üÃÍ" + +#: ../../WPrefs.app/KeyboardSettings.c:113 +msgid "Key Repeat Rate" +msgstr "¥ê¥Ô¡¼¥È¤Î®ÅÙ" + +#: ../../WPrefs.app/KeyboardSettings.c:153 +msgid "Type here to test" +msgstr "¤³¤³¤Ç¥Æ¥¹¥È½ÐÍè¤Þ¤¹¡£" + +#: ../../WPrefs.app/KeyboardSettings.c:172 +msgid "Keyboard Preferences" +msgstr "¥­¡¼¥Ü¡¼¥É¤ÎÀßÄê" + +#: ../../WPrefs.app/KeyboardShortcuts.c:161 ../../WPrefs.app/Menu.c:923 ../../WPrefs.app/Menu.c:1291 ../../WPrefs.app/MenuGuru.c:263 +msgid "Cancel" +msgstr "ÃæÃÇ" + +#: ../../WPrefs.app/KeyboardShortcuts.c:162 +msgid "Press the desired shortcut key(s) or click Cancel to stop capturing." +msgstr "ÀßÄꤷ¤¿¤¤¥·¥ç¡¼¥È¥«¥Ã¥È¥­¡¼¤ò²¡¤¹¤«¡¢ÃæÃǥܥ¿¥ó¤Ç¥Á¥ã¥×¥Á¥ã¡¼¤òÃæ»ß¡£" + +#: ../../WPrefs.app/KeyboardShortcuts.c:180 ../../WPrefs.app/KeyboardShortcuts.c:374 ../../WPrefs.app/Menu.c:935 ../../WPrefs.app/Menu.c:1157 +msgid "Capture" +msgstr "¥Á¥ã¥×¥Á¥ã¡¼" + +#: ../../WPrefs.app/KeyboardShortcuts.c:181 ../../WPrefs.app/KeyboardShortcuts.c:381 +msgid "Click Capture to interactively define the shortcut key." +msgstr "¥­¥ã¥×¥Á¥ã¡¼¤ò¥¯¥ê¥Ã¥¯¤¹¤ì¤Ð¥·¥ç¡¼¥È¥«¥Ã¥È¤ò¥¤¥ó¥¿¥é¥¯¥Æ¥£¥ÖÀßÄê¤Ç¤­¤Þ¤¹¡£" + +#: ../../WPrefs.app/KeyboardShortcuts.c:299 +msgid "Actions" +msgstr "¥¢¥¯¥·¥ç¥ó" + +#: ../../WPrefs.app/KeyboardShortcuts.c:313 +msgid "Open applications menu" +msgstr "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥á¥Ë¥å¡¼¤ò³«¤¯" + +#: ../../WPrefs.app/KeyboardShortcuts.c:314 +msgid "Open window list menu" +msgstr "¥¦¥£¥ó¥É¥¦¥ê¥¹¥È¥á¥Ë¥å¡¼¤ò³«¤¯" + +#: ../../WPrefs.app/KeyboardShortcuts.c:315 +msgid "Open window commands menu" +msgstr "¥¦¥£¥ó¥É¥¦¥³¥Þ¥ó¥É¥á¥Ë¥å¡¼¤ò³«¤¯" + +#: ../../WPrefs.app/KeyboardShortcuts.c:316 +msgid "Hide active application" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò±£¤¹" + +#: ../../WPrefs.app/KeyboardShortcuts.c:317 +msgid "Miniaturize active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤òºÇ¾®²½" + +#: ../../WPrefs.app/KeyboardShortcuts.c:318 +msgid "Close active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤òÊĤ¸¤ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:319 +msgid "Maximize active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤òºÇÂç²½" + +#: ../../WPrefs.app/KeyboardShortcuts.c:320 +msgid "Maximize active window vertically" +msgstr "¥¦¥£¥ó¥É¥¦¤ò½ÄÊý¸þ¤À¤±ºÇÂç²½" + +#: ../../WPrefs.app/KeyboardShortcuts.c:321 +msgid "Raise active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤òÁ°Ì̤Ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:322 +msgid "Lower active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤òÇØÌ̤Ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:323 +msgid "Raise/Lower window under mouse pointer" +msgstr "¥Þ¥¦¥¹¥Ý¥¤¥ó¥¿²¼¤Î¥¦¥£¥ó¥É¥¦¤òÁ°/ÇØÌ̤Ø" + +#: ../../WPrefs.app/KeyboardShortcuts.c:324 +msgid "Shade active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤ò¾ö¤à" + +#: ../../WPrefs.app/KeyboardShortcuts.c:325 +msgid "Select active window" +msgstr "¥¢¥¯¥Æ¥£¥Ö¥¦¥£¥ó¥É¥¦¤ÎÁªÂò" + +#: ../../WPrefs.app/KeyboardShortcuts.c:326 +msgid "Focus next window" +msgstr "¥Õ¥©¡¼¥«¥¹¤ò¼¡¤Î¥¦¥£¥ó¥É¥¦¤Ø" + +#: ../../WPrefs.app/KeyboardShortcuts.c:327 +msgid "Focus previous window" +msgstr "¥Õ¥©¡¼¥«¥¹¤òÁ°¤Î¥¦¥£¥ó¥É¥¦¤Ø" + +#: ../../WPrefs.app/KeyboardShortcuts.c:328 +msgid "Switch to next workspace" +msgstr "¼¡¤Î¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:329 +msgid "Switch to previous workspace" +msgstr "Á°¤Î¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:330 +msgid "Switch to next ten workspaces" +msgstr "10ÈÖÌܤΥ¥¯¥¹¥Ú¡¼¥¹¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:331 +msgid "Switch to previous ten workspaces" +msgstr "10ÈÖ¼êÁ°¤Î¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:332 +msgid "Switch to workspace 1" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹1¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:333 +msgid "Switch to workspace 2" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹2¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:334 +msgid "Switch to workspace 3" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹3¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:335 +msgid "Switch to workspace 4" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹4¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:336 +msgid "Switch to workspace 5" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹5¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:337 +msgid "Switch to workspace 6" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹6¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:338 +msgid "Switch to workspace 7" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹7¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:339 +msgid "Switch to workspace 8" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹8¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:340 +msgid "Switch to workspace 9" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹8¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:341 +msgid "Switch to workspace 10" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹10¤Ø°ÜÆ°" + +#: ../../WPrefs.app/KeyboardShortcuts.c:342 +msgid "Raise Clip" +msgstr "¥¯¥ê¥Ã¥×¤ò¼êÁ°¤Ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:343 +msgid "Lower Clip" +msgstr "¥¯¥ê¥Ã¥×¤òÇØÌ̤Ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:344 +msgid "Raise/Lower Clip" +msgstr "¥¯¥ê¥Ã¥×¤òÁ°/ÇØÌ̤Ë" + +#: ../../WPrefs.app/KeyboardShortcuts.c:357 ../../WPrefs.app/Menu.c:1146 +msgid "Shortcut" +msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È" + +#: ../../WPrefs.app/KeyboardShortcuts.c:368 +msgid "Clear" +msgstr "¥¯¥ê¥¢" + +#: ../../WPrefs.app/KeyboardShortcuts.c:429 +msgid "Keyboard Shortcut Preferences" +msgstr "¥­¡¼¥Ü¡¼¥É¥·¥ç¡¼¥È¥«¥Ã¥È¤ÎÀßÄê" + +#: ../../WPrefs.app/Menu.c:373 +msgid "Window Manager" +msgstr "Window Manager" + +#: ../../WPrefs.app/Menu.c:375 +msgid "Program to open files" +msgstr "¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¥×¥í¥°¥é¥à" + +#: ../../WPrefs.app/Menu.c:377 ../../WPrefs.app/Menu.c:1133 +msgid "Program to Run" +msgstr "¼Â¹Ô¤¹¤ë¥×¥í¥°¥é¥à" + +#: ../../WPrefs.app/Menu.c:427 ../../WPrefs.app/Menu.c:428 +msgid "New Command %i" +msgstr "¿·¤·¤¤¥³¥Þ¥ó¥É %i" + +#: ../../WPrefs.app/Menu.c:435 +msgid "New Submenu" +msgstr "¿·¤·¤¤¥µ¥Ö¥á¥Ë¥å¡¼" + +#: ../../WPrefs.app/Menu.c:440 +msgid "External Menu" +msgstr "³°Éô¥á¥Ë¥å¡¼" + +#: ../../WPrefs.app/Menu.c:447 +msgid "Workspaces" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹" + +#: ../../WPrefs.app/Menu.c:1017 ../../WPrefs.app/Menu.c:1032 +msgid "Commands" +msgstr "¥³¥Þ¥ó¥É" + +#: ../../WPrefs.app/Menu.c:1018 ../../WPrefs.app/Menu.c:1033 +msgid "Add Command" +msgstr "¥³¥Þ¥ó¥ÉÄɲÃ" + +#: ../../WPrefs.app/Menu.c:1019 ../../WPrefs.app/Menu.c:1034 +msgid "Add Submenu" +msgstr "¥µ¥Ö¥á¥Ë¥å¡¼ÄɲÃ" + +#: ../../WPrefs.app/Menu.c:1020 ../../WPrefs.app/Menu.c:1035 +msgid "Add External Menu" +msgstr "³°Éô¥á¥Ë¥å¡¼ÄɲÃ" + +#: ../../WPrefs.app/Menu.c:1021 ../../WPrefs.app/Menu.c:1036 +msgid "Add Workspace Menu" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¥á¥Ë¥å¡¼ÄɲÃ" + +#: ../../WPrefs.app/Menu.c:1022 ../../WPrefs.app/Menu.c:1037 +msgid "Remove Item" +msgstr "¹àÌܤòºï½ü" + +#: ../../WPrefs.app/Menu.c:1023 ../../WPrefs.app/Menu.c:1038 +msgid "Cut Item" +msgstr "¹àÌܤòÀÚ¤ê¼è¤ë" + +#: ../../WPrefs.app/Menu.c:1024 ../../WPrefs.app/Menu.c:1039 +msgid "Copy Item" +msgstr "¹àÌܤò¥³¥Ô¡¼" + +#: ../../WPrefs.app/Menu.c:1025 ../../WPrefs.app/Menu.c:1040 +msgid "Paste Item" +msgstr "¹àÌܤòÄ¥¤êÉÕ¤±" + +#: ../../WPrefs.app/Menu.c:1069 +msgid "Label" +msgstr "¸«½Ð¤·" + +#: ../../WPrefs.app/Menu.c:1082 +msgid "Command" +msgstr "¥³¥Þ¥ó¥É" + +#: ../../WPrefs.app/Menu.c:1087 +msgid "Run Program" +msgstr "¥×¥í¥°¥é¥à¼Â¹Ô" + +#: ../../WPrefs.app/Menu.c:1088 +msgid "Arrange Icons" +msgstr "¥¢¥¤¥³¥ó¤òÀ°Îó" + +#: ../../WPrefs.app/Menu.c:1089 +msgid "Hide Others" +msgstr "¾¤ò±£¤¹" + +#: ../../WPrefs.app/Menu.c:1090 +msgid "Show All Windows" +msgstr "Á´¤Æ¤Î¥¦¥£¥ó¥É¥¦¤òɽ¼¨" + +#: ../../WPrefs.app/Menu.c:1091 +msgid "Exit WindowMaker" +msgstr "WindowMaker¤ò½ªÎ»" + +#: ../../WPrefs.app/Menu.c:1092 +msgid "Exit X Session" +msgstr "X¥»¥Ã¥·¥ç¥ó¤ò½ªÎ»" + +#: ../../WPrefs.app/Menu.c:1093 +msgid "Start window manager" +msgstr "¥¦¥£¥ó¥É¥¦¥Þ¥Í¡¼¥¸¥ã¡¼µ¯Æ°" + +#: ../../WPrefs.app/Menu.c:1094 +msgid "Restart WindowMaker" +msgstr "WindowMaker¤òºÆµ¯Æ°" + +#: ../../WPrefs.app/Menu.c:1095 +msgid "Save Session" +msgstr "¥»¥Ã¥·¥ç¥ó¤òÊݸ" + +#: ../../WPrefs.app/Menu.c:1096 +msgid "Clear Session" +msgstr "¥»¥Ã¥·¥ç¥ó¤ò¥¯¥ê¥¢" + +#: ../../WPrefs.app/Menu.c:1097 +msgid "Refresh Screen" +msgstr "²èÌ̤κÆɽ¼¨" + +#: ../../WPrefs.app/Menu.c:1098 +msgid "Info Panel" +msgstr "¾ðÊó¥Ñ¥Í¥ë" + +#: ../../WPrefs.app/Menu.c:1099 +msgid "Legal Panel" +msgstr "¥é¥¤¥»¥ó¥¹" + +#: ../../WPrefs.app/Menu.c:1107 +msgid "Open workspace menu" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¥á¥Ë¥å¡¼¤ò³«¤¯" + +#: ../../WPrefs.app/Menu.c:1114 +msgid "No confirmation panel" +msgstr "³Îǧ¥Ñ¥Í¥ë¤Ê¤·" + +#: ../../WPrefs.app/Menu.c:1120 +msgid "Menu Path/Directory List" +msgstr "¥á¥Ë¥å¡¼¤Î¥Ñ¥¹/¥Ç¥£¥ì¥¯¥È¥ê¥ê¥¹¥È" + +#: ../../WPrefs.app/Menu.c:1165 +msgid "Ask help to the Guru" +msgstr "ã¿Í¤Ë½õ¤±¤òµá¤á¤ë" + +#: ../../WPrefs.app/Menu.c:1286 +msgid "" +"The format of the current menu in ~/G/D/WMRootMenu is not supported by WPrefs. A new menu will be created.\n" +"You can also replace ~/G/D/WMRootMenu with ~/G/L/W/plmenu to get the default menu." +msgstr "" +"¤³¤Î¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë ~/G/D/WMRootMenu ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È\n" +"¤ÏWPrefs¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¿·¤·¤¤¥á¥Ë¥å¡¼¤òºîÀ®¤·¤Þ¤¹¡£\n" +"¤Þ¤¿¡¢ ~/G/D/WMRootMenu ¤ò ~/G/L/W/plmenu ¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£" + +#: ../../WPrefs.app/Menu.c:1291 ../../WPrefs.app/Menu.c:1296 ../../WPrefs.app/WPrefs.c:582 +msgid "Warning" +msgstr "·Ù¹ð" + +#. WMMapWidget(panel->pathB); +#: ../../WPrefs.app/Menu.c:1291 ../../WPrefs.app/Menu.c:1297 ../../WPrefs.app/MenuGuru.c:119 ../../WPrefs.app/MenuGuru.c:126 ../../WPrefs.app/MenuGuru.c:140 ../../WPrefs.app/MouseSettings.c:156 ../../WPrefs.app/Text.c:181 ../../WPrefs.app/WPrefs.c:544 ../../WPrefs.app/WPrefs.c:549 ../../WPrefs.app/WPrefs.c:560 ../../WPrefs.app/WPrefs.c:569 ../../WPrefs.app/WPrefs.c:575 ../../WPrefs.app/WPrefs.c:582 ../../WPrefs.app/WPrefs.c:599 ../../WPrefs.app/WPrefs.c:604 +msgid "OK" +msgstr "OK" + +#: ../../WPrefs.app/Menu.c:1296 +msgid "Any changes made in this section will not be saved" +msgstr "¤³¤Î¥»¥¯¥·¥ç¥ó¤Ç¹Ô¤ï¤ì¤¿Á´¤Æ¤ÎÊѹ¹¤òÇË´þ¤·¤Þ¤¹¡£" + +#: ../../WPrefs.app/Menu.c:1356 +msgid "Applications Menu Definition" +msgstr "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥á¥Ë¥å¡¼¤ÎÄêµÁ" + +#: ../../WPrefs.app/MenuGuru.c:106 +msgid "Menu Guru - Select Type" +msgstr "Menu Guru - ¥¿¥¤¥×¤ÎÁªÂò" + +#: ../../WPrefs.app/MenuGuru.c:111 ../../WPrefs.app/MenuGuru.c:133 ../../WPrefs.app/MenuGuru.c:251 +msgid "Next" +msgstr "¼¡¤Ø" + +#: ../../WPrefs.app/MenuGuru.c:114 +msgid "Menu Guru - Select Menu File" +msgstr "Menu Guru - ¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¤ÎÁªÂò" + +#: ../../WPrefs.app/MenuGuru.c:122 +msgid "Menu Guru - Select Pipe Command" +msgstr "Menu Guru - ¥Ñ¥¤¥×¥³¥Þ¥ó¥É¤ÎÁªÂò" + +#: ../../WPrefs.app/MenuGuru.c:129 +msgid "Menu Guru - Select Directories" +msgstr "Menu Guru - ¥Ç¥£¥ì¥¯¥È¥ê¤ÎÁªÂò" + +#: ../../WPrefs.app/MenuGuru.c:136 +msgid "Menu Guru - Select Command" +msgstr "Menu Guru - ¥³¥Þ¥ó¥É¤ÎÁªÂò" + +#: ../../WPrefs.app/MenuGuru.c:257 +msgid "Back" +msgstr "Ìá¤ë" + +#: ../../WPrefs.app/MenuGuru.c:271 +msgid "" +"This process will help you create a submenu which definition is located in another file or is created dynamically.\n" +"What do you want to use as the contents of the submenu?" +msgstr "" +"¤³¤Îºî¶È¤Ï¥á¥Ë¥å¡¼ÄêµÁ¤Ë¾¤Î¥Õ¥¡¥¤¥ë¤ò»È¤¦¾ì¹ç¤ä¡¢Æ°Åª¤Ë¤½¤ì¤ò»ØÄꤹ¤ë¤Î¤òÊä½õ¤·¤Þ¤¹¡£\n" +"¤É¤ì¤ò¥µ¥Ö¥á¥Ë¥å¡¼¤Ë»È¤¤¤Þ¤¹¤«?" + +#: ../../WPrefs.app/MenuGuru.c:279 +msgid "A file containing the menu definition in the plain text (non-property list) menu format." +msgstr "¥á¥Ë¥å¡¼ÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏÄ̾ï¤Î¥Æ¥­¥¹¥È¥Õ¥¡¥¤¥ë¤Î (¥×¥í¥Ñ¥Æ¥£¡¼¥ê¥¹¥È¤Ç¤Ê¤¯) ¥á¥Ë¥å¡¼¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:285 +msgid "The menu definition generated by a script/program read through a pipe." +msgstr "¥á¥Ë¥å¡¼ÄêµÁ¤Ï¥¹¥¯¥ê¥×¥È¤ä¥×¥í¥°¥é¥à¤ÎÃͤò¥Ñ¥¤¥×·Ðͳ¤Ç»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:291 +msgid "The files in one or more directories." +msgstr "¥Õ¥¡¥¤¥ë¤Ï°ì¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:303 +msgid "Type the path for the menu file:" +msgstr "¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹:" + +#: ../../WPrefs.app/MenuGuru.c:318 +msgid "The menu file must contain a menu in the plain text menu file format. This format is described in the menu files included with WindowMaker, probably at ~/GNUstep/Library/WindowMaker/menu" +msgstr "¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È·Á¼°¤Î¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤³¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ÏWindowMaker¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë(~/GNUstep/Library/WindowMaker/menu)¤ÈƱÍͤǤ¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:328 +msgid "Type the command that will generate the menu definition:" +msgstr "¥á¥Ë¥å¡¼ÄêµÁ¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É:" + +#: ../../WPrefs.app/MenuGuru.c:338 +msgid "The command supplied must generate and output a valid menu definition to stdout. This definition should be in the plain text menu file format, described in the menu files included with WindowMaker, usually at ~/GNUstep/Library/WindowMaker/menu" +msgstr "¥³¥Þ¥ó¥É¤ÏÀµ¤·¤¤¥á¥Ë¥å¡¼ÄêµÁ¤òÀ¸À®¤·¤Æɸ½à½ÐÎϤؽÐÎϤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤³¤Î¥á¥Ë¥å¡¼ÄêµÁ¤Ï¥Æ¥­¥¹¥È·Á¼°¤Î¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹¡£WindowMaker¤Î¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë ~/GNUstep/Library/WindowMaker/menu.ja ¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£" + +#: ../../WPrefs.app/MenuGuru.c:350 ../../WPrefs.app/MenuGuru.c:372 ../../WPrefs.app/MenuGuru.c:394 +msgid "Type the path for the directory. You can type more than one path by separating them with spaces." +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ñ¥¹¤òÆþÎÏ¡£¥¹¥Ú¡¼¥¹¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:361 ../../WPrefs.app/MenuGuru.c:383 ../../WPrefs.app/MenuGuru.c:405 +msgid "The menu generated will have an item for each file in the directory. The directories can contain program executables or data files (such as jpeg images)." +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¤ËÂбþ¤·¤¿¥á¥Ë¥å¡¼¹àÌܤ¬ºî¤é¤ì¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¼Â¹Ô¥Õ¥¡¥¤¥ë¤ä¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë(JPEG¥¤¥á¡¼¥¸¤Ê¤É)¤ò´Þ¤à¤³¤È¤¬²Äǽ¤Ç¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:415 +msgid "If the directory contain data files, type the command used to open these files. Otherwise, leave it in blank." +msgstr "¤â¤·¡¢¥Ç¥£¥ì¥¯¥È¥ê¤ÎÆâÍƤ¬¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤Ï¤½¤ì¤ò¥ª¡¼¥×¥ó¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¤òÆþÎÏ¡¢¤½¤ì°Ê³°¤Î¾ì¹ç¤Ë¤Ï¶õÇò¤Î¤Þ¤Þ¤Ë¤·¤Þ¤¹¡£" + +#: ../../WPrefs.app/MenuGuru.c:426 +msgid "Each file in the directory will have an item and they will be opened with the supplied command.For example, if the directory contains image files and the command is \"xv -root\", each file in the directory will have a menu item like \"xv -root imagefile\"." +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ëÁ´¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬¹àÌܤȤʤê¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Î¹àÌܤÏÀßÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¤Ç¥ª¡¼¥×¥ó¤µ¤ì¤Þ¤¹¡£Î㤨¤Ð¥Ç¥£¥ì¥¯¥È¥ê¤ÎÆâÍƤ¬²èÁü¥Õ¥¡¥¤¥ë¤Ç¥³¥Þ¥ó¥É¤¬ \"xv -root\"¤À¤È¡¢¥Ç¥£¥ì¥¯¥È¥ê¤Î¤½¤ì¤¾¤ì¤Î¥Õ¥¡¥¤¥ë¤Ï\"xv -root imagefile\"¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£" + +#: ../../WPrefs.app/MenuPreferences.c:112 +msgid "Menu Scrolling Speed" +msgstr "¥á¥Ë¥å¡¼¤Î¥¹¥¯¥í¡¼¥ë®ÅÙ" + +#: ../../WPrefs.app/MenuPreferences.c:161 +msgid "Submenu Alignment" +msgstr "¥µ¥Ö¥á¥Ë¥å¡¼¤ÎʤÓ" + +#: ../../WPrefs.app/MenuPreferences.c:204 +msgid "" +"Always open submenus inside the screen, instead of scrolling.\n" +"Note: this can be an annoyance at some circumstances." +msgstr "" +"¥µ¥Ö¥á¥Ë¥å¡¼¤¬¾ï¤Ë²èÌ̤ÎÃæ¤Ëɽ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡£" + +#: ../../WPrefs.app/MenuPreferences.c:209 +msgid "Scroll off-screen menus when pointer is moved over them." +msgstr "²èÌ̤γ°¤Î¥á¥Ë¥å¡¼¤ò¥Þ¥¦¥¹¥«¡¼¥½¥ë¤Î°ÜÆ°¤Ë¹ç¤ï¤»¤Æ¥¹¥¯¥í¡¼¥ë¤¹¤ë¡£" + +#: ../../WPrefs.app/MenuPreferences.c:229 +msgid "Menu Preferences" +msgstr "¥á¥Ë¥å¡¼¤ÎÀßÄê" + +#: ../../WPrefs.app/MouseSettings.c:154 ../../WPrefs.app/Text.c:181 ../../WPrefs.app/WPrefs.c:544 ../../WPrefs.app/WPrefs.c:549 ../../WPrefs.app/WPrefs.c:558 ../../WPrefs.app/WPrefs.c:567 ../../WPrefs.app/WPrefs.c:575 ../../WPrefs.app/WPrefs.c:599 ../../WPrefs.app/WPrefs.c:604 +msgid "Error" +msgstr "¥¨¥é¡¼" + +#: ../../WPrefs.app/MouseSettings.c:155 +msgid "Invalid mouse acceleration threshold value. Must be the number of pixels to travel before accelerating." +msgstr "¥Þ¥¦¥¹²Ã®¤Î¥Ñ¥é¥á¡¼¥¿¡¼¤¬ÉÔÀµ¤Ç¤¹¡£²Ã®¤ò³«»Ï¤¹¤ë¤Þ¤Ç¤Î°ÜÆ°Î̤ò¥Ô¥¯¥»¥ë¤Ç»ØÄꤷ¤Þ¤¹¡£" + +#: ../../WPrefs.app/MouseSettings.c:209 +msgid "mouse button %s not supported by WPrefs." +msgstr "¥Þ¥¦¥¹¥Ü¥¿¥ó %s ¤Ï WPrefs ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/MouseSettings.c:243 ../../WPrefs.app/MouseSettings.c:254 ../../WPrefs.app/MouseSettings.c:265 +msgid "bad value %s for option %s" +msgstr "ÃÍ %s ¤Ï¥ª¥×¥·¥ç¥ó %s ¤ÎÃͤȤ·¤ÆÉÔÀµ¤Ç¤¹¡£" + +#: ../../WPrefs.app/MouseSettings.c:325 +msgid "modifier key %s for option ModifierKey was not recognized. Using %s as default" +msgstr "ÃÍ %s ¤ÏModifierKey¤È¤·¤Æ²ò¼á¤Ç¤­¤Þ¤»¤ó¡£ÃÍ %s ¤ò¥Ç¥Õ¥©¥ë¥È¤Ç»È¤¤¤Þ¤¹¡£" + +#: ../../WPrefs.app/MouseSettings.c:350 +msgid "could not retrieve keyboard modifier mapping" +msgstr "keyboard modifier¥Þ¥Ã¥Ô¥ó¥°¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£" + +#: ../../WPrefs.app/MouseSettings.c:497 +msgid "Mouse Speed" +msgstr "¥Þ¥¦¥¹¤Î®ÅÙ" + +#: ../../WPrefs.app/MouseSettings.c:564 +msgid "Threshold:" +msgstr "Threshold:" + +#: ../../WPrefs.app/MouseSettings.c:579 +msgid "Double-Click Delay" +msgstr "¥À¥Ö¥ë¥¯¥ê¥Ã¥¯¤ÎÃÙ±ä" + +#: ../../WPrefs.app/MouseSettings.c:623 +msgid "Test" +msgstr "¥Æ¥¹¥È" + +#: ../../WPrefs.app/MouseSettings.c:633 +msgid "Workspace Mouse Actions" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤Ç¤ÎÆ°ºî" + +#: ../../WPrefs.app/MouseSettings.c:638 +msgid "Disable mouse actions" +msgstr "¥Þ¥¦¥¹Æ°ºî¤Î»ÈÍÑÄä»ß" + +#: ../../WPrefs.app/MouseSettings.c:691 +msgid "Applications menu" +msgstr "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó" + +#: ../../WPrefs.app/MouseSettings.c:697 +msgid "Window list menu" +msgstr "¥¦¥£¥ó¥É¥¦°ìÍ÷" + +#: ../../WPrefs.app/MouseSettings.c:703 +msgid "Select windows" +msgstr "¥¦¥£¥ó¥É¥¦¤ÎÁªÂò" + +#: ../../WPrefs.app/MouseSettings.c:738 +msgid "Mouse Grab Modifier" +msgstr "Mouse Grab Modifier" + +#: ../../WPrefs.app/MouseSettings.c:772 +msgid "could not create %s" +msgstr "%s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/MouseSettings.c:788 +msgid "could not create temporary file %s" +msgstr "¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/MouseSettings.c:813 +msgid "could not rename file %s to %s\n" +msgstr "¥Õ¥¡¥¤¥ë %s ¤ò %s ¤Ë¤ê¥Í¡¼¥à½ÐÍè¤Þ¤»¤ó¡£\n" + +#: ../../WPrefs.app/MouseSettings.c:896 +msgid "Mouse Preferences" +msgstr "¥Þ¥¦¥¹¤ÎÀßÄê" + +#: ../../WPrefs.app/Paths.c:82 +msgid "bad value in option IconPath. Using default path list" +msgstr "¥¢¥¤¥³¥ó¥Ñ¥¹¤ÎÃͤ¬ÉÔÀµ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/Paths.c:99 +msgid "bad value in option PixmapPath. Using default path list" +msgstr "Pixmap¤Î¥Ñ¥¹¤¬ÉÔÀµ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/Paths.c:301 +msgid "Icon Search Paths" +msgstr "¥¢¥¤¥³¥ó¸¡º÷¥Ñ¥¹" + +#: ../../WPrefs.app/Paths.c:313 ../../WPrefs.app/Paths.c:349 +msgid "Add" +msgstr "ÄɲÃ" + +#: ../../WPrefs.app/Paths.c:320 ../../WPrefs.app/Paths.c:356 +msgid "Remove" +msgstr "ºï½ü" + +#: ../../WPrefs.app/Paths.c:337 +msgid "Pixmap Search Paths" +msgstr "Pixmap¸¡º÷¥Ñ¥¹" + +#: ../../WPrefs.app/Paths.c:385 +msgid "Search Path Configuration" +msgstr "¸¡º÷¥Ñ¥¹¤ÎÀßÄê" + +#: ../../WPrefs.app/Preferences.c:142 +msgid "Size Display" +msgstr "ɽ¼¨¥µ¥¤¥º" + +#: ../../WPrefs.app/Preferences.c:147 ../../WPrefs.app/Preferences.c:163 +msgid "Corner of screen" +msgstr "²èÌ̤Υ³¡¼¥Ê¡¼" + +#: ../../WPrefs.app/Preferences.c:148 ../../WPrefs.app/Preferences.c:164 +msgid "Center of screen" +msgstr "²èÌ̤ÎÃæ±û" + +#: ../../WPrefs.app/Preferences.c:149 ../../WPrefs.app/Preferences.c:165 +msgid "Center of resized window" +msgstr "¥ê¥µ¥¤¥º¤µ¤ì¤¿¥¦¥£¥ó¥É¥¦¤ÎÃæ±û" + +#: ../../WPrefs.app/Preferences.c:150 +msgid "Technical drawing-like" +msgstr "Technical drawing-like" + +#: ../../WPrefs.app/Preferences.c:158 +msgid "Position Display" +msgstr "ɽ¼¨°ÌÃÖ" + +#: ../../WPrefs.app/Preferences.c:173 +msgid "Show balloon text for..." +msgstr "¥Ð¥ë¡¼¥ó¥Ø¥ë¥×¤Îɽ¼¨¤Ï..." + +#: ../../WPrefs.app/Preferences.c:180 +msgid "incomplete window titles" +msgstr "Ť¤¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë" + +#: ../../WPrefs.app/Preferences.c:181 +msgid "miniwindow titles" +msgstr "¥ß¥Ë¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë" + +#: ../../WPrefs.app/Preferences.c:182 +msgid "application/dock icons" +msgstr "application/dock¥¢¥¤¥³¥ó" + +#: ../../WPrefs.app/Preferences.c:195 +msgid "Raise window when switching focus with keyboard." +msgstr "¥­¡¼¥Ü¡¼¥É¤Ç¥¦¥£¥ó¥É¥¦¤¬¥Õ¥©¡¼¥«¥¹¤µ¤ì¤¿¤È¤­¼êÁ°¤Ë¡£" + +#: ../../WPrefs.app/Preferences.c:215 +msgid "Miscellaneous Ergonomic Preferences" +msgstr "¤½¤Î¾¤ÎÁàºîÀ­¤ÎÀßÄê" + +#: ../../WPrefs.app/Text.c:179 +msgid "Invalid font %s." +msgstr "¥Õ¥©¥ó¥È %s ¤ÏÉÔÀµ¤Ç¤¹¡£" + +#: ../../WPrefs.app/Text.c:256 +msgid "Set Font..." +msgstr "¥Õ¥©¥ó¥ÈÀßÄê..." + +#: ../../WPrefs.app/Text.c:262 +msgid "Window Title Font" +msgstr "¥¦¥£¥ó¥É¥¦¥¿¥¤¥È¥ë¥Õ¥©¥ó¥È" + +#: ../../WPrefs.app/Text.c:263 +msgid "Menu Title Font" +msgstr "¥á¥Ë¥å¡¼¥¿¥¤¥È¥ë¥Õ¥©¥ó¥È" + +#: ../../WPrefs.app/Text.c:264 +msgid "Menu Item Font" +msgstr "¥á¥Ë¥å¡¼¹àÌÜ¥Õ¥©¥ó¥È" + +#: ../../WPrefs.app/Text.c:265 +msgid "Icon Title Font" +msgstr "¥¢¥¤¥³¥ó¥¿¥¤¥È¥ë¥Õ¥©¥ó¥È" + +#: ../../WPrefs.app/Text.c:266 +msgid "Clip Title Font" +msgstr "¥¯¥ê¥Ã¥×¥¿¥¤¥È¥ë¥Õ¥©¥ó¥È" + +#: ../../WPrefs.app/Text.c:267 +msgid "Geometry Display Font" +msgstr "¥Ç¥£¥¹¥×¥ì¥¤¥Õ¥©¥ó¥È¤Î¥¸¥ª¥á¥È¥ê" + +#: ../../WPrefs.app/Text.c:280 +msgid "" +"Sample Text\n" +"abcdefghijklmnopqrstuvxywz\n" +"ABCDEFGHIJKLMNOPQRSTUVXYWZ\n" +"0123456789" +msgstr "" +"¥µ¥ó¥×¥ëɽ¼¨\n" +"abcdefghijklm...¤¢¤¤¤¦¤¨¤ª¤«\n" +"ABCDEFGHIJKLM...°¤µï±­³¨Èø²½\n" +"0123...Îí°íÆõ»²" + +#: ../../WPrefs.app/Text.c:285 +msgid "Alignment" +msgstr "À°Îó" + +#: ../../WPrefs.app/Text.c:290 +msgid "Left" +msgstr "º¸" + +#: ../../WPrefs.app/Text.c:296 +msgid "Center" +msgstr "Ãæ±û" + +#: ../../WPrefs.app/Text.c:303 +msgid "Right" +msgstr "±¦" + +#: ../../WPrefs.app/Text.c:325 +msgid "Text Preferences" +msgstr "¥Æ¥­¥¹¥È¤ÎÀßÄê" + +#: ../../WPrefs.app/TextureAndColor.c:339 +msgid "Window Title Bar" +msgstr "¥¦¥£¥ó¥É¥¦¥¿¥¤¥È¥ë¥Ð¡¼" + +#: ../../WPrefs.app/TextureAndColor.c:340 +msgid "Menu Title Bar" +msgstr "¥á¥Ë¥å¡¼¥¿¥¤¥È¥ë¥Ð¡¼" + +#: ../../WPrefs.app/TextureAndColor.c:341 +msgid "Menu Items" +msgstr "¥á¥Ë¥å¡¼¹àÌÜ" + +#: ../../WPrefs.app/TextureAndColor.c:342 +msgid "Workspace/Clip" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹/¥¯¥ê¥Ã¥×" + +#: ../../WPrefs.app/TextureAndColor.c:343 +msgid "Icons" +msgstr "¥¢¥¤¥³¥ó" + +#: ../../WPrefs.app/TextureAndColor.c:354 +msgid "Focused Window" +msgstr "¥Õ¥©¡¼¥«¥¹¥¦¥£¥ó¥É¥¦" + +#: ../../WPrefs.app/TextureAndColor.c:367 ../../WPrefs.app/TextureAndColor.c:398 ../../WPrefs.app/TextureAndColor.c:429 +msgid "Texture" +msgstr "¥Æ¥¯¥¹¥Á¥ã¡¼" + +#: ../../WPrefs.app/TextureAndColor.c:373 ../../WPrefs.app/TextureAndColor.c:404 ../../WPrefs.app/TextureAndColor.c:435 +msgid "Text Color" +msgstr "¥Æ¥­¥¹¥È¤Î¿§" + +#: ../../WPrefs.app/TextureAndColor.c:378 ../../WPrefs.app/TextureAndColor.c:409 ../../WPrefs.app/TextureAndColor.c:440 ../../WPrefs.app/TextureAndColor.c:464 ../../WPrefs.app/TextureAndColor.c:530 ../../WPrefs.app/TextureAndColor.c:607 +msgid "Set..." +msgstr "ÀßÄê..." + +#: ../../WPrefs.app/TextureAndColor.c:385 +msgid "Unfocused Window" +msgstr "¥Õ¥©¡¼¥«¥¹¤Î̵¤¤¥¦¥£¥ó¥É¥¦" + +#: ../../WPrefs.app/TextureAndColor.c:416 +msgid "Owner of Focused Window" +msgstr "¥Õ¥©¡¼¥«¥¹¥¦¥£¥ó¥É¥¦¤Î¥ª¡¼¥Ê¡¼" + +#: ../../WPrefs.app/TextureAndColor.c:449 +msgid "Unselected Items" +msgstr "ÈóÁªÂò¤Î¹àÌÜ" + +#: ../../WPrefs.app/TextureAndColor.c:459 ../../WPrefs.app/TextureAndColor.c:513 +msgid "Background" +msgstr "ÇØ·Ê" + +#: ../../WPrefs.app/TextureAndColor.c:474 +msgid "Normal Text" +msgstr "ÉáÄ̤Υƥ­¥¹¥È" + +#: ../../WPrefs.app/TextureAndColor.c:484 +msgid "Disabled Text" +msgstr "ÈóÁªÂò¤Î¥Æ¥­¥¹¥È" + +#: ../../WPrefs.app/TextureAndColor.c:493 +msgid "Selected Items" +msgstr "ÁªÂò¤µ¤ì¤¿¹àÌÜ" + +#: ../../WPrefs.app/TextureAndColor.c:503 +msgid "Text" +msgstr "¥Æ¥­¥¹¥È" + +#: ../../WPrefs.app/TextureAndColor.c:521 +msgid "Menu Title Background" +msgstr "¥á¥Ë¥å¡¼¥¿¥¤¥È¥ë¤ÎÇØ·Ê" + +#: ../../WPrefs.app/TextureAndColor.c:539 +msgid "Menu Title Text" +msgstr "¥á¥Ë¥å¡¼¥¿¥¤¥È¥ë¤Î¥Æ¥­¥¹¥È" + +#: ../../WPrefs.app/TextureAndColor.c:551 +msgid "Workspace Background" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤ÎÇØ·Ê" + +#: ../../WPrefs.app/TextureAndColor.c:560 +msgid "Change" +msgstr "Êѹ¹" + +#: ../../WPrefs.app/TextureAndColor.c:566 +msgid "Clip Title Text" +msgstr "¥¯¥ê¥Ã¥×¥Æ¥­¥¹¥È¥¿¥¤¥È¥ë" + +#: ../../WPrefs.app/TextureAndColor.c:576 +msgid "Normal" +msgstr "ɸ½à" + +#: ../../WPrefs.app/TextureAndColor.c:586 +msgid "Collapsed" +msgstr "Êø²õ" + +#: ../../WPrefs.app/TextureAndColor.c:598 +msgid "Icon Background" +msgstr "¥¢¥¤¥³¥ó¤ÎÇØ·Ê" + +#: ../../WPrefs.app/TextureAndColor.c:632 +msgid "Texture and Color Preferences" +msgstr "¥Æ¥¯¥¹¥Á¥ã¡¼¤È¥«¥é¡¼¤ÎÀßÄê" + +#: ../../WPrefs.app/WPrefs.c:196 +msgid "WindowMaker Preferences" +msgstr "WindowMaker¤ÎÀßÄê" + +#: ../../WPrefs.app/WPrefs.c:220 +msgid "Revert Page" +msgstr "¥Ú¡¼¥¸¤òÉüµ¢" + +#: ../../WPrefs.app/WPrefs.c:226 +msgid "Revert All" +msgstr "Á´¤Æ¤òÉüµ¢" + +#: ../../WPrefs.app/WPrefs.c:232 +msgid "Save" +msgstr "Êݸ" + +#: ../../WPrefs.app/WPrefs.c:238 +msgid "Close" +msgstr "ÊĤ¸¤ë" + +#: ../../WPrefs.app/WPrefs.c:262 +msgid "Version %s for WindowMaker %s" +msgstr "Version %s for WindowMaker %s" + +#: ../../WPrefs.app/WPrefs.c:269 +msgid "Starting..." +msgstr "Starting..." + +#: ../../WPrefs.app/WPrefs.c:275 +msgid "" +"Programming/Design: Alfredo K. Kojima\n" +"Artwork: Marco van Hylckama Vlieg" +msgstr "" +"Programming/Design: Alfredo K. Kojima\n" +"Artwork: Marco van Hylckama Vlieg" + +#: ../../WPrefs.app/WPrefs.c:362 +msgid "could not locate image file %s\n" +msgstr "¥¤¥á¡¼¥¸¥Õ¥¡¥¤¥ë %s ¤¬¸«ÉÕ¤«¤ê¤Þ¤»¤ó¡£\n" + +#: ../../WPrefs.app/WPrefs.c:486 +msgid "Loading WindowMaker configuration files..." +msgstr "WindowMaker ¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ßÃæ..." + +#: ../../WPrefs.app/WPrefs.c:490 +msgid "Initializing configuration panels..." +msgstr "ÀßÄê¥Ñ¥Í¥ë¤ò½é´ü²½Ãæ..." + +#: ../../WPrefs.app/WPrefs.c:543 ../../WPrefs.app/WPrefs.c:598 +msgid "WindowMaker domain (%s) is corrupted!" +msgstr "WindowMaker domain (%s) ¤Ï²õ¤ì¤Æ¤¤¤Þ¤¹¡£" + +#: ../../WPrefs.app/WPrefs.c:547 +msgid "Could not load WindowMaker domain (%s) from defaults database." +msgstr "WindowMaker domain (%s) ¤ò¥Ç¥Õ¥©¥ë¥È¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éÆɤ߹þ¤á¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/WPrefs.c:555 +msgid "could not extract version information from WindowMaker" +msgstr "WindowMaker ¤«¤é¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/WPrefs.c:556 +msgid "Make sure WindowMaker is in your search path." +msgstr "WindowMaker ¤¬¥µ¡¼¥Á¥Ñ¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¤«³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¡£" + +#: ../../WPrefs.app/WPrefs.c:559 ../../WPrefs.app/WPrefs.c:568 +msgid "Could not extract version from WindowMaker. Make sure it is correctly installed." +msgstr "WindowMaker ¤Î¥Ð¡¼¥¸¥ç¥ó¾ðÊ󤬼èÆÀ¤Ç¤­¤Þ¤»¤ó¡£Àµ¤·¤¯¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¡£" + +#: ../../WPrefs.app/WPrefs.c:573 +msgid "" +"WPrefs only supports WindowMaker 0.18.0 or newer.\n" +"The version installed is %i.%i.%i\n" +msgstr "" +"WPrefs ¤Ï WindowMaker 0.18.0 °Ê¾å¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£\n" +"¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï %i.%i.%i ¤Ç¤¹¡£\n" + +#: ../../WPrefs.app/WPrefs.c:580 +msgid "WindowMaker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs." +msgstr "¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë WindowMaker %i.%i.%i ¤Ï¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤Î WPrefs ¤Ç¤Ï°ìÉô¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/WPrefs.c:587 +msgid "could not run \"wmaker -global_defaults_path\"." +msgstr "\"wmaker -global_defaults_path\" ¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/WPrefs.c:602 +msgid "Could not load global WindowMaker domain (%s)." +msgstr "¥°¥í¡¼¥Ð¥ëWindowMaker¥É¥á¥¤¥ó(%s)¤ò¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£" + +#: ../../WPrefs.app/WPrefs.c:848 +msgid "" +"bad speed value for option %s\n" +". Using default Medium" +msgstr "" +"¥ª¥×¥·¥ç¥ó %s ¤ÎspeedÃͤÏÉÔÀµ¤Ç¤¹¡£\n" +"¥Ç¥Õ¥©¥ë¥ÈÃͤò»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/WindowHandling.c:108 +msgid "bad option value %s in WindowPlacement. Using default value" +msgstr "¥¦¥¤¥ó¥É¥¦ÇÛÃÖ¥ª¥×¥·¥ç¥ó %s ¤ÏÉÔÀµ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤò»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/WindowHandling.c:130 +msgid "invalid data in option WindowPlaceOrigin. Using default (0,0)" +msgstr "WindowÇÛÃ֤δð½àÃͤ¬ÉÔÀµ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î(0,0)¤ò»ÈÍѤ·¤Þ¤¹¡£" + +#: ../../WPrefs.app/WindowHandling.c:192 +msgid "Window Placement" +msgstr "¥¦¥¤¥ó¥É¥¦¤ÎÇÛÃÖ" + +#: ../../WPrefs.app/WindowHandling.c:197 +msgid "Automatic" +msgstr "¼«Æ°" + +#: ../../WPrefs.app/WindowHandling.c:198 +msgid "Random" +msgstr "¥é¥ó¥À¥à" + +#: ../../WPrefs.app/WindowHandling.c:199 +msgid "Manual" +msgstr "¥Þ¥Ë¥å¥¢¥ë" + +#: ../../WPrefs.app/WindowHandling.c:200 +msgid "Cascade" +msgstr "¥«¥¹¥±¡¼¥É" + +#: ../../WPrefs.app/WindowHandling.c:206 +msgid "Placement Origin" +msgstr "ÇÛÃ֤δð½àÅÀ" + +#: ../../WPrefs.app/WindowHandling.c:260 +msgid "Opaque Move" +msgstr "ÆâÍƤâ°ÜÆ°" + +#: ../../WPrefs.app/WindowHandling.c:296 +msgid "When maximizing..." +msgstr "ºÇÂç²½¤Î¤È¤­¤Ë..." + +#: ../../WPrefs.app/WindowHandling.c:301 +msgid "...do not resize over icons" +msgstr "...¥¢¥¤¥³¥óÎΰè¤ò´Þ¤á¤Ê¤¤" + +#: ../../WPrefs.app/WindowHandling.c:306 +msgid "...do not resize over dock" +msgstr "...¥É¥Ã¥¯Îΰè¤ò´Þ¤á¤Ê¤¤" + +#: ../../WPrefs.app/WindowHandling.c:319 +msgid "Keep transients above their owners" +msgstr "Keep transients above their owners" + +#: ../../WPrefs.app/WindowHandling.c:346 +msgid "Window Handling Preferences" +msgstr "¥¦¥£¥ó¥É¥¦Áàºî¤ÎÀßÄê" + +#: ../../WPrefs.app/Workspace.c:135 +msgid "Workspace Navigation" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤ÎÁàºî" + +#: ../../WPrefs.app/Workspace.c:159 +msgid "drag windows between workspaces." +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹´Ö¤Î¥¦¥£¥ó¥É¥¦°ÜÆ°²Äǽ¡£" + +#: ../../WPrefs.app/Workspace.c:184 +msgid "switch to first workspace when switching past the last workspace and vice-versa" +msgstr "" +"ºÇ¸å¤Î¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤«¤é¤Î°ÜÆ°¤ÇºÇ½é¤Î\n" +"¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤Ø°ÜÆ°¤Þ¤¿¤Ï¤½¤ÎµÕ¡£" + +#: ../../WPrefs.app/Workspace.c:208 +msgid "create a new workspace when switching past the last workspace." +msgstr "" +"ºÇ¸å¤Î¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤«¤é¤Î°ÜÆ°¤Ç\n" +"¿·µ¬¤Ë¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤òºîÀ®¡£" + +#: ../../WPrefs.app/Workspace.c:216 +msgid "Dock/Clip" +msgstr "Dock/Clip" + +#: ../../WPrefs.app/Workspace.c:285 +msgid "Workspace Preferences" +msgstr "¥ï¡¼¥¯¥¹¥Ú¡¼¥¹¤ÎÀßÄê" + +#: ../../WPrefs.app/main.c:56 +msgid "usage: %s [options]\n" +msgstr "usage: %s [options]\n" + +#: ../../WPrefs.app/main.c:57 +msgid "options:" +msgstr "options:" + +#: ../../WPrefs.app/main.c:58 +msgid " -display \tdisplay to be used" +msgstr " -display \tdisplay to be used" + +#: ../../WPrefs.app/main.c:59 +msgid " -version\t\tprint version number and exit" +msgstr " -version\t\tprint version number and exit" + +#: ../../WPrefs.app/main.c:82 +msgid "too few arguments for %s" +msgstr "too few arguments for %s" + +#: ../../WPrefs.app/main.c:104 +msgid "X server does not support locale" +msgstr "X server does not support locale" + +#: ../../WPrefs.app/main.c:107 +msgid "cannot set locale modifiers" +msgstr "cannot set locale modifiers" + +#: ../../WPrefs.app/main.c:113 +msgid "could not open display %s" +msgstr "could not open display %s" + +#: ../../WPrefs.app/main.c:121 +msgid "could not initialize application" +msgstr "could not initialize application" diff --git a/WPrefs.app/tiff/Makefile.in b/WPrefs.app/tiff/Makefile.in index c59559ad..e0020b40 100644 --- a/WPrefs.app/tiff/Makefile.in +++ b/WPrefs.app/tiff/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WPrefs.app/xpm/Makefile.in b/WPrefs.app/xpm/Makefile.in index a8701844..b9818040 100644 --- a/WPrefs.app/xpm/Makefile.in +++ b/WPrefs.app/xpm/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/Backgrounds/Makefile.in b/WindowMaker/Backgrounds/Makefile.in index 5031afbb..c0b5b00e 100755 --- a/WindowMaker/Backgrounds/Makefile.in +++ b/WindowMaker/Backgrounds/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/Defaults/Makefile.am b/WindowMaker/Defaults/Makefile.am index b8fef185..fc8f7d89 100644 --- a/WindowMaker/Defaults/Makefile.am +++ b/WindowMaker/Defaults/Makefile.am @@ -18,7 +18,7 @@ WindowMaker: $(srcdir)/WindowMaker.in ./Makefile sed -e "s:#pkgdatadir#:$(pkgdatadir):" $(srcdir)/WindowMaker.in > WindowMaker chmod 644 WindowMaker -WMState: $(srcdir)/WMState.in ./Makefile +WMState: $(srcdir)/WMState.in $(srcdir)/Makefile -rm -f WMState sed -e "s:#wprefs#:$(wprefsdir)/WPrefs:" $(srcdir)/WMState.in > WMState chmod 644 WMState diff --git a/WindowMaker/Defaults/Makefile.in b/WindowMaker/Defaults/Makefile.in index 53c24cc0..5d2f9775 100755 --- a/WindowMaker/Defaults/Makefile.in +++ b/WindowMaker/Defaults/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -218,7 +216,7 @@ WindowMaker: $(srcdir)/WindowMaker.in ./Makefile sed -e "s:#pkgdatadir#:$(pkgdatadir):" $(srcdir)/WindowMaker.in > WindowMaker chmod 644 WindowMaker -WMState: $(srcdir)/WMState.in ./Makefile +WMState: $(srcdir)/WMState.in $(srcdir)/Makefile -rm -f WMState sed -e "s:#wprefs#:$(wprefsdir)/WPrefs:" $(srcdir)/WMState.in > WMState chmod 644 WMState diff --git a/WindowMaker/Defaults/WMState b/WindowMaker/Defaults/WMState index 07a4aacc..c2e7ce7c 100755 --- a/WindowMaker/Defaults/WMState +++ b/WindowMaker/Defaults/WMState @@ -2,8 +2,8 @@ Dock = { Applications = ( { - Command = dockit; - Name = dockit.Dockit; + Command = ""; + Name = Logo.WMDock; AutoLaunch = No; Forced = No; Position = "0,0"; diff --git a/WindowMaker/Defaults/WMState.in b/WindowMaker/Defaults/WMState.in index 8881db91..d4c6ae7e 100644 --- a/WindowMaker/Defaults/WMState.in +++ b/WindowMaker/Defaults/WMState.in @@ -2,8 +2,8 @@ Dock = { Applications = ( { - Command = dockit; - Name = dockit.Dockit; + Command = ""; + Name = Logo.WMDock; AutoLaunch = No; Forced = No; Position = "0,0"; diff --git a/WindowMaker/Defaults/WindowMaker b/WindowMaker/Defaults/WindowMaker index 60b51c7f..2b807636 100755 --- a/WindowMaker/Defaults/WindowMaker +++ b/WindowMaker/Defaults/WindowMaker @@ -1,4 +1,6 @@ { + EdgeResistance = 5; + IconificationStyle = Zoom; IconPath = ( "~/GNUstep/Library/Icons", "/usr/local/share/WindowMaker/Icons", @@ -17,7 +19,6 @@ "/usr/local/share/pixmaps", "/usr/share/pixmaps" ); - IconificationStyle = Zoom; WindowTitleBalloons = YES; IconSize = 64; FocusMode = manual; @@ -36,7 +37,6 @@ SaveSessionOnExit = NO; ColormapMode = auto; RaiseDelay = 0; - EdgeResistance = 0; AutoFocus = YES; WindowPlacement = auto; WindowPlaceOrigin = (64, 64); @@ -48,7 +48,7 @@ AdvanceToNewWorkspace = NO; CycleWorkspaces = NO; ResizeDisplay = line; - MoveDisplay = corner; + MoveDisplay = floating; OpaqueMove = YES; OnTopTransients = YES; IconPosition = "blh"; @@ -59,7 +59,6 @@ ShadeSpeed = medium; DoubleClickTime = 250; AlignSubmenus = NO; - NoWindowUnderDock = YES; NoWindowOverIcons = NO; IgnoreFocusClick = NO; CloseKey = None; diff --git a/WindowMaker/Defaults/WindowMaker.in b/WindowMaker/Defaults/WindowMaker.in index f8294879..5c26e835 100644 --- a/WindowMaker/Defaults/WindowMaker.in +++ b/WindowMaker/Defaults/WindowMaker.in @@ -1,4 +1,6 @@ { + EdgeResistance = 5; + IconificationStyle = Zoom; IconPath = ( "~/GNUstep/Library/Icons", "#pkgdatadir#/Icons", @@ -17,7 +19,6 @@ "/usr/local/share/pixmaps", "/usr/share/pixmaps" ); - IconificationStyle = Zoom; WindowTitleBalloons = YES; IconSize = 64; FocusMode = manual; @@ -36,7 +37,6 @@ SaveSessionOnExit = NO; ColormapMode = auto; RaiseDelay = 0; - EdgeResistance = 0; AutoFocus = YES; WindowPlacement = auto; WindowPlaceOrigin = (64, 64); @@ -48,7 +48,7 @@ AdvanceToNewWorkspace = NO; CycleWorkspaces = NO; ResizeDisplay = line; - MoveDisplay = corner; + MoveDisplay = floating; OpaqueMove = YES; OnTopTransients = YES; IconPosition = "blh"; @@ -59,7 +59,6 @@ ShadeSpeed = medium; DoubleClickTime = 250; AlignSubmenus = NO; - NoWindowUnderDock = YES; NoWindowOverIcons = NO; IgnoreFocusClick = NO; CloseKey = None; diff --git a/WindowMaker/IconSets/Makefile.in b/WindowMaker/IconSets/Makefile.in index 6e72e3da..e2ac10ca 100755 --- a/WindowMaker/IconSets/Makefile.in +++ b/WindowMaker/IconSets/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/Icons/Makefile.in b/WindowMaker/Icons/Makefile.in index adc094a6..56b73471 100755 --- a/WindowMaker/Icons/Makefile.in +++ b/WindowMaker/Icons/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/Makefile.am b/WindowMaker/Makefile.am index ddc082fc..f9dae626 100644 --- a/WindowMaker/Makefile.am +++ b/WindowMaker/Makefile.am @@ -1,11 +1,11 @@ -SUBDIRS = Defaults Styles Themes Icons Pixmaps Backgrounds IconSets Sounds +SUBDIRS = Defaults Styles Themes Icons Pixmaps Backgrounds IconSets prefsdatadir = $(pkgdatadir) -prefsdata_DATA = wmmacros README menu plmenu autostart.sh \ +prefsdata_DATA = wmmacros README menu plmenu autostart.sh exitscript.sh \ menu.cz menu.de menu.fr menu.gl menu.ja menu.ko menu.nl menu.pt \ menu.it menu.no menu.he menu.es menu.ru menu.tr menu.el menu.se \ - menu.fi menu.hr menu.dk + menu.fi menu.hr menu.dk menu.sl EXTRA_DIST = $(prefsdata_DATA) wmmacros.in plmenu.in diff --git a/WindowMaker/Makefile.in b/WindowMaker/Makefile.in index 2870e647..0cc99895 100755 --- a/WindowMaker/Makefile.in +++ b/WindowMaker/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -91,14 +89,14 @@ X_LOCALE = @X_LOCALE@ pixmapdir = @pixmapdir@ wprefsdir = @wprefsdir@ -SUBDIRS = Defaults Styles Themes Icons Pixmaps Backgrounds IconSets Sounds +SUBDIRS = Defaults Styles Themes Icons Pixmaps Backgrounds IconSets prefsdatadir = $(pkgdatadir) -prefsdata_DATA = wmmacros README menu plmenu autostart.sh \ +prefsdata_DATA = wmmacros README menu plmenu autostart.sh exitscript.sh \ menu.cz menu.de menu.fr menu.gl menu.ja menu.ko menu.nl menu.pt \ menu.it menu.no menu.he menu.es menu.ru menu.tr menu.el menu.se \ - menu.fi menu.hr menu.dk + menu.fi menu.hr menu.dk menu.sl EXTRA_DIST = $(prefsdata_DATA) wmmacros.in plmenu.in diff --git a/WindowMaker/Pixmaps/Makefile.in b/WindowMaker/Pixmaps/Makefile.in index 1e78c60a..e0434c8c 100755 --- a/WindowMaker/Pixmaps/Makefile.in +++ b/WindowMaker/Pixmaps/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/README b/WindowMaker/README index 1c16f792..782f6b1e 100644 --- a/WindowMaker/README +++ b/WindowMaker/README @@ -19,6 +19,13 @@ Instructions for editing the plain text menus can be found in the menu file itself, kindly translated to your tongue for your convenience, by the translation contributors. +There is a script to convert plain text menus to property list menus +in the utils directory, named wm-oldmenu2new. + +If you are unsure to wich format to use, stick with the plain text menus +as they are more flexible. If for some psychological reason you are +scared by text based configuration, use the property list menu. + Localized menu file translators: -------------------------------- @@ -46,3 +53,5 @@ menu.hr Croatian Toni Bilic menu.el Greek Nikolaos Papagrigoriou menu.dk Danish John M. Lockard Jacob Sparre Andersen +menu.sl Slovene Alen Salamun + diff --git a/WindowMaker/Sounds/Makefile.am b/WindowMaker/Sounds/Makefile.am deleted file mode 100755 index 023e4e5e..00000000 --- a/WindowMaker/Sounds/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ - -defsdatadir = $(pkgdatadir)/Sounds - -defsdata_DATA = - -EXTRA_DIST = $(defsdata_DATA) diff --git a/WindowMaker/Sounds/Makefile.in b/WindowMaker/Sounds/Makefile.in deleted file mode 100755 index 0007afd6..00000000 --- a/WindowMaker/Sounds/Makefile.in +++ /dev/null @@ -1,210 +0,0 @@ -# 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@ - -defsdatadir = $(pkgdatadir)/Sounds - -defsdata_DATA = - -EXTRA_DIST = $(defsdata_DATA) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../../src/config.h -CONFIG_CLEAN_FILES = -DATA = $(defsdata_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 WindowMaker/Sounds/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -install-defsdataDATA: $(defsdata_DATA) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(defsdatadir) - @list='$(defsdata_DATA)'; for p in $$list; do \ - if test -f $(srcdir)/$$p; then \ - echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(defsdatadir)/$$p"; \ - $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(defsdatadir)/$$p; \ - else if test -f $$p; then \ - echo " $(INSTALL_DATA) $$p $(DESTDIR)$(defsdatadir)/$$p"; \ - $(INSTALL_DATA) $$p $(DESTDIR)$(defsdatadir)/$$p; \ - fi; fi; \ - done - -uninstall-defsdataDATA: - @$(NORMAL_UNINSTALL) - list='$(defsdata_DATA)'; for p in $$list; do \ - rm -f $(DESTDIR)$(defsdatadir)/$$p; \ - done -tags: TAGS -TAGS: - - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = WindowMaker/Sounds - -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-defsdataDATA - @$(NORMAL_INSTALL) - -install: install-exec install-data all - @: - -uninstall: uninstall-defsdataDATA - -install-strip: - $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install -installdirs: - $(mkinstalldirs) $(DATADIR)$(defsdatadir) - - -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-defsdataDATA install-defsdataDATA 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: diff --git a/WindowMaker/Styles/Makefile.am b/WindowMaker/Styles/Makefile.am index 8bf742b4..44db9f49 100644 --- a/WindowMaker/Styles/Makefile.am +++ b/WindowMaker/Styles/Makefile.am @@ -23,7 +23,6 @@ defsdata_DATA = \ Pink\ Pumpkin\ Purple\ - Rainbow\ Red\ RednBlue\ ShinyBrown\ diff --git a/WindowMaker/Styles/Makefile.in b/WindowMaker/Styles/Makefile.in index a06fbab6..0ae1dfca 100755 --- a/WindowMaker/Styles/Makefile.in +++ b/WindowMaker/Styles/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -116,7 +114,6 @@ defsdata_DATA = \ Pink\ Pumpkin\ Purple\ - Rainbow\ Red\ RednBlue\ ShinyBrown\ diff --git a/WindowMaker/Styles/Rainbow b/WindowMaker/Styles/Rainbow deleted file mode 100755 index 4f979d52..00000000 --- a/WindowMaker/Styles/Rainbow +++ /dev/null @@ -1,15 +0,0 @@ -{ - HighlightColor = white; - HighlightTextColor = black; - FTitleColor = black; - PTitleColor = gray60; - UTitleColor = white; - FTitleBack = (mhgradient, yellow, red, yellow, green, blue, purple); - PTitleBack = (mhgradient, yellow3, red3, yellow3, green3, blue3, purple3); - UTitleBack = (mhgradient, yellow4, red4, yellow4, green4, blue4, purple4); - MenuTitleColor = black; - MenuTextColor = white; - MenuDisabledColor = gray60; - MenuTitleBack = (mhgradient, yellow, red, yellow, green, blue, purple); - MenuTextBack = (mhgradient, yellow4, red4, yellow4, green4, blue4, purple4); -} diff --git a/WindowMaker/Themes/Makefile.in b/WindowMaker/Themes/Makefile.in index 2d4bbf48..ec10b161 100755 --- a/WindowMaker/Themes/Makefile.in +++ b/WindowMaker/Themes/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/WindowMaker/exitscript.sh b/WindowMaker/exitscript.sh new file mode 100755 index 00000000..95c32897 --- /dev/null +++ b/WindowMaker/exitscript.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Place commands to be executed when WindowMaker is exited here. +# This file must be executable. +# + diff --git a/WindowMaker/menu b/WindowMaker/menu index 5ef0ee8e..f161c7c3 100644 --- a/WindowMaker/menu +++ b/WindowMaker/menu @@ -148,7 +148,6 @@ "Magnify" EXEC xmag "Colormap" EXEC xcmap "XKill" EXEC xkill - "ASClock" EXEC asclock -shape "Clipboard" EXEC xclipboard "Utils" END @@ -185,8 +184,14 @@ "Wine" WS_BACK '(solid, "#400020")' "Solid" END "Gradient" MENU - "Flag" WS_BACK '(mdgradient, green, red, white, green)' + "Sunset" WS_BACK '(mvgradient, deepskyblue4, black, deepskyblue4, tomato4)' "Sky" WS_BACK '(vgradient, blue4, white)' + "Blue Shades" WS_BACK '(vgradient, "#7080a5", "#101020")' + "Indigo Shades" WS_BACK '(vgradient, "#746ebc", "#242e4c")' + "Purple Shades" WS_BACK '(vgradient, "#654c66", "#151426")' + "Wheat Shades" WS_BACK '(vgradient, "#a09060", "#302010")' + "Grey Shades" WS_BACK '(vgradient, "#636380", "#131318")' + "Wine Shades" WS_BACK '(vgradient, "#600040", "#180010")' "Gradient" END "Images" OPEN_MENU BACKGROUNDS_DIR ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t "Background" END diff --git a/WindowMaker/menu.el b/WindowMaker/menu.el index b64ad459..b362abc6 100644 --- a/WindowMaker/menu.el +++ b/WindowMaker/menu.el @@ -19,39 +19,39 @@ * MENU - ôï óçìåßï ðïõ îåêéíÜ Ýíá (õðï)ìåíïý * END - ôï óçìåßï ðïõ ôåëåéþíåé Ýíá (õðï)ìåíïý * OPEN_MENU - áíïßãåé Ýíá ìåíïý áðü Ýíá áñ÷åßï, pipe Þ ôá ðåñéå÷üìåíá åíüò - * êáôáëüãïõ(ùí) êáé áíôéóôïé÷åß ìéá åíôïëÞ óôï êáèÝíá. - * WORKSPACE_MENU - ðñïóèÝôåé Ýíá õðïìåíïý ãéá ôç äéá÷åßñçóç ôùí Åðéöáíåéþí - * Åñãáóßáò. Ìüíï Ýíá workspace_menu åðéôñÝðåôáé. + * êáôáëüãïõ(ùí) êáé áíôéóôïé÷åß ìéá åíôïëÞ óôï êáèÝíá. + * WORKSPACE_MENU - ðñïóèÝôåé Ýíá õðïìåíïý ãéá ôç äéá÷åßñçóç ôùí Åðéöáíåéþí. + * Ìüíï Ýíá workspace_menu åðéôñÝðåôáé. * EXEC - åêôÝëåóç ðñïãñÜììáôïò * EXIT - Ýîïäïò áðü ôïí window manager - * RESTART [] - åðáíåêêéíåß ôïí WindowMaker Þ îåêéíÜåé Ýíáò - * Üëëïò window manager - * REFRESH - áíáíåþíåé ôçí ðñïâïëÞ ôçò åðéöÜíåéáò åñãáóßáò óôçí ïèüíç - * ARRANGE_ICONS - ôáêôïðïßçóç ôùí åéêïíéäßùí óôçí åðéöÜíåéá åñãáóßáò + * RESTART [] - åðáíåêêéíåß ôïí Window Maker Þ îåêéíÜåé Ýíáò + * Üëëïò window manager + * REFRESH - áíáíåþíåé ôçí ðñïâïëÞ ôçò ÅðéöÜíåéáò óôçí ïèüíç + * ARRANGE_ICONS - ôáêôïðïßçóç ôùí åéêïíéäßùí óôçí ÅðéöÜíåéá * SHUTDOWN - ôåñìáôßæåé âßáéá üëïõò ôïõò clients (êáé ôåñìáôßæåé ôï X window - * session) - * SHOW_ALL - åìöáíßæåé üëá ôá "êñõìÝíá" ðáñÜèõñá óôçí åðéöÜíåéá åñãáóßáò - * HIDE_OTHERS - "êñýâåé" üëá ôá ðáñÜèõñá óôçí åðéöÜíåéá åñãáóßáò, åêôüò áðü - * áõôü ðïõ åßíáé "åíåñãü" (Þ ôï ôåëåõôáßï ðïõ Þôáí "åíåñãü") - * SAVE_SESSION - áðïèçêåýåé ôï åêÜóôïôå "ÐåñéâÜëëïí" åñãáóßáò, ôï ïðïßï + * session) + * SHOW_ALL - åìöáíßæåé üëá ôá "êñõìÝíá" ðáñÜèõñá óôçí ÅðéöÜíåéá + * HIDE_OTHERS - "êñýâåé" üëá ôá ðáñÜèõñá óôçí ÅðéöÜíåéá, åêôüò áðü + * áõôü ðïõ åßíáé "åíåñãü" (Þ ôï ôåëåõôáßï ðïõ Þôáí "åíåñãü") + * SAVE_SESSION - áðïèçêåýåé ôï åêÜóôïôå "êáôÜóôáóç" ôçò ÅðéöÜíåéáò, ôï ïðïßï * óçìáßíåé, üëá ôá ðñïãñÜììáôá ðïõ åêôåëïýíôáé åêåßíç ôç * óôéãìÞ ìå üëåò ôïõò ôéò éäéüôçôåò (ãåùìåôñßá, èÝóç óôçí * ïèüíç, åðéöÜíåéá åñãáóßáò óôçí ïðïßá Ý÷ïõí åêôåëåóôåß, Dock Þ * Clip áðü üðïõ åêôåëÝóôçêáí, áí åßíáé åëá÷éóôïðïéçìÝíá, - * áíáäéðëùìÝíá Þ êñõììÝíá). Åðßóçò áðïèçêåýåé óå ðéá åðéöÜíåéá + * áíáäéðëùìÝíá Þ êñõììÝíá). Åðßóçò áðïèçêåýåé óå ðéá ÅðéöÜíåéá * åñãáóßáò Þôáí ï ÷ñÞóôçò ôçí ôåëåõôáßá öïñÜ. ¼ëåò ïé - * ðëçñïöïñßåò èá áíáêëçèïýí ôçí åðüìåíç öïñÜ ðïõ ï ÷ñÞóôçò - * åêêéíßóåé ôïí WindowMmaker ìÝ÷ñé ç åíôïëÞ SAVE_SESSION Þ - * CLEAR_SESSION ÷ñçóéìïðïéçèïýí. Áí óôï áñ÷åßï WindowMaker ôïõ + * èá áíáêëçèïýí ôçí åðüìåíç öïñÜ ðïõ ï ÷ñÞóôçò + * åêêéíßóåé ôïí Window Maker ìÝ÷ñé ç åíôïëÞ SAVE_SESSION Þ + * CLEAR_SESSION ÷ñçóéìïðïéçèïýí. Áí óôï áñ÷åßï Window Maker ôïõ * êáôáëüãïõ "~/GNUstep/Defaults/" õðÜñ÷åé ç åíôïëÞ: * "SaveSessionOnExit = Yes;", ôüôå üëá ôá ðáñáðÜíù ãßíïíôáé - * áõôüìáôá ìå êÜèå Ýîïäï ôïõ ÷ñÞóôç áðü ôïí WindowMaker, + * áõôüìáôá ìå êÜèå Ýîïäï ôïõ ÷ñÞóôç áðü ôïí Window Maker, * áêõñþíïíôáò ïõóéáóôéêÜ êÜèå ðñïçãïýìåíç ÷ñÞóç ôùò åíôïëþí * SAVE_SESSION Þ CLEAR_SESSION (âëÝðå ðáñáêÜôù). * CLEAR_SESSION - óâÞíåé üëåò ôéò ðëçñïöïñßåò ðïõ Ý÷ïõí áðïèçêåõèåß óýìöùíá ìå * ôá ðáñáðÜíù. Äåí èá Ý÷åé üìùò êáíÝíá áðïôÝëåóìá áí ç åíôïëÞ * SaveSessionOnExit=Yes. - * INFO - Ðëçñïöïñßåò ó÷åôéêÜ ìå ôïí WindowMmaker + * INFO - Ðëçñïöïñßåò ó÷åôéêÜ ìå ôïí Window Mmaker * * OPEN_MENU óýíôáîç: * 1. ×åéñéóìüò åíüò áñ÷åßïõ-ìåíïý. @@ -109,8 +109,8 @@ "Ìåíïý" MENU "Ðëçñïöïñßåò" MENU - "Ó÷åôéêÜ..." INFO_PANEL - "ÍïìéêÜ..." LEGAL_PANEL + "Info..." INFO_PANEL + "Legal..." LEGAL_PANEL "System Console" EXEC xconsole "System Load" EXEC xosview || xload "Process List" EXEC xterm -e top @@ -118,7 +118,7 @@ "Ðëçñïöïñßåò" END "XTerm" EXEC xterm -sb "Rxvt" EXEC rxvt -bg black -fg white -fn fixed - "ÅðéöÜíåéåò Åñãáóßáò" WORKSPACE_MENU + "ÅðéöÜíåéåò" WORKSPACE_MENU "ÐñïãñÜììáôá" MENU "ÃñáöéêÜ" MENU "Gimp" EXEC gimp >/dev/null @@ -130,8 +130,8 @@ "OffiX Files" EXEC files "LyX" EXEC lyx "Netscape" EXEC netscape - "Ghostview" EXEC ghostview %a(Enter file to view) - "Acrobat" EXEC /usr/local/Acrobat3/bin/acroread %a(Enter PDF to view) + "Ghostview" EXEC ghostview %a(Áñ÷åßï ðñïò áíÜãíùóç) + "Acrobat" EXEC /usr/local/Acrobat3/bin/acroread %a(Áñ÷åßï ðñïò áíÜãíùóç) "TkDesk" EXEC tkdesk "ÐñïãñÜììáôá" END "ÊåéìåíïãñÜöïé" MENU @@ -149,7 +149,7 @@ "ÄéÜöïñá" END "Åñãáëåßá" MENU "Áñéèìïìç÷áíÞ" EXEC xcalc - "Éäéüôçôåò Ðáñáèýñùí" EXEC xprop | xmessage -center -title 'xprop' -file - + "Éäéüôçôåò Ðáñáèýñïõ" EXEC xprop | xmessage -center -title 'Éäéüôçôåò Ðáñáèýñïõ' -file - "ÅðéëïãÞ ÃñáììáôïóåéñÜò" EXEC xfontsel "ÅîïìïéùôÞò Ôåñìáôéêïý" EXEC xminicom "ÌåãÝèõíóç" EXEC xmag @@ -166,15 +166,15 @@ "ÁíáæÞôçóç ÂïÞèåéáò" EXEC MANUAL_SEARCH(%s) "ÅðéëïãÞ" END - "ÅðéöÜíåéá Åñãáóßáò" MENU + "ÅðéöÜíåéá" MENU "Áðüêñõøç ôùí ¶ëëùí" HIDE_OTHERS "ÅìöÜíéóç ¼ëùí" SHOW_ALL "Ôáêôïðïßçóç Åéêïíéäßùí" ARRANGE_ICONS "ÁíáíÝùóç ÐñïâïëÞò" REFRESH "Êëåßäùìá" EXEC xlock -allowroot -usefirst - "ÁðïèÞêåõóç ÐåñéâÜëëïíôïò" SAVE_SESSION - "ÓâÞóéìï ÁðïèçêåõìÝíïõ ÐåñéâÜëëïíôïò" CLEAR_SESSION - "ÅðéöÜíåéá Åñãáóßáò" END + "Óþóéìï ÊáôÜóôáóçò" SAVE_SESSION + "ÄéáãñáöÞ óùóìÝíçò ÊáôÜóôáóçò" CLEAR_SESSION + "ÅðéöÜíåéá" END "ÅìöÜíéóç" MENU "ÈÝìáôá" OPEN_MENU THEMES_DIR ~/GNUstep/Library/WindowMaker/Themes WITH setstyle @@ -192,21 +192,20 @@ "Êñáóéïý" WS_BACK '(solid, "#400020")' "Ìïíü÷ñùìï" END "ÄéáâáèìéóìÝíï" MENU - "Óçìáßá" WS_BACK '(mdgradient, blue, white, blue, white)' + "Óçìáßá" WS_BACK '(mdgradient, green, red, white, green)' "ÏõñÜíïò" WS_BACK '(vgradient, blue4, white)' "ÄéáâáèìéóìÝíï" END "Åéêüíåò" OPEN_MENU BACKGROUNDS_DIR ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t "Öüíôï" END - "ÁðïèÞêåõóç ÈÝìáôïò" EXEC getstyle -t ~/GNUstep/Library/WindowMaker/Themes/"%a(Theme name)" - "ÁðïèÞêåõóç ÏìÜäáò Åéêïíéäßùí" EXEC geticonset ~/GNUstep/Library/WindowMaker/IconSets/"%a(IconSet name)" + "ÁðïèÞêåõóç ÈÝìáôïò" EXEC getstyle -t ~/GNUstep/Library/WindowMaker/Themes/"%a(¼íïìá ÈÝìáôïò)" + "ÁðïèÞêåõóç ÏìÜäáò Åéêïíéäßùí" EXEC geticonset ~/GNUstep/Library/WindowMaker/IconSets/"%a(¼íïìá ÏìÜäáò)" "ÅìöÜíéóç" END "¸îïäïò" MENU "Åðáíåêêßíçóç" RESTART "Åêêßíçóç ôïõ AfterStep" RESTART afterstep "¸îïäïò..." EXIT - "¸îïäïò áðü ôï ÐåñéâÜëëïí..." SHUTDOWN + "ÐëÞñçò ¸îïäïò..." SHUTDOWN "¸îïäïò" END "Ìåíïý" END - diff --git a/WindowMaker/menu b/WindowMaker/menu.sl similarity index 63% copy from WindowMaker/menu copy to WindowMaker/menu.sl index 5ef0ee8e..a684c6c2 100644 --- a/WindowMaker/menu +++ b/WindowMaker/menu.sl @@ -1,5 +1,5 @@ /* - * Root Menu definition for WindowMaker + * Root Menu definition for WindowMaker in Slovenian language * * Syntax is: * @@ -100,25 +100,25 @@ #include "wmmacros" -"Applications" MENU - "Info" MENU - "Info Panel..." INFO_PANEL - "Legal..." LEGAL_PANEL - "System Console" EXEC xconsole - "System Load" EXEC xosview || xload - "Process List" EXEC xterm -e top - "Manual Browser" EXEC xman - "Info" END +"Aplikacije" MENU + "Informacije" MENU + "Informacije o programu..." INFO_PANEL + "Licenca..." LEGAL_PANEL + "Sistemska konzola" EXEC xconsole + "Obremenitev sistema" EXEC xosview || xload + "Seznam procesov" EXEC xterm -e top + "Pomoè (Iskalec man strani)" EXEC xman + "Informacije" END "XTerm" EXEC xterm -sb "Rxvt" EXEC rxvt -bg black -fg white -fn fixed - "Workspaces" WORKSPACE_MENU - "Applications" MENU - "Graphics" MENU + "Delovni prostori" WORKSPACE_MENU + "Aplikacije" MENU + "Grafika" MENU "Gimp" EXEC gimp >/dev/null "XV" EXEC xv "XPaint" EXEC xpaint "XFig" EXEC xfig - "Graphics" END + "Grafika" END "X File Manager" EXEC xfm "OffiX Files" EXEC files "LyX" EXEC lyx @@ -126,80 +126,78 @@ "Ghostview" EXEC ghostview %a(Enter file to view) "Acrobat" EXEC /usr/local/Acrobat3/bin/acroread %a(Enter PDF to view) "TkDesk" EXEC tkdesk - "Applications" END - "Editors" MENU + "Aplikacije" END + "Urejevalniki besedil" MENU "XFte" EXEC xfte "XEmacs" EXEC xemacs || emacs "XJed" EXEC xjed "NEdit" EXEC nedit "Xedit" EXEC xedit "VI" EXEC xterm -e vi - "Editors" END - "Miscellaneous" MENU + "Urejevalniki besedil" END + "Drugo" MENU "Xmcd" EXEC xmcd 2> /dev/null "Xplaycd" EXEC xplaycd "Xmixer" EXEC xmixer - "Miscellaneous" END - "Utils" MENU - "Calculator" EXEC xcalc - "Window Properties" EXEC xprop | xmessage -center -title 'xprop' -file - - "Font Chooser" EXEC xfontsel - "Terminal Emulator" EXEC xminicom - "Magnify" EXEC xmag - "Colormap" EXEC xcmap + "Drugo" END + "Uporabi programi" MENU + "Kalkulator" EXEC xcalc + "Lastnosti oken" EXEC xprop | xmessage -center -title 'xprop' -file - + "Pregled pisav" EXEC xfontsel + "Terminal emulator" EXEC xminicom + "Povecevalno steklo" EXEC xmag + "Barvna lestvica" EXEC xcmap "XKill" EXEC xkill "ASClock" EXEC asclock -shape - "Clipboard" EXEC xclipboard - "Utils" END + "Odlagali¹èe (clipboard)" EXEC xclipboard + "Uporabni programi" END - "Selection" MENU - "Copy" EXEC echo '%s' | wxcopy - "Mail To" EXEC xterm -name mail -T "Pine" -e pine %s - "Navigate" EXEC netscape %s - "Search in Manual" EXEC MANUAL_SEARCH(%s) - "Selection" END + "Izbira" MENU + "Kopiraj" EXEC echo '%s' | wxcopy + "Po¹lji po po¹ti" EXEC xterm -name mail -T "Pine" -e pine %s + "Odpri WEB stran" EXEC netscape %s + "Poi¹èi v navodilih" EXEC MANUAL_SEARCH(%s) + "Izbira" END - "Workspace" MENU - "Hide Others" HIDE_OTHERS - "Show All" SHOW_ALL - "Arrange Icons" ARRANGE_ICONS - "Refresh" REFRESH - "Lock" EXEC xlock -allowroot -usefirst - "Save Session" SAVE_SESSION - "Clear Saved Session" CLEAR_SESSION - "Workspace" END + "Delovni prostor" MENU + "Skrij druge" HIDE_OTHERS + "Poka¾i vse" SHOW_ALL + "Poravnaj ikone" ARRANGE_ICONS + "Obnovi" REFRESH + "Zakleni" EXEC xlock -allowroot -usefirst + "Shrani session" SAVE_SESSION + "Izbri¹i shranjen session" CLEAR_SESSION + "Delovni prostor" END - "Appearance" MENU - "Themes" OPEN_MENU THEMES_DIR ~/GNUstep/Library/WindowMaker/Themes WITH setstyle - "Styles" OPEN_MENU STYLES_DIR ~/GNUstep/Library/WindowMaker/Styles WITH setstyle - "Icon Sets" OPEN_MENU ICON_SETS_DIR ~/GNUstep/Library/WindowMaker/IconSets WITH seticons - "Background" MENU - "Solid" MENU - "Black" WS_BACK '(solid, black)' - "Blue" WS_BACK '(solid, "#505075")' + "Izgled" MENU + "Teme" OPEN_MENU THEMES_DIR ~/GNUstep/Library/WindowMaker/Themes WITH setstyle + "Stili" OPEN_MENU STYLES_DIR ~/GNUstep/Library/WindowMaker/Styles WITH setstyle + "Zbirke ikon" OPEN_MENU ICON_SETS_DIR ~/GNUstep/Library/WindowMaker/IconSets WITH seticons + "Odzadje" MENU + "Barva" MENU + "Èrna" WS_BACK '(solid, black)' + "Modra" WS_BACK '(solid, "#505075")' "Indigo" WS_BACK '(solid, "#243e6c")' - "Deep Blue" WS_BACK '(solid, "#180090")' - "Purple" WS_BACK '(solid, "#554466")' - "Wheat" WS_BACK '(solid, "wheat4")' - "Dark Gray" WS_BACK '(solid, "#333340")' - "Wine" WS_BACK '(solid, "#400020")' - "Solid" END - "Gradient" MENU - "Flag" WS_BACK '(mdgradient, green, red, white, green)' - "Sky" WS_BACK '(vgradient, blue4, white)' - "Gradient" END - "Images" OPEN_MENU BACKGROUNDS_DIR ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t - "Background" END - "Save Theme" EXEC getstyle -t ~/GNUstep/Library/WindowMaker/Themes/"%a(Theme name)" - "Save IconSet" EXEC geticonset ~/GNUstep/Library/WindowMaker/IconSets/"%a(IconSet name)" - "Appearance" END - - "Exit" MENU - "Restart" RESTART - "Start AfterStep" RESTART afterstep - "Exit..." EXIT - "Exit session..." SHUTDOWN - "Exit" END -"Applications" END - + "Temno modra" WS_BACK '(solid, "#180090")' + "Violièna" WS_BACK '(solid, "#554466")' + "P¹enièna" WS_BACK '(solid, "wheat4")' + "Temno siva" WS_BACK '(solid, "#333340")' + "Vinsko rdeèa" WS_BACK '(solid, "#400020")' + "Barva" END + "Preliv" MENU + "Zastava" WS_BACK '(mdgradient, green, red, white, green)' + "Nebo" WS_BACK '(vgradient, blue4, white)' + "Preliv" END + "Slike" OPEN_MENU BACKGROUNDS_DIR ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t + "Odzadje" END + "Shrani temo" EXEC getstyle -t ~/GNUstep/Library/WindowMaker/Themes/"%a(Theme name)" + "Shrani zbirko ikon" EXEC geticonset ~/GNUstep/Library/WindowMaker/IconSets/"%a(IconSet name)" + "Izgled" END + "Izhod" MENU + "Ponovno za¾eni" RESTART + "Po¾eni AfterStep" RESTART afterstep + "Izhod..." EXIT + "Izhod iz session..." SHUTDOWN + "Izhod" END +"Aplikacije" END diff --git a/WindowMaker/plmenu b/WindowMaker/plmenu index bbfb7118..4bc963f7 100644 --- a/WindowMaker/plmenu +++ b/WindowMaker/plmenu @@ -80,8 +80,14 @@ ("Wine", EXEC, "wdwrite WindowMaker WorkspaceBack '(solid, \"#400020\")'") ), ("Gradient", - ("Flag", EXEC, "wdwrite WindowMaker WorkspaceBack '(mdgradient, green, red, white, green)'"), - ("Sky", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, blue4, white)'") + ("Sunset", EXEC, "wdwrite WindowMaker WorkspaceBack '(mvgradient, deepskyblue4, black, deepskyblue4, tomato4)'"), + ("Sky", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, blue4, white)'"), + ("Blue Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#7080a5\", \"#101020\")'"), + ("Indigo Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#746ebc\", \"#242e4c\")'"), + ("Purple Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#654c66\", \"#151426\")'"), + ("Wheat Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#a09060\", \"#302010\")'"), + ("Grey Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#636380\", \"#131318\")'"), + ("Wine Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#600040\", \"#180010\")'") ), ("Images", OPEN_MENU, "/usr/local/share/WindowMaker/Backgrounds ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t") ), diff --git a/WindowMaker/plmenu.in b/WindowMaker/plmenu.in index 479856f3..f5d8e1c8 100755 --- a/WindowMaker/plmenu.in +++ b/WindowMaker/plmenu.in @@ -80,8 +80,14 @@ ("Wine", EXEC, "wdwrite WindowMaker WorkspaceBack '(solid, \"#400020\")'") ), ("Gradient", - ("Flag", EXEC, "wdwrite WindowMaker WorkspaceBack '(mdgradient, green, red, white, green)'"), - ("Sky", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, blue4, white)'") + ("Sunset", EXEC, "wdwrite WindowMaker WorkspaceBack '(mvgradient, deepskyblue4, black, deepskyblue4, tomato4)'"), + ("Sky", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, blue4, white)'"), + ("Blue Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#7080a5\", \"#101020\")'"), + ("Indigo Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#746ebc\", \"#242e4c\")'"), + ("Purple Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#654c66\", \"#151426\")'"), + ("Wheat Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#a09060\", \"#302010\")'"), + ("Grey Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#636380\", \"#131318\")'"), + ("Wine Shades", EXEC, "wdwrite WindowMaker WorkspaceBack '(vgradient, \"#600040\", \"#180010\")'") ), ("Images", OPEN_MENU, "#pkgdatadir#/Backgrounds ~/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t") ), diff --git a/configure b/configure index 57cfc3f7..e09b2f0b 100755 --- a/configure +++ b/configure @@ -28,8 +28,6 @@ ac_help="$ac_help ac_help="$ac_help --disable-xpm disable use of XPM pixmaps through libXpm" ac_help="$ac_help - --disable-png disable PNG support through libpng" -ac_help="$ac_help --disable-jpeg disable JPEG support through libjpeg" ac_help="$ac_help --disable-gif disable GIF support through libgif or libungif" @@ -42,7 +40,10 @@ ac_help="$ac_help ac_help="$ac_help --with-pixmapdir=PATH specify where pixmaps are located [DATADIR/pixmaps]" ac_help="$ac_help - --enable-single-icon use single application icon per WM_INSTANCE+WM_CLASS (unsupported) " + --with-appspath=PATH specify the path of the GNUstep applications directory " +ac_help="$ac_help + --enable-single-icon use single application icon per WM_INSTANCE+WM_CLASS +" # Initialize some variables set by options. # The variables have the same names as the options, with @@ -581,7 +582,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:585: checking for a BSD compatible install" >&5 +echo "configure:586: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -634,7 +635,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:638: checking whether build environment is sane" >&5 +echo "configure:639: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -691,7 +692,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:695: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:696: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -720,7 +721,7 @@ fi PACKAGE=WindowMaker -VERSION=0.20.1 +VERSION=0.20.2 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } @@ -737,7 +738,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:741: checking for working aclocal" >&5 +echo "configure:742: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -750,7 +751,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:754: checking for working autoconf" >&5 +echo "configure:755: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -763,7 +764,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:767: checking for working automake" >&5 +echo "configure:768: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -776,7 +777,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:780: checking for working autoheader" >&5 +echo "configure:781: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -789,7 +790,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:793: checking for working makeinfo" >&5 +echo "configure:794: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -805,6 +806,13 @@ fi +WINGS_VER=0.0.1 +WRASTER_VER=0.0.1 + + +subdirs="libPropList" + + @@ -818,7 +826,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:822: checking host system type" >&5 +echo "configure:830: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -843,7 +851,7 @@ echo "$ac_t""$host" 1>&6 # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:847: checking for $ac_word" >&5 +echo "configure:855: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -872,7 +880,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:876: checking for $ac_word" >&5 +echo "configure:884: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -920,7 +928,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:924: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:932: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -930,11 +938,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:946: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -954,12 +962,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:958: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:966: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:963: checking whether we are using GNU C" >&5 +echo "configure:971: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -968,7 +976,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:972: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:980: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -983,7 +991,7 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:987: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:995: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1011,7 +1019,7 @@ else fi echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -echo "configure:1015: checking for POSIXized ISC" >&5 +echo "configure:1023: checking for POSIXized ISC" >&5 if test -d /etc/conf/kconfig.d && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 then @@ -1034,7 +1042,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1038: checking for $ac_word" >&5 +echo "configure:1046: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1063,7 +1071,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1067: checking for $ac_word" >&5 +echo "configure:1075: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1111,7 +1119,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1115: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1123: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1121,11 +1129,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1145,12 +1153,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1149: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1157: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1154: checking whether we are using GNU C" >&5 +echo "configure:1162: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1159,7 +1167,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1171: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1174,7 +1182,7 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1178: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1186: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1202,7 +1210,7 @@ else fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:1206: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:1214: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1231,7 +1239,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1235: checking for $ac_word" >&5 +echo "configure:1243: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1268,7 +1276,7 @@ fi # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1272: checking for a BSD compatible install" >&5 +echo "configure:1280: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1318,7 +1326,7 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1322: checking whether ln -s works" >&5 +echo "configure:1330: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1339,7 +1347,7 @@ else fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1343: checking how to run the C preprocessor" >&5 +echo "configure:1351: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1354,13 +1362,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1364: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1372: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1371,13 +1379,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1381: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1401,13 +1409,13 @@ echo "$ac_t""$CPP" 1>&6 if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 -echo "configure:1405: checking whether ${CC-cc} needs -traditional" >&5 +echo "configure:1413: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP @@ -1425,7 +1433,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA @@ -1449,12 +1457,12 @@ fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:1453: checking return type of signal handlers" >&5 +echo "configure:1461: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1471,7 +1479,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:1475: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1483: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -1490,12 +1498,12 @@ EOF echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:1494: checking for vprintf" >&5 +echo "configure:1502: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1530: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -1542,12 +1550,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:1546: checking for _doprnt" >&5 +echo "configure:1554: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -1597,19 +1605,19 @@ fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:1601: checking for working alloca.h" >&5 +echo "configure:1609: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:1613: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -1630,12 +1638,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:1634: checking for alloca" >&5 +echo "configure:1642: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -1690,12 +1698,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:1694: checking whether alloca needs Cray hooks" >&5 +echo "configure:1702: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1724: checking for $ac_func" >&5 +echo "configure:1732: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1760: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1775,7 +1783,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:1779: checking stack direction for C alloca" >&5 +echo "configure:1787: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1783,7 +1791,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else @@ -1826,12 +1834,12 @@ fi for ac_func in gethostname gettimeofday select poll strerror strncasecmp setpgid do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1830: checking for $ac_func" >&5 +echo "configure:1838: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1883,7 +1891,7 @@ done # Extract the first word of "cpp", so it can be a program name with args. set dummy cpp; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1887: checking for $ac_word" >&5 +echo "configure:1895: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CPP_PATH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1940,12 +1948,12 @@ INTLIBS="" echo $ac_n "checking for gettext""... $ac_c" 1>&6 -echo "configure:1944: checking for gettext" >&5 +echo "configure:1952: checking for gettext" >&5 if eval "test \"`echo '$''{'ac_cv_func_gettext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gettext=yes" else @@ -1986,7 +1994,7 @@ if eval "test \"`echo '$ac_cv_func_'gettext`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 -echo "configure:1990: checking for gettext in -lintl" >&5 +echo "configure:1998: checking for gettext in -lintl" >&5 ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1994,7 +2002,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2017: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2032,7 +2040,7 @@ fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2036: checking for $ac_word" >&5 +echo "configure:2044: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_XGETTEXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2092,8 +2100,8 @@ fi -supported_locales="cs de es fr gl it ja ko nl no pt ru se tr fi hr el" -supported_wprefs_locales="pt hr fr ko" +supported_locales="cs de es fr gl it ja ko nl no pt ru se tr fi hr el pl ro" +supported_wprefs_locales="pt hr fr ko ja" for lang in $LINGUAS; do ok=0 @@ -2136,7 +2144,7 @@ if test "$enable_kanji" = yes; then case $host_os in freebsd*) echo $ac_n "checking for setlocale in -lxpg4""... $ac_c" 1>&6 -echo "configure:2140: checking for setlocale in -lxpg4" >&5 +echo "configure:2148: checking for setlocale in -lxpg4" >&5 ac_lib_var=`echo xpg4'_'setlocale | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2144,7 +2152,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lxpg4 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2213,7 +2221,7 @@ fi # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:2217: checking for X" >&5 +echo "configure:2225: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then @@ -2275,12 +2283,12 @@ if test "$ac_x_includes" = NO; then # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2292: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2349,14 +2357,14 @@ if test "$ac_x_libraries" = NO; then ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2368: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. @@ -2462,17 +2470,17 @@ else case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 -echo "configure:2466: checking whether -R must be followed by a space" >&5 +echo "configure:2474: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2484: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_nospace=yes else @@ -2488,14 +2496,14 @@ rm -f conftest* else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_space=yes else @@ -2527,7 +2535,7 @@ rm -f conftest* # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 -echo "configure:2531: checking for dnet_ntoa in -ldnet" >&5 +echo "configure:2539: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2535,7 +2543,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2568,7 +2576,7 @@ fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:2572: checking for dnet_ntoa in -ldnet_stub" >&5 +echo "configure:2580: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2576,7 +2584,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2616,12 +2624,12 @@ fi # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 -echo "configure:2620: checking for gethostbyname" >&5 +echo "configure:2628: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else @@ -2665,7 +2673,7 @@ fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:2669: checking for gethostbyname in -lnsl" >&5 +echo "configure:2677: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2673,7 +2681,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2714,12 +2722,12 @@ fi # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:2718: checking for connect" >&5 +echo "configure:2726: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -2763,7 +2771,7 @@ fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:2767: checking for connect in -lsocket" >&5 +echo "configure:2775: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2771,7 +2779,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2806,12 +2814,12 @@ fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:2810: checking for remove" >&5 +echo "configure:2818: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2846: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_remove=yes" else @@ -2855,7 +2863,7 @@ fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:2859: checking for remove in -lposix" >&5 +echo "configure:2867: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2863,7 +2871,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2886: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2898,12 +2906,12 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:2902: checking for shmat" >&5 +echo "configure:2910: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else @@ -2947,7 +2955,7 @@ fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:2951: checking for shmat in -lipc" >&5 +echo "configure:2959: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2955,7 +2963,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2999,7 +3007,7 @@ fi # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:3003: checking for IceConnectionNumber in -lICE" >&5 +echo "configure:3011: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3007,7 +3015,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3050,7 +3058,7 @@ XLFLAGS="$X_LIBS" XLIBS="$X_EXTRA_LIBS -lX11" echo $ac_n "checking for _Xsetlocale in -lX11""... $ac_c" 1>&6 -echo "configure:3054: checking for _Xsetlocale in -lX11" >&5 +echo "configure:3062: checking for _Xsetlocale in -lX11" >&5 ac_lib_var=`echo X11'_'_Xsetlocale | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3058,7 +3066,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lX11 $XLFLAGS $XLIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3106,7 +3114,7 @@ added_xext=no if test "$shape" = yes; then echo $ac_n "checking for XShapeSelectInput in -lXext""... $ac_c" 1>&6 -echo "configure:3110: checking for XShapeSelectInput in -lXext" >&5 +echo "configure:3118: checking for XShapeSelectInput in -lXext" >&5 ac_lib_var=`echo Xext'_'XShapeSelectInput | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3114,7 +3122,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXext $XLFLAGS $XLIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3164,7 +3172,7 @@ fi if test "$shm" = yes; then echo $ac_n "checking for XShmAttach in -lXext""... $ac_c" 1>&6 -echo "configure:3168: checking for XShmAttach in -lXext" >&5 +echo "configure:3176: checking for XShmAttach in -lXext" >&5 ac_lib_var=`echo Xext'_'XShmAttach | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3172,7 +3180,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXext $XLFLAGS $XLIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3207,12 +3215,12 @@ fi if test "$ok" = yes; then echo $ac_n "checking for shmget""... $ac_c" 1>&6 -echo "configure:3211: checking for shmget" >&5 +echo "configure:3219: checking for shmget" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmget'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_shmget=yes" else @@ -3268,6 +3276,7 @@ fi + # Check whether --with-gfx-libs or --without-gfx-libs was given. if test "${with_gfx_libs+set}" = set; then withval="$with_gfx_libs" @@ -3301,7 +3310,7 @@ fi if test "$xpm" = yes; then echo $ac_n "checking for XpmCreatePixmapFromData in -lXpm""... $ac_c" 1>&6 -echo "configure:3305: checking for XpmCreatePixmapFromData in -lXpm" >&5 +echo "configure:3314: checking for XpmCreatePixmapFromData in -lXpm" >&5 ac_lib_var=`echo Xpm'_'XpmCreatePixmapFromData | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3309,7 +3318,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXpm $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3335,11 +3344,53 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 + my_libok=yes +else + echo "$ac_t""no" 1>&6 +my_libok=no +fi + + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH $XCFLAGS" + ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6 +echo "configure:3360: checking for X11/xpm.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3370: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 GFXFLAGS="$GFXFLAGS -DUSE_XPM" GFXLIBS="$GFXLIBS -lXpm" + supported_gfx="XPM" else echo "$ac_t""no" 1>&6 +supported_gfx="XPM (builtin)" fi + CPPFLAGS=$my_old_cppflags + fi fi @@ -3353,7 +3404,7 @@ fi echo $ac_n "checking for gzread in -lz""... $ac_c" 1>&6 -echo "configure:3357: checking for gzread in -lz" >&5 +echo "configure:3408: checking for gzread in -lz" >&5 ac_lib_var=`echo z'_'gzread | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3361,7 +3412,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lz $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3427: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3396,20 +3447,15 @@ fi png=yes -# Check whether --enable-png or --disable-png was given. -if test "${enable_png+set}" = set; then - enableval="$enable_png" - png=$enableval -else - png=yes -fi +# assume libz is present... +#AC_ARG_ENABLE(png, +#[ --disable-png disable PNG support through libpng], +# png=$enableval, png=yes) - -if test "$png" = yes; then - if test "$zlib" = yes; then - echo $ac_n "checking for png_get_valid in -lpng""... $ac_c" 1>&6 -echo "configure:3413: checking for png_get_valid in -lpng" >&5 +if test "$png" = yes -a "$zlib" = yes ; then + echo $ac_n "checking for png_get_valid in -lpng""... $ac_c" 1>&6 +echo "configure:3459: checking for png_get_valid in -lpng" >&5 ac_lib_var=`echo png'_'png_get_valid | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3417,7 +3463,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpng $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS -lz -lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3443,12 +3489,51 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 + my_libok=yes +else + echo "$ac_t""no" 1>&6 +my_libok=no +fi + + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for png.h""... $ac_c" 1>&6 +echo "configure:3505: checking for png.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3515: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 GFXLIBS="$GFXLIBS -lpng -lz" GFXFLAGS="$GFXFLAGS -DUSE_PNG" supported_gfx="$supported_gfx PNG" else echo "$ac_t""no" 1>&6 fi + CPPFLAGS=$my_old_cppflags fi fi @@ -3465,7 +3550,7 @@ fi if test "$jpeg" = yes; then echo $ac_n "checking for jpeg_destroy_compress in -ljpeg""... $ac_c" 1>&6 -echo "configure:3469: checking for jpeg_destroy_compress in -ljpeg" >&5 +echo "configure:3554: checking for jpeg_destroy_compress in -ljpeg" >&5 ac_lib_var=`echo jpeg'_'jpeg_destroy_compress | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3473,7 +3558,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ljpeg $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3573: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3499,12 +3584,36 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXLIBS="$GFXLIBS -ljpeg" GFXFLAGS="$GFXFLAGS -DUSE_JPEG" - supported_gfx="$supported_gfx JPEG" + my_libok=yes else echo "$ac_t""no" 1>&6 +my_libok=no fi + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + cat > conftest.$ac_ext <&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + GFXLIBS="$GFXLIBS -ljpeg" GFXFLAGS="$GFXFLAGS -DUSE_JPEG" + supported_gfx="$supported_gfx JPEG" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* + CPPFLAGS=$my_old_cppflags + fi fi @@ -3521,7 +3630,7 @@ fi if test "$gif" = yes; then retry=no echo $ac_n "checking for DGifOpenFileName in -lungif""... $ac_c" 1>&6 -echo "configure:3525: checking for DGifOpenFileName in -lungif" >&5 +echo "configure:3634: checking for DGifOpenFileName in -lungif" >&5 ac_lib_var=`echo ungif'_'DGifOpenFileName | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3529,7 +3638,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lungif $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3555,16 +3664,15 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXLIBS="$GFXLIBS -lungif" GFXFLAGS="$GFXFLAGS -DUSE_GIF" - supported_gfx="$supported_gfx GIF" + my_libok=yes my_libname=ungif else echo "$ac_t""no" 1>&6 -retry=yes +retry=yes my_libok=no fi if test "$retry" = yes; then echo $ac_n "checking for DGifOpenFileName in -lgif""... $ac_c" 1>&6 -echo "configure:3568: checking for DGifOpenFileName in -lgif" >&5 +echo "configure:3676: checking for DGifOpenFileName in -lgif" >&5 ac_lib_var=`echo gif'_'DGifOpenFileName | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3572,7 +3680,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgif $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3598,13 +3706,53 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXLIBS="$GFXLIBS -lgif" GFXFLAGS="$GFXFLAGS -DUSE_GIF" - supported_gfx="$supported_gfx GIF" + my_libok=yes my_libname=gif else echo "$ac_t""no" 1>&6 +my_libok=no fi fi + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + ac_safe=`echo "gif_lib.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for gif_lib.h""... $ac_c" 1>&6 +echo "configure:3723: checking for gif_lib.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + GFXLIBS="$GFXLIBS -l$my_libname" GFXFLAGS="$GFXFLAGS -DUSE_GIF" + supported_gfx="$supported_gfx GIF" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS=$my_old_cppflags + fi fi @@ -3629,8 +3777,9 @@ ICONEXT="xpm" # if test "$tif" = yes; then + my_libname="" echo $ac_n "checking for TIFFGetVersion in -ltiff""... $ac_c" 1>&6 -echo "configure:3634: checking for TIFFGetVersion in -ltiff" >&5 +echo "configure:3783: checking for TIFFGetVersion in -ltiff" >&5 ac_lib_var=`echo tiff'_'TIFFGetVersion | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3638,7 +3787,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltiff $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3664,16 +3813,16 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff $GFXLIBS" - ICONEXT="tiff" + my_libok=yes my_libname="-ltiff" else echo "$ac_t""no" 1>&6 +my_libok=no fi - if test ! "$ICONEXT" = "tiff"; then + if test "$my_libok" = no; then if test "$zlib" = "yes"; then echo $ac_n "checking for TIFFGetVersion in -ltiff""... $ac_c" 1>&6 -echo "configure:3677: checking for TIFFGetVersion in -ltiff" >&5 +echo "configure:3826: checking for TIFFGetVersion in -ltiff" >&5 ac_lib_var=`echo tiff'_'TIFFGetVersion | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3681,7 +3830,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltiff $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lz -lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3707,18 +3856,18 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff -lz $GFXLIBS" - ICONEXT="tiff" + my_libok=yes my_libname="-ltiff -lz" else echo "$ac_t""no" 1>&6 +my_libok=no fi fi fi - if test ! "$ICONEXT" = "tiff"; then + if test "$my_libok" = no; then echo $ac_n "checking for TIFFGetVersion in -ltiff34""... $ac_c" 1>&6 -echo "configure:3722: checking for TIFFGetVersion in -ltiff34" >&5 +echo "configure:3871: checking for TIFFGetVersion in -ltiff34" >&5 ac_lib_var=`echo tiff34'_'TIFFGetVersion | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3726,7 +3875,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltiff34 $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3752,122 +3901,128 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff34 $GFXLIBS" - ICONEXT="tiff" + my_libok=yes my_libname="-ltiff34" else echo "$ac_t""no" 1>&6 +my_libok=no fi fi -fi - - - - - - - - - - -PLPATH=`pwd`/libPropList - - -if test -f $PLPATH/libPropList.a; then - echo Using compiled libPropList - needtobuild=no - LIBPL_LIBS="-L$PLPATH -lPropList" - LIBPL_INC_PATH="-I$PLPATH" -else - echo $ac_n "checking for PLGetString in -lPropList""... $ac_c" 1>&6 -echo "configure:3784: checking for PLGetString in -lPropList" >&5 -ac_lib_var=`echo PropList'_'PLGetString | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + ac_safe=`echo "tiffio.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for tiffio.h""... $ac_c" 1>&6 +echo "configure:3918: checking for tiffio.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - ac_save_LIBS="$LIBS" -LIBS="-lPropList $LIBS" -cat > conftest.$ac_ext < conftest.$ac_ext < EOF -if { (eval echo configure:3803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3928: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" + eval "ac_cv_header_$ac_safe=yes" else + echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" + eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* -LIBS="$ac_save_LIBS" - fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 - LIBPL_LIBS=-lPropList LIBPL_INC_PATH="" needtobuild=no + GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="$my_libname $GFXLIBS" + ICONEXT="tiff" supported_gfx="$supported_gfx TIFF" else echo "$ac_t""no" 1>&6 -LIBPL_LIBS="-L$PLPATH -lPropList" - LIBPL_INC_PATH="-I$PLPATH" - needtobuild=yes fi + CPPFLAGS=$my_old_cppflags + fi fi -if test "$needtobuild" = yes; then - if test -f libPropList/libPropList.a; then - echo "using included libPropList" - else - echo "********** WARNING *************" - echo "libPropList is not installed in your system." - echo "You need to build it before building WindowMaker (if you already" - echo "did that, remove config.cache and rerun configure)." - echo "Please read the INSTALL file for detailed instructions." - echo "Press to continue configuring WindowMaker or" - echo "type b and to build it now." - read foo - if test "$foo" = b; then - echo - echo "Building libPropList..." - echo - if test ! -d libPropList; then - gzip -d -c libPropList.tar.gz | tar xf - - fi - ok=no - if (cd libPropList; ./configure); then - if (cd libPropList; make); then - ok=yes - fi - fi - if test "$ok" = no; then - echo "********** WARNING **********" - echo "An error occurred while building libPropList" - echo "Please build it manually." - echo "Press to continue." - read foo - fi - echo - echo "resuming WindowMaker configuration..." - echo - fi - fi -fi + + + + +#LIBPL_LIBS="-L${top_builddir}/libPropList -lPropList" +#LIBPL_INC_PATH="-I${top_srcdir}/libPropList" +# +# +#PLPATH=`pwd`/libPropList +# +#if test -f $PLPATH/libPropList.a; then +# echo "using bundled libPropList, already compiled." +# needtobuild=no +# LIBPL_LIBS="-L$PLPATH -lPropList" +# LIBPL_INC_PATH="-I$PLPATH" +#else +# AC_CHECK_LIB(PropList, PLGetString, +# [LIBPL_LIBS=-lPropList LIBPL_INC_PATH="" needtobuild=no], +# [LIBPL_LIBS="-L$PLPATH -lPropList" +# LIBPL_INC_PATH="-I$PLPATH" +# needtobuild=yes]) +#fi +# +# +#if test "$needtobuild" = yes; then +# if test -f libPropList/libPropList.a; then +# echo "using included libPropList" +# else +# echo "********** WARNING *************" +# echo "libPropList is not installed in your system." +# echo "You need to build it before building Window Maker (if you already" +# echo "did that, remove config.cache and rerun configure)." +# echo "Please read the INSTALL file for detailed instructions." +# echo "Press to continue configuring Window Maker or" +# echo "type b and to build it now." +# read foo +# if test "$foo" = b; then +# echo +# echo "Building libPropList..." +# echo +# if test ! -d libPropList; then +# gzip -d -c libPropList.tar.gz | tar xf - +# fi +# ok=no +# if (cd libPropList; ./configure); then +# if (cd libPropList; make); then +# ok=yes +# fi +# fi +# if test "$ok" = no; then +# echo "********** WARNING **********" +# echo "An error occurred while building libPropList" +# echo "Please build it manually." +# echo "Press to continue." +# read foo +# fi +# echo +# echo "resuming Window Maker configuration..." +# echo +# fi +# fi +#fi +# +#AC_SUBST(LIBPL_LIBS) +#AC_SUBST(LIBPL_INC_PATH) + + # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" @@ -3928,15 +4083,26 @@ fi -gnustepdir="${prefix}/GNUstep" +appspath="" -if test "x$GNUSTEP_LOCAL_ROOT" != "x" ; then - gnustepdir=`echo "$GNUSTEP_LOCAL_ROOT" | sed -e "s%${prefix}%\${prefix}%"` +# Check whether --with-appspath or --without-appspath was given. +if test "${with_appspath+set}" = set; then + withval="$with_appspath" + : fi -appsdir=$gnustepdir/Apps -wprefsdir=$appsdir/WPrefs.app +if test "x$appspath" = "x"; then + gnustepdir="${prefix}/GNUstep" + + if test "x$GNUSTEP_LOCAL_ROOT" != "x" ; then + gnustepdir=`echo "$GNUSTEP_LOCAL_ROOT" | sed -e "s%${prefix}%\${prefix}%"` + fi + + appspath=$gnustepdir/Apps +fi + +wprefsdir=$appspath/WPrefs.app @@ -3957,12 +4123,12 @@ fi echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 -echo "configure:3961: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo "configure:4127: checking for sys/wait.h that is POSIX.1 compatible" >&5 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3978,7 +4144,7 @@ wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } EOF -if { (eval echo configure:3982: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4148: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_sys_wait_h=yes else @@ -4002,17 +4168,17 @@ for ac_hdr in fcntl.h limits.h sys/ioctl.h sys/time.h sys/types.h libintl.h sys/ do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4006: checking for $ac_hdr" >&5 +echo "configure:4172: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4016: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4182: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -4042,12 +4208,12 @@ done echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6 -echo "configure:4046: checking for sys_siglist declaration in signal.h or unistd.h" >&5 +echo "configure:4212: checking for sys_siglist declaration in signal.h or unistd.h" >&5 if eval "test \"`echo '$''{'ac_cv_decl_sys_siglist'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -4059,7 +4225,7 @@ int main() { char *msg = *(sys_siglist + 1); ; return 0; } EOF -if { (eval echo configure:4063: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4229: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_decl_sys_siglist=yes else @@ -4080,12 +4246,12 @@ EOF fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:4084: checking for working const" >&5 +echo "configure:4250: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -4155,12 +4321,12 @@ EOF fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:4159: checking for ANSI C header files" >&5 +echo "configure:4325: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -4168,7 +4334,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4172: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4338: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -4185,7 +4351,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -4203,7 +4369,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -4224,7 +4390,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -4235,7 +4401,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:4239: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then : else @@ -4259,12 +4425,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:4263: checking for size_t" >&5 +echo "configure:4429: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -4292,12 +4458,12 @@ EOF fi echo $ac_n "checking for pid_t""... $ac_c" 1>&6 -echo "configure:4296: checking for pid_t" >&5 +echo "configure:4462: checking for pid_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -4325,12 +4491,12 @@ EOF fi echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -echo "configure:4329: checking whether time.h and sys/time.h may both be included" >&5 +echo "configure:4495: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -4339,7 +4505,7 @@ int main() { struct tm *tp; ; return 0; } EOF -if { (eval echo configure:4343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4509: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else @@ -4373,6 +4539,74 @@ if test "$GCC" = "yes"; then fi + +enable_shared=no +#AC_ARG_ENABLE(shared, +#[ --enable-shared build libraries as shared ], enable_shared=yes, +# enable_shared=no) + +if test "$enable_shared" = yes; then + if test "$GCC" = yes; then + _CFLAGS="-fPIC" + LDSHARED='$CC -shared' + else + # find system name and corresponding cc options + case `(uname -sr || echo unknown) 2>/dev/null` in + SunOS\ 5*) + _CFLAGS="-fast -xcg89 -KPIC -R." + LDSHARED='$CC -G';; + SunOS\ 4*) + _CFLAGS="-PIC" + LDSHARED="ld";; + IRIX*) + _CFLAGS="-ansi -rpath ." + LDSHARED='$CC -shared';; + SCO_SV\ 3.2*) + _CFLAGS="-dy -KPIC " + LDSHARED='$CC -dy -KPIC -G';; + HP-UX*) + _CFLAGS="+z" + LDSHARED="ld -b" + SHAREDLIBS='libz.sl';; + *) + _CFLAGS="" + LDSHARED='$CC -shared';; + esac + fi + + echo $ac_n "checking for shared library support""... $ac_c" 1>&6 +echo "configure:4579: checking for shared library support" >&5 + + test=tmptest$$ + cat > $test.c <&1`" = "" && + test "`($LDSHARED -o $test.so $test.o) 2>&1`" = ""; then + CFLAGS="$CFLAGS $_CFLAGS" + WRASTERLIB='libwraster.so.$(WRASTER_VER)' + WINGSLIB='libWINGs.so.$(WINGS_VER)' + echo "$ac_t""yes, building shared" 1>&6 + else + LDSHARED='$CC' + WRASTERLIB='libwraster.a' + WINGSLIB='libWINGs.a' + echo "$ac_t""no, building static" 1>&6 + fi + rm -f $test.co $test.so +fi + +#AC_SUBST(WRASTER_VER) +#AC_SUBST(WINGS_VER) +#AC_SUBST(WRASTERLIB) +# AC_SUBST(WINGSLIB) +# AC_SUBST(LDSHARED) + + + trap '' 1 2 15 @@ -4483,7 +4717,6 @@ trap 'rm -fr `echo "Makefile po/Makefile util/Makefile test/Makefile wmlib/Makef WindowMaker/Themes/Makefile WindowMaker/Backgrounds/Makefile \ WindowMaker/Pixmaps/Makefile WindowMaker/Icons/Makefile \ WindowMaker/IconSets/Makefile \ - WindowMaker/Sounds/Makefile \ WPrefs.app/Makefile WPrefs.app/tiff/Makefile WPrefs.app/xpm/Makefile \ WPrefs.app/po/Makefile src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF @@ -4526,6 +4759,7 @@ s%@AUTOMAKE@%$AUTOMAKE%g s%@AUTOHEADER@%$AUTOHEADER%g s%@MAKEINFO@%$MAKEINFO%g s%@SET_MAKE@%$SET_MAKE%g +s%@subdirs@%$subdirs%g s%@host@%$host%g s%@host_alias@%$host_alias%g s%@host_cpu@%$host_cpu%g @@ -4557,8 +4791,6 @@ s%@XLFLAGS@%$XLFLAGS%g s%@GFXFLAGS@%$GFXFLAGS%g s%@GFXLIBS@%$GFXLIBS%g s%@ICONEXT@%$ICONEXT%g -s%@LIBPL_LIBS@%$LIBPL_LIBS%g -s%@LIBPL_INC_PATH@%$LIBPL_INC_PATH%g s%@DFLAGS@%$DFLAGS%g s%@SOUND@%$SOUND%g s%@pixmapdir@%$pixmapdir%g @@ -4612,7 +4844,6 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile po/Makefile util/Makefile test/Makefile w WindowMaker/Themes/Makefile WindowMaker/Backgrounds/Makefile \ WindowMaker/Pixmaps/Makefile WindowMaker/Icons/Makefile \ WindowMaker/IconSets/Makefile \ - WindowMaker/Sounds/Makefile \ WPrefs.app/Makefile WPrefs.app/tiff/Makefile WPrefs.app/xpm/Makefile \ WPrefs.app/po/Makefile "} EOF @@ -4794,6 +5025,103 @@ chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 +if test "$no_recursion" != yes; then + + # Remove --cache-file and --srcdir arguments so they do not pile up. + ac_sub_configure_args= + ac_prev= + for ac_arg in $ac_configure_args; do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case "$ac_arg" in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; + esac + done + + for ac_config_dir in libPropList; do + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + if test ! -d $srcdir/$ac_config_dir; then + continue + fi + + echo configuring in $ac_config_dir + + case "$srcdir" in + .) ;; + *) + if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; + else + { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } + fi + ;; + esac + + ac_popdir=`pwd` + cd $ac_config_dir + + # A "../" for each directory in /$ac_config_dir. + ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + /*) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_config_dir ;; + *) # Relative path. + ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_sub_srcdir/configure; then + ac_sub_configure=$ac_sub_srcdir/configure + elif test -f $ac_sub_srcdir/configure.in; then + ac_sub_configure=$ac_configure + else + echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + + # Make the cache file name correct relative to the subdirectory. + case "$cache_file" in + /*) ac_sub_cache_file=$cache_file ;; + *) # Relative path. + ac_sub_cache_file="$ac_dots$cache_file" ;; + esac + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" + # The eval makes quoting arguments work. + if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir + then : + else + { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } + fi + fi + + cd $ac_popdir + done +fi + @@ -4804,32 +5132,15 @@ echo "WLIBS=\"-L$exec_prefix/lib -lWINGs -lwraster $LIBPL_LIBS $GFXLIBS -lm\""\ -formats="XPM PPM" -a=0 -for i in $GFXFLAGS; do - case "$i" in - -DUSE_GIF) - formats="$formats GIF" - ;; - -DUSE_TIFF) - formats="$formats TIFF" - ;; - -DUSE_PNG) - formats="$formats PNG" - ;; - -DUSE_JPEG) - formats="$formats JPEG" - ;; - esac -done +supported_gfx="$supported_gfx PPM (built-in)" echo -echo "WindowMaker was configured as follows:" +echo "Window Maker was configured as follows:" echo echo "Installation path prefix: $prefix" echo "Installation path prefix for binaries: $exec_prefix" echo "Installation path for WPrefs.app: $wprefsdir" -echo "Graphic format libraries: $formats" +echo "Graphic format libraries: $supported_gfx" if test "x$MOFILES" = "x"; then mof=none else @@ -4840,8 +5151,5 @@ if test "x$MOFILES" != "x"; then echo "Installation path of translated messages: $NLSDIR" fi -echo "What!? WPrefs.app won't be installed where you want it?" -echo "May I point to you to the INSTALL file?" - diff --git a/configure.in b/configure.in index 107af9da..f8c36a8f 100644 --- a/configure.in +++ b/configure.in @@ -1,14 +1,27 @@ -dnl -dnl WindowMaker autoconf input. -dnl +dnl +dnl Window Maker autoconf input. +dnl dnl Process with: aclocal; autoconf; automake +dnl +dnl +dnl Shared library generation stuff taken from configure script from zlib +dnl AC_INIT(src/WindowMaker.h) -AM_INIT_AUTOMAKE(WindowMaker, 0.20.1) +AM_INIT_AUTOMAKE(WindowMaker, 0.20.2) +dnl Shared Library Versions + +WINGS_VER=0.0.1 +WRASTER_VER=0.0.1 + + +dnl configure/build bundled libraries +dnl =================================== +AC_CONFIG_SUBDIRS(libPropList) AM_CONFIG_HEADER(src/config.h) @@ -118,8 +131,8 @@ dnl ================== dnl List of supported locales dnl ------------------------- -supported_locales="cs de es fr gl it ja ko nl no pt ru se tr fi hr el" -supported_wprefs_locales="pt hr fr ko" +supported_locales="cs de es fr gl it ja ko nl no pt ru se tr fi hr el pl ro" +supported_wprefs_locales="pt hr fr ko ja" for lang in $LINGUAS; do ok=0 @@ -184,17 +197,14 @@ fi dnl Put it back once we have some real gnome support... dnl dnl AC_ARG_WITH(gnome, -dnl [ --with-gnome enable support for GNOME extensions ], -dnl [with_gnome=$withval], [with_gnome=yes]) -dnl AC_MSG_CHECKING([for GNOME support]) -dnl if test "x$with_gnome" = "xyes"; then -dnl HAVE_GNOME="#define MWM_HINTS" -dnl AC_MSG_RESULT(yes) +dnl [ --enable-gnome enable support for GNOME extensions ], +dnl [enable_gnome=$withval], [enable_gnome=yes]) +dnl if test "$enable_gnome" = yes; then +dnl GNOME="#define GNOME" dnl else -dnl HAVE_GNOME="#undef MWM_HINTS" -dnl AC_MSG_RESULT(no) +dnl GNOME="#undef GNOME" dnl fi -dnl AC_SUBST(HAVE_GNOME) +dnl AC_SUBST(GNOME) AC_SUBST(I18N) AC_SUBST(INTLIBS) @@ -267,6 +277,7 @@ dnl ============================================== dnl Graphic Format Libraries dnl ============================================== + dnl dnl Specify paths to look for graphic format libraries dnl ================================================== @@ -292,8 +303,17 @@ AC_ARG_ENABLE(xpm, if test "$xpm" = yes; then AC_CHECK_LIB(Xpm, XpmCreatePixmapFromData, - [GFXFLAGS="$GFXFLAGS -DUSE_XPM" GFXLIBS="$GFXLIBS -lXpm"],, + my_libok=yes, my_libok=no, $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS) + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH $XCFLAGS" + AC_CHECK_HEADER(X11/xpm.h, + [GFXFLAGS="$GFXFLAGS -DUSE_XPM" GFXLIBS="$GFXLIBS -lXpm" + supported_gfx="XPM"], supported_gfx="XPM (builtin)") + CPPFLAGS=$my_old_cppflags + fi fi @@ -317,17 +337,23 @@ AC_CHECK_LIB(z, gzread, zlib=yes, zlib=no, $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS) dnl PNG Support dnl =========== png=yes -AC_ARG_ENABLE(png, -[ --disable-png disable PNG support through libpng], - png=$enableval, png=yes) +# assume libz is present... +#AC_ARG_ENABLE(png, +#[ --disable-png disable PNG support through libpng], +# png=$enableval, png=yes) -if test "$png" = yes; then - if test "$zlib" = yes; then - AC_CHECK_LIB(png, png_get_valid, - [GFXLIBS="$GFXLIBS -lpng -lz" GFXFLAGS="$GFXFLAGS -DUSE_PNG" - supported_gfx="$supported_gfx PNG"],, +if test "$png" = yes -a "$zlib" = yes ; then + AC_CHECK_LIB(png, png_get_valid, my_libok=yes, my_libok=no, $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS -lz -lm) + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + AC_CHECK_HEADER(png.h, + [GFXLIBS="$GFXLIBS -lpng -lz" GFXFLAGS="$GFXFLAGS -DUSE_PNG" + supported_gfx="$supported_gfx PNG"], ) + CPPFLAGS=$my_old_cppflags fi fi @@ -340,10 +366,17 @@ AC_ARG_ENABLE(jpeg, jpeg=$enableval, jpeg=yes) if test "$jpeg" = yes; then - AC_CHECK_LIB(jpeg, jpeg_destroy_compress, - [GFXLIBS="$GFXLIBS -ljpeg" GFXFLAGS="$GFXFLAGS -DUSE_JPEG" - supported_gfx="$supported_gfx JPEG"],, + AC_CHECK_LIB(jpeg, jpeg_destroy_compress, my_libok=yes, my_libok=no, $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS) + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + AC_TRY_CPP(jpeglib.h, + [GFXLIBS="$GFXLIBS -ljpeg" GFXFLAGS="$GFXFLAGS -DUSE_JPEG" + supported_gfx="$supported_gfx JPEG"], ) + CPPFLAGS=$my_old_cppflags + fi fi @@ -359,19 +392,28 @@ AC_ARG_ENABLE(gif, if test "$gif" = yes; then retry=no - AC_CHECK_LIB(ungif, DGifOpenFileName, - [GFXLIBS="$GFXLIBS -lungif" GFXFLAGS="$GFXFLAGS -DUSE_GIF" - supported_gfx="$supported_gfx GIF"],retry=yes, - $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS) + AC_CHECK_LIB(ungif, DGifOpenFileName, + [my_libok=yes my_libname=ungif], + [retry=yes my_libok=no], + $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS) dnl dnl libungif is the same thing as libgif for all practical purposes. dnl if test "$retry" = yes; then - AC_CHECK_LIB(gif, DGifOpenFileName, - [GFXLIBS="$GFXLIBS -lgif" GFXFLAGS="$GFXFLAGS -DUSE_GIF" - supported_gfx="$supported_gfx GIF"],, + AC_CHECK_LIB(gif, DGifOpenFileName, + [my_libok=yes my_libname=gif], + my_libok=no, $GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS) fi + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + AC_CHECK_HEADER(gif_lib.h, + [GFXLIBS="$GFXLIBS -l$my_libname" GFXFLAGS="$GFXFLAGS -DUSE_GIF" + supported_gfx="$supported_gfx GIF"], ) + CPPFLAGS=$my_old_cppflags + fi fi @@ -393,28 +435,35 @@ ICONEXT="xpm" # if test "$tif" = yes; then + my_libname="" AC_CHECK_LIB(tiff, TIFFGetVersion, - [GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff $GFXLIBS" - ICONEXT="tiff"],, + [my_libok=yes my_libname="-ltiff"], my_libok=no, [$GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lm]) dnl dnl Retry with zlib dnl - if test ! "$ICONEXT" = "tiff"; then + if test "$my_libok" = no; then if test "$zlib" = "yes"; then - AC_CHECK_LIB(tiff, TIFFGetVersion, - [GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff -lz $GFXLIBS" - ICONEXT="tiff"],, + AC_CHECK_LIB(tiff, TIFFGetVersion, + [my_libok=yes my_libname="-ltiff -lz"], my_libok=no, [$GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lz -lm]) fi fi - if test ! "$ICONEXT" = "tiff"; then + if test "$my_libok" = no; then AC_CHECK_LIB(tiff34, TIFFGetVersion, - [GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="-ltiff34 $GFXLIBS" - ICONEXT="tiff"],, + [my_libok=yes my_libname="-ltiff34"], my_libok=no, [$GFX_INC_PATH $GFX_LIB_PATH $XLFLAGS $XLIBS $GFXLIBS -lm]) fi + + if test "$my_libok" = yes; then + my_old_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $GFX_INC_PATH" + AC_CHECK_HEADER(tiffio.h, + [GFXFLAGS="$GFXFLAGS -DUSE_TIFF" GFXLIBS="$my_libname $GFXLIBS" + ICONEXT="tiff" supported_gfx="$supported_gfx TIFF"], ) + CPPFLAGS=$my_old_cppflags + fi fi @@ -430,70 +479,76 @@ dnl ============================================== dnl ===================================================== dnl Check for libPropList +dnl Always use the included libPropList, even if it is +dnl already installed. dnl ===================================================== -PLPATH=`pwd`/libPropList - -if test -f $PLPATH/libPropList.a; then - echo Using compiled libPropList - needtobuild=no - LIBPL_LIBS="-L$PLPATH -lPropList" - LIBPL_INC_PATH="-I$PLPATH" -else - AC_CHECK_LIB(PropList, PLGetString, - [LIBPL_LIBS=-lPropList LIBPL_INC_PATH="" needtobuild=no], - [LIBPL_LIBS="-L$PLPATH -lPropList" - LIBPL_INC_PATH="-I$PLPATH" - needtobuild=yes]) -fi - - -if test "$needtobuild" = yes; then - if test -f libPropList/libPropList.a; then - echo "using included libPropList" - else - echo "********** WARNING *************" - echo "libPropList is not installed in your system." - echo "You need to build it before building WindowMaker (if you already" - echo "did that, remove config.cache and rerun configure)." - echo "Please read the INSTALL file for detailed instructions." - echo "Press to continue configuring WindowMaker or" - echo "type b and to build it now." - read foo - if test "$foo" = b; then - echo - echo "Building libPropList..." - echo - if test ! -d libPropList; then - gzip -d -c libPropList.tar.gz | tar xf - - fi - ok=no - if (cd libPropList; ./configure); then - if (cd libPropList; make); then - ok=yes - fi - fi - if test "$ok" = no; then - echo "********** WARNING **********" - echo "An error occurred while building libPropList" - echo "Please build it manually." - echo "Press to continue." - read foo - fi - echo - echo "resuming WindowMaker configuration..." - echo - fi - fi -fi - -AC_SUBST(LIBPL_LIBS) -AC_SUBST(LIBPL_INC_PATH) +#LIBPL_LIBS="-L${top_builddir}/libPropList -lPropList" +#LIBPL_INC_PATH="-I${top_srcdir}/libPropList" +# +# +#PLPATH=`pwd`/libPropList +# +#if test -f $PLPATH/libPropList.a; then +# echo "using bundled libPropList, already compiled." +# needtobuild=no +# LIBPL_LIBS="-L$PLPATH -lPropList" +# LIBPL_INC_PATH="-I$PLPATH" +#else +# AC_CHECK_LIB(PropList, PLGetString, +# [LIBPL_LIBS=-lPropList LIBPL_INC_PATH="" needtobuild=no], +# [LIBPL_LIBS="-L$PLPATH -lPropList" +# LIBPL_INC_PATH="-I$PLPATH" +# needtobuild=yes]) +#fi +# +# +#if test "$needtobuild" = yes; then +# if test -f libPropList/libPropList.a; then +# echo "using included libPropList" +# else +# echo "********** WARNING *************" +# echo "libPropList is not installed in your system." +# echo "You need to build it before building Window Maker (if you already" +# echo "did that, remove config.cache and rerun configure)." +# echo "Please read the INSTALL file for detailed instructions." +# echo "Press to continue configuring Window Maker or" +# echo "type b and to build it now." +# read foo +# if test "$foo" = b; then +# echo +# echo "Building libPropList..." +# echo +# if test ! -d libPropList; then +# gzip -d -c libPropList.tar.gz | tar xf - +# fi +# ok=no +# if (cd libPropList; ./configure); then +# if (cd libPropList; make); then +# ok=yes +# fi +# fi +# if test "$ok" = no; then +# echo "********** WARNING **********" +# echo "An error occurred while building libPropList" +# echo "Please build it manually." +# echo "Press to continue." +# read foo +# fi +# echo +# echo "resuming Window Maker configuration..." +# echo +# fi +# fi +#fi +# +#AC_SUBST(LIBPL_LIBS) +#AC_SUBST(LIBPL_INC_PATH) -dnl Paranoia setup -dnl ============== +dnl Debugging setup +dnl =============== AC_ARG_ENABLE(debug, [ --enable-debug enable debugging ],, enable_debug=no) @@ -544,15 +599,22 @@ AC_SUBST(pixmapdir) dnl Support for GNUSTEP_LOCAL_ROOT, for WPrefs.app dnl ============================================== -gnustepdir="${prefix}/GNUstep" +appspath="" + +AC_ARG_WITH(appspath, +[ --with-appspath=PATH specify the path of the GNUstep applications directory ]) + +if test "x$appspath" = "x"; then + gnustepdir="${prefix}/GNUstep" -if test "x$GNUSTEP_LOCAL_ROOT" != "x" ; then + if test "x$GNUSTEP_LOCAL_ROOT" != "x" ; then gnustepdir=`echo "$GNUSTEP_LOCAL_ROOT" | sed -e "s%${prefix}%\${prefix}%"` -fi + fi -appsdir=$gnustepdir/Apps + appspath=$gnustepdir/Apps +fi -wprefsdir=$appsdir/WPrefs.app +wprefsdir=$appspath/WPrefs.app AC_SUBST(wprefsdir) @@ -560,7 +622,8 @@ AC_SUBST(wprefsdir) dnl Enable single appicon per wm instance+class combo -cls dnl ===================================================== AC_ARG_ENABLE(single-icon, -[ --enable-single-icon use single application icon per WM_INSTANCE+WM_CLASS (unsupported) ], +[ --enable-single-icon use single application icon per WM_INSTANCE+WM_CLASS +], if test "$enableval" = yes; then REDUCE_APPICONS="#define REDUCE_APPICONS" else @@ -601,6 +664,75 @@ if test "$GCC" = "yes"; then fi +dnl Shared Library Support (unfinished) +dnl =================================== + +enable_shared=no +#AC_ARG_ENABLE(shared, +#[ --enable-shared build libraries as shared ], enable_shared=yes, +# enable_shared=no) + +if test "$enable_shared" = yes; then + if test "$GCC" = yes; then + _CFLAGS="-fPIC" + LDSHARED='$CC -shared' + else + # find system name and corresponding cc options + case `(uname -sr || echo unknown) 2>/dev/null` in + SunOS\ 5*) + _CFLAGS="-fast -xcg89 -KPIC -R." + LDSHARED='$CC -G';; + SunOS\ 4*) + _CFLAGS="-PIC" + LDSHARED="ld";; + IRIX*) + _CFLAGS="-ansi -rpath ." + LDSHARED='$CC -shared';; + SCO_SV\ 3.2*) + _CFLAGS="-dy -KPIC " + LDSHARED='$CC -dy -KPIC -G';; + HP-UX*) + _CFLAGS="+z" + LDSHARED="ld -b" + SHAREDLIBS='libz.sl';; + *) + _CFLAGS="" + LDSHARED='$CC -shared';; + esac + fi + + AC_MSG_CHECKING([for shared library support]) + + test=tmptest$$ + cat > $test.c <&1`" = "" && + test "`($LDSHARED -o $test.so $test.o) 2>&1`" = ""; then + CFLAGS="$CFLAGS $_CFLAGS" + WRASTERLIB='libwraster.so.$(WRASTER_VER)' + WINGSLIB='libWINGs.so.$(WINGS_VER)' + AC_MSG_RESULT([yes, building shared]) + else + LDSHARED='$CC' + WRASTERLIB='libwraster.a' + WINGSLIB='libWINGs.a' + AC_MSG_RESULT([no, building static]) + fi + rm -f $test.[co] $test.so +fi + +#AC_SUBST(WRASTER_VER) +#AC_SUBST(WINGS_VER) +#AC_SUBST(WRASTERLIB) +# AC_SUBST(WINGSLIB) +# AC_SUBST(LDSHARED) + + + dnl dnl Nicolai: Program tests for Documentation Section dnl ================================================= @@ -633,7 +765,6 @@ AC_OUTPUT(Makefile po/Makefile util/Makefile test/Makefile wmlib/Makefile \ WindowMaker/Themes/Makefile WindowMaker/Backgrounds/Makefile \ WindowMaker/Pixmaps/Makefile WindowMaker/Icons/Makefile \ WindowMaker/IconSets/Makefile \ - WindowMaker/Sounds/Makefile \ WPrefs.app/Makefile WPrefs.app/tiff/Makefile WPrefs.app/xpm/Makefile \ WPrefs.app/po/Makefile ) @@ -653,32 +784,15 @@ dnl dnl Spit out the configuration dnl ========================== -formats="XPM PPM" -a=0 -for i in $GFXFLAGS; do - case "$i" in - -DUSE_GIF) - formats="$formats GIF" - ;; - -DUSE_TIFF) - formats="$formats TIFF" - ;; - -DUSE_PNG) - formats="$formats PNG" - ;; - -DUSE_JPEG) - formats="$formats JPEG" - ;; - esac -done +supported_gfx="$supported_gfx PPM (built-in)" echo -echo "WindowMaker was configured as follows:" +echo "Window Maker was configured as follows:" echo echo "Installation path prefix: $prefix" echo "Installation path prefix for binaries: $exec_prefix" echo "Installation path for WPrefs.app: $wprefsdir" -echo "Graphic format libraries: $formats" +echo "Graphic format libraries: $supported_gfx" if test "x$MOFILES" = "x"; then mof=none else @@ -689,9 +803,6 @@ if test "x$MOFILES" != "x"; then echo "Installation path of translated messages: $NLSDIR" fi -echo "What!? WPrefs.app won't be installed where you want it?" -echo "May I point to you to the INSTALL file?" - dnl This is for Emacs. I'm lazy, I know... (nicolai) dnl ================================================ diff --git a/doc/Makefile.in b/doc/Makefile.in index 61e9f54f..17639165 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/doc/geticonset.1x b/doc/geticonset.1x index 13c9a9d6..5aad0e24 100644 --- a/doc/geticonset.1x +++ b/doc/geticonset.1x @@ -1,7 +1,7 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. .TH geticonset 1x "March 1998" .SH NAME -geticonset \- gets the current WindowMaker iconset +geticonset \- gets the current Window Maker iconset .SH SYNOPSIS .B geticonset .I [iconsetfile] @@ -24,4 +24,4 @@ is the actual file that's read. .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/doc/getstyle.1x b/doc/getstyle.1x index 17796a16..b03263c1 100644 --- a/doc/getstyle.1x +++ b/doc/getstyle.1x @@ -1,7 +1,7 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. .TH getstyle 1x "March 1998" .SH NAME -getstyle \- dumps the current WindowMaker style related configuration +getstyle \- dumps the current Window Maker style related configuration .SH SYNOPSIS .B getstyle [style file] @@ -30,4 +30,4 @@ This is the actual file that's written. .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/doc/seticons.1x b/doc/seticons.1x index 6cb5f3fb..0ae1a96d 100644 --- a/doc/seticons.1x +++ b/doc/seticons.1x @@ -1,7 +1,7 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. .TH seticons 1x "March 1998" .SH NAME -seticons \- sets the WindowMaker icons +seticons \- sets the icon images used in Window Maker .SH SYNOPSIS .B seticons .I iconsfile @@ -10,7 +10,7 @@ seticons \- sets the WindowMaker icons reads .I iconsfile and writes its contents to the WMWindowAttributes domain, efectively -setting the icons WindowMaker uses for a given class (for example, +setting the icons Window Maker uses for a given class (for example, XTerm, "xterm.XTerm", "rxvt.XTerm", "pine.XTerm", etc) .SH ENVIRONMENT .IP GNUSTEP_USER_ROOT @@ -26,4 +26,4 @@ This is the actual file that's written. .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/doc/setstyle.1x b/doc/setstyle.1x index 741a39b4..c630670e 100644 --- a/doc/setstyle.1x +++ b/doc/setstyle.1x @@ -1,7 +1,7 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. .TH setstyle 1x "March 1998" .SH NAME -setstyle \- set style related options for WindowMaker +setstyle \- set style related options for Window Maker .SH SYNOPSIS .B setstyle .I stylefile @@ -10,7 +10,7 @@ setstyle \- set style related options for WindowMaker reads .I stylefile and writes its contents to the WindowMaker domain, efectively setting -the WindowMaker style. +the Window Maker style. .SH ENVIRONMENT .IP GNUSTEP_USER_ROOT specifies the initial path for the Defaults directory. "Defaults/" is @@ -25,4 +25,4 @@ This is the actual file that's written. .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/doc/wdwrite.1x b/doc/wdwrite.1x index 12fc1135..28fbb4d7 100644 --- a/doc/wdwrite.1x +++ b/doc/wdwrite.1x @@ -27,4 +27,4 @@ The domains reside in GNUSTEP_USER_ROOT/Defaults/ .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/doc/wmaker.1x b/doc/wmaker.1x index d85d13c1..011b4260 100644 --- a/doc/wmaker.1x +++ b/doc/wmaker.1x @@ -1,12 +1,12 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. -.TH WindowMaker 1x "August 1998" +.TH Window\ Maker 1x "August 1998" .SH NAME wmaker \- X11 window manager with a NEXTSTEP look .SH SYNOPSIS .B wmaker .I "[-options]" .SH "DESCRIPTION" -WindowMaker is a X11 window manager with a NEXTSTEP look. It tries to +Window Maker is a X11 window manager with a NEXTSTEP look. It tries to emulate NeXT's look as much as possible, but it deviates from it as necessary. .SH "OPTIONS" @@ -22,11 +22,11 @@ do not show the workspace Clip .TP .B \-display host:display.screen specify display to use. -On multiheaded machines, WindowMaker will automatically manage all screens. -If you want WindowMaker to manage only a specific screen, you must supply +On multiheaded machines, Window Maker will automatically manage all screens. +If you want Window Maker to manage only a specific screen, you must supply the screen number you want to have managed with the .B \-display -command line argument. For example, if you want WindowMaker to manage only +command line argument. For example, if you want Window Maker to manage only screen 1, start it as: .B wmaker -display :0.1 .TP @@ -41,14 +41,15 @@ for a list of visuals available in your display. .SH FILES .TP .B ~/GNUstep/Defaults/WindowMaker -general WindowMaker defaults. +general Window Maker defaults. .TP .B ~/GNUstep/Defaults/WMState information about the Dock and Clip. DON'T edit this while running -WindowMaker. It will be overwritten. +Window Maker. It will be overwritten. .TP .B ~/GNUstep/Defaults/WMRootMenu -Contains the name of the file to read the root menu from. +Contains the name of the file to read the root menu from or the +menu itself, in property list format. .TP .B ~/GNUstep/Defaults/WMWindowAttributes Attributes for different application classes and instances. Use the @@ -56,34 +57,44 @@ Attribute Editor (right drag the application's title bar, select Attributes) instead of modifying this file directly. There are just a few options not available using the Attributes Editor. .TP -.B /etc/GNUstep/Defaults/ +.B /usr/share/WindowMaker/Defaults/ All the above-mentioned files are READ from here if not found except for WMState, which is COPIED from here. No matter where they are read from, if it's necesary to write configuration changes back into this files, user's files will be written to. .TP .B ~/GNUstep/Library/WindowMaker/autostart -This script is automatically executed when WindowMaker is started. +This script is automatically executed when Window Maker is started. +.TP +.B ~/GNUstep/Library/WindowMaker/exitscript +This script is automatically executed immediately before Window Maker is +exited. +.B Note: +If you need to run something that requires the X server to be running +from this script, make sure you do not use the +.I SHUTDOWN +command from the root menu to exit Window Maker. Otherwise, the X server +might be shut down before the script is executed. .TP .B ~/GNUstep/Library/WindowMaker/ The menu file indicated in WMRootMenu is looked for here... .TP .B /etc/X11/WindowMaker/ -and here, in that order. +and here, in that order. Unless, the indicated path is an absolute path. .TP .B ~/GNUstep/Library/WindowMaker/Pixmaps/ -WindowMaker looks for pixmaps here +Window Maker looks for pixmaps here .TP .B ~/GNUstep/Library/WindowMaker/Backgrounds/ -WindowMaker looks for backgrounds here +Window Maker looks for backgrounds here .TP .B ~/GNUstep/Library/WindowMaker/Styles/ -WindowMaker looks for style files here (not true... it looks like it +Window Maker looks for style files here (not true... it looks like it does, but you have to specify the full path anyway, it's just a place to keep things nicely ordered) .TP .B ~/GNUstep/Library/WindowMaker/Themes/ -WindowMaker looks for theme files here (ibid) +Window Maker looks for theme files here (ibid) .TP .B /usr/share/WindowMaker/Pixmaps/ System wide pixmaps are located here... @@ -110,12 +121,11 @@ variable is empty, GNUSTEP_SYSTEM_ROOT is looked for. specifies the location of the system-wide GNUstep directory. If this variable is empty, it defaults to /etc/GNUstep .SH SEE ALSO -The WindowMaker User Guide +The Window Maker User Guide .PP -The WindowMaker FAQ +The Window Maker FAQ .PP .BR X (1x), -.BR convertstyle (1), .BR wdwrite (1x), .BR wxcopy (1x), .BR geticonset (1x), @@ -126,8 +136,9 @@ The WindowMaker FAQ .BR setstyle (1x), .BR wmsetbg (1x) .SH AUTHOR -WindowMaker was written by Alfredo K. Kojima -with help from many contributors. +Window Maker was written by Alfredo K. Kojima , +Dan Pascu with contributions from many people around +the Internet. .PP This manual page was written by Marcelo E. Magallon, . diff --git a/doc/wmsetbg.1x b/doc/wmsetbg.1x index a3ebbcb2..0f3e4233 100644 --- a/doc/wmsetbg.1x +++ b/doc/wmsetbg.1x @@ -11,10 +11,10 @@ wmsetbg \- sets the background on the X11 display reads the specified .I image (XPM, PNG, jpeg, Tiff, raw PPM) and puts it on the root window. It can either -scale the image or tile it to make it fit the root window. WindowMaker +scale the image or tile it to make it fit the root window. Window Maker uses this command internally to set the root window image on start up. It can be used on the command line, but it .B won't -write the information to the WindowMaker defaults' database. +write the information to the Window Maker defaults' database. .SH OPTIONS .TP .B \-t @@ -33,7 +33,7 @@ dithers colors matches colors .TP .B \-u -updates the WindowMaker defaults database +updates the Window Maker defaults database .TP .B \-d updates the specifed @@ -47,4 +47,5 @@ colors per channel to use .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . +wmsetbg was written by Dan Pascu diff --git a/doc/wxcopy.1x b/doc/wxcopy.1x index 2b69a224..90bab794 100644 --- a/doc/wxcopy.1x +++ b/doc/wxcopy.1x @@ -1,10 +1,10 @@ .\" Hey, Emacs! This is an -*- nroff -*- source file. -.TH wxcopy 1x "March 1998" +.TH wxcopy 1x "September 1998" .SH NAME wxcopy \- copy stdin or file into cutbuffer .SH SYNOPSIS .B wxcopy -[\-cutbuffer number] +[options] [filename] .SH DESCRIPTION .B wxcopy @@ -12,11 +12,33 @@ copies stdin or .I filename into the cutbuffer. If no cutbuffer is specified, the data will be copied into cutbuffer 0 and the other cutbuffers will be rotated, if present. -.I number +If a cutbuffer is specified, the data is copied into that cutbuffer, +and no rotation of buffers is performed. +.SH OPTIONS +.TP +.B \-cutbuffer number +Specifies the number of the cutbuffer to copy data to. +.TP +.B \-display display\-name +The data will be copied in the cutbuffers of the specified display/screen. +.TP +.B \-nolimit +Makes the normal 64kb limit check not to be performed, making the buffer +attempt to grow to whatever size is required. +.TP +.B \-clearselection +Clears the PRIMARY selection owner. In practice it means that when you try +to paste the data with the middle mouse button (for example) it will paste +the data from cut buffer 0, instead of any eventually existing mouse +selection. +.PP .SH SEE ALSO .BR wxpaste (1x), .BR wmaker (1x) .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . + +Binary data compatibility and \-nolimit stuff by Luke Kendall +. diff --git a/doc/wxpaste.1x b/doc/wxpaste.1x index 9e471e16..535d713e 100644 --- a/doc/wxpaste.1x +++ b/doc/wxpaste.1x @@ -4,16 +4,38 @@ wxpaste \- output a cutbuffer to stdout .SH SYNOPSIS .B wxpaste -[\-cutbuffer number] +[options] .SH DESCRIPTION .B wxpaste -outputs the most recent cutbuffer or cutbuffer -.I number -to stdout +outputs the contents of the specified cutbuffer to stdout. If no cutbuffer +is specified, the cutbuffer 0 will be used as default. +.PP +.SH OPTIONS +.TP +.B \-cutbuffer number +The data will be pasted from the specified cutbuffer, instead of the default +0. +.TP +.B \-display display\-name +Specifies the display where wxpaste should look for the data to be pasted. +.TP +.B \-selection [selection\-name] +The data will be copied from the named selection. If cutting from the +selection fails, the cutbuffer will be used. The default value for the +selection name is PRIMARY. +.PP +.SH BUGS +.TP +The \-selection option must be the last one. The syntax could be +cleaned, but backwards compatibility prevents that... + +INCR and MULTIPLE selection types are not handled. Actually, only simple +text selections are handled, wich should be enough for most uses of a +utility such as this. .SH SEE ALSO .BR wxcopy (1x), .BR wmaker (1x) .SH AUTHOR This man page was written by Marcelo Magallon . .PP -WindowMaker was written by Alfredo K. Kojima . +Window Maker was written by Alfredo K. Kojima . diff --git a/libPropList.tar.gz b/libPropList.tar.gz deleted file mode 100644 index c8eed72256d1348359c6387cedb4aceb21f2fadb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 98985 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
gA>m%x(yEI`_>vpyjqc_rlM94(H$j0Al zC1WpTb}qMSt;K;WJ19c|S|AV7o~T`(V!WBUo0M>SU(KcgfLusPR0m$X zdSCWqd);C{=WL$}LoaB5bQu#iQk>^{$EOWU+J?<({X(7HtEJDZnmytF&O~z;Crimy zXMv#v$2d}ma<7256`afHos4@t<1jViW_X#fl**Wzk{M^{&eU{5i}2}%?GF%C{#5ng zq4N%}kT}qFG}_et6mE)xb>u8{SVyY-=4Ng!w-QeZj7vy4bGKlpo&v(#U76afZuA^c z!#jX+=7UExQI|aA<2LzSD6SN6t4r#FeUcGqPrs!79Og$y@Xj5ly&D%x*0z{*5427A9$~G_ncIZ2dpqti>WM+U**}sLuK9IIE z38-y&hbQcgu3}i6^b(PTH|S+}P8=2EOfb+~7cWuQQIc53DjR?N<=9{OrolyMx9NC- zqw$m06+6MkF3Jw}P{xs&e<9nYjGkKXbWl)`9;7_g4K2aIx zBf!QP@_=B7?kTQ_SjqhRKp*AmZ)r+Y-{;(i@@u6VC5v=r%}%H+MH~J@fveLXzSH5W zC0bF=w7b74=U0B~Rh_)-&cysUZH(NfUd(j5|Dk7c_Bg-n%{Ozj&oj5;$VK^aZL)lz zs$_Pj1u8E&H7}hQG$y+{KfEuQwd~eC)ThZAPVnf-;>MKH#>X5f3*C}?GL}2V+v8sE zCLJWU+r{e%RhB3bf1}>Oi{PC0E(IH@lz(VFIqWq0j;hMUbuZWqnW?cODhiDw^iX;k z_bJwP4o1j#HkY9IYG$Z)q6u%I;TFZm$pih316$vQyu~1egFeVMXJ%qBZQot9?{zsn z0#*Xa3!p6?7MzecRGvfOOq2?|?L8`OR0}p^BZ&_2Ka0=yPm@tJSk%KJ+w#f4JfYd< zcBt3JoU&blCi53NRKbi9F*4(&QT#D5D_I`>`9@ZhW_T0I29AcyCsgMHI)wBJei`a> zv|2)bGE<8seoqlLGtCZ=Ay#rv*MJ`s32TnbEB-!mwu+jsxS=VrMSsT@{e9w|lpML~ zQ>6mIg4osH<#^0`JD)Ezd&-E2EKu@1dE4oBt!wk+-Dmq-d%TFxcp5U;gEfwiwx3rx zf=G-312jvjx#wuu(wSTVPUY67xsMJ^lps8pPTwq?L#=`aK&xfXBlWJjzpVjd@hX~N_2-V!* z%XdjV_C!7z@dQad_d}Z>Dk0$rZ+8hYIF{BJo@or~id-ef-8HXpGKGRwyNy4=J~D^x zK~96B$OS?UX}#>*?9bkn#BL*c$>FrU<=xrfsYFr17lrs$vl6ONmLCS=+pYo$XS2uX zP_U!#Bxuq*1!P$u{l1zE&%?(nZ4v!&EF`I{P%dMts7P&%>2xXXp7$A1ipwC3+cI{T zbttf|K~jK4fZY=jV$GuKTi@a1X6LM^MAxGG2uM%z5-^^E*!ZF0A{zb9MvTKN@Y)i|XU$;Gz9}f3839 zgBkvE(OdQLk)NRs4pe_Gd@sb=P42_$5gKaqV-z1?qegE|=Qb}|6EbR2ZxM~j_JMFo zovM9{h@8=p=m1dP9WP(rWSFAOVcYEN7Q~;SpI}Hc{*1_`C<6AAc=xy+<8X$t?zLNR z%SB{e^83mdWRCZnRiVVf1x?~N(fR%NZBuzSX~L+fk8Ln23EDUa6~1a>#|7ML1aL7} z$8an{C%v1RmWs=>NH{~YIP&sFvSz*~iSCw%t=Txv!7?`+=VB{!!Ky*vSGrK@UksN4 zCDIflL<@25eF18Y!kbK`G6EEh3-~(iuz*9RR!Usf5Ym_g7V+7=u}-5TB;WHw(Tf>* z=hxO7|FbrEso4|zs`o$o^b=~suZD)M#=GV3Q}9*Kb@&75ycX}cj3iHBwh$nzJ`HCQ z+{Q4|syoHVoMoc?QmNMAG@X6t!_q7^Cy^y$l0}zMjkUyhGkL;W97`TksQxUbXXq%2 zNaYjM&I$vDh)&5&;KDlCB{Qulp%)#Di|SDzShe>yB7P!L&10D^MlBv+?l+4Yhd!R0~vy4U!XMk0?>d%ejos zgyqkQKm*rYX!;nLQn)-JcCd>>P_}^ExxSgnXZ$ZMaNtI%Qw1)YVsnf%eK~qfdk3qI zU{iRBg4TfylR1}KS5Kl|o5&!{xwW`JJXliY_8f4`#+ebfe>hxUgL$TV^t}+`pNg$R zpVtw?4n{w`ixM{d@`^N0(;DK1rePJUOB0!0IQT8c=A zECQ2^mLBT7pVS_vyjBNTv@_rlf^t+^B%FPH)^r>i3%Kqh)%7(jIfe=%ykMNx3@a_I zswac>NX>`z<~b?R4G5*GJc*KXjtu3_vQyId50(;613m7(Q5C4erA7u)O%K|W>k$>B zsDk*p*=LHFbiD#gpArcING!%WO z2uN$f(xdTO4j?$|T3(RR75dJXp>vAZic4d))N=Loc{7>`r)$IUIo{vizue?`yqDRU zmIy>u_r8!hGom+>^WNvPW8Oj>p2#@hK69iqut6IWY<5F)(i`aoqQp;8f$xnD_)`B8 z{^&;4_#W#bU|bRoqNQ=qbD21N=~m8v^6ToEqcy9IqT|nd4V% zX)(_xW!g@uG6=BHX^YtAu{?OpcsxF6Vw{5#fmA-gVm??Ve5yQ9#udrCO$x-oY4k9j z60;X!*SVAI4O5`n7m`GCXf&ymF{DKis?x``3pqPyf6il(xgt1mgR>*4p1cI9vH_g4 zXBvW4yP0CLp1bd4yN+P<(SZ_GNZQ|mD60%Bx9S*XGc0PW<3%9X7!3? z*@L?-aQh=&-xmF0tsLo-IoKi~N7>Hzmy}XiTw9CT6Kq8!wg=r>xbbbOPE1I4Bcd^$ODne^2k5Hpf0xCPldXL<42|mBPO{ zvwF8b@6wB-kVv~9P1~dralS%ojDzIsb5YnD?6_EVE{|D63z{w|)?lYO>?8jm8B3mc z2p7bbuXYBCP%bDHN{a`Vjz-%Bo#VedAXaJ7c=DVzoUweYOejZBGl?w@ep9DfQ{maW z0;*r^C#^S*khJetwW4QP8Idu=UZJY-x~$6WcGF6pqgX+VCw4jzO^R;h(UwH(K037c zag;|HHgGswpv%OsK?yO#njPGi97r^2M+!Xq3YK6f|x_Rq*pvx$)r7HF= zIz`zZg@W{o+sF6v4vn!B#t_V|E*KbKQF6jgC$VLT6cuZ3>4tK-xm%@N%^A1nSsCSY ze~oE9sFJ$ra5-qArjJ71?zi~@oZQb0mKYKI^agHOsJGsYYrpUaTi`f7=fx2->%6UHh8NL?7*S6$pC+q7fG$}U1}*FM@|yR4ENj~lQ{rf~{iy#HH5 zhwyITh=`QDPv~jGGBPuyC&VK^!nEnjw|kBM?jAx5owgu#na^A?`C+IxM?}ESyjDAXP-daw|lUQyuk7;6<%#wOzj~ zd}drE%-mOxaeZN+irXoMGJH7sSag93Ytez&s1^?>7i>v~F+aKs;valZn*JEPSL-#@ zvL`!7#iPKPelzCB=b2*K1vcHf>YqnEtUQu?#(y!3oXPmecn8Z|T?Anl4{Ax@X$w?$BWz7?Pd%L~ zpW*2I#$53j+DK`IUjxIAVx{rI7HY_ys*UJe_2%-gnFH_59|E&=zqPu`>^+0Kl-5PQ2u;uEJ|h{^l)o^bN=+W zf4>HNDL=VL(orDMUwbS0oB!e+w@PP$QvTHRpUQRI`aNMyT5RkmwW4M<2RX@>34VFU ziPE8MIMwiMA+1y*1gr22fA;y}9Z*O8`aT_>`hM$aANJJL(k|gCe!mtk*FOG8&i)oI zes>233WflzB?ZW*B@#y2wmXdQeRN*_aE|}l5J7jKy!0%8>uR`@-|ed4uZaKZYN&l; z{$53Xfz})Gy4OET7P#@vD97rpZpWZ+Amm^ReXEd3@O$&zK4*rCg3QFU=;(owB>xxl zFw+|txV3Ueg3mlTltn3cQ408bWOBs}jsD6S`FW)^u2@FF^{fa^w6ry~GzH1OTC%jv zuk5WH_3V(L=-xCKbN>(ZAr;4Nl6@j}Z7^( z3Ch@DtbPwWSCXb_P6lRzSnN@UH=V3uHQtbKG7&ZbO-X?^s6+bZn){Reo0|Unq`dp% z_%-seh&lb+{O@5*R{c(3+B>5^7wEA?Y?PTt&x=Yyi@k#Y*VzwjiZ5GCVzIBPQR+8` zod0dZaAEXTck3v;;Q49S9QIi~-wA!bB?vCbyI|`@*A5vJ=Z+rvW^wl@uh{mf0F$Ex zEZQJ}6%PwWplssD;fvS<44Q!V&>2{F=z@Czc?Ic`N!%O0ldIC0o2ayKo%bGkb4QY= zlZ^OwDC8)>y6-$ZjpFKJXoHltrE7x;rm6NohCI{}u5KG|VfsZ?IMC8$!*9*LJdZ5e4x$H}#Z-{MXk8Re9! z>7HfDHhQ?W%C>I9yxaCQ)-k_vl>tz|5BUcEmZu9JO&P3PWeP{yf!A#Dv3oYOtTo4A z!;UG~yDyIu<6!3%FBRWk_{u(569SDF+u9jDwYK4bd&Q)^L-5^G9|DqKC;%$-{Lh6p zrI)88{!vuq83a6=8zBbiL$dVVm?9%*IdF-`cXs!dk(ML6e8Ybp7kt{mH@3(_VpkoI^BS>fjOf}-;Wr6c)+Wc z!5jf~fj2`#WnNlyx#I$6n!Hn!1L%N}e^Y%CV?r;fL zXtKp7$m^R~v|J->K*txx%H;BHd#$nSxZYIVf! zaLLReKT}?BnE}NtoCV-LZMA%D^dkZ`nxWBx@{WH#GEwfeB)BsLG>ye$^MBNlDTq-i z+HZwqg@mf0pHlxfI&I?;d`L0(yZd&KTV>&a;I3K5v#urB`}EO9V_&(l{oF}IG*lYl zFZ&Y)d^YQuqWvlBxYq&yf%~*!Dy%c2+h{67q!+AC7Eb*7`Wc<1NKKV`3W|)Zoj{Gg zuGZb*T{80GuQ-2l@a4>+dd62zbHRZRDSm*^E7R3{2^>lD5pVp#{~9En|Cd1m-8y-u z^>`)Aqt|Mvh9tB+yvZ!R#sp)?>P}I%&j-lW7O{QQ?fF_1CwOJXR?euEUYuBvj{GhvBH~w7stE7|t zukky_EyJ1$9Mh!9X(@*7!s^N}HyY(?!FJ+y{n!;8-f;VaM-9YzmTp18*Q{dc(^0Ko zy{%`ZqBNFOv`AgCAC-Y%251gTqazif!oc7!h7nRup;N=~Pd6U%h zlV+3u4*_Zh$-?CwUIUp>M1=&{&gmxMM^y;l)7+<{hEKdz_|~IxT;>^+@yQw{gQgPT zIb@Gul`J&|4+6_yBaBtZw0~~ZbuS8C;2X^`C{7euzKmyjYnK8DMWhjHL4r^Un}dJV ztFa>M3NcRNV>TN=X?Ns1ZIlB@O3M_h(9jf*6FZPM3C~1gEM~TVkb%_Bb0AQvkEL*% zaO_OfkvkqC1XRN~xn!DsY;UB@w+SnRiip|W*45I_xCQmw)j*+KBRaq0%GZCkt<|kt zUiGc6UB<0do`3ji`cZlvh8>RZT`PLSC<&c^qQ!Qle-#V-_X+I0=(8h1Z)xC|6kV80 zsM1Aw#LUtA@wfH0cFSsOtbmbgH%GYk0e*)b+(4vANRimNjz%*_-k5DZn(9sL!N?KI zRwmI}96Moa%Sxd!w(xOdx8o1?DX0)TmeJGJgOqR$2E|_>PmXel^oKL#T7>#uEh?3N z2V5O+HzaA9nk6;{o=jnNRz=d^xAn6({x_c;&1-a+XL9?unX^i|`(a~eV`JOew(;wB zw6MDN&8K&~_gT3aH1Y{Z_lZ)v3!-YQ1N>^Y%+XyEKPmsL3^jb`&=w^)Bkf8bF&KpB zV|PA8VDZEF@9RqF?)%%+XIC?f@qklMgKvYcgl^{jr`)%Mb7o9#IqBwQb=A{M%4L(Q zW>&T=hF-|!9uSTx+g|{SxX0b&9zMSREtX%A3EuCwLu^j(=I7h|5{(H>>?T!#qR2vs_Mj2 zt63(-)I~fK*a=!ku~6dm`F#dhV9@{xPSPcFv>97cUP(sMD$r<4`o~gdt$#}XM$jsD zvher9POjdP^0WN0b@HP17=@43cxZ+1`H9u$6XX^u-NjwLJOl zqt5mjz95RZA&2?w3M#sI(4j<1)H@S34o*ViXU1XCea~Gm6)1!;xylh3meR-+;TMc6 znSimQUdO<|)%v`EhXH3X=iLIF_sh{mPsx@FIO__dh)_ehnZgd(&thzp&ve|%!;^FYBA-p)!8r<-9N!Jx3P z=OtW2%q7VYsr8dqsY*ku=BEbCes(b6 zF%+cpx5T+JKX8Bb7pMx?^wbI0GxnN;8uX@oT=5T|M2HWn7Of~ z^P4<<{O*Si61b#2L6X;waPKNvM=e#WritZ+xCguIl20WG8=WK=QTVm{uO+FGIWY%V z0}TmQGb^Rw;WgF~$wy@tKEl20?2p-pAi@!X#rb%)xVQi&nD5DzxlDu}`S3xw&HK0C zD3at{YiD0&XZ2I3#s5|6C|y-5HAynq>tu$uk7Y9vhsjvp?!Sj*&Wa^3Oc5m|&Eq;U zZQXAOz*8z{YT}UthWMlBydc%|fXRkuB5n0sV zM}UL)$(+qfn#$mQ3tu9ocU8!tR^6kz24xP}s z*!k95^!5dutmGHdw8s!K zE#YT2?gEd=94)CQ5GT0z=T%xwE=PKRoFPyDjA3RY2!j%+>Tkev8=nnCvwu4SLE|ul z6^h#HHqZk{b=@Hc#EDLa04^mD(c}w1+OMB^QthCgEPXE~ON=GE1#sjRyS2Ti zopn}fvfiZ=8QP!ym+<}wOV&c>JEcY9fsOg7M zG547q|CbEk7<)Irlsz8BxG02Y>S77X(nana?~DrTF9kxZqa$6wjZz5oK*GSl%(Vhq z&RFF>A-#NIfbiyTY;vjea~vH@i}OF z5iIE>)N*M(r7zJcep>IS&#leFQIvaxqCaUto^rg=B^p7QS?*NsBoUS9DI}eYkMAbZ zU@u{?n_(dA0x7PqX-%=YKd8Q+B0*AX7Y+u8smagKC^ku6KyH(M2vrIQ~HovE7Ku za6_y>?V^P|v7Xi2mIirUMg9~(9y|&ZCdRk?Vb5GlJV2eV_cZQ7g0CggOh9pPobb}t zLWcyagtqL!EJE=^W{yHLfC={UxY#v#B;|(-WC)nibl!tEDxJcdH@-=?ujF)do^3g0 zuu%4c@y~9Wj2Zg*kqndIOl1JMWbP0GCUzab%!Gw3oP$Lju(MYF=Tc=~qtKxy6cHZ- zP#si>2)PZwGc*PZj;`4NAL^40WM7TlN&r15{?#S1x+eqTI2xOif@#CpY&#Pefm5nY zXIo0H$S`mEC8U?Vo8-2ZFQN1dY85LF`-A%!_W6N-aw%3g6JL^KtdRO9;whsZ zWJZRR5YNQYlX;*JmpG%kP$g8kJdwlUrjO&l{^VQ=%buoJKQoo$i4;*mqI^ls7e(C9 zKr0(3^S;FTs&+#vR&WsuWPF#tA!&{YmAX}L&Plydg1lfSoIS_NxM9DbwQZQdoVeYo zB&xqKS7%SL6?-`5=Rl|^Tbn2iI|I?Jt$!JU#9)0dhNMXwr|4N3nS7Pd4y7i1h)QrX zFeY>IABcJQ*RL(tBhk_-C+9-rV0&)I=JXzl`JWYTJ3Huv{JCRO{%>!1QtR+Ug1XEJ8ioU#>GNDANl;o9;t>J~%Q5La6 z0baG4`cheYE@r07d7apJkkviG8n*m=nqr&wqUa))FpTDuu^D5ANr94-+G$9!+C2jU zMm$If9qMO()&UJ59=xn<1~`ptoiRpt@T{N%QlL7UD-$8?aQ5SHSF9zAV%ENMPq%K{ zj5g!3&eEUg0}>hz-(~yjyc^tw<~kFR*O&RS&p)7NFDYQxR)wEA2JLRC;DR9ZP#D0I zyhuewQNb_@s}5jdybjGReO#aIj6VJOXu4Z2<{%2iF~r{M{uQf+WnDL?pqFx9GF`Eg zg-A)qlW^7Y2pN~_^Irz><@X3bUkF1!1#qilHG<)I61}a!ZGsfr;=f&+^>P zKO^6Jp|9ia6LA2y2)1KV?^~`f-9qpn?7eA>9=eawjY58%475j8-D&iSdaiVP1oKhb z%nG5jT-lW*4}O3rOSzDiql4;8+Sr<@aZ5zKA^P5{%sOY_|9kt`+AZwE0^{$Jf#-Zq zgXWd}6%=r^DkXc?v6(<#0`|Rnr9;FSCij+D7wHki@;QEjelJ0^<+s*}af37EwG{ z2o4F3RdZbPQ3dGSx&6HUzM_eDK;z!edj~Ryh{2Zq(K$ zFvo_;mKxmB(Sdy^U`##yRoapVZQ4eyZKw4#;Kz1S2i^biwf;FJm%H3Vf(|ea)YQua z)dY}x46NTd{&Ne2(7p*uumkby7QbM)sb$Lxo^}U)_Vm{DOcS-um0I7NGfga) z+UOxJI3i8(D*cFJZB4eG%t&+frF!e_dX0HSEZh&$)o@Y|9W+Cj`#}6bRn|O~x^I^Q z$ac$n1LO+&>W`g%Jha*p$Oc}M*oU+49%kC^T!Ag=3Qlz0Sk8cfHJKr zO2on+0=7XJ!scGXKT1aielAV325YPotB^5IGOVg6UQzK^#h3naFIl*jH|J@<3_Qvk zWcEv6GD#3K!m(?7ZCa<$%o(&ta!Kh;JIT`JyVVNJ?8?N7|K-!GA)KUQUjE>NLo9-~m zdlmUULeAfFF8;!B!DEoc`9i)zVY8Oa-81bI3HLFJ^(Z>&V_2Q^!CCQr!`-5|gR$r#5>y&rsL-4@gvya;jQC;lNvQ zrLQ!-QPp=^h!3~l>#YR!YTI8Fm+k?=$rJG$aW6X+y z))7^?F6sP@>peKVp~ue)<2#pJv0(kiMm+^c$dgOQjs2YlIvx2{hmrbDC+BT1r{~WZ z4M`U1R6ADkK|viow1Qft+pI-;WD(0-8#n}Y_VjIIy5Y+TXo}t_$(DRBAN%`mH&55c z$9?h8K^?_)%F)#p=PR$kH?6>dLpjP+j=BC))mpyZxT> zZYHiE9b*WtU6a!JN-fD&1aRQGhs&f|xTPny0jc@v7qGyQuC`-MLHKD7Y(({T{Z384NWkN-9NP`X+hLeh;iC{ZHoU$^!`%oEc z!UcR32Arq~&tl5{B`SXG5HMkvk+k4sxkzdg!vxWBcXgFgUv9ja<_={>kwL|ziUROt zn1HI~v0ZRRpz@5WtCHI>t5g$C8##BfwoXMg?m3q43TCaE zOdxBSs_|${axtO`+j>A8>lNZWVFkLo9f>T)IKnNF;1D{}8d^Pcc++~qZs79z(mlysA|VB2u~^o4|K>UDWOIqE11oj-qgj3+ z(yG?RMp)n{3R9;aV}iu46Z=*~#_Ic>w}?58LQeEYs)h5GmXMsxc%!x4hujCrcc&M2 zxn!Bd9p8~E4)4wXh>ti;dz5l$)}#`HNXQwH<(Y3R?pKSsz?9KwqK~39C)e{MRY7Up zJZX2;Q_1Myc#hTp&cx-i(>H2a7%XU#V%)I%Sx;fZBGe4B4J5juwN^pzx7y8p#uIS2 zdyK*d@V*DK4JFUi1DFwl1^MzjGuS0tRAQpt#1xnZ+>e{|jl1NUr2A#9&z15O?kcM# zO(T(bP-6~@U`8lyGgjAGId!^>3(2VzerFR;m`GDB!q2&x^AO~sW@+qN1oc=dhHK4` zjj&>%r(BgJqbrM?Xc!f-+Kp;CT@{x+){D!owr6^67>=chlICj*I&Cq-q6#nIMm-{7 zdZ!-|zSx1rP=5xrwlcE7HN3>!7nSf$MJ`hJ9-{4$OMqOeo_Sibou-NoSuidC3v}}- z=cg|?My+gC%Evg8MwrAUo|&WgSe_F!nqZ7>q%_WsJ7!&$PE!48NX?6|){|7Zo@TJr zexwh)77G~A0kt(G=|bEy;1Uzs0VUWVGhh#y$q_!j!gF$KR8c7o zim9u*5!j-dTns!+H=4K39g>R6!lij-e* zA|Lncn9NghU0pWIT! zGKVy5o9Ep}O*?c{EG^|(%j|k%&gdvzC;Q{37}USAdBfFze>O9uO_X z>7Bq_%1lbXE3l$-J-9M#-cxn)aqEKG#T6z@d78K-6!1+-Z2yF3T2Krb z>D!?6ZM*2ZE<9!Hp$qOdV{3Ct^)TJ3wtig&zT_O$l5j)4{2E(RL%zuIZjV-Rjy$#H z=}46Qs7q00v@14dpYJ6Eq_R5NkGkk#xqz#8DE(V=qQp9JCIb}vsqpxEfvs+UO5fRe zVs3lZHfvp5x==I4_*&lvK<1vA_;THWIT@)7c?cl$d#<_unciY$(O@@JShJVDayc?OFwZd^ zg~9GP?tE-~y?R|%V`DsPBv-x_KIJZ7Bc_Y&f@0)}dfi9OF^kq`)(j8d)2Nv_@PjSfE@nx4Cp#dYU|rc4 zOCI`N!zrfrwi?9)}SrvG=p*Hd*b# zJI$`FLok!M(26STVIAB|#Qi3}#Jg7rYJN{Zq|tgM8y+#zR#XI$5D#bwW7mixNe@6L z-5caC3pzA2v_Q7FhkXvZ$s&f1)<14-zX*CnF3|Xk_(j>3n!C4BM74l z7h8BaFEwrVHw8BR#W;wqGKl@mH#M!w%P`=&RNPP{(1=;D#8{LFd+@eCl}O6qKyK0$ zsyde(@kEY-ky?dJKbN-Bxeuxx(XpAwF}wT1?R}El6TK7K$v4WW$q?@_1?nO3qLLuz zIM{aGc0d6|Mu=%G89u}S*R&Y{VBXtl01~g+UxlcG2r}DGMRS}mPH5)|RY2Z4o`R~P z-s5pvr_wCXKngWG=O;$Ngt#EgeCR9)OheQ?R%STH+WQCAw2qgvX6`YJQZFufcsiG< z+JSOtm1?yotls@BW8h;(6Pk_PdBU05J62U3&wAjjp{s2!S76tk)j9522s>>SoMB=} zF^S!vt=Hc`D+n=lK734&m?O8Lgn3YwY`{> zAW~lEjTJ+`$auv;T2gZLwMZk0?AVuHq~D^Kr3B0wrxZ_2X@q_drKWgUd&YpTUS)Vf zJYan+j1P#*o=+4eG#s9U!sU1gd}x$+gi!!kW?s8uNkPVMI^=sBx?_C|B30r1#z`_iW2AXC;M}b2)Ls7HAY`=#(a^(7WyoZ5Mn(+m zX@K)+Tsn!@T0<0u@=O#~&pM|sFC}trUIcfC>m3a^jQl5;nqVN%hFyF+t=UXmUT9fo z5y;V-FNB?lgSF2vk^hmWU9ibeCP`b+shOG`!BC0D3Ie^3KrJt)gc4V(11Pg$iMqDF zsR>KOtL$;nU&j@06Yy^YE>!jCh)#4K&ywV@EUkqD-5!tXOn_P_i zxrMvUE-6WfFCv)n3r|D`G-woYN%@+Vd#Wixn<#{|sC_XljzXFX=v}pz-2iq0?hjj*$0eCdt-d3Ht%u&moI~vi)p5gM z-Ox95J;6ml{bgMZX3{XwyvTfkdpA;FQb$T8e)3?-Q4(p5iBvv5W>$gM6p<*-_X`cL zMgzR2mo-3o(2;YD#waYtsf}u6#<;dJ)<=>aG|2)i0KxDAOE3;MmOI>m)%E5I4E=7SfJVs-}^!o?c5x-yCcrfurZ(nak-!|l`Z zIz4()&`FXAOI^tMHC@NdsZPU`jTpOPXAp-SIk#6|Z&py!rcCOFGxNR?E3Sz|YHEWO zCj#AU0`0(ciOW<0p&onX$kvzs_e7u`L<52p72J|xrP(}XeAMz-YdG5FT0G>@GM=!X z*m{44Fv7w_J$1Fx@~X`%7+PxTE6)XYsQkH*T|RqJ=V)U0j7 zb7H`$(S94>^|YDy6oxLsQa7x}^-lf$8+R{wfw(jop@fTh4YQ>s2W~_{3Y~@!Rir4aj$N-U4O?6Mkh+uv`b6Zb|7NqmM3*Pjm$dnf0*(ay9p`~B_sJHc>n}%gOM45Q=?7-qZ z4X1unYJe4(@$IN&dB`ox?Fl!p#-XHEvO*MHOODj^b4ZJC$9`l=7hPIL1np;tFJW3~ zp0`A1lkj!w^uGm7;jfYx$tyYOu-i_39oKQkp0p5)Jqt8gLOBkV%4q{yGL*=0)CX&8 zH1(jC=F&W%u@FOfCo3v4uwqxYBHy}IYX*Nt5f4L}Q4ZRMWyx&o@7qFh1q4FA*D|$U z8lvJ2%gFVZau#vpit6oSQ-|@X9efBWbmz!oD~`kk!L~j*_@miMAgTeu*&WfH3sO6d z586OC0`jC*Lx)BvbPJA@oWYU!#_(x@^;&3|x}!rXJg+#<01pCsdXRi5r8aj*30@U` zt=W~8K^(_~`Bdy8B;BJ)!4bt35{`IT|mr81ElPPF_i@Z>d4(DE++&mGs_M7eMl|9r5>7_ zy#}{giClW@NSnp8nA)DKbm^qTWVNW7%FQWxS2T-5#$3Wf?BmU454xzG=IryyfDmJ0 zmZ19j^qBz15m_Ps5cLi!D`|yV41v|1m5xGXNqvWG2DCGpYE#>b_}que+DuO+C0W;` z%2*AhxW)AJ*Uw zwZblMiJaY?PnVK6hNiZ+G>v`P+rsT-fr^ye%K5pC!cPw^Z$7)XizBd>@6)`JD^;M% z{oi%jCMEkeOOVj*z{=DWwws=Bi@UR>-GhaV0m#q#@1On!QJn9bL26>U8gf^G>lstF z3kahRz@^BtnT&5PM$r;d`aIi5(gjm~QkR~3CpHu1Jp%QuCc$?bKC4#YU}}W}$NLQV zzAUElotDF>6T+@?)2Z<{P|)%zKUI}n!qZU$P+i*|9u{)v4F<#LdhpQsOG#F#< z91EVXhh7_+PDvL@+FqKQGU2Ja&kg9s-mHa+ot8>ej!*3GX5uwX_t1K0Rd-snb15k- z)ybBTh}B3EIB*cPR7yy0s8NG~F0D)a?)nkf>!`jTRZ~5SPV)Y-bFE*Q1Xb!XcP{}4 z24-N#u7Rd;5#h~-gt*l&Qi8_w0aYZ>mUh42tZ?yHW@?mpWg(aIbiDw&YsOGXk4FoD zeP&TB7LwpRBrA7aXyZs#wloj2IONquxr#J&`>jKlQ(KUllQq3tkB&T|*YqDsvxNrq zw;wc|F_vi=N%t|$C6*5BQeUz9E+cf*sefio`NH>7_dUIA%}8r!@IW-g3Pp%LZ?@8m zZhoxhjj_UVk?hElu5TM8S&WVPfQ~V;zcIYYL*&vDXdPr_ChftfMD7vLCRFzJq}ukk zB8^G|wAaeBDt9GC#C%&b@X^*8i038vqz#`)j9O+kY;@*?mFv`9TicmcrftPd(rjdv z*&xQQhEo~%Gb)ig**ZL(8<|cYPG&AP5>uRBPKi!eD@*(6&g^q_;%GJ0s((YnN6~Q| z4OBH-3h2LE*V&HbDm=*RERjzNEWr)&6?-^gn$ZvD?aoSBr4?m{Oqm*M9|jx@JpMMT zQ$0OS>33*wN3#g)qs8;re$ZM%S$l4>L8@Nhf9%{r1-QN5PKU$lt$9_mhd~|=rwiZS zMIX@wWTEDY69y2R!jB-qQJ4`G^w9nERPaZ7gOWK^L;gST1J#+B(Yy)v7|O`)F2`g2 z1sYq@w8hB+y5L`X_-#y(2sKH9`lwXTR00qbrnmHshv--O_)*bX2#v*eErp6bQhH?R zFntwS!t3!uPmSUoQg=?b3&pv|vMokXR!i{O$ia0&Hv=J%O!FT+kUX|wv#pOH)FSk% zj{rW+QCkq1k((n&QpYwlHhm@%TtsGJn7J+PhH6S&nga|z3aAwA z`~0*%OkdmU6%$lGAG!b7P<*)uiiUkUZ7!8$DD3oUmZ`-z2|EG66XqdS4s~2`0r#zD zE4jl*kIcmbBtI9f6YG{nlMqKZAK3LFDYECqpbn}X%T3N{!*&I_Fya~sMI2r9BbChm zq#Yu^h@=;W`!N)F(JO0l8tb_tAEB?6fWNG)FjPU0Rk6_@#iCb{wS(7{9GgrmSi2Ww zC>ZlWLFC2SvoQRFvR+EjohqS*eL#N(3m8GL89It#iEa?B|1AbOWU3;S5yerObG;Qgp$V^8Fsfq8c&NCFa|cRrj@q3?>eWjaMRy<}{&a%m=UlH< z%Kc5(|Eqz=LV@!GKe;T<2M3)~0&T-B5ZqSw0+G?2NSoyRNF=3|?iF^I%IKdTK-zl^ ze|P@OsU4*sWs{#Y2TE>4;wJDGBv#&>Szo1Q!J4Pah28`%#?nx~H>`l^nO)KdF@adl3? zl>p3_k8RtW7!%ueCbn(kMiWnL+vdc!C%mz3`|kJsw`yy5tNJ|jTR(N5I@MJ_DQJHt zvoQHr@#b1HI-xPTh!C2pPO{N5o=}<=v<6$PFm~aCXnAO) zA(JXbnSaGeJ9sLIdDgQ_cttEf^4((Je?z&WON#Sg`{E`1p@lT=Yt?l~IF?i(__^Tn z&~>Y`O1xJ3RL}W#%1rY(+_$=NE~hn7$Yk*6!T&P^$~;_V>0IoHqmB48Rkj3ybC5bW zp?)6B_zTF~fIbtDcU@;+vt%2|5-Z0&is*wj%fJ7jWP1VL89iGR*+zBUF#N0aBfMbQ zs|s4-_)NVuG3sY_$`>-?M!+Y^55WLm=~Rv1%rAR5!g$C^bJ|z2)gl@U=9zHz=sX2m z7pX=9JW3gG)cRHVOv`g=Sr+m$O{HZ(wMF|%R=pq7X`Pe*Exx%lzIJ(8D4f(Esq;9Q zA_%U$Qp_%hxKw$A=7e1E5|K@3+NnTn(4+9n4&7;AIPop@WzdBgz#krh;zwn6=-irA z*Yf)IrUqb;s$%1s)->7Bv{3;u{>w64Yg^%yM=PAlnh=DIF5lFnTMh0*(uz3Rvvo zhwS6pN}J<)nPpgi&_uE zidN;Yoa>Fgcjxj#m)MbMBGs%jpivC&(sfb^HdIlihdQ^w1S`=~KEIcPvvrSZ?bR*w z<$mnj{KG+vEbj}PNH5@zD!Ek*)bk%K!oZoPK~qb1;<7vHf~deg>jCB&s#Tm zDpS8Ho9K1k0)w7XGfa0E&Hu^by<;6#=V!JI?IFBWcK$uk;vwTw`=WF$a?gr4txtrh zdylU8d*_2YMh00C6Ru3xW;|1Qhbf1*7k7mXAc!r7OSM48o zyi4lJFIMc6CjK-{`{->IOH?;QaBT@kgMpn+iZJ6S=#NcWM?~HnwJ>Mz(+^CN^@?B9 zdS!>d$IgQU^$S_b7G6bgY_P=>2^}(eWh}$;)x;6pb&!ZkdMG;UMS? z{GYWd-lhc`L!1)mtR9#;r%AH34L96jm~^!r<0g0?iwfj}R$`{l(K0ycXJ*^?X!?}l z(KxbVQhjc}{R7XvWJNGSu%g++hmKvTf-dI_$DKy)ne}uPim&N9aRDNoar8<2a{uf3Zvhps1=~uZ4m#s*PQ-V!pczFy{ zg?xbnXQ{1E6K9&FUwyl0KS7sr7}F=%>UbtG@q)JCZmJUl5yy5NZpwiNBUTWa-6Wdl z8VP5T--Tp-+Si$6%Rme3H)SKx7vULzQk$PUU+=>&{ky%n2Y61`+SAe4vjwzwDE{_x ztM0ke1bvh~_D!^$SOc1?^qhQytMpEE&@4!>?Yt4)JAMr;kRi-9zZi+@g_*d?zmeP2T5!kiZRN7VtHK|ce*NH?F4O-(v*Z`7;6_*U z@Zo5g-`Uys>R1-t&auMLi7U0DNGQ~PLh8k>n-ph_8zv44mGON0Q1(5kru>a#sH@WK z+dfDQwVRL4Or<5O{=Mo_2(j&qdOei!!;~F9G+69rI*b^XTH<7rDQm1tmK z8h@nN?sgN~!-gF4LvRIt>Y-k;ySn?b$V%aFcbK*mI6u8g%EPhM#pI2Bi%7Czo2P1` zCeDP)tVp3h3ZfZA$j&oQSoH(qtDQ-~=+IsSZ~yg}w30s(P5>#A|0L{@yNvpNn0724=~* z*&yjy+&rD@9sOy%K>=@imzVuxH`kv5`M8n-yMf7?&WnaLAQOVSbca^^S+&*$_txGL z=DOBYUh6~rv|va*08hOLOZ>d&WLbQtJ_7^c@4R6A9rQVao96S4GYz+vJ@lB%g`{}aX{=}F@;s(!UK+H7#N0vFM7PCa~6?dFx?I44e(vOGSH!Mnm| zhr7|SekZ9F^HGC^xEOH8PN!rd{8<>?p`8NMW+$0d8GBTB^oCM@Zo?rsGqy-!_T5vQ zLzj;8%5Exij0G?0$`sep{8y+2Cs=uUUf(5*P&_3v0);xLwj6y zk_kuoA9pb?;Q>Uhu`8S91=s0ARL9wXn9jCml+xK)z#!>FQ^D zLjK_o9^n(8=El#=OOAXP!hBFkb%@1sm9N$K56xN|#--BrVmO>C)tly#t>PCgM8EpV z3$GUt>c*(hi!595!ne0HM-=%xJ0A~>VRvIAC8$X7$Y|gcckS2PVoX?TIp+Wt`LyM7 z5-R7+x*y-F^`v@9xq1Q3CpZ0>Hml5p{tnr8`@O(A9mu+__PHm=l zBxO+VI>_z=LdT^vt@#2zCB2}ZV(OoyLCvuu;Xb|tM&B3;J;$Ftt3>Z}4P}ys7!>NTNdvnE zcR9o(RM^v~(oRcL1;WtG1%`7U#l~R5uz}-9J@5BVQ@ZM3L^B?6FY=TB_E0}}5fmfo z5Rk1hpDgFumoHtL_~AdIoGYHb4pxOpNxtU&eO?2a8P5d}M*ZSkZoR{D(BnUe&Woy1Hz7y z&V9;K=556$!C-UYakH7yMHt8OqVEoW%yrED>i6Ez^yK`h*oyn3!-G0yHy|Ux>cpgu zqd$|Y<3$XLtUZB5_Io-WJ9g*5Qk!_0Dyd-zvrmW@MkvsCd`C}Fjw$6I!I84e(moOBO;@FL26 z@CJs-mp3PUsaQ>+fZ#(sjI}if?Aw!h)C~k-O*1ROO#yxV4PK32e4NNxL6hZJT(yFL^*KSTK|8=J;r$fdN zDR3ZcW9h46n(j-?SvCJ|HN4L!=wwQgT$_l^M$Jj+%B#Dx?JF`xL*(oDQZ% zd2~DiaD!w`Wp?rA<{1sx_kbh17iL@0=tqoPoKJfARvT;zS9$@mxv?W^=d{V+uO6?q@I! zkihFaxLYC(?V6ny#@s;6WA{m`Y=SI|=Iew@4(he%AUtp-0hJSjEd_#UT6W!Zy#Azg z??DwvxgaoiXnh#Ap(c?*aa1#x00kD$hrFCwgq@_+e<71nDs;?latlj~H!h2#Uj#6m z_du|H1{szTnp01cmHKFAp?*T4FzVK7NQP&uh!Tx5I09_+veB@AkmIa}sl(EhPb#!R18bqy}J8cxF7?xo&?7RI|axjRZQMn3LWM@{S)O5Zoe zApE;tGID-vgk8vL37ignnqFO<{i|^9Bz$_8`EO-pNnme?8ZL#{nb|G4Pa2DQnK!nHcpk6_IwD(WF{)t zFI!@!a?<(YkwaIe{4C~ed7)q5s~b`FI5nD-8yo<<1vQwj4PL7iZgj>JKY6CZg{9PZ zXal#G9v35V{JBpxY|G*5lHCtAZstD@CgN2ed!wDJs!vR2AohIU_JmT@)T!3d&*k5C z6hZv&N$*Ba)^2v$kA2x2@myRajoostgI4va8} z!<+s0C}jhze5_h>Ie9-DBATG6y#`v``=_#1L0SrGG_p3Qnp)!hk@$ST$bS=3ReW!# zM@NmB)!~WeuwrTCg^s7>e7p+B9MkJo!iK3QDLCXeBXoFfLTwWj5k4`DeNf#WO=@|G z##>Cn-5xX!V)&I}cD}Nsf8(|!@SK)envKeCCilhzzUAR0w<7c(({Byl{()GLm_sss z7HtK9cHOrGCyyx9f={ZronLDmBju|L?lQ`EPgi4#zId}^lfG+pPMc{U_1PpRQ1QLv zQ@R{)EKlX+2JDQ7?J4N7dlVD^8`8r(0TPlM*!X!)Mj{UIdB5Z9HK+|td3HLpa(JTT z4)|!)bb4qu$^(u+2!q*-X7pvbDqtLw1gd~OX6}H&>%xIg=ews03z{9DpLT)L_^-8&mu6)?v_BC~ zI5xK&4ouNAqX>Bf_yqVj{ea8Lx!C(~cd2qSDM_tGLzD}Pdfx>rH8p=SZUVH}XBjVP zehS5v1^!H~8Ts~-=Yp7E^`4m*yJ8N@!)FmLL#;xAP?3+W;CEaVYqblZHMJ z+}a1z^Nts{`%pY(x9W+F>GHy*vvl`ioFvz*iBm%lYp2*Qp9K5paAEMmHAMG!Sb)f{ zd7zXiqzC*5>r~TQoMRY(F}3E}uIO)l)P65b^hXxm|J68U(=ls-#9^;l%0Q~QS11<% zu8oas!gyAYUf1G#73d8E)WW+YAko3HH;~o>srGZe_x<3FvE2 zQg{wYBEW|FKkvG7xmRgE_YZTAH7_rr$v5%JsJjLmzS1aJw>9cqKhSKnl$5sW$%jBk z7oaCAF0fv+ulDv0LM)J-fjz73g%F0S(8l-C0f zIh9-O?S+AGYScvn444U1ic;nGg7xmR*lw$VIr{7zH7EWm)4}HaT4#iZNOX5;WGa3{ z$rsGpr=$ziewH8fT@s98`TF9P1QWbMX2DB^+IsY5#gH~;VE#(&j;4Q)9>Xa*Hc)Oq zxq!)!-Nxyi_fU=1k3@8TC@qT8>8-Toy5P2}@KH0xV3$=5l!O?!B(CZY+AsmOI`J-{ zi}q8#3ZekXj7ItFU2)suTa4Q$QeQ;t2LM+DzW+1V^*)F&KIs!x1t(wRt^N~)cn8RQ zF696z6~D!9q9tsNnPPM1C&0ZbrA=i8q5shg@5x|K-?lO7v0D zZEt7o8|pLBg{5tVc6pCT}pzFxf)dg8)V1UX&?q<$@a=BEKqtUz9GAct1& zd5}}{S4DHjlQrU%Fjw39)&CwK@0mEM$q4$cpY%`neEe~vHy`!C_K9mZ%$SBaEL`;Bs3CELH(oi=WdRq@_Kf&VTX_FNf6a+`(dJmKk$#x1yHMQZ;d z(yPP!iI8H#DT0&o?Ez47zvEJl1vw3HKl zP7_qd3B1*#@q+SSw;S;A{nyEfSBQAZVzQtxS>fD|+s8z(2^?}? zf z3Gnu}Vz~zbAVRSIz(bXPuCI4(1rtYd4{SQJ+mnIWF#5E$$w%t1fuq2=1BlWUOeKSi z_ssFT@47K$GdAw2ZOhQ=UW^LYv<$u3?l~GEX!2HsZf~X{TSq@*Tul&f%9AEDh9}JY z-`hr{3PDaIr37IkA7P}1nhe4ueS8&bz?7TJ4vc~2l|$I4(OFaaMnn1uuOpN0Z`Qh{ zN?5$+7++vudbY#f0j(F^B5a=XIYiGCtH7X@rRny^959H2YXR(%9{ey9-vqs;9GizM z#lEMwGDz&#&Cf{ykFT4r=WXZ9@#AjEi|@_lShQv6PQRa5+dcW;C zFuz&J$6n=84aUC}_H*-+H1bV+SExJXATmZ~_6b-EJC%t2vbYm}w|4mR(%%_$#&XTc z3D%hmw@><(wn0VblXkE9J=|ZWj8ntTrx9oy)(IKIB+e+ib#ojk)l$zG;MlJCyH{3U9drg^|iC2WzG4 zupF_u46=v)tf5^LdbNc_l3o@NZ_P zTM=v>*AVmJtH4AW9`TeQff4O39+j`uIwF!^=WOB1Y?ttg>fk7E0P zc*JqO?~q=)tR@=kgWBp8maafQlE-q(vIo2SP4QC#&ylPT`>CAictYc$K5Cq$^NHQI z$53;EFtpfvh}{f)9bDzQ`MjxZsNK&a1Q|zY-ccipC?jXtx}Cy;!L1NlxdVx+S0W-v zHJ(hmA5_>=C=NRxvl_L_^K|gZ5Ts~MCrEKnA=k%5u{{aFjq}q_X|d=}Nk%6sP31v? zGo_%99gtz**@w{*nA4Bep1c1XiUnIU#-QiXKlJi z?V@V+M~9Lrh}dEdC8XcG=7FHs!hyPo6iwI$U#jh|_2v>!pbvJVbz@ z!x>hW;Bj;qi078Z4E+i1cZ?Y`HeMB{(2doTQk@0PgYzgSDw?K=Ni5|5q73pWEVgvBB4NmNA9lAKUo*sg?#6Z&s{T8$m*y0&wj=n<6S^}qd zHbLuiD*HHr$`+JbI@x^`I?1@Em0Q_TMuX{k!EEkKYh-CwBiifx_+}Ap6b60o*a-SQ zR;+>KD{ko6UX|ZwUd_mRY`k zn%hJ{WpV(V@uiAS_ruToq$0L>(r#x}3YGA|cHIfUFMcbpg&Swzh&#k_5Pcl#hWVMh z3w24=JNpw&n+9>k!nm;;aI1pYe4ovQawXWVs`0c4-{C6YT&AQ7k%w6FKDvkWp~V3* zgRo#j!78uj=jf;y!$rnm@wAwva4666(L~dtA3Q%HE*rig2a7Qi>@{;mOp;;+Ab;j5 zs|byXcvXrnCtJEFI1HaxADcYXREo<%5=1O@kdL1=lO0EPgV~C~~$A-9o} z8o4PP2p(;zWH(PliNOj7U?V$EMZz0Lr&Y4#yeyE4C`O-Pd}I%0;=iWAO5M%{f}&0a zrY~SAFVTP6Dcjk;gFTW<%5gnt+|4f*hHND=zmw9GTm)sEHU_a()h{H||nhFyE` zDiwlQ>trKSwQnLBQtIi!ggl<7uc?@nd03&yFlfME`-B4=ch6Ii7vYNIo`}H7P$+pb zOf~SOD7U-R)?^Lv9Zq;k$B;Vzg!kf|_(zLU0N)U-5TR&vI9YpGImXIUQbWm45AhUZ zcfy&e&)@F$fEURJq-ZV;=akWs@s4je&yAN4a3i`36^)BvvP@y64ZzL*Lh{<7q@buA zv5SU#wh%rX66hOnt7c0dJm}`F$}rALFp63! z>~g-;;z>74s&7L7*}vBRXxYK=R7=bMYh5t`P2K(xtAt z**B#DT9OtM!>Q8Ig0iH#hZN1%NseBmS*y?Gu+d-+u}ZcY`YjxyoKJqac)K6Cn5cX} zPlR9zIEjPHVDh97@D33&0w5|9{T8Z>zWM~CAS;v??yO~3^-qgP7}XbL-3M0WKKjl0 zU;7?(Exo<>bNpma#4_PDZv9W`V6Y9&K+IAwUQMh-1Y8Mfu?`KfAAa-4(*Bf2?`b|u zU{KhT>R>q+d|AC(+bIz8ezpg9TgD>>*xkxE`~iO7G4stRdy8Y;Q$a6P+@RPjRC-4H#g2$}*)Ke%{_?nYl z(e%j~?_t(DOz&#p0iDrdbD!^}p%!=g_D;TaF=vh4E4rODske zi1HE|zm2-h*-SA^U?QX59rWmSR+IO^I@D4FU6IX6l*-qiQ%X@CEw4& zD?7D96{}q?0lC882ckVXu-gzr<^6Y9DN~VKT$Y%rG#3n_p6V2Pe(D&TmS7@kyF`-P zrM}=$0%3;1x15124@fHZiKke_h;c>uCmkZK#0ZHr(CY$H0EErstnS`E(Hsm2aFvl7 zodrD7UY;!j`c$pSS7>vvS8IXSjP7npdNMh~?IMMM=tUf(I^%0Bob*BRY5p`_t9lbg zunQKL#(c7R0e$-7%~h3<dJ;GIh4rpqqPrqh79^?(z2R`%9bNElXDw?>9mzM=K z@SN1Ynt-gdZHZr!KVTvyB zHxU#1;n0Fp`WY&soaEPDdx!J%3PjG;`j`Y0ZX%IU`812ReEj#^H!OfPzww!*MxNb34{-fv63zhRS9ziKp9p5E*@-d*B*D zPZxx9*7LSI&<=%!&CoANw^N+$si>Bw%FiDA7}6L9ZO9We6jh}#*5U*>{1d2;nO20)X8YM4seiA<=@UvFNgpqK5OFK>U>_tGojC72PA*cYf+$VFPt^r`n~$NIdq`11Ic zPA1?qJ6DeD(ku)uazY7$%<&h!E#}0WFIj=Th|M(pRp6|(0CexNB^mqx61~u`HKR;* z_w__v;cdX+@O|4lJa^py=vh~%PWPwkK($;a0N{3DOUJ@?$t&P$cJ*_|=+LOVb=$Xl zJMjLHEvLsEekfS!3i&R}Jj52THYjCY3c*is#cQ1=Hi&S^clGDA`nVE6p33J_@VO zA{CY7E4s=YfJn?4PnMsid{X#+;a{?@tkKoe3|t5LmY^ujVGXnnn7Tg3RC4FwR~0zs ztD9lbZDqg8{sUK{MGNyKV4L9M^n!tHDn6C-XfytEV=uG~^sO-@&T*0RY1L4BD`6>P zz|*qdCOzN^Sr?5nFYe8UA>qr}GpO)gA2R}UL>Bc5I~c-7j`KLq!rm2}p`P%$O%Yfw zWjm`0ZtjF2mU*KW)vqQe!;m1(UrLA25&RKBbA?gpei_^WJO!IBzwlry1FnX~j6PZ8 zdUPKAvs$8)p(;uQoiCA@Cv20>l>9-!w#faDsbnyNf8d1D->qec%eF$co|8wyptreb zPz1>HR9LV&^7zQ}T;{1b#wVu}FMd#C{d~PMTRrRD-51j-F|%xQ{<^}A{VI7repr?j z4mFLsm`CGIfi;4msP&GZcU(0_W$+%NSL`mBtfjFQv%DIpjnvi9eQ(JqkFEnQ+@T?c}|m$dr4urroM$O)o5biee8 z4{LDlxPX~z)SSs9LWmKBIIC3c?o40ex!GJ~jRm zjaoYXz3}(TQ_E@InAo}i%U?FK^1$vz;HFJ$jt_5k#P|G!#8x-kiQ(FBHe^hcdkV5p zt?q!o;3W5=+BWKf`5&A@zkb16ew(0T{r$fAOelrK3hXe}^U*KYMIaJUk zps;*$_OB=rYA;a27Q|fDLSdZ%4{O!)!y|w3KJ-ZXpA#APFOA6_iED%Tu^9a$N|~ys z*j`KBZtb8Zu`6vf2Qd2aU7Y8cmi_Ydhij_ufqp80NK}A$FIN#EQ96_C zYQ4}J^m;n7hngmz=wr+t{yqw?s;5^TmBa|sMA1&xg1gHtYwO!;gq#K!T3Iiq}>4yC}2lzI|Xwzt9E z@#F4tcDhwWy%9-)*F1d(_=s*sT?{W0Ng5=lb_s`X#k0~2DryHg=ZbR zvEaR7R|b~subw+T#qCeZxO8JgRgSU2Ydlyve+uJB>tHekb4HLn!A0HQtakKPM`q z#_;M362NzLMxj^x3uDj-p^9lO1<7;XGIb(1A}VLp*jOl0=GdOK1l`DOosZw&!};@A z!2?Mlw*Bgl#w8-A2|Hv__B)8T{GtF6J#_~*^u?NkD4J3;(=BPRaV(c)#eV{d&AS}6 zJVKc0s%JQ!bf>#*5!re+`y|x-1{5bbf%^dJ-ypdHZERaRweV0qu6}`HJ^&>O(X8V* zTQ5|Wa_QjqKNbg$kg>KyF;zLYT&|Lq7Tw;Sad%OZ%Wyfz24Xescd7!oIyMH(#-)l| zm#v+ONnw3(toI{eQBevb7t`NUZMip?YTA3Y*L9s7Dpn|Yw65$uQXEx?{WB_HkJxh% z7tU=+ZU!O7dh(Pc?6+fHUQfs^6D>K4CubqK9MBkw(U@XZKxQZDPft#(U9S$r!n@_V zef>K-`!Cn#NBI_J*-<;Oim2cHTv7Bb9!l;w)&1k9@*rVpBF|`Z^Zo;f8Q}|8LZDX^1M#|YQ0-(gYbEEn2 zb^USB2*~YVVYGN z|Mo@Iy}UO~2>ZY%^S$2^D(nV`vd>S0j%`Lc?aDYnnEL}CYg%cV+lf?~p;KunA=UNmJz-_xG4 zDBmfjsBxJ7PwGcqj|65Vhf>8OJo>QnQ4!*o{`VyOmjBG(|$J{6yp zNepIioIT6zsK)J?UBpl@W8}4A@N}V`VOX$Wl*khkb+`ym?bQkRYB@7xrR_VOhA)0) zjr}@{Wu?@v{AXJ{u`A;G81G0Ef9enLcf5s_wDVF-^WVKcDp6aHgJ7^)H5;_S+j-O* z%V@q*LL+Oh70<7&b3GTKFwy>;mwdz;)V5+x+9!86MhZ#bq`SgzDJH=nx<=ua7yUPV zv%#-}NeOoY_=##hYmb%!+KL1TP`<$U;m=1IkLz~-qH^K%t(cW~v8r|Zegj8i05+Ov_;!=rKAow4 zQ-8eCCC7Xlc%(8jl12-Z9iuqSrQT|^)#sy-o zKd%9VveD)MVc_w?cD>hs1R_|M_o&TC3hWW4{?b*D^|h1NTV#!wV-0k=Pek2!y$%nL z_ojV2RQyv==Jk`|yPnpp6GUuglm=Jn~$cEot7M z`viv@KVV-o#7i6HK04I6H!U(cj<&JyWHXuB0v6RpW{78vZ5dx#~)1T zf$iHE?jF2TDgLzT>QN@WssZ4SS+`ASyGiMBWOVY1VCQGsAyo4`|p_ zj7Rv|$8T*(Z0|C9bg*vutw9D3QR~Q}FyOLi$tZG0^DWZL_Df8wM}?KN6$W+d z9hEc{Ue(wR2To#-^zfJmR27C<5^*7L*cwXWO5$K?%kvF(BQgwr!_3l&LJ!FT?W zzLOjF`M^wS5zpy^6Z`qPo4eoswDw^P&nVuKykVq1WE=)SRhD9F2#TNEo*@-9S|3#g zLx`{Fy~#-(yWJ&rWf9)U3bC{wq3_m{OlL#nf>bhd4};TAxj#dEw9LJC(n)6LoQ0I4-v&B2ZUP)cdP*W5h?SD%q-WQetQENj=V@nFheibXxz+*T8-9Z# z`FB7YUkzwydwcU-<#S9r+vo{obVxdqo5-KL=y0eVty|(&J=l4ERXj0yZH_wqmuvS;my0WehuE(U>lXPq4Jy)@Gv?L(iY=^V zGoib3Em4J)o)XebmCrdHPMa!F<%Mu9*DJ! z^7G%r+|cKTzMo;F2?M@N&Wk;`DiIn`E}RP0e*cBjVa%T!df^`AIrV5RikZ60eIit8 z|ML?yV>6}SR;%;fgZ9LO)~6@&!8g=!CkrN#>9VSvseaiBS$8OHhtFw4Soh@d1_;{K zmyG*jfiXp45%ME^i3jzycKo>miE@5wJ)K>=&&>kdxFT7~L+6A+F>ipbR&cA{s~Kc> zC_jl$fLT}bT`CBG{=q`s92ef=#7Yt$w~Vr{xjTZ9v;FFxKJ}K^2`dM<>gj|%FWjF#x}$WP-HG*FOD!z$&js+l`D^F@L|;arcTQy0-{L?E^=a;`8mPom%>k8FTh>=9_xCGlwq*Mh~vG>EKRCeR22vPr#}B znAP>=6Uszhw+wtfSU;zR8hv@ZUutz#KjXsTE}T{gUqWMi!lY(i1!CWOg%<(>1HIqh zkGAJ*%S-c#1cU|ng-jm47-E|ufaek_m;;vc}qDPrtgZ}j#Rb~@B3%(KtGX*Ptnj$edZ&ip&5piLWUzNxpK`Zx7Sa#_iWOy} z<@eqYJC~_ZkBeXC`Wb)}QBH*6Q2$S+1e}@yO=@vh1bTiPrtNf+$Zb*>;Ae(=PmRVG1uCPtqP=?^4St6b#q!;(5>ta3A!~=t8J`IU@ zX;}okTk`E0;eC<%fDZw`;4i1UjCBvG%7J_iF+2CG^>nivuOj$g9)qeGomxV5JpA{Q zS0_3^Fi#s5-?AG{mD!Ou+~K_66~v7Yv)C3wkm}=%Qp{T&p^9J#UuTjb;u2e-upSvT zl0-$xM`)F;@fOqkf?qx{%Y*yn$vuCj)Xt0qbJwPon&PWd4Q95M<-Cqak}Iota;@Wk z>(AtAwJr(A938Si81o~n+34Vig1^WrI&QE*c>!yitUA2iFbJ4RUv(`Jr&3&BN|#a& z7yC)aiT0cmz2JZ+x2`MnP^d24+)KSBMsdJNZZoeJ*6l(bWz>jKKA_Ov@>a94!H7LK zt*P7vV8ucu@4NghvmQ(Z)ND`!vhmU-%tbi^aJ7>G` z00)CtBO|t8TWrSnM}6EN3fc1q^!`gmIq}fooBH%tr~0qz^MUwYZVCQ_rzz{pdeokW zhwLXGJL1W(3#=EAIVh!<^WdfUJ@uTER9Ka0zO=cN?<)5fY^al|5B#y%l`ZW9E(_}S z0{_+yKOY|t+y4QJq_)zRM~q2VB?kb!&3kr!oOCuHpuwIj!f7jZ0ofXL8A7+sIpgm@ z2-IQ2qX7aMcM#wxictx%t8bg+AjIGoR z#mg-WF(E1WIw)S`K$3vwH-PUCFpG~U=jvz6%M;wWd76YKriX~m5Uc1E^5_?safng% zeLgB^TEwxNR$I6 zhOc8cPrYqN%@jWNCq5t^LiN{Q{3zOS^hR+|mZR{G%%48D>hVPq+ndHhjuqO!>l+A{ zh#W5-OWHvP+fj^%>fPdTvmSUV6EDF0{QQqacRiIZFW*-HiiV%x!JTDCEI%rHnKxH1 zs*2~0OAkrBTWYm&XjrZzu(z(G1OILBcSmd?TaD@5#Vh*E9f?$X!2i%gKuA8Pz`ccR z$Ru@ zS&OFVQaN)c6K(k$b^_5-g6)4PWuNlNnJhv!Z^XnL?)t(jFcKb$+`;AR16iXoWmP|He=5 z1j8eD+nYb>eo?_)JJ?k_uXWc-@rtW~0!-Z6raY(Uh&06~&Nu^vk~tmJmwJCQ^t)O? z%^b1>m-P(z%>-mznr(8ADoWF&jt*wMmm<9m^_9jy;{I+x%X<}hfRr6QpNr&}qg8Q& zDf!b-!8*?=!_cq2hgn_~L45X)L7Rpaw%lrr7FO`}9YHwWsGCQSr?_1kbyZXOhaK4$ zJSzs8aY|kD%V#~z_QS#U3oOg&**AXVkb!{97^lTQwj%@MSd+6YrthPUx~jAp{^Llz z%{NEK*J^?#XbC6w>?+-+r0FbpQ*p@Ezvbbl$KxGh#(mV2l;qLvQsI zmBl~Xl}s8!T)w3+a}7g={tfan;i-Q5R%54tp+S)d5loy(&GI+SM#>IE+C0IiV;e;L zq#>P|xSYxL6h9|$E^-x$rzBOM>GYM5a2?ZUZbX2zy2Q9}k21D@mRrp&!%}p?a%1Zm z8-(0$4P{kt)o)sBf51R^F$v%2drNO({a@|fLv$v9x+UzeV%xTD+cqk;ZQHh;iu1*` zZKq<}NhRs7bMHNUPWSCe5C8SA^$zws-t+y)KnWLF(0Xsa93fwqnlZ87akz}eXo*Yr zc5I=KA{GpBjT0B)$~JvwCzfT?*~!)8E*M3WX6DoTLKDL!YX@TentM-4WTTt}HC-(k za#$rF=WvMOZVqa(`F9e;hwyIdK*q@EaFiar;vNy9d#qiV4|X3vp<34WS3Zj^7M_v5 z9cwmbfra)wZ>STM;{GLP(Mn~h;7Mhw3!{f{X?vlztGuG+{|17nT4SPZNh5p3BBOEt z5zdvF;SK60B9}%?=q%C<^lH4cs0lPF1NV-lNHI87@RS(x*qw6t_!2`5OEM2CZa{HJ zIdFWX`EDRShCl`GP#_u&rs<|E6d^F1s=A;ac&-J7MsJK_O+7E;xOgg7@?s~(Q-9}8 z0HdGTXhZK>xE992AR-}EH9N*L)CABg(7`i8{Bk8DMRgaX1eBm$yxomgb*E<}=X%Fr z#VgL~3WY`9lYJ$2Tc6hzeB#3gIa#7C$`8n@w6Z0}bf0;9XZH0(F%v`x*9nnw^S&3( zgclQ$b07hKW=YJ@1oBn`+e%7vdXlGC%MGTaq62yYs_#))vHRLX4HX#}x@q$7V?zQo zVMXIsn3z<^rYRbqVP2PXadLeMT5!>QH{uKLMtp<;f(-siNaTTMzUUGL4nsdUV_LX` zrYifP=UhY2HR?cSkz=iKzjsTl@{74>onTxdp@liS=E8)umhB*cj&^cIg(N??rB-%i z!JNe5b5k;H8d>b7fgy8CH|eiQ9el7VQXFJ2liPddFd!=Xwx1{#9(DV@4w6ao!@C0c z@g+Ss5+zYYiNdu~O8Ff5QPK>M@gsavD$g9X33ddf$g3<;iO_zT$m@RC%ge*Z%{&rO zu)waguPetJDW!%;C(GHP0_RyeM)?es_cVxRVEp$cNO(;+1ufT@TaF7x>)K(A$&1}G z(%K<$ahS@P8>#|4YI=y5SFVkhhy3p&>A+TpV1=wXr^uWI9ldIs{2|jZV&q;-PYiK4 zW(dp~EI(&wz9;hK4QM!|LrpnY!Vtre?*EMh!7m#y^Yf1+b_I-!?z?$n!onStpnEx3 z+!a66hCDJwv(Brl9jRuFsX-rbp50^5&@Rx7{L0kVuh(~_3MmwdA+|rw)272zg_Jp| zQA6f&!ak;dU_*t^jcK|f*Ba3*n)EHlP8wuRJy%D-1v)AA^l5hi#JPP=pT)1dw*ad- zzoO$pIU$DGke0jZ6J$WO{g(++#P`<(xu4#%>8R%)A01v6^BH*q_3Qh~g6s`L{$)W< z(j0%EG8vR^aT8~nQQ9{56tvXF5L>s9zc6w&KGQlWpj4^At2fhKsOine&vd!0k(my1 zcqZGzSDsDNY|~$qp2rbaic_q}UX1`^P@#cT{tp%eH8}GB#RXCMvDgLWPIsAwBH+(< z(H|Jp`#WVJTlVwcTo7RXZbtdK>XMQXOb!F!lte>@TgJperv*L6i^*)yVtfib+I`rA z*ZnIVecSqOehFW-qIBkRH+%7lu1C?@)d>n-uV>$wfnqU$5SZFNl+~Rg+(^{#A9gJb zrJ~Z4x|UDyi-nm)^9Zgg@i>pTN1gbLY@X5k@C%T;X7zrRhH|Y$_o6h&YE4Zy4apulIMQ~Fpe~WvX)9Yf5{@>^z{(Nf! z$rnEwsYd7Izvk5b@*wfGf_z;`r%xvUeaz{AhS}el0vFX1C zh;_TC%AJeiMOqCa%#SeofP#s*ca*68)WuErOh)8KALi`iUQF-JoA+?V*D-Q1kqfGuKueEhgex=3!|C9+`sve~=&p|3QKBN`g?yvi~JPf@Va8 zwB_3^r3YnIE81T;1zqX=tG7Rlfhfb+UsW)>P`LtOa)E# zM0136y2zIArm|T+8vEVWN z5e8l4FBchrVSEl-V4qg;2%-PEffhV9H`5(pqbH~zXp0)FI*&mJjpHp*9!}j8X>Ji7 z%fk-Ck)#n-XJvh!t;e&73KEob4>sSEMNf>JDD!$6%2@UZQbT9<@Zc={&GZ)qK@(N~ zZPFC>gI3N_d~qp&se5|5gl0gKVd>yGIc}SG2KhV2;Z!a> zDXZk{_96I_AYLo3X-amkjY0K9kyHFZw8l_OO~9^(ACyLil`UNgxy)R7>mHBo zv8oEFT>>8pFJD;5}cNxh;&ZzphN#eh8LAY6tswfF8dlYYXQnm zj*s}-t16E_CeJ$(y+&Ppv^9Pb9Uayo&T8BmnSWJuoK)ah3;L0%A(ti-jS})E(ti>l zuYG?BkcEE`AW#2AfUy1t0V06xi!pZ&2M5L}D2(03b{2P*A_jBtT9n4jQc=VgIGLLl zO^|jp7%ejE!P*D4fbwG6Vj&l!HEFVq2T>pEIcT`AfN8FYd^3=y2mFV9MvK6y1j79$ zfNuT!H^T8+4ey8jPR%iDOumJDXI_ZN-u#+cBM$n5xr^fXBXUR|3X_YZ=N5VV&1u@2 zdp3M&`HlA)`S)?g%|7Td#Dt%{lzxcWbThJ*~`@tupr&TQ^?j-Wr2*7_|2L5nM-OD->5_}{zl*w&Elf|h67ul z1rfL(EbI>~{gUI2HAV+=QR+q?iAkZp28!!lJXo zxlxxov8$6Zi$rb3ieD*38lrU4*jvWsSLriPr%4eLkA(kWfyl7tBNj)`(4903ud-DR zN!-V1I^?~ zP7`gv2Iw`nll_)~(moSrKO$A=2K-19NcQM%vWN*4TwOt)BJzQ;2k!$?(!tZ-JUl>w z_qOqD9W*&sLXQT2uxC)A?vjyDMulXg={ zUZq22k1{NQ__+Ylmbm&NF=9vvE#Xpa=8uvz-wraV37G|VhvH)}qa_-00XOnXkZO{X zNFsFwJ`L{xYG-(j+sZk7N`;nUlNVI7R(t4|xuA_j<>jKfm zraO-qZOt%gedg%~_6@u<@9vG?3(gr0oU!^vD#(VH@YV{mGVkl`^b01f;)QV^yZBYlb9}QfVU2qAphxAzUbhu^t z$yK+?er$qY3C!rpd0}3s&TMF-Ul)V4DO_W&9{ll&S0Vl!HPW6RO3k{GMaV~OYD$de z=?Pw}XX)Fh0kP0&_b7p>!leZ7y1y&tsb8Tth>BlaJk=krxw69O-6Tad{KKD7AZ~a( ziefKlo-EcxK?>ZI?kh1kmPxkl3~&}WI}AoFTlX>-&l>VSL4IJwK`o}` z7%$GIMcx44`YjcOQ((1{$IvajtuvA&o@o5iOL9UifyK`vzc;7B(E`*7;;%rGa1h0h zukxhtvXh*}2Lc#d1`Y;4bDqvV0*fD(C;@Nan>bn^Myoq8iu=gD(9O$%9OuL2yN^9^ zLZ+2Ga{$@zi`{E7qhY!NN!xAq5DD&bKQkn>frYks46Ig9qK;%~5|Dip#=*EF5;MIE zR}N*BTE>>RAAkhfFxP__*N?e_E@2Ht3jo#OYzyR{s`V9^;#xK)naf#f#}xCm55eFT zcvn%6-RDElqm>nJ%Ukb8!%26PlEZ5!ibN%0wqi>fgV)a(Vtyz=pQwm^D>0*zi5!r9 zjv8Xqotr^>A`;|H*?uTwdm_gc&pQu#`i>O1q?a2EYNQgL03(r{fhY-BnFnV40-8ZC z*NZP}sV%&BX-(okf3Vb#dySFNO+%KC$Nim&n_QSIH;+z_PXA=7J&=bp+y z^OUgHC*O*)R>z{wB8$ic6YD4ZW?~YL5I%={$+V6%8gUDdAl{A_uE3o1D&T3&ED<{L z;zoqokvP+0yU-MWa?$Wj7r?28_ROBT=ebxLdr8!<1|9U|+%Oa7tbI<%**xSdD&KYL zWY+)rpC-tQN%!loY8a9KG(nId^%pIve|ro3(*$uF5`@V8R}&<6&T(A@m$$Od5cJAH zWpJzM-tp9<6Py&?2Xdq>VwQ>HU zAPpI(vKKzLgF`Ier%lOrWG|YwtP)^RGuAB=L`N4;tjU-0q^5^M;hT;h%BZ=5F8gWN zF~Q^(!x*4*UCyIXlFdPz+2K$@Kk)5j3WqR$PTw%aWN8xY25OqVNoOBe%o|OnFka|O zuoo(daJJ6JSms0Pi+c#D4r4m`U|~%e`McjVOk@ZNoKlS$Bj4uV&LgeuNI4&A(xxIGuZ3XaN$+RRuHOc7bIizf z!OPM|y7mtbgy>&A5U8B?< z$4h>;r2dcMCpjjXBlH6=?IksOv&Mq;>cbw=MF$b83`iuL!la`bLx^dpG5_I#fRYsI zRaDIV^+5LjdLScrHix1=i-1(mC_UIAd6vvY5KzR7*je>3VS$V*e5bZr;gy!?kSEB( zewHQSdb@33aGd-~ql;vep5`3*JtmY68VP)Jq34O(OG_unucPfZWY9<}ViswSwSh7O zg;w9~7it;{UamqztL^k6#C-W68IBAfsmFQ~Xe>SgPPaRTnR~9>igk#bZeASSCG81< z@3o49bgd!k8;NB+zW}Y1fSLvsg?t|2t{9h37qQcmK%_dALT9_j>T4bec|9&&Ca?LoG#cY)@{{Z>!BJp45&^2DV-YAOmWwuG!oL+35;OpALg zYF5m>)X$$AK=~aQF@)A2lYo{MrC`8DCqi%%L}zIN6adoD(~ZsO)iFHN1}$18DMx zAIiZxrgWetdVJSqL-Q^yon?65xav7v&bVBt*_Lty5jSy4sUvbaOD)C9YU>r~gW&6O zq*4P5gNiPRc8B_l?!3mxM;U!pBcx0n@NBNfu%)Kc6CCmsV98uYX*(C39twjS*G`fh zM!BWQDkJWnOYj#-DG`M;)Ee$|jzZcy!Wb~r-KmW0ntl1Ev8~qY@FkNLS5J|Wj@NmD z6~&Dm{|FHP;8Z&DfA%qAlgRys(s zlbN80(i9J?d|9zwcBZP*F(*0L<)wU#wfaiD;mE@@fbn8l=u3l<&Oij6Y19*s+!}wH zz54%%$a%4iNVxl-K)=f*W3RQ~QkHe=RMigA%k z_%m0rSIYxUyJtjN)PY8~@pK|w*AY`2Sd+_VCwlXagMb-brO^4uG7d)dM@*&7{KQao zkqjMY!$Sfg>Aw_+v%|kpAUpr0K-SX#g#v-1{a+LaWxrj|xqX8}@|G+u z;v4W+XU>nNEC;A*cjaYsJDa!CKeYqfb1t zYi6T*m2e*rLzB-_Tsm?u1CBBEHLk@wH|T?9RI5L*lSf-Xm12Q%55XBAkE9<4Zg&7L zU#j#stC~I`eyOSO3-y&&TCPr>b=MPAs)S=W_n+>yaBn|$-F{2%Z|QJ>X7DsFgO(q` z1jxV|FdH{dfPDNSX#j|6>HUnW8!{0FO{K~ujiO9JBa2CLq42Qu!s6uDi8Qhf>>u{M zqPuQvaX^wUw9O4J-P3XDGou4tg&i}AO;v=!bJ>D%^JyGPZJ{hi|7pdOo^b|a{pr+? zM&tgIo&`nk5$02rUQXaGiPb!EjV_a|s5#6dEepsqY+3lh!#x&dwd4{J*~0q{7O;ez88b$M9HtLreNpEc`7K&5&2L;KOmW=55% zoa?XKVoF67;(nJ3bv`=cl7MB@1{@{pgfV5U_Hj9w#B^9;#5DR-RH;=b(&Es#;Cy_H zJT-9jk+7W3*p5ZH9jE(T*c)L*a)gonOAPu2Cu*M1Xd+Xj%;0)Gj4b`pVGaIg{3j3; zIfE`JLA2wbyTc@(UjZ#SRaK!phs1?+T;gQpATZO+c#g`^xSlCSB)=T&CY@}@yd0Ac zBb>9zs0;&o@7-v0h8*JDzEkocw;O(CjjvXh6uKsZCE~S#Fh37ebCbkZ6_snCcAGPt z5wi1dG#d7yv>cXt>umHI-{b(q4O7rIX=ictyg8UM$;r5y(6iN=(+e+Y7lu&y#D=)W znkygl)mtsO=2Jmo#v`nL7#cEVgC0fYh5^AeIB8&K6&=e-sp)*>Z$sb1uh2nh^hU}UK8(4m2 zZM~Gx*Se*qZZL8M8qEBN(_3sH>5VD671jxH=C=asmkNxPYY(YOJg5%&JT0M(1xO*n z*xfI1(zLnLbdZ18Kswiny1ylHcXvKrNZ%Nn+21e#`f^Pq+uI|QY53F%^8sQ{4=t~L zJJ*Y&a8_^A0y3*LV5AillKSpXbRaZZ|)@p(sBm;+lO*R(*Z7ZtUT_{icfe!&D|s+ zyUzeK8PPFh8+wR*sHaY;hz&g&8!h_AXsebOpPz~W9e>Q#j;M_6aK+XB^xX>2GQQ8j z2RE3XUyB_RUtF`L30((~iK8qiNJ-X+HX@A&wC}sBPQh_K@N~u@iX5S)&m4tSP&oN; zlz3elGZMD)Q#*|djx1JgI%D2!t`t?NmLKkKF8E0|{i)6GCcNsTD%#Mi(oO`-^ef0X z)r6Wu%9w|q7zOq;H5nc`=;XB5Xzn`*I+#`_^%Xndqjz4K{{u+gxJg|__?4<5?4((+%)-?<)BT>)knS_Z%M-YjPT%}md`{c% z^C&Oz0L_8uhV?je%`TdXp1)7y_!ugdD86MeG%GR7OqSV%SDyA`VYEamk1BI zbOhw%@lFPr7FuN`_laB=3dZiYkDG&+!q;Fdt^Aq?2B;CHalMkhw+OzSW&Cv6W| z{dA9vKBdNED3fxi9b;S`yt7_~OQSm-zUPk(hrmvwsdzzpP{z=?%$QAX^LCeJOob8P z($3ksHfuX+hIu=u%?0^nJyPD>NI-*%)Wz-T)XaM3Xf}7bnT+n@a$0JpMnfU^=iDA| zFR@lrqvj_9O1z5XaoA9korK=2J-~SaN&89GV3jgJVi|EnxXjPp!?u(FjIVqS!S!1|3}u>P5?J zCp4CXum;WXMDLqxp!}oU4%tuyetMGlh`xKaT_V{lDP|d7ty)gNK@PD8z8M0;?6)Aq zGigyfUgD;-Ks{=|CKuG>JiT4HGtv+qdc%M)h*KXSP&IPaqTbeZnb;gWjFw?TsQ%pa z1Cz99T-!9V#1@g`pq>d=CNlaSNj5(biE|b1L99zECyfy@XTm86 zuBb4HYP9>ZCs;rom)rv(c6>1rIL?^_K&D3?M?oC5Zs?$Zq{Km(fGPwqfs|9&iOUah zWyC8DKpkHWq>{%1Wgez-i)R!=88s4ZH?HV#8ymQ$l-8+NfV-@#F| zcR(^y7@tlnUB4CQC>;wxM-;@{vok`3vs=m5pQ@xrd_jAJ37Mm(K8W;Eo<7G14?ARZoOh+ZCj%c#fUZ1b&psr2xluAMK`Zx<)HUC~Ogmmq$SSAPUrFhG$=5T>TT`bouF;|jm zQdyl$dlorNDub%ZZ0aW*&h4{V9Jz|+%6LzV*0%;CovG5MtWHc3vMa_bT)G{jH(8af zA*`Q+OH(p2_&*eOXnC&J3_e6Ye~kenf@3YrCE zrI2rTF7Ft>x>91l?XtY^N2^^FB4;oIQn~-`fZOU_ay@$ZWDM%wD=I;rY#RuGFo)y;VM;k_*cCnffop zy{&QhTUuH+H*spzApk%E8#bR(%{^cs#}zS3=L$P$m$ZxfPVU{`4DSf3Kdcmd35E!j zjYgDIZQ}V7Sg6M0#E>~mWowH4IK47sBKG(;^zv`w*LoMh&yKZ0F0y$DogI%kMXs^6 zQQ~+6KZphXIDi#eP+OX4`n}=cXS>n65s%AwMe$@*5QOrjsGxi^!KIM-&MpwKpgf|(#{~O@2?5wQ zUN0Mz(nCLQ1nMT?%25Pxl^d0(&OX|#e3aw?q+Ge-ZF$`=oy>uMvKXKfgA^-MWSl~> zNQs-oA4ZCJ$4BqU>pl+n4O85DU5A6Ca(7plaOpHOSbhi5|IfO(=v+-+LT1I}*5zz? z_)^iD3cUe9a8OQ9K#)5txpGl4#+I~<%7T?mcNMyGE3g1l9p)hZUb|zYd3AUO#H4Fp zc_^djqJ{g}ux>%_``g5BQWH3vrY*7_LzG{V(s<_WXL$aTS_YLnP4{Vs>N|s1`|DV` z@4+wVsdh(B0JxKb$l_QFo`Jwbt;uJHEzr{g+{%*enRF4{A^Q?i4wx)69D3GP4miJa zKS|#g!|d1N_g_}k?9Y4t!&E-XT$>Q-^WH9?qY^1Oc)j1rO`$YaLoLQ8HiGYiaB5ol zql-^Ub3bp2xm&T4En%$r6?Th3%jWN*gfm?VR5Qfu3FPcJfmK|4f22g;!~O9M^3QKV z)d#OyJoRyl)d*r>JmsrYzQAm5kxD~C%{66?r7t_}Mx$XJ4KQ>}t?h_BPC+m}M*v+~ zeLi842092GbUhvC42u2yu?NP&j+jczzvx(PJW-JL0WtB5U%Bq&6G?Gv(%^S^Lwp%6 ziVw1J#W;U|KepKRHMIbtf^Q8y#C?CZo_*M7&M%9g(o-+=X&c3Hi;3fScB~~u9RfXZ z6sc)c$%RV((qr!Yc*vvE%kRa#_4rZynWdfi+4J(hgitXcztf~8cx8Z}n}&okXBvp` zXE7|AGBj?;?fGw$Z;6V=m(RV)K|sDEBm?|x9K5{3a`XX8bGiOaZVujcuV=e^k$x|i zC)@yT!gQsAAvaPVNKD>hNkM9tz(bJI)ZiDEnUd@U)yw!2!D~O-upY~B1^{S9Le1lik`?=M}e45wMaKpx+#plOPn*dxG#_iK`o|Wqcj^MDp z{L7&e=);mB?3>3v0tl?&pFrYABG!Aj-w`lLpEy6z5XHvXpiGhO>oK02BR%#=BICPp zhR;F`c4}J9+Hr~-8DFET+*?mek#2|$jOV+yY9-jr`S1ecQ=?54y9ixKrZ}wpAX|CBvuSeAA zW8N9wE=a4DqaW^3*It)?N^09QDj&;d4+kpe3EQ&(4u{(QJZ*z@FlNv+AVhn~U!~fW z&(HARi3rlZJegh?#tKJ<%7PRQ?N~r&!vQx>^b`*Wo`unec9o4kl?a9j<;myZD%Xyj zlb7qk!F8N2uf; z;$fdM2u6pD%z9`oV3nr43sXYH$h!J85RCm{c{wm2!Qxz#BNEzn>-}bfLtaP(aJ*G? z_bfoq$>0W@_@Qpc_*KhUFoF9<%$p1c;VW27^auK1$j{(PpUUV>JBrsK*z;rZopq)u zsR&Qb(khrU9L+Fe4Zxr)LwIO$<1rVA_RP;!h{Xr}ZZ-2rTOu!FSiZz~`N+pif{3$$ zHh;HiOc0_MG4K0Us+QW1*aOr6QLy4Y9B{(4B#< zl}nBImsd9gUHm8{vsRO}y)U14qv7^Qhv(nd`m`?AZ=0I`|K-F}@1rhUq^pnkc^Odllqxjem%} zCPpx#LXzbv80=Gm7Ox|p^A1w_>WMZ+Oli*dld!2?T#fgC-R&YMDyY^_{eIrn1eh6L zesq8Kc6;iTs*1bDpmV;=zq(*b!3QlcSfF^-PQ_$Vi5<(@p{7ujl}%D}vSzHCw>5W= z?v7AwiLR!oD|g5Z8QEpI2CFWhe!iWoj@FGE)?`1ze?wt2${+dccXc*H1Z^#SP3IoT z{#cgwL7C}7$XPRhXo$lN68UG6U*vjJYA$_;pG$r0KffHh_n1b)&EzCuqzSx(G|0D8eYinH5YaHRh`u3!Q4uf+h`*?7B)%*B-cQE@W33PwF5MwEi#z zw3VE|&wwS0qRbiy)+3yR#L$+(xNpNY6I~j;c5Rqk)T~g*DMR;??n<{y(C875N5Yta z{f+g*n;9#DGgjv1M*t4i`{!GzB`NfGoj`1a@BVlYtXlJ|(b$H`kjqq9tb^vlZ$sTi$#N5+#tN>$9m{5Ay55bCaMmfhxNd}g5B_6x zGJDXb0iJ=Bq*`Q*szv}_m@%Oi(OiS>9`77v(+9b99?=!8F~JP0h%nI@Me|{s;R`TJ zl*LW&p<|qe>HP%k0+3~^_BG{Cg*%6sqUDqpDGR_IN`5uALtc)Ug%DbHaFp|J!$!kj z26d9ofZN`RmyQyzvJFvnQoke}IA0wdl)z-kv27)9zNl1warX|u!FzP_fyUG40f&Tn zv$9j;gzqe@jCv}Pmy*fI4^Lby>)NJjo;V|3xldWGDO`PXZmj`P@de;?ZN~>Ry z!-v4ba%SEg@g{tiL;E8EP#q5EXd{=V^|heHyyzaJlZ)gytk|eYky*OAz{>8x?A)RS zfP|e0Wr#d~9x!Xw6*}4#6tI;qPOy!z;BOh#M6H+l;Nla^>x0YE zV`pe)-hhxu5gdunY>y0(L`S)OoEjS_2GfZRZ5pTa1Lr#a`!Q>j*<{`e3oDUfjttd% z2>#VGW5g$H72cr+5}@CeP`NJ=EYp%>>4z7K7D4lKbiLgn)=@bLF?=^$-?sQkUfvV} zV*$!QPBH=lYyRzu6pCA8jlUnfoXf5Hk-%-SHJ3_5n!b+&V0vg6GP9ILv{23=aj{{$3Mcts?WJGdStvChGFBpcL2NmNU|0)oKRPawch<5zxl}OSyp=d` zeBDMQwJ5nmM#)QKSB4QJe@&T)I>brS7Y@^|8=D^Axhdhb3e9krJsh59@#R^>Lf|Q8 zWS^emkiU*liR1O#24&1K7?LH5O-etY#d(yeN}Gyge?Tx=5>7gtF zO{@%l5gtR58ud6Do3p>7*qHO5z4|<7O3)8kqZ}Ef`?N>N+X)P|dEfpKFYkzQWFQCx z5?JW$940N{+v=)om@c$S*hUhmU{_lSoQ4guPvNAaYeY{!V;*l_UfNw>hn4l;v6 zJQF28G9mQU-r}(pg*?lKPwD}p!oxj{QXf^Gip-T3UoLV-|6PrKoB z>;48k(%JlmJ=0J(ws)|lNijW@V$B#C(*ci1DdW;m*{iw_GRk&PRTK&>Bwak_!gEmUq+WhtLsm;}R{6JoVhmIyZ-Vy&eNPL@paUj-j*_BBP z?OA#8B>{eFiWK|C?S!!|xWXW_qtPEtS%mHkV%l)|wvWuqsaaH^HYbmkuww%`MTJe* zHF765?R0zWY&)nlGcG<)rhX*_d)`n^V%~N$V?{aS!Rzj}S#eLDirKu?QiXIxIj;?} zL}4xn(HRI5!;iBB(=HmbPnpM8>RPOG_{ADEhomh0)B|BM3|(edlR&vg2Xe@&P-k9IbWOjNNJ}2k>BjudJpm)|C)=V&sA2h zW4w$}RDs16Q6m@`VnOuSZflmr*tyHAn>v5 zfR02D);1+8gTX!YlwMNM>mkIm^T00!J6NR%moSGE>>)RndY5&dl8R~Ua$LoHlDcFP zscCy(bz@tw&AUzc48Em_qPJ+D>0RH)&XXxKAU`A?DfC3pX)&&;-2-KXL036|G3Wx> z3k`;LvE?Gg!iG$h_zE4}+sZF2z3~AW-3|-Lo{{LGL@0f{fV|RgW36Pm=&*D?wmYAL zka&m6bpp|CEW+_5&w)EQZMcs&Jj-%HM!I9nOK$A3oZ1?nU>h+QU2vSY15sr^an!;h z62NPr8m!cF&N2xk>A@*NX(10qT6RUxgKIgGE&P$SPRhs)n!e%rcn2@9>F*3 z7&;Kynl$M*nNBbUjD~IF6Nxv>J}~ycJX2!9qc1WJBJ1V+LqZY350k_njk)|>n$<5j zd+A%_G4GQW{7pck+M_=0vC!BJ(<`h_?q~e6);q2Q#>`}d+Go=I?A+h0Xh^y)e)Q6w zE1T^ik~Wn#+xo@xuBraQ%)&t0HH*v4$hntfzffrCV*AD8Tud_h;-T2#Q+O18MT*FwxOfZ`Awpd7ftc!*SE!ZD?@Kvxt0=`N!LGm7&YQcj?p}Q?pwAC zR&O|m^5D-b8I3l_EFNiP9tr47<>r=?T+*WRe~Cn#tl`nFV=M|eoD!>2$Om!uc&;XI_cKJlMC1(%)4s_wad!oL-s~)oc2w!)7S)<<_MdRo z=V5Bbv(!hx?QP*OTQy~(I{`K8U@y2?6OqD?wujFw{Db9n8CAP9qr+&_64_k8Gn2>) zZ)hPJx~d^g0Y6d0G70~om3)Hgs?=kNo<$p-)u`Vg21mgGx|=NEK@V218CWXWPFCQ?7dQkAJ|L(5Xfj{5B4F5cpxdS-{l+MO`4 zX=W<0qn!r6`F+hNF2z`zcoWm+(3IczV7Fz2`PD9OUf(IT?bI1_()Sgba5`U~R8zzx z)9m~laGQuKKxqK6-rt*M{rto+^BMdpvkDYvReob*(v3OqTU?Zg*h_bkUV=$|SF;cgR!&G=GTzy7D=D%5pz zz2hypdKvbGf|i7=iG$!1f1qfE$;rWqn1o;*#@|fW4pf;Y83mhQXKp;}&&rtX^lOhj zzo)K+!Fz8ExTLX0_SxxV-r+cL6=Id@UANp`gOVL&VY}M|J=wRUsaAg2gd!6pC(a}vCtig|FoG+Y`Vp21L>VTP zShLbh-iu>2e9_`JPFakT@=9nD24MXo^Q){U&bl_>{Mv*~kRxd3tap%Q522qckQ^`9 zN*!6-bvha}q3?g7EsLp*m_<$)lsrg(Vc9*l&+c^`O+-<}#W2y&otUCWZZs)yL~rOv zOY0TikxHJ5xS65kBh@60FP+nM*JI$UE%BIjn}UKHq~z8||#-)!=s5;t!&0{XPrraA9xx&eUBk zm$ZrvOWq;$)$YJS2nPvBXVAqB6*OE-2+Jt)Bz_`?u0iOl`q>g|4;s4vl5Y>&<(J&j5xH`jcuNrmM!`RL!o zeo!gC*fZCn+T+Lvj*L4o5G383rG9-g$Nm{($nWOh9jg5w+5YO9rwtccuQOd$)smqm z&?Rr1q%T57u3)an+J(3xE6J)~kwZ{xSt0b*zd4mP`cZvllK#Yl?h?F}v-(gkD^*(kmDRzn2ag0UO18|;pYW=g_f z%((r44)|j^&3%)ga0uY7CK?Zr&EslG9BPb+HIS>(C0{kqWOBUWIaLP;y#F*v`kc6D zn32>WdL>^p6;(2FZnGsTU2c#~kU6R^a`%X_kKJBjh a|NQp-eEIK#|5ER_09o&O9gxKjp#K4V&UJJE diff --git a/mkpatch b/mkpatch index a872293a..ce150c15 100755 --- a/mkpatch +++ b/mkpatch @@ -96,7 +96,7 @@ EOF for i in $files; do echo $OTREE/$i echo "echo \"Removing ../$i\"" >> $TMP/delfiles - if [ -d $OTREE/$i ]; then + if [ -d $OTREE/$delfiles ]; then echo "rm -rf ../$i" >> $TMP/delfiles else echo "rm ../$i" >> $TMP/delfiles @@ -156,7 +156,7 @@ while [ $index -lt $dircount ]; do mv tmpdir/`basename $origname` ../$origname index=`expr $index + 1` done -rmdir tmpdir +rm -fr tmpdir #copy files index=0 @@ -250,7 +250,7 @@ check_text_changes() { else cat $TMP/tmp >> $TMP/bindiff fi - rm -f $TMP/tmp + rm -fr $TMP/tmp done } @@ -300,7 +300,12 @@ dir=`pwd` dir=`basename $dir` cd $savedir -if test ! "$dir" = "$TARGET_TREE"; then +if test "$USER" = root; then + echo "Do not run this script as the root user" + exit 1 +fi + +if test "$dir" != "$TARGET_TREE"; then echo "You must move the \"TMP\" directory to inside the " echo "\"$TARGET_TREE\" directory before running this script." exit 1 diff --git a/po/Makefile.in b/po/Makefile.in index 1db66c45..e85dd006 100644 --- a/po/Makefile.in +++ b/po/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/po/README b/po/README index b05303a5..ca805f56 100644 --- a/po/README +++ b/po/README @@ -94,9 +94,9 @@ the top of the file, like: # You may also want to translate the menu definition file. -Send me the translated files to me, so that I can include them +Send the translated files to me, so that I can include them in the next distribution. -- -Alfredo Kojima +Alfredo Kojima diff --git a/po/cs.po b/po/cs.po index f94a7736..e97f107b 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,33 +1,33 @@ -# Message catalog for WindowMaker +# Message catalog 1998. # Copyright (C) 1998 Free Software Foundation, Inc. # David Sauer , 1998. # msgid "" msgstr "" -"Project-Id-Version: WindowMaker 0.19.3\n" -"POT-Creation-Date: 1998-09-12 13:26+0200\n" -"PO-Revision-Date: 1998-09-12 13:39+02:00\n" +"Project-Id-Version: WindowMaker 0.18.0\n" +"POT-Creation-Date: 1998-08-18 01:41+0200\n" +"PO-Revision-Date: 1998-08-18 01:52+02:00\n" "Last-Translator: David Sauer \n" -"Language-Team: czech \n" +"Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: unknown\n" -#: ../src/appicon.c:509 ../src/dialog.c:267 ../src/dialog.c:323 -#: ../src/dock.c:2999 ../src/dockedapp.c:206 ../src/rootmenu.c:166 -#: ../src/winspector.c:278 ../src/winspector.c:291 +#: ../src/appicon.c:493 ../src/dialog.c:262 ../src/dialog.c:318 +#: ../src/dock.c:2966 ../src/rootmenu.c:164 ../src/winspector.c:269 +#: ../src/winspector.c:277 msgid "Error" msgstr "Chyba" -#: ../src/appicon.c:510 +#: ../src/appicon.c:494 ../src/winspector.c:278 msgid "Could not open specified icon file" msgstr "Nelze otevøí specifikovaný soubor s ikonou" -#: ../src/appicon.c:531 ../src/dock.c:281 ../src/winmenu.c:85 +#: ../src/appicon.c:515 ../src/dock.c:238 ../src/winmenu.c:85 msgid "Kill Application" msgstr "Ukonèit aplikaci" -#: ../src/appicon.c:532 ../src/dock.c:282 ../src/winmenu.c:86 +#: ../src/appicon.c:516 ../src/dock.c:239 ../src/winmenu.c:86 msgid "" "This will kill the application.\n" "Any unsaved changes will be lost.\n" diff --git a/po/el.po b/po/el.po index 2e89429e..77cd16f5 100644 --- a/po/el.po +++ b/po/el.po @@ -4,425 +4,503 @@ msgstr "" "From: Papagrigoriou Nikolaos \n" "Language-Team: Greek \n" "Content-Type: text/plain; charset=iso-8859-7\n" -"Version: 0.1a" +"Version: 0.2" +"**************************" +"Words from the maintainer:" +"Ç ìåôÜöñáóç åßíáé áêüìç óå áñ÷éêü óôÜäéï. Ôá ìõíÞìáôá ðïõ åìöáíßæïíôáé óôçí" +"êïíóüëá ðñïò ôï ðáñüí åßíáé óôçí áããëéêÞ ãëþóóá. Åðßóçò ëüãù ôïõ ðåñéïñéóìÝíïõ" +"÷þñïõ óôçí åìöÜíéóç ôùí ìõíçìÜôùí, óôï ãñáöéêü ðåñéâÜëëïí, äåí åßíáé äõíáôÞ ç" +"óùóôÞ ìåôÜöñáóç. ÐïëëÝò öïñÝò ÷ñçóéìïðïéïýíôáé óõíôïìïãñáößåò. Èá õðÜñîåé óôï" +"ìÝëëïí åëëçíéêÞ óåëßäá ãéá ôïí Window Maker, üðïõ èá ãßíåôáé åðåîÞãçóç ôùí" +"åëëçíéêþí üñùí (Dock=ÁðïâÜèñá, Clip=ÓõíäåôÞñáò)." +"**************************" "Contact the maintainer for suggestions and corrections" "Xgettext-Options: --default-domain=WindowMaker --add-comments --keyword=_\n" "Files: ../src/appicon.c ../src/defaults.c ../src/dialog.c ../src/dock.c ../src/event.c ../src/framewin.c ../src/icon.c ../src/main.c ../src/menu.c ../src/misc.c ../src/pixmap.c ../src/resources.c ../src/rootmenu.c ../src/screen.c ../src/session.c ../src/stacking.c ../src/startup.c ../src/switchmenu.c ../src/texture.c ../src/wdefaults.c ../src/winmenu.c ../src/winspector.c ../src/workspace.c ../src/xutil.c\n" -#: ../src/appicon.c:493 ../src/dialog.c:262 ../src/dialog.c:318 ../src/dock.c:2966 ../src/rootmenu.c:164 ../src/winspector.c:274 ../src/winspector.c:287 +#: ../src/appicon.c:509 ../src/dialog.c:215 ../src/dialog.c:271 ../src/dock.c:2982 ../src/dockedapp.c:206 ../src/rootmenu.c:168 ../src/winspector.c:279 ../src/winspector.c:295 msgid "Error" msgstr "ÓöÜëìá" -#: ../src/appicon.c:494 +#: ../src/appicon.c:510 msgid "Could not open specified icon file" msgstr "Äåí ìðïñåß íá äéáâáóôåß ôï óõãêåêñéìÝíï áñ÷åßï åéêïíéäßïõ" -#: ../src/appicon.c:515 ../src/dock.c:238 ../src/winmenu.c:85 +#: ../src/appicon.c:511 ../src/dialog.c:114 ../src/dialog.c:215 ../src/dialog.c:271 ../src/dialog.c:451 ../src/dock.c:431 ../src/dock.c:2983 ../src/dockedapp.c:206 ../src/dockedapp.c:350 ../src/rootmenu.c:169 ../src/winspector.c:280 ../src/winspector.c:296 +msgid "OK" +msgstr "ÏÊ" + +#: ../src/appicon.c:532 ../src/dock.c:281 ../src/winmenu.c:85 msgid "Kill Application" -msgstr "Âßáéïò Ôåñìáôéóìüò ÐñïãñÜììáôïò" +msgstr "Óêüôùóå ôï ðñüãñáììá" -#: ../src/appicon.c:516 ../src/dock.c:239 ../src/winmenu.c:86 +#: ../src/appicon.c:533 ../src/dock.c:282 ../src/winmenu.c:86 msgid "" "This will kill the application.\n" "Any unsaved changes will be lost.\n" "Please confirm." msgstr "" -"Ôï ðñüãñáììá èá ôåñìáôéóôåß âßáéá.\n" +"Ôï ðñüãñáììá èá \"óêïôùèåß\".\n" "ÁëëÜãåò ðïõ äåí Ý÷ïõí óùèåß èá ÷áèïýí.\n" "Ðáñáêáëþ Åðéâåâáéþóôå." -#: ../src/appicon.c:531 ../src/dock.c:1010 +#: ../src/appicon.c:534 ../src/dock.c:283 ../src/winmenu.c:87 +msgid "Yes" +msgstr "Íáé" + +#: ../src/appicon.c:534 ../src/dock.c:283 ../src/winmenu.c:87 +msgid "No" +msgstr "¼÷é" + +#: ../src/appicon.c:548 ../src/dock.c:1038 msgid "Unhide Here" -msgstr "Áðüêñõøç Åäþ" +msgstr "ÖáíÝñùóå Åäþ" -#: ../src/appicon.c:532 ../src/dock.c:1012 +#: ../src/appicon.c:549 ../src/dock.c:1040 msgid "(Un)Hide" -msgstr "(Áðï)Êñýøå" +msgstr "(Îå)Êñýøå" -#: ../src/appicon.c:533 +#: ../src/appicon.c:550 msgid "Set Icon..." -msgstr "Êáèïñéóìüò Åéêïíéäßïõ..." +msgstr "Êáèüñéóå Åéêïíßäéï..." -#: ../src/appicon.c:534 ../src/dock.c:1016 ../src/winmenu.c:260 +#: ../src/appicon.c:551 ../src/dock.c:1044 ../src/winmenu.c:260 msgid "Kill" -msgstr "Âßáéïò Ôåñìáôéóìüò" +msgstr "Óêüôùóå" -#: ../src/defaults.c:560 ../src/screen.c:514 ../src/screen.c:615 ../src/screen.c:621 +#: ../src/defaults.c:592 ../src/startup.c:635 ../src/startup.c:653 ../src/startup.c:659 msgid "could not read domain \"%s\" from defaults database" msgstr "could not read domain \"%s\" from defaults database" -#: ../src/defaults.c:629 ../src/defaults.c:732 ../src/defaults.c:757 ../src/defaults.c:783 +#: ../src/defaults.c:638 ../src/defaults.c:762 ../src/defaults.c:801 ../src/defaults.c:831 msgid "Domain %s (%s) of defaults database is corrupted!" msgstr "Domain %s (%s) of defaults database is corrupted!" -#: ../src/defaults.c:634 ../src/defaults.c:741 ../src/defaults.c:766 ../src/defaults.c:791 +#: ../src/defaults.c:643 ../src/defaults.c:783 ../src/defaults.c:814 ../src/defaults.c:840 msgid "could not load domain %s from user defaults database" msgstr "could not load domain %s from user defaults database" -#: ../src/defaults.c:645 +#: ../src/defaults.c:654 ../src/defaults.c:747 msgid "Domain %s (%s) of global defaults database is corrupted!" msgstr "Domain %s (%s) of global defaults database is corrupted!" -#: ../src/defaults.c:662 +#: ../src/defaults.c:673 ../src/defaults.c:752 msgid "could not load domain %s from global defaults database" msgstr "could not load domain %s from global defaults database" -#: ../src/defaults.c:1077 +#: ../src/defaults.c:1151 msgid "can't convert \"%s\" to boolean for key \"%s\"" msgstr "can't convert \"%s\" to boolean for key \"%s\"" -#: ../src/defaults.c:1082 ../src/defaults.c:1116 ../src/defaults.c:1148 ../src/defaults.c:1161 ../src/defaults.c:1176 ../src/defaults.c:1191 ../src/defaults.c:1262 ../src/defaults.c:1274 ../src/defaults.c:1333 ../src/defaults.c:1377 ../src/defaults.c:1419 ../src/defaults.c:1465 ../src/defaults.c:1511 ../src/defaults.c:1732 ../src/defaults.c:1746 ../src/defaults.c:1779 ../src/defaults.c:1791 ../src/defaults.c:1803 ../src/defaults.c:1827 ../src/defaults.c:1845 ../src/defaults.c:1858 ../src/defaults.c:1871 ../src/defaults.c:1908 ../src/defaults.c:1946 ../src/defaults.c:2010 +#: ../src/defaults.c:1156 ../src/defaults.c:1190 ../src/defaults.c:1222 ../src/defaults.c:1235 ../src/defaults.c:1250 ../src/defaults.c:1265 ../src/defaults.c:1336 ../src/defaults.c:1348 ../src/defaults.c:1407 ../src/defaults.c:1451 ../src/defaults.c:1493 ../src/defaults.c:1539 ../src/defaults.c:1585 ../src/defaults.c:1629 ../src/defaults.c:1851 ../src/defaults.c:1865 ../src/defaults.c:1903 ../src/defaults.c:1915 ../src/defaults.c:1927 ../src/defaults.c:1950 ../src/defaults.c:1977 ../src/defaults.c:1990 ../src/defaults.c:2003 ../src/defaults.c:2033 ../src/defaults.c:2074 ../src/defaults.c:2086 ../src/defaults.c:2098 ../src/defaults.c:2123 ../src/defaults.c:2143 ../src/defaults.c:2156 ../src/defaults.c:2169 ../src/defaults.c:2208 ../src/defaults.c:2246 ../src/defaults.c:2310 ../src/defaults.c:2461 msgid "using default \"%s\" instead" msgstr "using default \"%s\" instead" -#: ../src/defaults.c:1113 +#: ../src/defaults.c:1187 msgid "can't convert \"%s\" to integer for key \"%s\"" msgstr "can't convert \"%s\" to integer for key \"%s\"" -#: ../src/defaults.c:1143 ../src/defaults.c:1257 ../src/defaults.c:1727 ../src/defaults.c:1774 ../src/wdefaults.c:532 ../src/wdefaults.c:568 +#: ../src/defaults.c:1217 ../src/defaults.c:1331 ../src/defaults.c:1846 ../src/defaults.c:1898 ../src/defaults.c:2069 ../src/wdefaults.c:544 ../src/wdefaults.c:580 msgid "Wrong option format for key \"%s\". Should be %s." msgstr "Wrong option format for key \"%s\". Should be %s." -#: ../src/defaults.c:1156 +#: ../src/defaults.c:1230 msgid "Incorrect number of elements in array for key \"%s\"." msgstr "Incorrect number of elements in array for key \"%s\"." -#: ../src/defaults.c:1171 +#: ../src/defaults.c:1245 msgid "Wrong value for key \"%s\". Should be Coordinate." msgstr "Wrong value for key \"%s\". Should be Coordinate." -#: ../src/defaults.c:1186 +#: ../src/defaults.c:1260 msgid "can't convert array to integers for \"%s\"." msgstr "can't convert array to integers for \"%s\"." -#: ../src/defaults.c:1325 +#: ../src/defaults.c:1399 msgid "Invalid focus mode \"%s\". Should be Manual, Auto or Sloppy." msgstr "Invalid focus mode \"%s\". Should be Manual, Auto or Sloppy." -#: ../src/defaults.c:1328 +#: ../src/defaults.c:1402 msgid "Invalid colormap focus mode \"%s\". Should be Manual or Auto." msgstr "Invalid colormap focus mode \"%s\". Should be Manual or Auto." -#: ../src/defaults.c:1371 +#: ../src/defaults.c:1445 msgid "Invalid window placement mode \"%s\". Should be Auto, Cascade, Random or Manual." msgstr "Invalid window placement mode \"%s\". Should be Auto, Cascade, Random or Manual." -#: ../src/defaults.c:1413 +#: ../src/defaults.c:1487 msgid "Invalid geometry display type \"%s\". Should be Center, Corner, Floating or Line." msgstr "Invalid geometry display type \"%s\". Should be Center, Corner, Floating or Line." -#: ../src/defaults.c:1460 +#: ../src/defaults.c:1534 msgid "Invalid speed \"%s\". Should be UltraFast, Fast, Medium, Slow or UltraSlow." msgstr "Invalid speed \"%s\". Should be UltraFast, Fast, Medium, Slow or UltraSlow." -#: ../src/defaults.c:1505 +#: ../src/defaults.c:1579 msgid "Invalid mouse button \"%s\". Should be Left, Middle, Right or Button1 through Button5" msgstr "Invalid mouse button \"%s\". Should be Left, Middle, Right or Button1 through Button5" -#: ../src/defaults.c:1574 ../src/defaults.c:1605 ../src/defaults.c:1617 ../src/defaults.c:1658 ../src/defaults.c:1694 +#: ../src/defaults.c:1623 +msgid "Invalid iconification style \"%s\". Should be Zoom, Twist, Flip or None" +msgstr "Invalid iconification style \"%s\". Should be Zoom, Twist, Flip or None" + +#: ../src/defaults.c:1692 ../src/defaults.c:1723 ../src/defaults.c:1735 ../src/defaults.c:1777 ../src/defaults.c:1817 msgid "\"%s\" is not a valid color name" msgstr "\"%s\" is not a valid color name" -#: ../src/defaults.c:1586 +#: ../src/defaults.c:1704 msgid "bad number of arguments in gradient specification" msgstr "bad number of arguments in gradient specification" -#: ../src/defaults.c:1632 +#: ../src/defaults.c:1750 msgid "too few arguments in multicolor gradient specification" msgstr "too few arguments in multicolor gradient specification" -#: ../src/defaults.c:1741 +#: ../src/defaults.c:1860 msgid "Error in texture specification for key \"%s\"" msgstr "Error in texture specification for key \"%s\"" -#: ../src/defaults.c:1787 ../src/defaults.c:1823 +#: ../src/defaults.c:1911 ../src/defaults.c:1946 ../src/defaults.c:2082 ../src/defaults.c:2119 msgid "Too few elements in array for key \"WorkspaceBack\"." msgstr "Too few elements in array for key \"WorkspaceBack\"." -#: ../src/defaults.c:1799 +#: ../src/defaults.c:1923 ../src/defaults.c:2094 msgid "Wrong type for workspace background. Should be Texture." msgstr "Wrong type for workspace background. Should be Texture." -#: ../src/defaults.c:1841 +#: ../src/defaults.c:1973 ../src/defaults.c:2139 msgid "Cannot get color entry for key \"WorkspaceBack\"." msgstr "Cannot get color entry for key \"WorkspaceBack\"." -#: ../src/defaults.c:1853 +#: ../src/defaults.c:1985 ../src/defaults.c:2151 msgid "key \"WorkspaceBack\" has invalid color \"%s\"" msgstr "key \"WorkspaceBack\" has invalid color \"%s\"" -#: ../src/defaults.c:1867 +#: ../src/defaults.c:1999 ../src/defaults.c:2165 msgid "Cannot get file entry for key \"WorkspaceBack\"." msgstr "Cannot get file entry for key \"WorkspaceBack\"." -#: ../src/defaults.c:1885 -msgid "could not run \"%s\"" -msgstr "could not run \"%s\"" - -#: ../src/defaults.c:1891 +#: ../src/defaults.c:2012 ../src/defaults.c:2191 msgid "could not find background image \"%s\"" msgstr "could not find background image \"%s\"" -#: ../src/defaults.c:1904 +#: ../src/defaults.c:2029 ../src/defaults.c:2204 msgid "Error in texture specification for key \"WorkspaceBack\"" msgstr "Error in texture specification for key \"WorkspaceBack\"" -#: ../src/defaults.c:1941 +#: ../src/defaults.c:2185 +msgid "could not run \"%s\"" +msgstr "could not run \"%s\"" + +#: ../src/defaults.c:2241 msgid "Invalid justification type \"%s\". Should be Left, Center or Right" msgstr "Invalid justification type \"%s\". Should be Left, Center or Right" -#: ../src/defaults.c:1975 +#: ../src/defaults.c:2275 msgid "could not load any usable font" msgstr "could not load any usable font" -#: ../src/defaults.c:2005 +#: ../src/defaults.c:2305 msgid "could not get color for key \"%s\"" msgstr "could not get color for key \"%s\"" -#: ../src/defaults.c:2064 -msgid "invalid key modifier \"%s\"" -msgstr "invalid key modifier \"%s\"" +#: ../src/defaults.c:2364 ../src/rootmenu.c:442 +msgid "%s:invalid key modifier \"%s\"" +msgstr "%s:invalid key modifier \"%s\"" -#: ../src/defaults.c:2076 -msgid "invalid kbd shortcut specification \"%s\"" -msgstr "invalid kbd shortcut specification \"%s\"" +#: ../src/defaults.c:2376 +msgid "%s:invalid kbd shortcut specification \"%s\"" +msgstr "%s:invalid kbd shortcut specification \"%s\"" -#: ../src/defaults.c:2082 -msgid "invalid key in shortcut \"%s\"" -msgstr "invalid key in shortcut \"%s\"" +#: ../src/defaults.c:2383 +msgid "%s:invalid key in shortcut \"%s\"" +msgstr "%s:invalid key in shortcut \"%s\"" -#: ../src/defaults.c:2176 +#: ../src/defaults.c:2409 +msgid "%s: modifier key %s is not valid" +msgstr "%s: modifier key %s is not valid" + +#: ../src/defaults.c:2455 +msgid "Invalid icon Position \"%s\". Should be one of blv, blh, brv, brh, tlv, tlh, trv, trh" +msgstr "Invalid icon Position \"%s\". Should be one of blv, blh, brv, brh, tlv, tlh, trv, trh" + +#: ../src/defaults.c:2537 msgid "could not render texture for icon background" msgstr "could not render texture for icon background" -#: ../src/defaults.c:2513 +#: ../src/defaults.c:2896 +msgid "background texture rendering was unsuccessfull" +msgstr "background texture rendering was unsuccessfull" + +#: ../src/defaults.c:2923 +msgid "could not load image %s for option %s:%s\n" +msgstr "could not load image %s for option %s:%s\n" + +#: ../src/defaults.c:2939 +msgid "could not spawn texture rendering subprocess for option" +msgstr "could not spawn texture rendering subprocess for option" + +#: ../src/defaults.c:2993 ../src/defaults.c:3081 msgid "could not render texture for workspace background" msgstr "could not render texture for workspace background" -#: ../src/dialog.c:67 ../src/dialog.c:79 ../src/dialog.c:162 ../src/dialog.c:495 -msgid "OK" -msgstr "ÏÊ" - -#: ../src/dialog.c:67 ../src/dialog.c:72 ../src/dialog.c:162 ../src/dialog.c:502 +#: ../src/dialog.c:114 ../src/dialog.c:458 ../src/dock.c:431 ../src/dockedapp.c:356 ../src/rootmenu.c:214 ../src/rootmenu.c:238 msgid "Cancel" msgstr "¶êõñï" -#: ../src/dialog.c:72 ../src/rootmenu.c:206 -msgid "Exit" -msgstr "¸îïäïò" - -#: ../src/dialog.c:84 -msgid "Yes" -msgstr "Íáé" - -#: ../src/dialog.c:84 -msgid "No" -msgstr "¼÷é" - -#: ../src/dialog.c:257 +#: ../src/dialog.c:210 msgid "Could not open directory " msgstr "Äåí ìðïñåß íá äéáâáóôåß ï êáôÜëïãïò" -#: ../src/dialog.c:313 +#: ../src/dialog.c:266 msgid "Could not load image file " -msgstr "Äåí ìðïñåß íá öïñôùèåß ôï áñ÷åßï åéêüíáò" +msgstr "Äåí ìðïñåß íá öïñôùèåß ç åéêüíá" -#: ../src/dialog.c:439 +#: ../src/dialog.c:395 msgid "Directories" msgstr "ÊáôÜëïãïé" -#: ../src/dialog.c:448 +#: ../src/dialog.c:404 msgid "Icons" msgstr "Åéêïíßäéá" -#: ../src/dialog.c:485 +#: ../src/dialog.c:441 msgid "File Name:" -msgstr "¼íïìá Áñ÷åßïõ" +msgstr "Áñ÷åßï:" -#: ../src/dialog.c:508 +#: ../src/dialog.c:464 msgid "Choose File" -msgstr "ÅðÝëåîå ôï Áñ÷åßï" +msgstr "ÅðÝëåîå Áñ÷åßï" -#: ../src/dialog.c:518 +#: ../src/dialog.c:474 msgid "Icon Chooser" msgstr "ÅðéëïãÞ Åéêïíéäßïõ" -#: ../src/dock.c:290 -msgid "could not load clip tile image" -msgstr "could not load clip tile image" +#: ../src/dock.c:225 +msgid "Type the name for workspace %i:" +msgstr "Ðëçêôñïëüãçóå ôï üíïìá ôçò åðéöÜíåéáò %i:" + +#: ../src/dock.c:226 ../src/dock.c:1017 +msgid "Rename Workspace" +msgstr "ÁëëáãÞ ïíüìáôïò ÅðéöÜíåéáò" -#: ../src/dock.c:406 +#: ../src/dock.c:429 msgid "Workspace Clip" -msgstr "Clip ÅðéöÜíåéáò Åñãáóßáò" +msgstr "ÓõíäåôÞñáò ÅðéöÜíåéáò" -#: ../src/dock.c:407 +#: ../src/dock.c:430 msgid "All selected icons will be removed!" -msgstr "¼ëá ôá åðéëåãìÝíá åéêïíßäéá íá áöáéñåèïýí" +msgstr "¼ëá ôá åðéëåãìÝíá åéêïíßäéá èá áöáéñåèïýí!" -#: ../src/dock.c:456 +#: ../src/dock.c:479 msgid "Keep Icon" -msgstr "ÊñÜôçóç Åéêïíéäßïõ" +msgstr "ÊñÜôçóå Åéêïíßäéï" -#: ../src/dock.c:457 ../src/dock.c:1931 ../src/dock.c:2047 +#: ../src/dock.c:480 ../src/dock.c:1932 ../src/dock.c:2049 msgid "Type the command used to launch the application" msgstr "Ðëçêôñïëüãçóå ôçí åíôïëÞ åêôÝëåóçò ôçò åöáñìïãÞò" -#: ../src/dock.c:872 +#: ../src/dock.c:841 +msgid "could not launch application %s\n" +msgstr "äåí ìðïñåß íá åêôåëåóôåß ç åöáñìïãÞ %s\n" + +#: ../src/dock.c:896 msgid "could not create workspace submenu for Clip menu" msgstr "could not create workspace submenu for Clip menu" -#: ../src/dock.c:930 +#: ../src/dock.c:954 msgid "could not create options submenu for Clip menu" msgstr "could not create options submenu for Clip menu" -#: ../src/dock.c:932 +#: ../src/dock.c:958 msgid "Floating Clip" -msgstr "Floating Clip" +msgstr "Åðßðëåõóç ÓõíäåôÞñá" -#: ../src/dock.c:938 +#: ../src/dock.c:964 msgid "Collapsed" msgstr "ÊñõììÝíï" -#: ../src/dock.c:944 +#: ../src/dock.c:970 msgid "AutoCollapse" msgstr "Áõôüìáôç Áðüêñõøç" -#: ../src/dock.c:950 +#: ../src/dock.c:976 msgid "AutoAttract Icons" msgstr "Áõôüìáôç Ýëîç Åéêïíéäßùí" -#: ../src/dock.c:956 +#: ../src/dock.c:982 msgid "Keep Attracted Icons" -msgstr "ÊñÜôçóç Åëêïýìåíùí Åéêïíéäßùí" +msgstr "ÊñÜôçóå Åëêïýìåíá Åéêïíßäéá" -#: ../src/dock.c:980 +#: ../src/dock.c:1006 msgid "Floating Dock" -msgstr "Floating Dock" +msgstr "Åðßðëåõóç ÁðïâÜèñáò" -#: ../src/dock.c:986 +#: ../src/dock.c:1012 msgid "Clip Options" -msgstr "ÅðéëïãÝò óôï Clip" +msgstr "Éäéüôçôåò ÓõíäåôÞñá" -#: ../src/dock.c:991 +#: ../src/dock.c:1019 msgid "(Un)Select Icon" msgstr "(Áðï)ÅðéëïãÞ Åéêïíéäßïõ" -#: ../src/dock.c:993 +#: ../src/dock.c:1021 msgid "(Un)Select All Icons" msgstr "(Áðï)ÅðéëïãÞ ¼ëùí ôùí Åéêïíéäßùí" -#: ../src/dock.c:996 +#: ../src/dock.c:1024 msgid "Keep Icon(s)" msgstr "ÊñÜôçóç Åéêïíéäßïõ(ùí)" -#: ../src/dock.c:998 +#: ../src/dock.c:1026 msgid "Move Icon(s) To" msgstr "ÌåôáöïñÜ Åéêïíéäßïõ(ùí) Óôçí" -#: ../src/dock.c:1003 +#: ../src/dock.c:1031 msgid "Remove Icon(s)" msgstr "Áöáßñåóç Åéêïíéäßïõ(ùí)" -#: ../src/dock.c:1005 +#: ../src/dock.c:1033 msgid "Attract Icons" msgstr "¸ëîç Åéêïíéäßùí" -#: ../src/dock.c:1008 +#: ../src/dock.c:1036 msgid "Launch" msgstr "ÅêôÝëåóç" -#: ../src/dock.c:1014 +#: ../src/dock.c:1042 msgid "Settings..." msgstr "Ñõèìßóåéò..." -#: ../src/dock.c:1425 ../src/dock.c:1439 ../src/dock.c:1453 ../src/dock.c:1463 +#: ../src/dock.c:1426 ../src/dock.c:1440 ../src/dock.c:1454 ../src/dock.c:1464 msgid "bad value in docked icon state info %s" msgstr "bad value in docked icon state info %s" -#: ../src/dock.c:1471 +#: ../src/dock.c:1472 msgid "bad value in docked icon position %i,%i" -msgstr "ëÜèïò ôéìÞ åéêïíéäßïõ ôïõ Dock óôç èÝóç %i,%i" +msgstr "bad value in docked icon position %i,%i" -#: ../src/dock.c:1700 +#: ../src/dock.c:1701 msgid "there are too many icons stored in dock. Ignoring what doesn't fit" -msgstr "õðÜñ÷ïõí ðÜñá ðïëëÜ åéêïíßäéá óôï Dock. ¼ôé äåí ôáéñéÜæåé áãíïåßôáé" +msgstr "there are too many icons stored in dock. Ignoring what doesn't fit" -#: ../src/dock.c:1930 ../src/dock.c:2046 +#. icon->forced_dock = 1; +#: ../src/dock.c:1931 ../src/dock.c:2048 msgid "Dock Icon" -msgstr "Åéêïíßäéï ôïõ Dock" +msgstr "Åéêïíßäéï ÁðïâÜèñáò" -#: ../src/dock.c:2959 ../src/dock.c:2963 +#: ../src/dock.c:2975 ../src/dock.c:2979 msgid "Could not execute command \"%s\"" msgstr "Äåí ìðïñåß íá åêôåëåóôåß ç åíôïëÞ \"%s\"" -#: ../src/event.c:453 +#: ../src/dockedapp.c:128 +msgid "could not find icon %s, used in a docked application" +msgstr "could not find icon %s, used in a docked application" + +#: ../src/dockedapp.c:205 +msgid "Could not open specified icon file:%s" +msgstr "Äåí ìðïñåß íá äéáâáóôåß ôï óõãêåêñéìÝíï áñ÷åßï åéêïíéäßïõ:%s" + +#: ../src/dockedapp.c:291 +msgid "Start when WindowMaker is started" +msgstr "ÅêôÝëåóç êáôÜ ôçí åêêßíçóç ôïõ WM" + +#: ../src/dockedapp.c:298 +msgid "Application path and arguments" +msgstr "ÅíôïëÞ åêôÝëåóçò ðñïãñÜììáôïò" + +#: ../src/dockedapp.c:309 +msgid "Command for files dropped with DND" +msgstr "ÅíôïëÞ ãéá ôá áñ÷åßá ðïõ áöÞíïíôáé ìå DND" + +#: ../src/dockedapp.c:321 +msgid "%d will be replaced with the file name" +msgstr "ôï %d áíôéêáèéóôÜôáé ìå ôï üíïìá ôïõ áñ÷åßïõ" + +#: ../src/dockedapp.c:325 +msgid "DND support was not compiled in" +msgstr "äåí Ýãéíå compile ìå õðïóôÞñéîç DND" + +#: ../src/dockedapp.c:331 +msgid "Icon Image" +msgstr "Åéêïíßäéï" + +#: ../src/dockedapp.c:343 ../src/winspector.c:1187 +msgid "Browse..." +msgstr "ÁíáæÞôçóç" + +#: ../src/dockedapp.c:388 +msgid "Docked Application Settings" +msgstr "Ñõèìßóåéò ÐñïãñÜììáôïò" + +#: ../src/event.c:475 msgid "stack overflow: too many dead processes" msgstr "stack overflow: too many dead processes" -#: ../src/framewin.c:509 +#: ../src/framewin.c:526 msgid "could not render gradient: %s" msgstr "could not render gradient: %s" -#: ../src/framewin.c:525 ../src/framewin.c:540 ../src/framewin.c:551 ../src/framewin.c:558 ../src/framewin.c:565 ../src/icon.c:285 ../src/texture.c:496 +#: ../src/framewin.c:542 ../src/framewin.c:557 ../src/framewin.c:568 ../src/framewin.c:575 ../src/framewin.c:582 ../src/icon.c:294 ../src/texture.c:528 msgid "error rendering image:%s" msgstr "error rendering image:%s" -#: ../src/icon.c:177 ../src/wdefaults.c:391 +#: ../src/icon.c:180 ../src/wdefaults.c:402 msgid "error loading image file \"%s\"" msgstr "óöÜëìá êáôÜ ôï öüñôùìá ôïõ áñ÷åßïõ åéêüíáò \"%s\"" -#: ../src/icon.c:603 +#: ../src/icon.c:611 msgid "could not find default icon \"%s\"" msgstr "äåí ìðüñåóå íá âñåèåß ôï åî' ïñéóìïý åéêïíßäéï \"%s\"" -#: ../src/icon.c:609 +#: ../src/icon.c:617 msgid "could not load default icon \"%s\":%s" msgstr "äåí ìðüñåóå íá öïñôùèåß ôï åî' ïñéóìïý åéêïíßäéï \"%s\":%s" -#: ../src/main.c:169 +#: ../src/main.c:177 msgid "Restart failed!!!" msgstr "Ç åðáíåêêßíéóç áðÝôõ÷å!!!" -#: ../src/main.c:185 +#: ../src/main.c:221 msgid "%s aborted.\n" -msgstr "%s aborted.\n" +msgstr "%s áêõñþèçêå.\n" -#: ../src/main.c:196 +#: ../src/main.c:232 msgid "usage: %s [-options]\n" msgstr "÷ñÞóç: %s [-ðáñÜìåôñïé]\n" -#: ../src/main.c:197 +#: ../src/main.c:233 msgid "options:" msgstr "åðéëïãÝò:" -#: ../src/main.c:199 +#: ../src/main.c:235 msgid " -nocpp \t\tdisable preprocessing of configuration files" msgstr " -nocpp \t\tdisable preprocessing of configuration files" -#: ../src/main.c:201 +#: ../src/main.c:237 msgid " -nodock\t\tdo not open the application Dock" msgstr " -nodock\t\tdo not open the application Dock" -#: ../src/main.c:202 +#: ../src/main.c:238 msgid " -noclip\t\tdo not open the workspace Clip" msgstr " -noclip\t\tdo not open the workspace Clip" #. #. puts(_(" -locale locale locale to use")); #. -#: ../src/main.c:206 +#: ../src/main.c:242 msgid " -visualid visualid\tvisual id of visual to use" msgstr " -visualid visualid\tvisual id of visual to use" -#: ../src/main.c:207 +#: ../src/main.c:243 msgid " -display host:dpy\tdisplay to use" msgstr " -display host:dpy\tdisplay to use" -#: ../src/main.c:208 +#: ../src/main.c:244 msgid " -version\t\tprint version and exit" msgstr " -version\t\tprint version and exit" -#: ../src/main.c:220 +#: ../src/main.c:256 msgid "" "could not find user GNUstep directory.\n" "Make sure you have installed WindowMaker correctly and run wmaker.inst" @@ -430,27 +508,31 @@ msgstr "" "could not find user GNUstep directory.\n" "Make sure you have installed WindowMaker correctly and run wmaker.inst" -#: ../src/main.c:241 +#: ../src/main.c:277 msgid "%s:could not execute initialization script" msgstr "%s:could not execute initialization script" -#: ../src/main.c:295 ../src/main.c:302 ../src/main.c:309 +#: ../src/main.c:296 +msgid "%s:could not execute exit script" +msgstr "%s:could not execute exit script" + +#: ../src/main.c:353 ../src/main.c:360 ../src/main.c:367 msgid "too few arguments for %s" msgstr "too few arguments for %s" -#: ../src/main.c:313 +#: ../src/main.c:371 msgid "bad value for visualid: \"%s\"" msgstr "bad value for visualid: \"%s\"" -#: ../src/main.c:358 +#: ../src/main.c:412 msgid "X server does not support locale" msgstr "X server does not support locale" -#: ../src/main.c:361 +#: ../src/main.c:415 msgid "cannot set locale modifiers" msgstr "cannot set locale modifiers" -#: ../src/main.c:375 +#: ../src/main.c:422 msgid "could not open display \"%s\"" msgstr "could not open display \"%s\"" @@ -474,51 +556,51 @@ msgstr "your machine is misconfigured. HOSTNAME is set to %s" msgid "your machine is misconfigured. HOST is set to %s" msgstr "your machine is misconfigured. HOST is set to %s" -#: ../src/misc.c:707 +#: ../src/misc.c:759 msgid "selection timed-out" msgstr "selection timed-out" -#: ../src/misc.c:721 +#: ../src/misc.c:773 msgid "Program Arguments" msgstr "Program Arguments" -#: ../src/misc.c:740 +#: ../src/misc.c:792 msgid "Enter command arguments:" -msgstr "Enter command arguments:" +msgstr "Ðëçêôñïëïãåßóôå ôéò ðáñáìÝôñïõò ôçò åíôïëÞò:" -#: ../src/misc.c:761 +#: ../src/misc.c:813 msgid "unable to get dropped data from DND drop" msgstr "unable to get dropped data from DND drop" -#: ../src/misc.c:769 +#: ../src/misc.c:821 msgid "error getting dropped data from DND drop" msgstr "error getting dropped data from DND drop" -#: ../src/misc.c:775 +#: ../src/misc.c:827 msgid "out of memory while getting data from DND drop" msgstr "out of memory while getting data from DND drop" -#: ../src/misc.c:819 ../src/misc.c:938 +#: ../src/misc.c:871 ../src/misc.c:990 msgid "out of memory during expansion of \"%s\"" msgstr "out of memory during expansion of \"%s\"" -#: ../src/misc.c:873 +#: ../src/misc.c:925 msgid "out of memory during expansion of \"%w\"" msgstr "out of memory during expansion of \"%w\"" -#: ../src/misc.c:892 +#: ../src/misc.c:944 msgid "out of memory during expansion of \"%a\"" msgstr "out of memory during expansion of \"%a\"" -#: ../src/misc.c:914 +#: ../src/misc.c:966 msgid "out of memory during expansion of \"%d\"" msgstr "out of memory during expansion of \"%d\"" -#: ../src/misc.c:926 +#: ../src/misc.c:978 msgid "selection not available" msgstr "selection not available" -#: ../src/misc.c:1004 ../src/misc.c:1010 +#: ../src/misc.c:1056 ../src/misc.c:1062 msgid "bad window name value in %s state info" msgstr "bad window name value in %s state info" @@ -526,6 +608,62 @@ msgstr "bad window name value in %s state info" msgid "could not load mask bitmap file \"%s\". Won't use mask" msgstr "could not load mask bitmap file \"%s\". Won't use mask" +#: ../src/proplist.c:180 +msgid "unterminated string" +msgstr "unterminated string" + +#: ../src/proplist.c:247 +msgid "unterminated array" +msgstr "unterminated array" + +#: ../src/proplist.c:256 +msgid "missing , in array or unterminated array" +msgstr "missing , in array or unterminated array" + +#: ../src/proplist.c:267 +msgid "could not get array element" +msgstr "could not get array element" + +#: ../src/proplist.c:297 +msgid "unterminated dictionary" +msgstr "unterminated dictionary" + +#: ../src/proplist.c:315 +msgid "missing dictionary key" +msgstr "missing dictionary key" + +#: ../src/proplist.c:317 +msgid "missing dictionary entry key or unterminated dictionary" +msgstr "missing dictionary entry key or unterminated dictionary" + +#: ../src/proplist.c:323 +msgid "error parsing dictionary key" +msgstr "error parsing dictionary key" + +#: ../src/proplist.c:332 +msgid "missing = in dictionary entry" +msgstr "missing = in dictionary entry" + +#: ../src/proplist.c:351 +msgid "missing ; in dictionary entry" +msgstr "missing ; in dictionary entry" + +#: ../src/proplist.c:432 +msgid "was expecting a string, dictionary, data or array." +msgstr "was expecting a string, dictionary, data or array." + +#: ../src/proplist.c:434 +msgid "Comments are not allowed inside WindowMaker owned domain files." +msgstr "Comments are not allowed inside WindowMaker owned domain files." + +#: ../src/proplist.c:453 +msgid "could not open domain file %s" +msgstr "could not open domain file %s" + +#: ../src/proplist.c:466 +msgid "extra data after end of file" +msgstr "extra data after end of fil" + #: ../src/resources.c:71 msgid "The following character sets are missing in %s:" msgstr "The following character sets are missing in %s:" @@ -554,167 +692,155 @@ msgstr "could not parse color \"%s\"" msgid "could not allocate color \"%s\"" msgstr "could not allocate color \"%s\"" -#: ../src/rootmenu.c:162 +#: ../src/rootmenu.c:166 msgid "Program \"%s\" not found or cannot be executed." -msgstr "Ôï ðñüãñáììá \"%s\" äåí âñÝèçêå êáé äåí ìðïñåß íá åêôåëåóôåß." +msgstr "Ôï ðñüãñáììá \"%s\" äåí âñÝèçêå Þ äåí ìðïñåß íá åêôåëåóôåß." + +#: ../src/rootmenu.c:212 ../src/rootmenu.c:214 ../src/rootmenu.c:238 +msgid "Exit" +msgstr "¸îïäïò" -#: ../src/rootmenu.c:207 +#: ../src/rootmenu.c:213 msgid "Exit window manager?" -msgstr "¸îïäïò áðü ôïí window manager?" +msgstr "¸îïäïò áðü ôïí Window Manager?" -#: ../src/rootmenu.c:227 +#: ../src/rootmenu.c:236 msgid "Close X session" -msgstr "Ôåñìáôéóìüò X ÐåñéâÜëëïíôïò" +msgstr "ÐëÞñçò Ôåñìáôéóìüò" -#: ../src/rootmenu.c:228 +#: ../src/rootmenu.c:237 msgid "" "Close Window System session?\n" "(all applications will be closed)" msgstr "" -"Close Window System session?\n" -"(all applications will be closed)" +"Íá ôåñìáôßóù ðëÞñùò ôïí Window Manager;\n" +"(üëåò ïé åöáñìïãÝò èá ôñåñìáôéóôïýí)" -#: ../src/rootmenu.c:230 -msgid "Exiting...\n" -msgstr "Exiting...\n" - -#: ../src/rootmenu.c:435 -msgid "%s:invalid key modifier \"%s\"" -msgstr "%s:invalid key modifier \"%s\"" - -#: ../src/rootmenu.c:449 +#: ../src/rootmenu.c:456 msgid "%s:invalid kbd shortcut specification \"%s\" for entry %s" msgstr "%s:invalid kbd shortcut specification \"%s\" for entry %s" -#: ../src/rootmenu.c:457 +#: ../src/rootmenu.c:464 msgid "%s:invalid key in shortcut \"%s\" for entry %s" msgstr "%s:invalid key in shortcut \"%s\" for entry %s" -#: ../src/rootmenu.c:510 +#: ../src/rootmenu.c:517 msgid "%s: unmatched '\"' in menu file" msgstr "%s: unmatched '\"' in menu file" -#: ../src/rootmenu.c:559 +#: ../src/rootmenu.c:567 msgid "%s: missing command" msgstr "%s: missing command" -#: ../src/rootmenu.c:592 +#: ../src/rootmenu.c:600 msgid "invalid OPEN_MENU specification: %s" msgstr "invalid OPEN_MENU specification: %s" -#: ../src/rootmenu.c:657 +#: ../src/rootmenu.c:665 msgid "%s:could not stat menu" msgstr "%s:could not stat menu" -#: ../src/rootmenu.c:665 +#: ../src/rootmenu.c:673 msgid "%s:could not stat menu :%s" msgstr "%s:could not stat menu :%s" -#: ../src/rootmenu.c:683 +#: ../src/rootmenu.c:691 msgid "too many parameters in OPEN_MENU: %s" msgstr "too many parameters in OPEN_MENU: %s" -#: ../src/rootmenu.c:719 +#: ../src/rootmenu.c:727 msgid "There are more than one WORKSPACE_MENU commands in the applications menu. Only one is allowed." msgstr "There are more than one WORKSPACE_MENU commands in the applications menu. Only one is allowed." -#: ../src/rootmenu.c:748 ../src/rootmenu.c:766 +#: ../src/rootmenu.c:756 ../src/rootmenu.c:774 msgid "%s:missing parameter for menu command \"%s\"" msgstr "%s:missing parameter for menu command \"%s\"" -#: ../src/rootmenu.c:829 +#: ../src/rootmenu.c:837 msgid "%s:unknown command \"%s\" in menu config." msgstr "%s:unknown command \"%s\" in menu config." -#: ../src/rootmenu.c:837 +#: ../src/rootmenu.c:845 msgid "%s:can't add shortcut for entry \"%s\"" msgstr "%s:can't add shortcut for entry \"%s\"" -#: ../src/rootmenu.c:974 +#: ../src/rootmenu.c:982 msgid "%s:maximal line size exceeded in menu config: %s" msgstr "%s:maximal line size exceeded in menu config: %s" -#: ../src/rootmenu.c:996 ../src/rootmenu.c:1088 ../src/rootmenu.c:1189 +#: ../src/rootmenu.c:1004 ../src/rootmenu.c:1096 ../src/rootmenu.c:1197 msgid "%s:missing command in menu config: %s" msgstr "%s:missing command in menu config: %s" -#: ../src/rootmenu.c:1026 +#: ../src/rootmenu.c:1034 msgid "%s:syntax error in menu file:END declaration missing" msgstr "%s:syntax error in menu file:END declaration missing" -#: ../src/rootmenu.c:1055 ../src/rootmenu.c:1154 +#: ../src/rootmenu.c:1063 ../src/rootmenu.c:1162 msgid "could not make arguments for menu file preprocessor" msgstr "could not make arguments for menu file preprocessor" -#: ../src/rootmenu.c:1061 ../src/rootmenu.c:1161 +#: ../src/rootmenu.c:1069 ../src/rootmenu.c:1169 msgid "%s:could not open/preprocess menu file" msgstr "%s:could not open/preprocess menu file" -#: ../src/rootmenu.c:1073 ../src/rootmenu.c:1174 +#: ../src/rootmenu.c:1081 ../src/rootmenu.c:1182 msgid "%s:could not open menu file" msgstr "%s:could not open menu file" -#: ../src/rootmenu.c:1100 +#: ../src/rootmenu.c:1108 msgid "%s:invalid menu file. MENU command is missing" msgstr "%s:invalid menu file. MENU command is missing" -#: ../src/rootmenu.c:1109 +#: ../src/rootmenu.c:1117 msgid "error reading preprocessed menu data" msgstr "error reading preprocessed menu data" -#: ../src/rootmenu.c:1201 +#: ../src/rootmenu.c:1209 msgid "%s:no title given for the root menu" msgstr "%s:no title given for the root menu" -#: ../src/rootmenu.c:1255 ../src/rootmenu.c:1318 ../src/rootmenu.c:1362 +#: ../src/rootmenu.c:1263 ../src/rootmenu.c:1326 ../src/rootmenu.c:1370 msgid "out of memory while constructing directory menu %s" msgstr "out of memory while constructing directory menu %s" -#: ../src/rootmenu.c:1265 +#: ../src/rootmenu.c:1273 msgid "%s:could not stat file \"%s\" in menu directory" msgstr "%s:could not stat file \"%s\" in menu directory" -#: ../src/rootmenu.c:1411 +#: ../src/rootmenu.c:1419 msgid "Commands" msgstr "ÅíôïëÝò" -#: ../src/rootmenu.c:1413 +#: ../src/rootmenu.c:1421 msgid "Exit..." msgstr "¸îïäïò..." -#: ../src/rootmenu.c:1474 -msgid "%s:could not find menu file \"%s\"" -msgstr "%s:could not find menu file \"%s\"" +#: ../src/rootmenu.c:1488 +msgid "could not find menu file \"%s\" referenced in WMRootMenu" +msgstr "could not find menu file \"%s\" referenced in WMRootMenu" -#: ../src/rootmenu.c:1481 -msgid "%s:could not access menu \"%s\"" -msgstr "%s:could not access menu \"%s\"" +#: ../src/rootmenu.c:1495 +msgid "could not access menu \"%s\" referenced in WMRootMenu" +msgstr "could not access menu \"%s\" referenced in WMRootMenu" -#: ../src/rootmenu.c:1507 ../src/rootmenu.c:1562 +#: ../src/rootmenu.c:1523 ../src/rootmenu.c:1578 msgid "%s:format error in root menu configuration \"%s\"" msgstr "%s:format error in root menu configuration \"%s\"" -#: ../src/screen.c:110 -msgid "it seems that there already is a window manager running" -msgstr "öáßíåôáé ðùò Þäç êÜðïéïò window manager åêôåëåßôáé" - -#: ../src/screen.c:390 +#: ../src/screen.c:402 msgid "could not load logo image for panels" msgstr "could not load logo image for panels" -#: ../src/screen.c:393 +#: ../src/screen.c:405 msgid "error making logo image for panel:%s" msgstr "error making logo image for panel:%s" -#: ../src/screen.c:523 -msgid "icon size is configured to %i, but it's too small. Using 16, instead\n" -msgstr "icon size is configured to %i, but it's too small. Using 16, instead\n" - -#: ../src/screen.c:566 +#: ../src/screen.c:584 msgid "could not initialize graphics library context: %s" msgstr "could not initialize graphics library context: %s" -#: ../src/session.c:113 ../src/wdefaults.c:550 ../src/winspector.c:333 +#: ../src/session.c:113 ../src/wdefaults.c:562 ../src/winspector.c:343 msgid "can't convert \"%s\" to boolean" msgstr "can't convert \"%s\" to boolean" @@ -722,61 +848,92 @@ msgstr "can't convert \"%s\" to boolean" msgid "could not get window list!!" msgstr "could not get window list!!" -#: ../src/startup.c:163 +#: ../src/startup.c:171 msgid "internal X error: %s\n" msgstr "internal X error: %s\n" -#: ../src/startup.c:225 +#. +#. * No functions that potentially do Xlib calls should be called from +#. * here. Xlib calls are not atomic so, so the logical integrity of +#. * Xlib is not guaranteed if a Xlib call is made from a signal handler. +#. +#: ../src/startup.c:233 msgid "got signal %i (%s) - restarting\n" msgstr "got signal %i (%s) - restarting\n" -#: ../src/startup.c:227 +#: ../src/startup.c:235 msgid "got signal %i - restarting\n" msgstr "got signal %i - restarting\n" -#: ../src/startup.c:240 +#: ../src/startup.c:248 msgid "%s: Received signal SIGTERM. Exiting..." msgstr "%s: Received signal SIGTERM. Exiting..." -#: ../src/startup.c:251 +#: ../src/startup.c:259 msgid "got signal %i (%s)\n" msgstr "got signal %i (%s)\n" -#: ../src/startup.c:253 +#: ../src/startup.c:261 msgid "got signal %i\n" msgstr "got signal %i\n" -#: ../src/startup.c:258 +#: ../src/startup.c:266 msgid "crashed while trying to do some post-crash cleanup. Aborting immediatelly." msgstr "crashed while trying to do some post-crash cleanup. Aborting immediatelly." -#: ../src/startup.c:267 +#. restart another window manager so that the X session doesn't +#. * go to space +#: ../src/startup.c:275 msgid "trying to start alternative window manager..." -msgstr "ãßíåôáé ðñïóðÜèåéá íá åêôåëåóôÞ Ýíáò åíáëëáêôéêüò window manager..." +msgstr "trying to start alternative window manager..." + +#: ../src/startup.c:645 +msgid "icon size is configured to %i, but it's too small. Using 16, instead\n" +msgstr "icon size is configured to %i, but it's too small. Using 16, instead\n" + +#: ../src/startup.c:683 +msgid "it seems that there already is a window manager running" +msgstr "it seems that there already is a window manager running" + +#: ../src/startup.c:689 +msgid "could not manage screen %i" +msgstr "could not manage screen %i" + +#: ../src/startup.c:743 +msgid "could not manage any screen" +msgstr "could not manage any screen" #: ../src/switchmenu.c:124 msgid "Windows" msgstr "ÐáñÜèõñá" -#: ../src/texture.c:260 +#: ../src/texture.c:267 msgid "image file \"%s\" used as texture could not be found." msgstr "image file \"%s\" used as texture could not be found." -#: ../src/texture.c:266 +#: ../src/texture.c:273 msgid "could not load texture pixmap \"%s\":%s" msgstr "could not load texture pixmap \"%s\":%s" -#: ../src/texture.c:362 ../src/texture.c:492 +#: ../src/texture.c:413 ../src/texture.c:524 msgid "could not render texture: %s" msgstr "could not render texture: %s" -#: ../src/wdefaults.c:385 +#: ../src/wdefaults.c:396 msgid "could not find icon file \"%s\"" -msgstr "äåí ìðïñåß íá âñåèåß ôï áñ÷åßï åéêïíéäßïõ \"%s\"" +msgstr "äåí ìðïñåß íá âñåèåß ôï åéêïíßäéï \"%s\"" + +#: ../src/window.c:1956 ../src/window.c:2095 +msgid "" +"the NumLock, ScrollLock or similar key seems to be turned on.\n" +"Turn it off or some mouse actions and keyboard shortcuts will not work." +msgstr "" +"the NumLock, ScrollLock or similar key seems to be turned on.\n" +"Turn it off or some mouse actions and keyboard shortcuts will not work." #: ../src/winmenu.c:182 msgid "could not create workspace submenu for window menu" -msgstr "äåí ìðïñåß íá äçìéïõñãçèåß ôï õðï-ìåíïý ôçò åðéöÜíåéáò åñãáóßáò óôï ìåíïý ôïõ ðáñáèýñïõ" +msgstr "could not create workspace submenu for window menu" #: ../src/winmenu.c:204 msgid "(Un)Maximize" @@ -788,7 +945,7 @@ msgstr " #: ../src/winmenu.c:221 msgid "(Un)Shade" -msgstr "(Îå)Áíáäßðëùóç" +msgstr "(Îå/Áíá)äßðëùóç" #: ../src/winmenu.c:229 msgid "Hide" @@ -800,7 +957,7 @@ msgstr " #: ../src/winmenu.c:238 msgid "Select" -msgstr "ÅðéëïãÞ" +msgstr "ÅðÝëåîå" #: ../src/winmenu.c:246 msgid "Move To" @@ -812,191 +969,208 @@ msgstr " #: ../src/winmenu.c:253 msgid "Close" -msgstr "Ôåñìáôéóìüò" +msgstr "ÔåñìÜôéóå" -#: ../src/winspector.c:272 +#: ../src/winspector.c:277 msgid "Could not find icon \"%s\" specified for this window" msgstr "Äåí ìðïñåß íá âñåèåß ôï åéêïíßäéï \"%s\" ðïõ åðéëÝ÷èçêå ãé' áõôü ôï ðáñÜèõñï" -#: ../src/winspector.c:285 +#: ../src/winspector.c:293 msgid "Could not open specified icon \"%s\":%s" msgstr "Äåí ìðïñåß íá äéáâáóôåß ôï åéêïíßäéï \"%s\":%s" -#: ../src/winspector.c:972 +#: ../src/winspector.c:985 msgid "Save" -msgstr "ÁðïèÞêåõóç" +msgstr "Óþóå" -#: ../src/winspector.c:978 +#: ../src/winspector.c:991 msgid "Apply" msgstr "ÅöáñìïãÞ" -#: ../src/winspector.c:984 +#: ../src/winspector.c:997 msgid "Revert" msgstr "ÅðáíáöïñÜ" -#. *** window spec *** -#: ../src/winspector.c:993 ../src/winspector.c:1001 +#: ../src/winspector.c:1006 ../src/winspector.c:1016 msgid "Window Specification" -msgstr "ÐñïäéáãñáöÞ Ðáñáèýñïõ" +msgstr "Êáèïñéóìüò Ðáñáèýñïõ" -#: ../src/winspector.c:994 +#: ../src/winspector.c:1007 msgid "Window Attributes" msgstr "Éäéüôçôåò ðáñáèýñïõ" -#: ../src/winspector.c:995 +#: ../src/winspector.c:1008 msgid "Advanced Options" msgstr "Ðñï÷ùñçìÝíåò ÅðéëïãÝò" -#: ../src/winspector.c:996 +#: ../src/winspector.c:1009 msgid "Icon and Initial Workspace" msgstr "Åéêïíßäéï êáé Áñ÷éêÞ ÅðéöÜíåéá" -#: ../src/winspector.c:997 +#: ../src/winspector.c:1010 msgid "Application Specific" msgstr "ÅéäéêÜ ãéá ôï ðñüãñáììá" -#: ../src/winspector.c:1009 +#: ../src/winspector.c:1024 msgid "Defaults for all windows" msgstr "ÊïéíÞ ãéá üëá ôá ðáñÜèõñá" -#: ../src/winspector.c:1045 +#: ../src/winspector.c:1060 msgid "" "The configuration will apply to all\n" "windows that have their WM_CLASS property set to the above selected\n" "name, when saved." msgstr "" "Ïé ñõèìßóåéò èá åöáñìïóôïýí óå üëá\n" -"ôá ðáñÜèõñá ðïõ éäéüôçôá ôïõò WM_CLASS, Ý÷åé ôéìÞ\n" -"áíôßóôïé÷ç ìå ôçí áõôÞ ðïõ åðéëÝ÷èçêå ðáñáðÜíù." +"ôá ðáñÜèõñá ðïõ ç éäéüôçôá ôïõò\n" +"WM_CLASS Ý÷åé ôéìÞ áíôßóôïé÷ç ìå áõôÞ ðïõ åðéëÝ÷èçêå ðáñáðÜíù." -#: ../src/winspector.c:1052 +#. *** attributes *** +#: ../src/winspector.c:1067 msgid "Attributes" msgstr "Éäéüôçôåò" -#: ../src/winspector.c:1062 +#: ../src/winspector.c:1077 msgid "Disable titlebar" -msgstr "Áðüêñõøç ìðÜñáò ôßôëïõ" +msgstr "Êñýøå ôç ìðÜñá ôïõ ôßôëïõ" -#: ../src/winspector.c:1066 +#: ../src/winspector.c:1081 msgid "Disable resizebar" -msgstr "Áðüêñõøç ìðÜñáò áëëáãÞò ìåãÝèïõò" +msgstr "Êñýøå ôç ìðÜñá áëëáãÞò ìåãÝèïõò" -#: ../src/winspector.c:1070 +#: ../src/winspector.c:1085 msgid "Disable close button" -msgstr "Áðüêñõøç êïõìðéïý ôåñìáôéóìïý" +msgstr "Êñýøå ôï êïõìðß ôåñìáôéóìïý" -#: ../src/winspector.c:1074 +#: ../src/winspector.c:1089 msgid "Disable miniaturize button" -msgstr "Áðüêñõøç êïõìðéïý åëá÷éóôïðïßçóçò" +msgstr "Êñýøå ôï êïõìðß åëá÷éóôïðïßçóçò" -#: ../src/winspector.c:1078 +#: ../src/winspector.c:1093 msgid "Keep on top" -msgstr "ÐÜíôá óôçí \"êïñõöÞ\"" +msgstr "ÐÜíôá óôçí êïñõöÞ" -#: ../src/winspector.c:1082 +#: ../src/winspector.c:1097 msgid "Omnipresent" -msgstr "ÅìöÜíéóç óå üëåò ôéò åðéöÜíåéåò åñãáóßáò" +msgstr "Ðáñþí óå êÜèå åðéöÜíåéá" -#: ../src/winspector.c:1086 +#: ../src/winspector.c:1101 msgid "Start Miniaturized" msgstr "Åêêßíçóç ùò Åëá÷éóôïðïéçìÝíï" -#: ../src/winspector.c:1090 +#: ../src/winspector.c:1105 msgid "Skip window list" -msgstr "Íá ìçí åìöáíßæåôáé óôç ëßóôá ðáñáèýñùí" +msgstr "Êñýøå áðü ôç Ëßóôá Ðáñáèýñùí" -#: ../src/winspector.c:1104 +#: ../src/winspector.c:1119 msgid "Advanced" msgstr "Ãéá ðñï÷ùñçìÝíïõò" -#: ../src/winspector.c:1114 +#: ../src/winspector.c:1129 msgid "Ignore HideOthers" -msgstr "Áãíüçóå ôçí Áðüêñõøç ôùí ¶ëëùí" +msgstr "Áãíüçóå \"Áðüêñõøç ôùí ¶ëëùí\"" -#: ../src/winspector.c:1118 +#: ../src/winspector.c:1133 msgid "Don't bind keyboard shortcuts" -msgstr "Íá ìçí äåóìåýïíôáé ïé óõíäõáóìïß ðëÞêôñùí êáôÜ ôçí ðëçêôñïëüãçóç" +msgstr "Ìç äÝóìåõóç ôùí óõíôïìåýóåùí" -#: ../src/winspector.c:1122 +#: ../src/winspector.c:1137 msgid "Don't bind mouse clicks" -msgstr "Íá ìçí äåóìåýïíôáé ôá êëßê ôïõ ðïíôéêéïý" +msgstr "Ìç äÝóìåõóç ôùí êëéê ðïíôéêéïý" -#: ../src/winspector.c:1126 +#: ../src/winspector.c:1141 msgid "Keep inside screen" -msgstr "ÄéáôÞñçóç åíôüò ôçò ïèüíçò" +msgstr "ÊñÜôçóå åíôüò ôçò ïèüíçò" -#: ../src/winspector.c:1130 +#: ../src/winspector.c:1145 msgid "Don't let it take focus" -msgstr "Íá ìçí ãßíåôáé ðïôÝ \"åíåñãü\"" - -#: ../src/winspector.c:1134 -msgid "Don't Save Session" -msgstr "Íá ìçí óþæåôáé êáôÜ ôçí áðïèÞêåõóç ôïõ ÐåñéâÜëëïíôïò" +msgstr "Íá ìçí åßíáé ðïôÝ \"åíåñãü\"" #: ../src/winspector.c:1149 -msgid "Enable the \"Don't bind...\" options to allow the application to receive all mouse or keyboard events." -msgstr "ÔóåêÜñéóå ôéò \"Íá ìçí äåóìåýïíôáé...\" åðéëïãÝò ãéá íá êÜíåéò ôéò åíôïëÝò áðü ôï ðëçêôñïëüãéï Þ ôï ðïíôßêé íá äåóìåýïíôáé ìüíï áðü ôá ðñïãñÜììáôá." +msgid "Don't Save Session" +msgstr "¼÷é \"Óþóéìï ÊáôÜóôáóçò\"" -#: ../src/winspector.c:1156 -msgid "Miniwindow Image" -msgstr "Åéêüíá Åëá÷éóôïðïéçìÝíïõ Ðáñáèýñïõ" +#: ../src/winspector.c:1153 +msgid "Emulate Application Icon" +msgstr "Åîïìïßùóç Åéêïíéäßïõ Ðñïãñ/ôïò" #: ../src/winspector.c:1168 -msgid "Browse..." -msgstr "ÅðÝëåîå..." +msgid "Enable the \"Don't bind...\" options to allow the application to receive all mouse or keyboard events." +msgstr "ÔóåêÜñéóå ôéò \"Ìç äÝóìåõóç...\" åðéëïãÝò\nãéá íá äÝ÷åôáé ôï ðñüãñáììá üëåò ôéò\nåíôïëÝò áðü ôï ðëçêôñïëüãéï Þ ôï ðïíôßêé." -#: ../src/winspector.c:1174 -msgid "Update" -msgstr "ÁíáíÝùóå" +#: ../src/winspector.c:1175 +msgid "Miniwindow Image" +msgstr "Åéêïíßäéï Åëá÷éóôïðïéçìÝíïõ Ðáñáèýñïõ" -#: ../src/winspector.c:1179 +#: ../src/winspector.c:1209 msgid "Icon file name:" -msgstr "Áñ÷åßï åéêïíéäßïõ" +msgstr "Áñ÷åßï åéêïíéäßïõ:" -#: ../src/winspector.c:1189 +#: ../src/winspector.c:1221 msgid "Ignore client supplied icon" -msgstr "Áãíüçóå ôï åî' ïñéóìïý åéêïíßäéï" +msgstr "Áãíüçóå åéêïíßäéï áðü ôïí Client" -#: ../src/winspector.c:1195 +#: ../src/winspector.c:1228 msgid "Initial Workspace" -msgstr "Áñ÷éêÞ ÅðéöÜíåéá åñãáóßáò" +msgstr "Áñ÷éêÞ ÅðéöÜíåéá" -#: ../src/winspector.c:1201 +#: ../src/winspector.c:1233 msgid "Nowhere in particular" msgstr "ÐïõèåíÜ óõãêåêñéìÝíá" -#: ../src/winspector.c:1232 +#: ../src/winspector.c:1264 msgid "Application Wide" -msgstr "Åõñýôåñá ãéá ôï ðñüãñáììá" +msgstr "Ó÷åôéêÜ ìå ôï ðñüãñáììá" -#: ../src/winspector.c:1242 +#: ../src/winspector.c:1274 msgid "Start Hidden" -msgstr "Åêêßíçóç ùò \"ÊñõìÝíï\"" +msgstr "Åêêßíçóç ùò \"ÊñõììÝíï\"" -#: ../src/winspector.c:1246 +#: ../src/winspector.c:1278 msgid "No application icon" -msgstr "÷ùñßò ôï åéêïíßäéï ôïõ ðñïãñÜììáôïò" +msgstr "×ùñßò åéêïíßäéï ðñïãñÜììáôïò" -#: ../src/workspace.c:89 ../src/workspace.c:90 ../src/workspace.c:402 +#: ../src/workspace.c:89 ../src/workspace.c:90 ../src/workspace.c:419 msgid "Workspace %i" -msgstr "ÅðéöÜíåéá åñãáóßáò %i" +msgstr "ÅðéöÜíåéá %i" -#: ../src/workspace.c:440 +#: ../src/workspace.c:467 msgid "Workspaces" -msgstr "ÅðéöÜíåéåò åñãáóßáò" +msgstr "ÅðéöÜíåéåò" -#: ../src/workspace.c:442 +#: ../src/workspace.c:469 msgid "could not create Workspace menu" -msgstr "ôï ìåíïý ôçò åðéöÜíåéáò åñãáóßáò äåí ìðüñåóå íá äçìéïõñãçèåß" +msgstr "ôï ìåíïý ÅðéöÜíåéáò äåí ìðüñåóå íá äçìéïõñãçèåß" -#: ../src/workspace.c:449 +#: ../src/workspace.c:476 msgid "New" msgstr "Äçìéïõñãßá ÍÝáò" -#: ../src/workspace.c:450 +#: ../src/workspace.c:477 msgid "Destroy Last" msgstr "ÊáôáóôñïöÞ Ôåëåõôáßáò" -#: ../src/xutil.c:220 +#: ../src/xutil.c:226 msgid "invalid data in selection" -msgstr "ôá äåäïìÝíá ôçò åðéëïãÞò åßíáé ìç áðïäåêôÜ " +msgstr "invalid data in selection" +# msgid "invalid kbd shortcut specification \"%s\"" +# msgstr "invalid kbd shortcut specification \"%s\"" +# +# msgid "Exiting...\n" +# msgstr "Exiting...\n" +# +# msgid "invalid key modifier \"%s\"" +# msgstr "invalid key modifier \"%s\"" +# +# msgid "could not load clip tile image" +# msgstr "could not load clip tile image" +# +# msgid "%s:could not find menu file \"%s\"" +# msgstr "%s:could not find menu file \"%s\"" +# +# msgid "%s:could not access menu \"%s\"" +# msgstr "%s:could not access menu \"%s\"" +# +# msgid "invalid key in shortcut \"%s\"" +# msgstr "invalid key in shortcut \"%s\"" +# diff --git a/po/ro.po b/po/ro.po index f63e7d89..5fcba4e9 100644 --- a/po/ro.po +++ b/po/ro.po @@ -348,23 +348,19 @@ msgstr "%s: dimensiuni invalide ale hartii de culori in linia \"%s\"" #: ../resource.c:579 msgid "%s: invalid geometry display type \"%s\". Shouldbe center, corner, floating or line" -msgstr "%s: tip de geometrie a monitorului invalid \"%s\". Valori permise: center, corner, floating -sau line" +msgstr "%s: tip de geometrie a monitorului invalid \"%s\". Valori permise: center, corner, floating sau line" #: ../resource.c:601 msgid "%s: invalid focus mode \"%s.\" Should be manual, auto or semiauto" -msgstr "%s: mod de focalizare invalid \"%s.\" Valori permise: manual, auto -sau semiauto" +msgstr "%s: mod de focalizare invalid \"%s.\" Valori permise: manual, auto sau semiauto" #: ../resource.c:619 msgid "%s: invalid window placement mode \"%s\". Should be auto, cascade or manual" -msgstr "%s: modo al plasarii ferestrei invalid \"%s\". Valori permise: auto, cascade -sau manual" +msgstr "%s: modo al plasarii ferestrei invalid \"%s\". Valori permise: auto, cascade sau manual" #: ../resource.c:639 msgid "%s: invalid texture type \"%s\" Should be solid, dgradient, vgradient or hgradient" -msgstr "%s: tip de textura invalid \"%s\" Valori permise: solid, dgradient, vgradient -sau hgradient" +msgstr "%s: tip de textura invalid \"%s\" Valori permise: solid, dgradient, vgradient sau hgradient" #: ../resource.c:666 msgid "%s: invalid gradient spec. \"%s\"" @@ -376,8 +372,7 @@ msgstr "%s: coordonata invalida \"%s\"" #: ../resource.c:701 msgid "%s: invalid justification type \"%s\". Should be left, center or right" -msgstr "%s: tipul de justificare invalid \"%s\". Valori permise: left, center -sau right" +msgstr "%s: tipul de justificare invalid \"%s\". Valori permise: left, center sau right" #: ../resource.c:731 msgid "could not make arguments for preference file preprocessor" @@ -405,8 +400,7 @@ msgstr "nu se poate gasi icon-ul de bakground \"%s\" " #: ../raster.c:183 msgid "invalid dither colormap size specification.disabling" -msgstr "specificarea marimii hartii de culori e invalida. -Dezactivare" +msgstr "specificarea marimii hartii de culori e invalida. Dezactivare" #: ../raster.c:193 msgid "Could not build PseudoColor color table\n" @@ -438,8 +432,7 @@ msgstr "Ferestre" #: ../dock.c:171 msgid "could not open file \"%s\" to save Dock state" -msgstr "e' fisierul \"%s\" nu se poate deschide pt. salvarea starii -Dock-ului" +msgstr "e' fisierul \"%s\" nu se poate deschide pt. salvarea starii Dock-ului" #: ../dock.c:687 msgid "Could not execute program \"%s\"" diff --git a/po/tr.po b/po/tr.po index 818ebb53..5627c9af 100644 --- a/po/tr.po +++ b/po/tr.po @@ -3,7 +3,7 @@ msgstr "" "Date: 1998-03-12 18:29:09+EET\n" "From: KGF \n" "Content-Type: text/plain; charset=\n" -"Language-Team: TURKISH \n" +"Language-Team: Turkish \n" "Xgettext-Options: --default-domain=WindowMaker --add-comments --keyword=_\n" "Files: ../main.c ../event.c ../window.c ../startup.c ../shutdown.c ../wcore.c ../properties.c ../texture.c ../actions.c ../menu.c ../client.c ../pixmap.c ../image.c ../gradient.c ../button.c ../screen.c ../icon.c ../rootmenu.c ../dialog.c ../resource.c ../moveres.c ../application.c ../colormap.c ../raster.c ../placement.c ../misc.c ../appmenu.c ../keybind.c ../stacking.c ../appicon.c ../switchmenu.c ../dock.c ../winmenu.c ../generic/error.c\n" diff --git a/src/GNUstep.h b/src/GNUstep.h index 03266c36..88b3c056 100644 --- a/src/GNUstep.h +++ b/src/GNUstep.h @@ -1,6 +1,6 @@ /* GNUstep.h-- stuff for compatibility with GNUstep applications * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -42,7 +42,7 @@ #undef WINGS_BOOL_FLAG #endif -#define WINDOWMAKER_WM_MINIATURIZE_WINDOW "_WINDOWMAKER_WM_MINIATURIZE_WINDOW" +#define GNUSTEP_WM_MINIATURIZE_WINDOW "_GNUSTEP_WM_MINIATURIZE_WINDOW" #define GNUSTEP_WM_ATTR_NAME "_GNUSTEP_WM_ATTR" @@ -67,8 +67,9 @@ enum { }; #endif /* _WINGS_H_ */ -/* GNUstep protocols atom names */ -#define GNUSTEP_WM_RESIZEBAR "_GNUSTEP_WM_RESIZEBAR" +/* window manager -> appkit notifications */ +#define GNUSTEP_WM_NOTIFICATION "GNUSTEP_WM_NOTIFICATION" + typedef struct { CARD32 flags; @@ -92,6 +93,9 @@ typedef struct { /* extra flags */ #define GSDocumentEditedFlag (1<<0) +#define GSWindowWillResizeNotificationsFlag (1<<1) +#define GSWindowWillMoveNotificationsFlag (1<<2) + #define GSNoApplicationIconFlag (1<<5) diff --git a/src/Makefile.am b/src/Makefile.am index c6a08ad1..a656426c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -102,16 +102,16 @@ CPPFLAGS = \ INCLUDES = \ - -I$(top_srcdir)/wrlib \ - -I$(top_srcdir)/WINGs \ @XCFLAGS@ \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList \ + -I$(top_srcdir)/wrlib \ + -I$(top_srcdir)/WINGs wmaker_LDADD = \ - $(top_builddir)/WINGs/libWINGs.a\ - $(top_builddir)/wrlib/libwraster.a\ - @LIBPL_LIBS@ \ + -L$(top_builddir)/WINGs -lWINGs\ + -L$(top_builddir)/wrlib -lwraster\ + -L$(top_builddir)/libPropList -lPropList\ @XLFLAGS@ \ @GFXLIBS@ \ @XLIBS@ \ diff --git a/src/Makefile.in b/src/Makefile.in index 1adb32db..75247730 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -193,15 +191,15 @@ CPPFLAGS = \ -DPIXMAPDIR="\"$(pixmapdir)\"" INCLUDES = \ - -I$(top_srcdir)/wrlib \ - -I$(top_srcdir)/WINGs \ @XCFLAGS@ \ - @LIBPL_INC_PATH@ + -I$(top_srcdir)/libPropList \ + -I$(top_srcdir)/wrlib \ + -I$(top_srcdir)/WINGs wmaker_LDADD = \ - $(top_builddir)/WINGs/libWINGs.a\ - $(top_builddir)/wrlib/libwraster.a\ - @LIBPL_LIBS@ \ + -L$(top_builddir)/WINGs -lWINGs\ + -L$(top_builddir)/wrlib -lwraster\ + -L$(top_builddir)/libPropList -lPropList\ @XLFLAGS@ \ @GFXLIBS@ \ @XLIBS@ \ @@ -227,8 +225,7 @@ placement.o properties.o proplist.o resources.o rootmenu.o screen.o \ session.o shutdown.o stacking.o startup.o superfluous.o switchmenu.o \ texture.o xmodifier.o xutil.o wcore.o wdefaults.o window.o winmenu.o \ winspector.o workspace.o wmsound.o text.o -wmaker_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a \ -$(top_builddir)/wrlib/libwraster.a +wmaker_DEPENDENCIES = wmaker_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) diff --git a/src/WindowMaker.h b/src/WindowMaker.h index 102740a6..c8b1c70f 100644 --- a/src/WindowMaker.h +++ b/src/WindowMaker.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -127,14 +127,6 @@ typedef struct WObjDescriptor { #define WTJ_LEFT 1 #define WTJ_RIGHT 2 - -/* icon box positions */ -#define WIB_BOTTOM 0 -#define WIB_TOP 1 -#define WIB_LEFT 2 -#define WIB_RIGHT 3 - - /* iconification styles */ #define WIS_ZOOM 0 #define WIS_TWIST 1 @@ -157,9 +149,6 @@ typedef struct WObjDescriptor { #define SPEED_SLOW 3 #define SPEED_ULTRASLOW 4 -/* startup warnings */ -#define WAR_DEFAULTS_DIR 1 /* created defaults DB directory */ - /* window states */ #define WS_FOCUSED 0 @@ -180,18 +169,19 @@ typedef struct WObjDescriptor { #define IY_LEFT 0 +/* program states */ +#define WSTATE_NORMAL 0 +#define WSTATE_NEED_EXIT 1 +#define WSTATE_NEED_RESTART 2 +#define WSTATE_EXITING 3 +#define WSTATE_RESTARTING 4 -typedef struct W2Color { - char *color1; - char *color2; -} W2Color; typedef struct WCoord { int x, y; } WCoord; - typedef struct WPreferences { char **pixmap_path; /* NULL terminated array of */ /* paths to find pixmaps */ @@ -213,8 +203,9 @@ typedef struct WPreferences { char use_saveunders; /* turn on SaveUnders for menus, * icons etc. */ - +/* char no_window_under_dock; + */ char no_window_over_icons; @@ -257,7 +248,7 @@ typedef struct WPreferences { WCoord *win_menu_pos; - int icon_yard; /* aka iconbox */ + char icon_yard; /* aka iconbox */ int raise_delay; /* delay for autoraise. 0 is disabled */ @@ -298,13 +289,13 @@ typedef struct WPreferences { int dblclick_time; /* double click delay time in ms */ /* animate menus */ - int menu_scroll_speed; /* how fast menus are scrolled */ + char menu_scroll_speed; /* how fast menus are scrolled */ /* animate icon sliding */ - int icon_slide_speed; /* icon slide animation speed */ + char icon_slide_speed; /* icon slide animation speed */ /* shading animation */ - int shade_speed; + char shade_speed; int edge_resistance; diff --git a/src/actions.c b/src/actions.c index daec8d96..6caa2db5 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1,6 +1,6 @@ /* action.c- misc. window commands (miniaturize, hide etc.) * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -27,6 +27,7 @@ #include #include #include +#include #include "WindowMaker.h" #include "wcore.h" @@ -69,8 +70,8 @@ static struct { {SHADE_STEPS_S, SHADE_DELAY_S}, {SHADE_STEPS_U, SHADE_DELAY_U}}; -#define SHADE_STEPS shadePars[wPreferences.shade_speed].steps -#define SHADE_DELAY shadePars[wPreferences.shade_speed].delay +#define SHADE_STEPS shadePars[(int)wPreferences.shade_speed].steps +#define SHADE_DELAY shadePars[(int)wPreferences.shade_speed].delay static int ignoreTimestamp=0; @@ -245,11 +246,12 @@ wSetFocusTo(WScreen *scr, WWindow *wwin) void wShadeWindow(WWindow *wwin) { - XWindowAttributes attribs; -#ifdef ANIMATIONS + XWindowAttributes attribs; + time_t time0 = time(NULL); +#ifdef ANIMATIONS int y, s, w, h; #endif - + if (wwin->flags.shaded) return; @@ -276,6 +278,9 @@ wShadeWindow(WWindow *wwin) wusleep(SHADE_DELAY*1000L); h-=s; y-=s; + + if (time(NULL)-time0 > MAX_ANIMATION_TIME) + break; } XMoveWindow(dpy, wwin->client_win, 0, wwin->frame->top_width); } @@ -302,6 +307,7 @@ wShadeWindow(WWindow *wwin) #ifdef ANIMATIONS if (!wwin->screen_ptr->flags.startup) { + /* Look at processEvents() for reason of this code. */ XSync(dpy, 0); processEvents(XPending(dpy)); } @@ -312,6 +318,7 @@ wShadeWindow(WWindow *wwin) void wUnshadeWindow(WWindow *wwin) { + time_t time0 = time(NULL); #ifdef ANIMATIONS int y, s, w, h; #endif /* ANIMATIONS */ @@ -347,6 +354,9 @@ wUnshadeWindow(WWindow *wwin) wusleep(SHADE_DELAY*2000L/3); h+=s; y+=s; + + if (time(NULL)-time0 > MAX_ANIMATION_TIME) + break; } } XMoveWindow(dpy, wwin->client_win, 0, wwin->frame->top_width); @@ -395,13 +405,19 @@ wMaximizeWindow(WWindow *wwin, int directions) if (!(wPreferences.icon_yard & IY_RIGHT)) new_x += wPreferences.icon_size; } - +#if 0 if (wPreferences.no_window_under_dock && wwin->screen_ptr->dock) { new_width -= wPreferences.icon_size + DOCK_EXTRA_SPACE; if (!wwin->screen_ptr->dock->on_right_side) new_x += wPreferences.icon_size + DOCK_EXTRA_SPACE; } +#endif + if (wwin->screen_ptr->dock && !wwin->screen_ptr->dock->lowered) { + new_width -= wPreferences.icon_size + DOCK_EXTRA_SPACE; + if (!wwin->screen_ptr->dock->on_right_side) + new_x += wPreferences.icon_size + DOCK_EXTRA_SPACE; + } } else { new_x = wwin->frame_x; new_width = wwin->frame->core->width; @@ -679,181 +695,6 @@ animateResize(WScreen *scr, int x, int y, int w, int h, #endif /* ANIMATIONS */ -/* Here are defined the miniaturize animation functions. The above defined - * functions, use a separate function that implements the animation for each - * different style, and a wrapper that calls them accordingly. - * The below function is a single function that implements all the miniaturize - * animation styles in one single function, using switch{} and if() statements - * to differentiate them. - * The above code is more generic and elegant, letting one to extend it very - * easily (though I don't think one would ;), but will make the code a little - * bit bigger, using three functions and a wrapper. - * The below version, is smaller, being optimised for size, but is less - * elegant, and harder to be extended. Also is harder to read. - * I let them both here so you can take a look, and decide which one you like - * more. I would use the above functions because they are nicer, and easier to - * read and follow, and only a little bit bigger. -Dan - */ - - -#ifdef ANIMATIONS_DONT_USE_THIS -static void -animateResize(WScreen *scr, int x, int y, int w, int h, - int fx, int fy, int fw, int fh, int hiding) -{ -#define FRAMES (MINIATURIZE_ANIMATION_FRAMES_Z) - float cx[FRAMES], cy[FRAMES], cw[FRAMES], ch[FRAMES]; - float xstep, ystep, wstep, hstep; - XPoint points[5]; - float angle, final_angle, a, d, delta, dx, dch, midy, twist=0.5; - int style = wPreferences.iconification_style; /* Catch the value */ - /* to avoid changes while animating */ - int frames, steps, delay, i, j; - - if (style == WIS_NONE) - return; - - switch(style) { - case WIS_TWIST: - frames = MINIATURIZE_ANIMATION_FRAMES_T; - steps = MINIATURIZE_ANIMATION_STEPS_T; - delay = MINIATURIZE_ANIMATION_DELAY_T; - twist = MINIATURIZE_ANIMATION_TWIST_T; - break; - case WIS_FLIP: - frames = MINIATURIZE_ANIMATION_FRAMES_F; - steps = MINIATURIZE_ANIMATION_STEPS_F; - delay = MINIATURIZE_ANIMATION_DELAY_F; - twist = MINIATURIZE_ANIMATION_TWIST_F; - break; - case WIS_ZOOM: - default: - frames = MINIATURIZE_ANIMATION_FRAMES_Z; - steps = MINIATURIZE_ANIMATION_STEPS_Z; - delay = MINIATURIZE_ANIMATION_DELAY_Z; - break; - } - - steps = (hiding ? (steps*2)/3 : steps); - if (steps == 0) - return; - - if (style == WIS_TWIST) { - x += w/2; - y += h/2; - fx += fw/2; - fy += fh/2; - } - xstep = (float)(fx-x)/steps; - ystep = (float)(fy-y)/steps; - wstep = (float)(fw-w)/steps; - hstep = (float)(fh-h)/steps; - for (j=0; j final_angle) - angle = final_angle; - switch (style) { - case WIS_TWIST: - a = atan(ch[0]/cw[0]); - d = sqrt((cw[0]/2)*(cw[0]/2)+(ch[0]/2)*(ch[0]/2)); - points[0].x = cx[0]+cos(angle-a)*d; - points[0].y = cy[0]+sin(angle-a)*d; - points[1].x = cx[0]+cos(angle+a)*d; - points[1].y = cy[0]+sin(angle+a)*d; - points[2].x = cx[0]+cos(angle-a+WM_PI)*d; - points[2].y = cy[0]+sin(angle-a+WM_PI)*d; - points[3].x = cx[0]+cos(angle+a+WM_PI)*d; - points[3].y = cy[0]+sin(angle+a+WM_PI)*d; - points[4].x = cx[0]+cos(angle-a)*d; - points[4].y = cy[0]+sin(angle-a)*d; - break; - case WIS_FLIP: - dx = (cw[0]/10) - ((cw[0]/5) * sin(angle)); - dch = (ch[0]/2) * cos(angle); - midy = cy[0] + (ch[0]/2); - points[0].x = cx[0] + dx; points[0].y = midy - dch; - points[1].x = cx[0] + cw[0] - dx; points[1].y = points[0].y; - points[2].x = cx[0] + cw[0] + dx; points[2].y = midy + dch; - points[3].x = cx[0] - dx; points[3].y = points[2].y; - points[4].x = points[0].x; points[4].y = points[0].y; - break; - } - - XGrabServer(dpy); - XDrawLines(dpy, scr->root_win, scr->frame_gc, points, 5, CoordModeOrigin); - XFlush(dpy); - if (delay>0) - wusleep(delay); - - XDrawLines(dpy, scr->root_win, scr->frame_gc, points, 5, CoordModeOrigin); - XUngrabServer(dpy); - cx[0]+=xstep; - cy[0]+=ystep; - cw[0]+=wstep; - ch[0]+=hstep; - if (angle >= final_angle) - break; - - } - XFlush(dpy); - } else { - /* Zoom or default */ - XGrabServer(dpy); - for (i=0; iroot_win, scr->frame_gc, - (int)cx[j], (int)cy[j], (int)cw[j], (int)ch[j]); - } - XFlush(dpy); - if (delay>0) - wusleep(delay); - - for (j=0; jroot_win, scr->frame_gc, - (int)cx[j], (int)cy[j], (int)cw[j], (int)ch[j]); - if (jroot_win, scr->frame_gc, - (int)cx[j], (int)cy[j], (int)cw[j], (int)ch[j]); - } - XFlush(dpy); - if (delay>0) - wusleep(MINIATURIZE_ANIMATION_DELAY_Z); - - for (j=0; jroot_win, scr->frame_gc, - (int)cx[j], (int)cy[j], (int)cw[j], (int)ch[j]); - } - - XUngrabServer(dpy); - } -} -#undef FRAMES -#endif /* ANIMATIONS */ - - static void flushExpose() { @@ -942,12 +783,23 @@ setupIconGrabs(WIcon *icon) static WWindow* recursiveTransientFor(WWindow *wwin) { + int i; + if (!wwin) return None; - /* TODO: a buggy client can put this in a infinite loop */ - while (wwin->transient_for != None) + /* hackish way to detect transient_for cycle */ + i = wwin->screen_ptr->window_count+1; + + while (wwin && wwin->transient_for != None && i>0) { wwin = wWindowFor(wwin->transient_for); + i--; + } + if (i==0 && wwin) { + wwarning("%s has a severely broken WM_TRANSIENT_FOR hint.", + wwin->frame->title); + return NULL; + } return wwin; } @@ -1009,6 +861,10 @@ wIconifyWindow(WWindow *wwin) unmapTransientsFor(wwin); if (present) { +#ifdef WMSOUND + wSoundPlay(WMSOUND_ICONIFY); +#endif + XUngrabPointer(dpy, CurrentTime); /* prevent window withdrawal when getting UnmapNotify */ XSelectInput(dpy, wwin->client_win, @@ -1043,9 +899,10 @@ wIconifyWindow(WWindow *wwin) #endif if (present) { + WWindow *owner = recursiveTransientFor(wwin->screen_ptr->focused_window); setupIconGrabs(wwin->icon); - if ((wwin->flags.focused || wwin->client_win == - recursiveTransientFor(wwin->screen_ptr->focused_window)->client_win) + if ((wwin->flags.focused + || (owner && wwin->client_win == owner->client_win)) && wPreferences.focus_mode==WKF_CLICK) { WWindow *tmp; @@ -1060,20 +917,18 @@ wIconifyWindow(WWindow *wwin) } else if (wPreferences.focus_mode!=WKF_CLICK) { wSetFocusTo(wwin->screen_ptr, NULL); } - -#ifdef WMSOUND - if (present) { - wSoundPlay(WMSOUND_ICONIFY); - } -#endif #ifdef ANIMATIONS - /* if (!wwin->screen_ptr->flags.startup) { + Window clientwin = wwin->client_win; + XSync(dpy, 0); processEvents(XPending(dpy)); + + /* the window can disappear while doing the processEvents() */ + if (!wWindowFor(clientwin)) + return; } - */ #endif } @@ -1111,7 +966,11 @@ wDeiconifyWindow(WWindow *wwin) wIconSelect(wwin->icon); XUnmapWindow(dpy, wwin->icon->core->window); - + +#ifdef WMSOUND + wSoundPlay(WMSOUND_DEICONIFY); +#endif + /* if the window is in another workspace, do it silently */ #ifdef ANIMATIONS if (!wwin->screen_ptr->flags.startup && !wPreferences.no_animations @@ -1144,14 +1003,15 @@ wDeiconifyWindow(WWindow *wwin) || wPreferences.focus_mode==WKF_SLOPPY) wSetFocusTo(wwin->screen_ptr, wwin); -#ifdef WMSOUND - wSoundPlay(WMSOUND_DEICONIFY); -#endif - #ifdef ANIMATIONS if (!wwin->screen_ptr->flags.startup) { + Window clientwin = wwin->client_win; + XSync(dpy, 0); processEvents(XPending(dpy)); + + if (!wWindowFor(clientwin)) + return; } #endif @@ -1209,6 +1069,9 @@ hideWindow(WIcon *icon, int icon_x, int icon_y, WWindow *wwin, int animate) XUnmapWindow(dpy, wwin->frame->core->window); wClientSetState(wwin, IconicState, icon->icon_win); flushExpose(); +#ifdef WMSOUND + wSoundPlay(WMSOUND_HIDE); +#endif #ifdef ANIMATIONS if (!wwin->screen_ptr->flags.startup && !wPreferences.no_animations && !wwin->flags.skip_next_animation && animate) { @@ -1221,10 +1084,6 @@ hideWindow(WIcon *icon, int icon_x, int icon_y, WWindow *wwin, int animate) wwin->flags.skip_next_animation = 0; UpdateSwitchMenu(wwin->screen_ptr, wwin, ACTION_CHANGE_STATE); - -#ifdef WMSOUND - wSoundPlay(WMSOUND_HIDE); -#endif } @@ -1269,7 +1128,7 @@ wHideOtherApplications(WWindow *awin) } #endif - if (wwin->main_window==None) { + if (wwin->main_window==None || wwin->window_flags.no_appicon) { if (!wwin->window_flags.no_miniaturizable) { wwin->flags.skip_next_animation = 1; wIconifyWindow(wwin); @@ -1412,14 +1271,13 @@ unhideWindow(WIcon *icon, int icon_x, int icon_y, WWindow *wwin, int animate, wwin->flags.hidden=0; wwin->flags.mapped=1; + +#ifdef WMSOUND + wSoundPlay(WMSOUND_UNHIDE); +#endif #ifdef ANIMATIONS - /* something is redundant here. animate passed here is - * !wwin->flags.skip_next_animation, so this flag is tested twice. - * Either we shold not test skip_next_animation here, or don't pass - * animate to this function. -Dan - */ - if (!wwin->screen_ptr->flags.startup && !wPreferences.no_animations && - !wwin->flags.skip_next_animation && animate) { + if (!wwin->screen_ptr->flags.startup && !wPreferences.no_animations + && animate) { animateResize(wwin->screen_ptr, icon_x, icon_y, icon->core->width, icon->core->height, wwin->frame_x, wwin->frame_y, @@ -1443,10 +1301,6 @@ unhideWindow(WIcon *icon, int icon_x, int icon_y, WWindow *wwin, int animate, } UpdateSwitchMenu(wwin->screen_ptr, wwin, ACTION_CHANGE_STATE); - -#ifdef WMSOUND - wSoundPlay(WMSOUND_UNHIDE); -#endif } @@ -1594,7 +1448,7 @@ wRefreshDesktop(WScreen *scr) attr.save_under = False; win = XCreateWindow(dpy, scr->root_win, 0, 0, scr->scr_width, scr->scr_height, 0, CopyFromParent, CopyFromParent, - (Visual *) CopyFromParent, CWBackingStore|CWSaveUnder, + (Visual *)CopyFromParent, CWBackingStore|CWSaveUnder, &attr); XMapRaised(dpy, win); XDestroyWindow(dpy, win); diff --git a/src/actions.h b/src/actions.h index dbf12e0e..80c4880f 100644 --- a/src/actions.h +++ b/src/actions.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/appicon.c b/src/appicon.c index 183f9061..a213f556 100644 --- a/src/appicon.c +++ b/src/appicon.c @@ -1,6 +1,6 @@ /* appicon.c- icon for applications (not mini-window) * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -153,7 +153,9 @@ wAppIconCreate(WWindow *leader_win) aicon->prev = NULL; aicon->next = scr->app_icon_list; if (scr->app_icon_list) { -#ifdef REDUCE_APPICONS +#ifndef REDUCE_APPICONS + scr->app_icon_list->prev = aicon; +#else /* If we aren't going to have a match, jump straight to new appicon */ if (leader_win->wm_class == NULL || leader_win->wm_class == NULL) atmp = NULL; @@ -185,11 +187,9 @@ wAppIconCreate(WWindow *leader_win) atmp = atmp->next; } if (atmp == NULL) { -#endif - scr->app_icon_list->prev = aicon; -#ifdef REDUCE_APPICONS + scr->app_icon_list->prev = aicon; } -#endif +#endif /* REDUCE_APPICONS */ } scr->app_icon_list = aicon; @@ -658,6 +658,9 @@ appIconMouseDown(WObjDescriptor *desc, XEvent *event) int clickButton = event->xbutton.button; Pixmap ghost = None; + if (aicon->editing) + return; + if (IsDoubleClick(scr, event)) { iconDblClick(desc, event); return; diff --git a/src/appicon.h b/src/appicon.h index 7a9792e6..a9bc1f0a 100644 --- a/src/appicon.h +++ b/src/appicon.h @@ -1,6 +1,6 @@ /* appicon.h- application icon * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/application.c b/src/application.c index f5fceb30..49aeec61 100644 --- a/src/application.c +++ b/src/application.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -132,6 +132,59 @@ extractIcon(WWindow *wwin) } +static void +saveIconNameFor(char *iconPath, char *wm_instance, char *wm_class) +{ + proplist_t dict = WDWindowAttributes->dictionary; + proplist_t adict, key, iconk; + proplist_t val; + char *tmp; + int i; + + i = 0; + if (wm_instance) + i += strlen(wm_instance); + if (wm_class) + i += strlen(wm_class); + + tmp = wmalloc(i+8); + *tmp = 0; + if (wm_class && wm_instance) { + sprintf(tmp, "%s.%s", wm_instance, wm_class); + } else { + if (wm_instance) + strcat(tmp, wm_instance); + if (wm_class) + strcat(tmp, wm_class); + } + + key = PLMakeString(tmp); + free(tmp); + adict = PLGetDictionaryEntry(dict, key); + + iconk = PLMakeString("Icon"); + + if (adict) { + val = PLGetDictionaryEntry(adict, iconk); + } else { + /* no dictionary for app, so create one */ + adict = PLMakeDictionaryFromEntries(NULL, NULL, NULL); + PLInsertDictionaryEntry(dict, key, adict); + PLRelease(adict); + val = NULL; + } + if (!val) { + val = PLMakeString(iconPath); + PLInsertDictionaryEntry(adict, iconk, val); + PLRelease(val); + } + PLRelease(key); + + if (val) + PLSave(dict, YES); +} + + void wApplicationExtractDirPackIcon(WScreen *scr, char *path, char *wm_instance, char *wm_class) @@ -162,59 +215,30 @@ wApplicationExtractDirPackIcon(WScreen *scr, char *path, } if (iconPath) { - proplist_t dict = WDWindowAttributes->dictionary; - proplist_t adict, key, iconk; - proplist_t val; - char *tmp; - int i; - - i = 0; - if (wm_instance) - i += strlen(wm_instance); - if (wm_class) - i += strlen(wm_class); - - tmp = wmalloc(i+8); - *tmp = 0; - if (wm_class && wm_instance) { - sprintf(tmp, "%s.%s", wm_instance, wm_class); - } else { - if (wm_instance) - strcat(tmp, wm_instance); - if (wm_class) - strcat(tmp, wm_class); - } - - key = PLMakeString(tmp); - free(tmp); - adict = PLGetDictionaryEntry(dict, key); - - iconk = PLMakeString("Icon"); - - if (adict) { - val = PLGetDictionaryEntry(adict, iconk); - } else { - /* no dictionary for app, so create one */ - adict = PLMakeDictionaryFromEntries(NULL, NULL, NULL); - PLInsertDictionaryEntry(dict, key, adict); - PLRelease(adict); - val = NULL; - } - if (!val) { - val = PLMakeString(iconPath); - PLInsertDictionaryEntry(adict, iconk, val); - PLRelease(val); - } - PLRelease(key); + saveIconNameFor(iconPath, wm_instance, wm_class); - if (val) - PLSave(dict, YES); - free(iconPath); } } +static Bool +extractClientIcon(WAppIcon *icon) +{ + char *path; + + path = wIconStore(icon->icon); + if (!path) + return False; + + saveIconNameFor(path, icon->wm_instance, icon->wm_class); + + free(path); + + return True; +} + + WApplication* wApplicationCreate(WScreen *scr, Window main_window) { @@ -337,6 +361,9 @@ wApplicationCreate(WScreen *scr, Window main_window) if (wapp->app_icon && !wapp->app_icon->docked) { #else if (wapp->app_icon && !wapp->app_icon->docked && wapp->app_icon->num_apps == 1) { +#ifdef THIS_SUCKS + } +#endif #endif WIcon *icon = wapp->app_icon->icon; WDock *clip = scr->workspaces[scr->current_workspace]->clip; @@ -348,7 +375,7 @@ wApplicationCreate(WScreen *scr, Window main_window) wapp->app_icon->icon->shadowed = 1; wapp->app_icon->icon->force_paint = 1; /* We don't do an wAppIconPaint() here because it's in - * wDockAttachIcon(). -Dan + * wDockAttachIcon(). -Dan. */ } wDockAttachIcon(clip, wapp->app_icon, x, y); @@ -367,6 +394,16 @@ wApplicationCreate(WScreen *scr, Window main_window) wArrangeIcons(scr, True); } + if (wapp->app_icon) { + char *tmp; + + /* if the displayed icon was supplied by the client, save the icon */ + tmp = wDefaultGetIconFile(scr, wapp->app_icon->wm_instance, + wapp->app_icon->wm_class, True); + if (!tmp) + extractClientIcon(wapp->app_icon); + } + wapp->prev = NULL; wapp->next = scr->wapp_list; if (scr->wapp_list) diff --git a/src/application.h b/src/application.h index 9ad71d50..c17ac9db 100644 --- a/src/application.h +++ b/src/application.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/appmenu.c b/src/appmenu.c index ba327740..0d01b280 100644 --- a/src/appmenu.c +++ b/src/appmenu.c @@ -1,6 +1,6 @@ /* appmenu.c- application defined menu * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/appmenu.h b/src/appmenu.h index 3e5b7e5a..87b09348 100644 --- a/src/appmenu.h +++ b/src/appmenu.h @@ -1,6 +1,6 @@ /* appmenu.h- application defined menu * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/balloon.c b/src/balloon.c index a8e56c9a..9c00764f 100644 --- a/src/balloon.c +++ b/src/balloon.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1998 Alfredo K. Kojima * @@ -137,7 +137,8 @@ makePixmap(WScreen *scr, int width, int height, int side, Pixmap *mask) if (!bal->monoGC) { bal->monoGC = XCreateGC(dpy, bitmap, 0, NULL); } - XSetForeground(dpy, bal->monoGC, scr->black_pixel); + XSetForeground(dpy, bal->monoGC, + BlackPixelOfScreen(ScreenOfDisplay(dpy, scr->screen))); XFillRectangle(dpy, bitmap, bal->monoGC, 0, 0, width+SPACE, height+SPACE); pixmap = XCreatePixmap(dpy, scr->root_win, width+SPACE, height+SPACE, @@ -152,7 +153,8 @@ makePixmap(WScreen *scr, int width, int height, int side, Pixmap *mask) } x = 0; - XSetForeground(dpy, bal->monoGC, scr->white_pixel); + XSetForeground(dpy, bal->monoGC, + WhitePixelOfScreen(ScreenOfDisplay(dpy, scr->screen))); drawBalloon(bitmap, bal->monoGC, x, y, width, height, side); XSetForeground(dpy, scr->draw_gc, scr->white_pixel); drawBalloon(pixmap, scr->draw_gc, x+1, y+1, width-2, height-2, side); diff --git a/src/balloon.h b/src/balloon.h index 52f3deb1..652b713b 100644 --- a/src/balloon.h +++ b/src/balloon.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/client.c b/src/client.c index a0999f96..d49bfd66 100644 --- a/src/client.c +++ b/src/client.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -58,6 +58,11 @@ extern Atom _XA_WINDOWMAKER_MENU; extern Atom _XA_GNUSTEP_WM_ATTR; extern Atom _XA_GNUSTEP_WM_RESIZEBAR; +#ifdef SHAPE +extern Bool wShapeSupported; +#endif + + /* *-------------------------------------------------------------------- * wClientRestore-- @@ -72,8 +77,8 @@ wClientRestore(WWindow *wwin) wClientGetGravityOffsets(wwin, &gx, &gy); /* set the positio of the frame on screen */ - wwin->frame_x -= gx * (wwin->old_border_width - FRAME_BORDER_WIDTH); - wwin->frame_y -= gy * (wwin->old_border_width - FRAME_BORDER_WIDTH); + wwin->frame_x -= gx * FRAME_BORDER_WIDTH; + wwin->frame_y -= gy * FRAME_BORDER_WIDTH; /* if gravity is to the south, account for the border sizes */ if (gy > 0) wwin->frame_y += (wwin->frame->top_width + wwin->frame->bottom_width); @@ -105,7 +110,7 @@ wClientRestore(WWindow *wwin) void wClientSetState(WWindow *wwin, int state, Window icon_win) { - unsigned long data[2]; + CARD32 data[2]; wwin->state = state; @@ -186,7 +191,7 @@ wClientConfigure(WWindow *wwin, XConfigureRequestEvent *xcre) return; } #ifdef SHAPE - { + if (wShapeSupported) { int junk; unsigned int ujunk; int b_shaped; @@ -492,9 +497,16 @@ wClientCheckProperty(WWindow *wwin, XPropertyEvent *event) case XA_WM_NORMAL_HINTS: /* normal (geometry) hints */ - - XGetWindowAttributes(dpy, wwin->client_win, &attribs); - GetNormalHints(wwin, &attribs, False); + { + int foo; + unsigned bar; + + XGetWindowAttributes(dpy, wwin->client_win, &attribs); + wClientGetNormalHints(wwin, &attribs, False, &foo, &foo, + &bar, &bar); + /* TODO: should we check for consistency of the current + * size against the new geometry hints? */ + } break; case XA_WM_TRANSIENT_FOR: @@ -593,17 +605,19 @@ wClientCheckProperty(WWindow *wwin, XPropertyEvent *event) /* *---------------------------------------------------------------------- - * GetNormalHints-- + * wClientGetNormalHints-- * Get size (normal) hints and a default geometry for the client - * window. The hints are also checked for inconsistency. + * window. The hints are also checked for inconsistency. If geometry is + * True, the returned data will account for client specified initial + * geometry. * * Side effects: - * normal_hints is filled with valid data and geometry information - * about the client is also changed. + * normal_hints is filled with valid data. *---------------------------------------------------------------------- */ void -GetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, int geometry) +wClientGetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, Bool geometry, + int *x, int *y, unsigned *width, unsigned *height) { int pre_icccm=0; @@ -614,11 +628,11 @@ GetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, int geometry) if (!PropGetNormalHints(wwin->client_win, wwin->normal_hints, &pre_icccm)) { wwin->normal_hints->flags = 0; } - wwin->client.x = wattribs->x; - wwin->client.y = wattribs->y; + *x = wattribs->x; + *y = wattribs->y; - wwin->client.width = wattribs->width; - wwin->client.height = wattribs->height; + *width = wattribs->width; + *height = wattribs->height; if (!(wwin->normal_hints->flags & PWinGravity)) { wwin->normal_hints->win_gravity = NorthWestGravity; @@ -677,12 +691,12 @@ GetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, int geometry) printf("PRE ICCCM\n"); #endif if (wwin->normal_hints->flags & (USPosition|PPosition)) { - wwin->client.x = wwin->normal_hints->x; - wwin->client.y = wwin->normal_hints->y; + *x = wwin->normal_hints->x; + *y = wwin->normal_hints->y; } if (wwin->normal_hints->flags & (USSize|PSize)) { - wwin->client.width = wwin->normal_hints->width; - wwin->client.height = wwin->normal_hints->height; + *width = wwin->normal_hints->width; + *height = wwin->normal_hints->height; } } } diff --git a/src/client.h b/src/client.h index ff4c8e05..bcca5400 100644 --- a/src/client.h +++ b/src/client.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -32,7 +32,9 @@ void wClientKill(WWindow *wwin); void wClientCheckProperty(WWindow *wwin, XPropertyEvent *event); -void GetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, int geometry); +void wClientGetNormalHints(WWindow *wwin, XWindowAttributes *wattribs, + Bool geometry, int *x, int *y, unsigned *width, + unsigned *height); void GetColormapWindows(WWindow *wwin); #endif diff --git a/src/colormap.c b/src/colormap.c index b33f9a6d..8d808ea9 100644 --- a/src/colormap.c +++ b/src/colormap.c @@ -1,11 +1,12 @@ /* colormap.c - colormap handling code * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1998 Alfredo K. Kojima * * This code slightly based on fvwm code, * Copyright (c) Rob Nation and others + * but completely rewritten. * * 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 diff --git a/src/config.h b/src/config.h index 3d81d382..49d01204 100644 --- a/src/config.h +++ b/src/config.h @@ -66,7 +66,7 @@ #define PACKAGE "WindowMaker" /* package version */ -#define VERSION "0.20.1" +#define VERSION "0.20.2" /* Define if you have the gethostname function. */ #define HAVE_GETHOSTNAME 1 diff --git a/src/defaults.c b/src/defaults.c index 079ba17a..12c41047 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -1,6 +1,6 @@ /* defaults.c - manage configuration through defaults db * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -96,6 +96,14 @@ typedef struct { } WDefaultEntry; +/* used to map strings to integers */ +typedef struct { + char *string; + short value; + char is_alias; +} WOptionEnumeration; + + /* type converters */ static int getBool(); @@ -106,20 +114,14 @@ static int getCoord(); static int getString(); #endif static int getPathList(); -static int getFocusMode(); -static int getPlacement(); -static int getGeomDisp(); +static int getEnum(); static int getTexture(); static int getWSBackground(); -static int getJust(); static int getFont(); static int getColor(); static int getKeybind(); static int getModMask(); -static int getSpeed(); -static int getMButton(); -static int getIconPosition(); -static int getIconificationStyle(); + /* value setting functions */ static int setJustify(); @@ -157,6 +159,94 @@ static int setClipTitleColor(); /* + * Tables to convert strings to enumeration values. + * Values stored are char + */ + + +/* WARNING: sum of length of all value strings must not exceed + * this value */ +#define TOTAL_VALUES_LENGTH 80 + + + +static WOptionEnumeration seFocusModes[] = { + {"Manual", WKF_CLICK, 0}, {"ClickToFocus", WKF_CLICK, 1}, + {"Auto", WKF_POINTER, 0}, {"FocusFollowMouse", WKF_POINTER, 1}, + {"Sloppy", WKF_SLOPPY, 0}, {"SemiAuto", WKF_SLOPPY, 1}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seColormapModes[] = { + {"Manual", WKF_CLICK, 0}, {"ClickToFocus", WKF_CLICK, 1}, + {"Auto", WKF_POINTER, 0}, {"FocusFollowMouse", WKF_POINTER, 1}, + {NULL, 0, 0} +}; + +static WOptionEnumeration sePlacements[] = { + {"Auto", WPM_SMART, 0}, {"Smart", WPM_SMART, 1}, + {"Cascade", WPM_CASCADE, 0}, + {"Random", WPM_RANDOM, 0}, + {"Manual", WPM_MANUAL, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seGeomDisplays[] = { + {"Center", WDIS_CENTER, 0}, + {"Corner", WDIS_TOPLEFT, 0}, + {"Floating", WDIS_FRAME_CENTER, 0}, + {"Line", WDIS_NEW, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seSpeeds[] = { + {"UltraFast", SPEED_ULTRAFAST, 0}, + {"Fast", SPEED_FAST, 0}, + {"Medium", SPEED_MEDIUM, 0}, + {"Slow", SPEED_SLOW, 0}, + {"UltraSlow", SPEED_ULTRASLOW, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seMouseButtons[] = { + {"Left", Button1, 0}, {"Button1", Button1, 1}, + {"Middle", Button2, 0}, {"Button2", Button2, 1}, + {"Right", Button3, 0}, {"Button3", Button3, 1}, + {"Button4", Button4, 0}, + {"Button5", Button5, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seIconificationStyles[] = { + {"Zoom", WIS_ZOOM, 0}, + {"Twist", WIS_TWIST, 0}, + {"Flip", WIS_FLIP, 0}, + {"None", WIS_NONE, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seJustifications[] = { + {"Left", WTJ_LEFT, 0}, + {"Center", WTJ_CENTER, 0}, + {"Right", WTJ_RIGHT, 0}, + {NULL, 0, 0} +}; + +static WOptionEnumeration seIconPositions[] = { + {"blv", IY_BOTTOM|IY_LEFT|IY_VERT, 0}, + {"blh", IY_BOTTOM|IY_LEFT|IY_HORIZ, 0}, + {"brv", IY_BOTTOM|IY_RIGHT|IY_VERT, 0}, + {"brh", IY_BOTTOM|IY_RIGHT|IY_HORIZ, 0}, + {"tlv", IY_TOP|IY_LEFT|IY_VERT, 0}, + {"tlh", IY_TOP|IY_LEFT|IY_HORIZ, 0}, + {"trv", IY_TOP|IY_RIGHT|IY_VERT, 0}, + {"trh", IY_TOP|IY_RIGHT|IY_HORIZ, 0}, + {NULL, 0, 0} +}; + + + +/* * All entries in the tables bellow, NEED to have a default value * defined, and this value needs to be correct. */ @@ -184,8 +274,8 @@ WDefaultEntry staticOptionList[] = { {"DisableWSMouseActions", "NO", NULL, &wPreferences.disable_root_mouse, getBool, NULL }, - {"FocusMode", "manual", (void*)False, - &wPreferences.focus_mode, getFocusMode, NULL + {"FocusMode", "manual", seFocusModes, + &wPreferences.focus_mode, getEnum, NULL }, /* have a problem when switching from manual to sloppy without restart */ {"NewStyle", "NO", NULL, &wPreferences.new_style, getBool, NULL @@ -195,27 +285,27 @@ WDefaultEntry staticOptionList[] = { }, {"DisableClip", "NO", (void*) WM_CLIP, NULL, getBool, setIfDockPresent - }, + } }; WDefaultEntry optionList[] = { /* dynamic options */ - {"IconPosition", "blh", NULL, - &wPreferences.icon_yard, getIconPosition, setIconPosition + {"IconPosition", "blh", seIconPositions, + &wPreferences.icon_yard, getEnum, setIconPosition }, - {"IconificationStyle", "Zoom", NULL, - &wPreferences.iconification_style, getIconificationStyle, NULL + {"IconificationStyle", "Zoom", seIconificationStyles, + &wPreferences.iconification_style, getEnum, NULL }, - {"SelectWindowsMouseButton", "Left", NULL, - &wPreferences.select_button, getMButton, NULL + {"SelectWindowsMouseButton", "Left", seMouseButtons, + &wPreferences.select_button, getEnum, NULL }, - {"WindowListMouseButton", "Middle", NULL, - &wPreferences.windowl_button, getMButton, NULL + {"WindowListMouseButton", "Middle", seMouseButtons, + &wPreferences.windowl_button, getEnum, NULL }, - {"ApplicationMenuMouseButton", "Right", NULL, - &wPreferences.menu_button, getMButton, NULL + {"ApplicationMenuMouseButton", "Right", seMouseButtons, + &wPreferences.menu_button, getEnum, NULL }, {"PixmapPath", DEF_PIXMAP_PATHS, NULL, &wPreferences.pixmap_path, getPathList, NULL @@ -223,8 +313,8 @@ WDefaultEntry optionList[] = { {"IconPath", DEF_ICON_PATHS, NULL, &wPreferences.icon_path, getPathList, NULL }, - {"ColormapMode", "auto", (void*)True, - &wPreferences.colormap_mode, getFocusMode, NULL + {"ColormapMode", "auto", seColormapModes, + &wPreferences.colormap_mode, getEnum, NULL }, {"AutoFocus", "NO", NULL, &wPreferences.auto_focus, getBool, NULL @@ -256,14 +346,14 @@ WDefaultEntry optionList[] = { {"ScrollableMenus", "NO", NULL, &wPreferences.scrollable_menus, getBool, NULL }, - {"MenuScrollSpeed", "medium", NULL, - &wPreferences.menu_scroll_speed, getSpeed, NULL + {"MenuScrollSpeed", "medium", seSpeeds, + &wPreferences.menu_scroll_speed, getEnum, NULL }, - {"IconSlideSpeed", "medium", NULL, - &wPreferences.icon_slide_speed, getSpeed, NULL + {"IconSlideSpeed", "medium", seSpeeds, + &wPreferences.icon_slide_speed, getEnum, NULL }, - {"ShadeSpeed", "medium", NULL, - &wPreferences.shade_speed, getSpeed, NULL + {"ShadeSpeed", "medium", seSpeeds, + &wPreferences.shade_speed, getEnum, NULL }, {"DoubleClickTime", "250", (void*) &wPreferences.dblclick_time, &wPreferences.dblclick_time, getInt, setDoubleClick, @@ -274,8 +364,8 @@ WDefaultEntry optionList[] = { {"OnTopTransients", "NO", NULL, &wPreferences.on_top_transients, getBool, NULL }, - {"WindowPlacement", "auto", NULL, - &wPreferences.window_placement, getPlacement, NULL + {"WindowPlacement", "auto", sePlacements, + &wPreferences.window_placement, getEnum, NULL }, {"IgnoreFocusClick","NO", NULL, &wPreferences.ignore_focus_click, getBool, NULL @@ -301,20 +391,22 @@ WDefaultEntry optionList[] = { {"AutoArrangeIcons", "NO", NULL, &wPreferences.auto_arrange_icons, getBool, NULL }, + /* {"NoWindowUnderDock", "NO", NULL, &wPreferences.no_window_under_dock, getBool, NULL }, + */ {"NoWindowOverIcons", "NO", NULL, &wPreferences.no_window_over_icons, getBool, NULL }, {"WindowPlaceOrigin", "(0, 0)", NULL, &wPreferences.window_place_origin, getCoord, NULL }, - {"ResizeDisplay", "corner", NULL, - &wPreferences.size_display, getGeomDisp, NULL + {"ResizeDisplay", "corner", seGeomDisplays, + &wPreferences.size_display, getEnum, NULL }, - {"MoveDisplay", "corner", NULL, - &wPreferences.move_display, getGeomDisp, NULL + {"MoveDisplay", "corner", seGeomDisplays, + &wPreferences.move_display, getEnum, NULL }, {"DontConfirmKill", "NO", NULL, &wPreferences.dont_confirm_kill, getBool,NULL @@ -341,8 +433,8 @@ WDefaultEntry optionList[] = { {"IconBack", "(solid, gray)", NULL, NULL, getTexture, setIconTile }, - {"TitleJustify", "center", NULL, - &wPreferences.title_justification, getJust, setJustify + {"TitleJustify", "center", seJustifications, + &wPreferences.title_justification, getEnum, setJustify }, {"WindowTitleFont", DEF_TITLE_FONT, NULL, NULL, getFont, setWinTitleFont @@ -504,15 +596,10 @@ WDefaultEntry optionList[] = { }, {"Workspace10Key", "None", (void*)WKBD_WORKSPACE10, NULL, getKeybind, setKeyGrab - }, + } }; - -/* Option names */ -static proplist_t DCenter, DCorner, DFloating, DLine; -static proplist_t JLeft, JCenter, JRight; - #if 0 static void rereadDefaults(void); #endif @@ -535,15 +622,6 @@ initDefaults() PLSetStringCmpHook(StringCompareHook); - DCenter = PLMakeString("Center"); - DCorner = PLMakeString("Corner"); - DFloating = PLMakeString("Floating"); - DLine = PLMakeString("Line"); - - JLeft = PLMakeString("Left"); - JCenter = PLMakeString("Center"); - JRight = PLMakeString("Right"); - for (i=0; iplkey), x); \ return False; } + + +static int +string2index(proplist_t key, proplist_t val, proplist_t def, + WOptionEnumeration *values) +{ + char *str; + WOptionEnumeration *v; + char buffer[TOTAL_VALUES_LENGTH]; + + if (PLIsString(val) && (str = PLGetString(val))) { + for (v=values; v->string!=NULL; v++) { + if (strcasecmp(v->string, str)==0) + return v->value; + } + } + + buffer[0] = 0; + for (v=values; v->string!=NULL; v++) { + if (!v->is_alias) { + if (buffer[0]!=0) + strcat(buffer, ", "); + strcat(buffer, v->string); + } + } + wwarning(_("wrong option value for key \"%s\". Should be one of %s"), + PLGetString(key), buffer); + + if (def) { + return string2index(key, val, NULL, values); + } + + return -1; +} + + + + /* * value - is the value in the defaults DB * addr - is the address to store the data @@ -1375,222 +1491,19 @@ again: static int -getFocusMode(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static char data; - char *val; - int second_pass=0; - - STRINGP("one of Manual, Auto or Sloppy"); - - val = PLGetString(value); - -again: - if (strcasecmp(val, "manual")==0 || strcasecmp(val, "clicktofocus")==0) - data = WKF_CLICK; - else if (strcasecmp(val, "auto")==0 || strcasecmp(val, "focusfollowsmouse")==0) - data = WKF_POINTER; - else if ((strcasecmp(val, "semiauto")==0 || strcasecmp(val, "sloppy")==0) - && !(int)entry->extra_data) - data = WKF_SLOPPY; - else { - if (!(int)entry->extra_data) - wwarning(_("Invalid focus mode \"%s\". Should be Manual, " - "Auto or Sloppy."), PLGetString(value)); - else - wwarning(_("Invalid colormap focus mode \"%s\". Should be Manual or " - "Auto."), PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(char*)addr = data; - - return True; -} - - -static int -getPlacement(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) +getEnum(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, + void **ret) { static char data; - char *val; - int second_pass=0; - STRINGP("one of Auto, Cascade, Random or Manual"); - - val = PLGetString(value); - -again: - if (strcasecmp(val, "auto")==0 || strcasecmp(val, "smart")==0) - data = WPM_SMART; - else if (strcasecmp(val, "cascade")==0) - data = WPM_CASCADE; - else if (strcasecmp(val, "manual")==0) - data = WPM_MANUAL; - else if (strcasecmp(val, "random")==0) - data = WPM_RANDOM; - else { - wwarning(_("Invalid window placement mode \"%s\". " - "Should be Auto, Cascade, Random or Manual."), - PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } + data = string2index(entry->key, value, entry->default_value, + (WOptionEnumeration*)entry->extra_data); + if (data < 0) return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(char*)addr = data; - - return True; -} - - - -static int -getGeomDisp(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static char data; - int changed=0; - STRINGP("one of Center, Corner, Floating or Line"); - -again: - if(PLIsEqual(value, DCenter)) - data = WDIS_CENTER; - else if(PLIsEqual(value, DCorner)) - data = WDIS_TOPLEFT; - else if(PLIsEqual(value, DFloating)) - data = WDIS_FRAME_CENTER; - else if(PLIsEqual(value, DLine)) - data = WDIS_NEW; - else { - wwarning(_("Invalid geometry display type \"%s\". Should " - "be Center, Corner, Floating or Line."), - PLGetString(value)); - if (changed==0) { - value = entry->plvalue; - changed = 1; - wwarning(_("using default \"%s\" instead"), entry->default_value); - goto again; - } - return False; - } - if (ret) *ret = &data; - - if (addr) - *(char*)addr = data; - - return True; -} - - -static int -getSpeed(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static int data; - char *val; - int second_pass=0; - - STRINGP("one of UltraFast, Fast, Medium, Slow or UltraSlow"); - val = PLGetString(value); - -again: - - if (strcasecmp(val, "ultrafast")==0) - data = SPEED_ULTRAFAST; - else if (strcasecmp(val, "fast")==0) - data = SPEED_FAST; - else if (strcasecmp(val, "medium")==0) - data = SPEED_MEDIUM; - else if (strcasecmp(val, "slow")==0) - data = SPEED_SLOW; - else if (strcasecmp(val, "ultraslow")==0) - data = SPEED_ULTRASLOW; - else { - wwarning(_("Invalid speed \"%s\". Should be UltraFast, Fast, " - "Medium, Slow or UltraSlow."), PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(int*)addr = data; - - return True; -} - - -static int -getMButton(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static char data; - char *val; - int second_pass=0; - - STRINGP("one of Left, Middle, Right or Button1 through Button5"); - - val = PLGetString(value); - -again: - if (strcasecmp(val, "left")==0 || strcasecmp(val, "button1")==0) - data = Button1; - else if (strcasecmp(val, "middle")==0 || strcasecmp(val, "button2")==0) - data = Button2; - else if (strcasecmp(val, "right")==0 || strcasecmp(val, "button3")==0) - data = Button3; - else if (strcasecmp(val, "button4")==0) - data = Button4; - else if (strcasecmp(val, "button5")==0) - data = Button4; - else { - wwarning(_("Invalid mouse button \"%s\". " - "Should be Left, Middle, Right or Button1 through Button5"), - PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - if (addr) *(char*)addr = data; @@ -1598,51 +1511,6 @@ again: } -static int -getIconificationStyle(WScreen *scr, WDefaultEntry *entry, proplist_t value, - void *addr, void **ret) -{ - static char data; - char *val; - int second_pass=0; - - STRINGP("one of Zoom, Twist, Flip or None"); - - val = PLGetString(value); - -again: - if (strcasecmp(val, "zoom")==0) - data = WIS_ZOOM; - else if (strcasecmp(val, "twist")==0) - data = WIS_TWIST; - else if (strcasecmp(val, "flip")==0) - data = WIS_FLIP; - else if (strcasecmp(val, "none")==0) - data = WIS_NONE; - else { - wwarning(_("Invalid iconification style \"%s\". " - "Should be Zoom, Twist, Flip or None"), - PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(char*)addr = data; - - return True; -} - - - /* * (solid ) @@ -1745,7 +1613,7 @@ parse_texture(WScreen *scr, proplist_t pl) RColor **colors; int i, count; int type; - + if (nelem < 3) { wwarning(_("too few arguments in multicolor gradient specification")); return NULL; @@ -1759,27 +1627,27 @@ parse_texture(WScreen *scr, proplist_t pl) type = WTEX_MDGRADIENT; count = nelem-1; - + colors = wmalloc(sizeof(RColor*)*(count+1)); - + for (i=0; i=0; --i) { + for (--i; i>=0; --i) { free(colors[i]); } free(colors); - break; + return NULL; } val = PLGetString(elem); if (!XParseColor(dpy, scr->colormap, val, &color)) { wwarning(_("\"%s\" is not a valid color name"), val); - for ( ; i>=0; --i) { + for (--i; i>=0; --i) { free(colors[i]); } - free(colors); - break; + free(colors); + return NULL; } else { colors[i] = wmalloc(sizeof(RColor)); colors[i]->red = color.red >> 8; @@ -2224,43 +2092,6 @@ again: } #endif /* !EXPERIMENTAL */ -static int -getJust(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static char data; - int changed=0; - - STRINGP("one of Left, Center or Right"); - -again: - if(PLIsEqual(value, JLeft)) - data = WTJ_LEFT; - else if(PLIsEqual(value, JRight)) - data = WTJ_RIGHT; - else if(PLIsEqual(value, JCenter)) - data = WTJ_CENTER; - else { - wwarning(_("Invalid justification type \"%s\". Should be " - "Left, Center or Right"), PLGetString(value)); - if (changed==0) { - value = entry->plvalue; - changed = 1; - wwarning(_("using default \"%s\" instead"), entry->default_value); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(char*)addr = data; - - return True; -} - static int getFont(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, @@ -2425,58 +2256,6 @@ getModMask(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, -static int -getIconPosition(WScreen *scr, WDefaultEntry *entry, proplist_t value, void *addr, - void **ret) -{ - static int data; - char *val; - int second_pass=0; - - STRINGP("one of blv, blh, brv, brh, tlv, tlh, trv, trh"); - - val = PLGetString(value); - -again: - if (strlen(val)==3) { - if (val[0]=='T' || val[0]=='t') { - data = IY_TOP; - } else { - data = IY_BOTTOM; - } - if (val[1]=='R' || val[1]=='r') { - data |= IY_RIGHT; - } else { - data |= IY_LEFT; - } - if (val[2]=='V' || val[2]=='v') { - data |= IY_VERT; - } else { - data |= IY_HORIZ; - } - } else { - wwarning(_("Invalid icon Position \"%s\". " - "Should be one of blv, blh, brv, brh, tlv, tlh, trv, trh"), - PLGetString(value)); - if (second_pass==0) { - val = PLGetString(entry->plvalue); - second_pass = 1; - wwarning(_("using default \"%s\" instead"), val); - goto again; - } - return False; - } - - if (ret) - *ret = &data; - - if (addr) - *(int*)addr = data; - - return True; -} - - /* ---------------- value setting functions --------------- */ static int setJustify(WScreen *scr, WDefaultEntry *entry, WTexture **texture, void *foo) @@ -2857,17 +2636,14 @@ setMenuDisabledColor(WScreen *scr, WDefaultEntry *entry, XColor *color, void *fo * WPixel color; // color for solid texture * proplist_t texture; // for checking updates * }; + * * - * spixmap and cpixmap textures are rendered by wmsetbg in a buffer - * supplied by wmaker (-x drawable-XID). - * All other textures are rendered by wmaker itself. This is to - * prevent wmaker from blocking when rendering large pixmaps. - * tpixmap must be rendered by wmaker because we dont know the size - * of the image before loading the image. We supply the pixmap - * to wmsetbg, instead of letting wmsetbg create it for 2 reasons: - * 1 - Xlib will free the pixmap when wmsetbg exits - * 2 - it would require wmaker to figure when wmsetbg finished - * rendering (complicated synchronization...). + * All textures are rendered by wmsetbg. When it exits with status 0 + * it outputs the pixmap ID. + * wmaker will monitor the fd and when it becomes available it reads the + * pixmap ID and uses it in the texture. The data read from the fd + * is the pixmap ID and the pid of the wmsetbg process, separated by + * a space (the pid is to allow paralel wmsetbg processes). * * The workspace background cant be set if the pid field of the * texture is 0. Otherwise, the texture is still being rendered diff --git a/src/defaults.h b/src/defaults.h index c7880fa9..46d9dfe1 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/dialog.c b/src/dialog.c index 0f4ab250..24104498 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -1,6 +1,6 @@ /* dialog.c - dialog windows for internal use * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -600,11 +600,13 @@ renderText(WMScreen *scr, char *text, char *font, RColor *from, RColor *to) gradient = RRenderGradient(w, h, from, to, RVerticalGradient); if (!gradient) { - wwarning("error doing image processing:%s", RErrorString); + wwarning("error doing image processing:%s", + RMessageForError(RErrorCode)); goto bye; } if (!RConvertImage(rc, gradient, &grad)) { - wwarning("error doing image processing:%s", RErrorString); + wwarning("error doing image processing:%s", + RMessageForError(RErrorCode)); goto bye; } @@ -642,7 +644,7 @@ wShowInfoPanel(WScreen *scr) WMSize size; WMFont *font; char version[32]; - char buffer[256]; + char buffer[512]; Window parent; WWindow *wwin; RColor color1, color2; @@ -686,10 +688,10 @@ wShowInfoPanel(WScreen *scr) color1.red = 0; color1.green = 0; color1.blue = 0; - color2.red = 0x80; - color2.green = 0x80; - color2.blue = 0x80; - logo = renderText(scr->wmscreen, " WindowMaker ", + color2.red = 0x50; + color2.green = 0x50; + color2.blue = 0x60; + logo = renderText(scr->wmscreen, " Window Maker ", "-*-times-bold-r-*-*-24-*", &color1, &color2); if (logo) { WMSetLabelImagePosition(panel->name1L, WIPImageOnly); @@ -701,7 +703,7 @@ wShowInfoPanel(WScreen *scr) WMSetLabelFont(panel->name1L, font); WMReleaseFont(font); } - WMSetLabelText(panel->name1L, "WindowMaker"); + WMSetLabelText(panel->name1L, "Window Maker"); } panel->name2L = WMCreateLabel(panel->win); @@ -735,15 +737,37 @@ wShowInfoPanel(WScreen *scr) WMSetLabelFont(panel->copyrL, font); } - sprintf(buffer, "Using visual %s %ibpp (0x%x)\n", - visuals[scr->w_visual->class], scr->w_depth, - (unsigned)scr->w_visual->visualid); + switch (scr->w_depth) { + case 15: + strcpy(version, "32 thousand"); + break; + case 16: + strcpy(version, "64 thousand"); + break; + case 24: + case 32: + strcpy(version, "16 million"); + break; + default: + sprintf(version, "%d", 1<w_depth); + break; + } + + sprintf(buffer, "Using visual 0x%x: %s %ibpp (%s colors)\n", + (unsigned)scr->w_visual->visualid, + visuals[scr->w_visual->class], scr->w_depth, version); + strcat(buffer, "Supported image formats: "); strl = RSupportedFileFormats(); for (i=0; strl[i]!=NULL; i++) { strcat(buffer, strl[i]); strcat(buffer, " "); } +#ifdef WMSOUND + strcat(buffer, "\nSound support compiled in"); +#else + strcat(buffer, "\nSound support not available"); +#endif panel->infoL = WMCreateLabel(panel->win); WMResizeWidget(panel->infoL, 350, 75); @@ -801,11 +825,11 @@ typedef struct { #define LICENSE_TEXT \ - " WindowMaker is free software; you can redistribute it and/or modify "\ + " Window Maker 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.\n\n\n"\ - " WindowMaker is distributed in the hope that it will be useful, but "\ + " Window Maker 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.\n\n\n"\ diff --git a/src/dialog.h b/src/dialog.h index a961d6fc..61f514c7 100644 --- a/src/dialog.h +++ b/src/dialog.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/dock.c b/src/dock.c index f21cd4bc..6ac9cd43 100644 --- a/src/dock.c +++ b/src/dock.c @@ -1,6 +1,6 @@ /* dock.c- built-in Dock module for WindowMaker * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -69,22 +69,6 @@ #define CLIP_IDLE 0 #define CLIP_FORWARD 2 -/* This should be 24. It looks better. - * Proof: the golden ratio is ~1.6: - * 64/1.6 = 24, thus 24 will look better than 22 :) - * -Alfredo - * - * This is true, but... ;) - * CLIP_BUTTON_SIZE only means the button itself, without the black delimiting - * line. So because one sees the black line together with the button, it should - * be 23. There is no big difference between 23 and 24, but 23 gives also a - * better aspect ratio between the button and the arrow mark. - * Anyway if you feel stronger for 24 you can change it as it is not very - * important. - * - * BTW I think you meant 64-64/1.6=24 or 64/(1.6*1.6) ;) - * -Dan - */ #define CLIP_BUTTON_SIZE 23 @@ -260,6 +244,9 @@ killCallback(WMenu *menu, WMenuEntry *entry) assert(entry->clientdata!=NULL); icon = (WAppIcon*)entry->clientdata; + + icon->editing = 1; + #ifdef REDUCE_APPICONS /* Send a delete message to the main window of each application * bound to this docked appicon. - cls @@ -286,6 +273,8 @@ killCallback(WMenu *menu, WMenuEntry *entry) } } #endif /* !REDUCE_APPICONS */ + + icon->editing = 0; } @@ -437,7 +426,7 @@ removeIconsCallback(WMenu *menu, WMenuEntry *entry) selectedIcons = list_cons(clickedIcon, NULL); } - while(selectedIcons) { + while (selectedIcons) { aicon = selectedIcons->head; keepit = aicon->running && wApplicationOf(aicon->main_window); wDockDetach(dock, aicon); @@ -475,7 +464,8 @@ keepIconsCallback(WMenu *menu, WMenuEntry *entry) if (!selectedIcons && clickedIcon!=dock->screen_ptr->clip_icon) { char *command = NULL; - if (!clickedIcon->command) { + if (!clickedIcon->command && !clickedIcon->editing) { + clickedIcon->editing = 1; if (wInputDialog(dock->screen_ptr, _("Keep Icon"), _("Type the command used to launch the application"), &command)==WDB_OK) { @@ -485,7 +475,9 @@ keepIconsCallback(WMenu *menu, WMenuEntry *entry) command = NULL; } clickedIcon->command = command; + clickedIcon->editing = 0; } else { + clickedIcon->editing = 0; if (command) free(command); return; @@ -913,7 +905,7 @@ updateClipOptionsMenu(WMenu *menu, WDock *dock) if (!menu || !dock) return; - /* floating */ + /* keep on top */ entry = menu->entries[index]; entry->flags.indicator_on = !dock->lowered; entry->clientdata = dock; @@ -955,7 +947,7 @@ makeClipOptionsMenu(WScreen *scr) return NULL; } - entry = wMenuAddCallback(menu, _("Floating Clip"), + entry = wMenuAddCallback(menu, _("Keep Clip On Top"), toggleLoweredCallback, NULL); entry->flags.indicator = 1; entry->flags.indicator_on = 1; @@ -1003,7 +995,7 @@ dockMenuCreate(WScreen *scr, int type) menu = wMenuCreate(scr, NULL, False); if (type != WM_CLIP) { - entry = wMenuAddCallback(menu, _("Floating Dock"), + entry = wMenuAddCallback(menu, _("Keep Dock On Top"), toggleLoweredCallback, NULL); entry->flags.indicator = 1; entry->flags.indicator_on = 1; @@ -1919,6 +1911,7 @@ wDockAttachIcon(WDock *dock, WAppIcon *icon, int x, int y) wwin = icon->icon->owner; if (icon->command==NULL) { + icon->editing = 0; if (XGetCommand(dpy, wwin->client_win, &argv, &argc) && argc>0) { icon->command = FlattenStringList(argv, argc); @@ -1928,6 +1921,7 @@ wDockAttachIcon(WDock *dock, WAppIcon *icon, int x, int y) /* icon->forced_dock = 1;*/ if (!icon->attracted || dock->type!=WM_CLIP || dock->keep_attracted) { + icon->editing = 1; if (wInputDialog(dock->screen_ptr, _("Dock Icon"), _("Type the command used to launch the application"), &command)==WDB_OK) { @@ -1937,7 +1931,9 @@ wDockAttachIcon(WDock *dock, WAppIcon *icon, int x, int y) command = NULL; } icon->command = command; + icon->editing = 0; } else { + icon->editing = 0; if (command) free(command); /* If the target is the dock, reject the icon. If @@ -1949,13 +1945,15 @@ wDockAttachIcon(WDock *dock, WAppIcon *icon, int x, int y) icon->icon->shadowed = 1; icon->icon->force_paint = 1; } - } else + } else { return False; + } } } } + } else { + icon->editing = 0; } - for (index=1; indexmax_icons; index++) if (dock->icon_array[index] == NULL) @@ -2044,6 +2042,7 @@ moveIconBetweenDocks(WDock *src, WDock *dest, WAppIcon *icon, int x, int y) } else { char *command=NULL; + icon->editing = 1; /* icon->forced_dock = 1;*/ if (wInputDialog(src->screen_ptr, _("Dock Icon"), _("Type the command used to launch the application"), @@ -2055,10 +2054,12 @@ moveIconBetweenDocks(WDock *src, WDock *dest, WAppIcon *icon, int x, int y) } icon->command = command; } else { + icon->editing = 0; if (command) free(command); return False; } + icon->editing = 0; } } @@ -2207,10 +2208,10 @@ wDockSnapIcon(WDock *dock, WAppIcon *icon, int req_x, int req_y, int dx, dy; int ex_x, ex_y; int i, offset = ICON_SIZE/2; - int only_down = (dock->type == WM_DOCK); WAppIcon *aicon = NULL; WAppIcon *nicon = NULL; + dx = dock->x_pos; dy = dock->y_pos; @@ -2231,50 +2232,116 @@ wDockSnapIcon(WDock *dock, WAppIcon *icon, int req_x, int req_y, else ex_x = (req_x + offset - dx)/ICON_SIZE; - if ((ex_y < 1 || ex_x != 0) && only_down) - return False; + /* check if the icon is outside the screen boundaries */ + if (dx + ex_x*ICON_SIZE < -ICON_SIZE+2 || + dx + ex_x*ICON_SIZE > scr->scr_width-1 || + dy + ex_y*ICON_SIZE < -ICON_SIZE+2 || + dy + ex_y*ICON_SIZE > scr->scr_height-1) + return False; - if (dock->x_pos + ex_x*ICON_SIZE < -ICON_SIZE+2 || - dock->x_pos + ex_x*ICON_SIZE > scr->scr_width-1 || - dock->y_pos + ex_y*ICON_SIZE < -ICON_SIZE+2 || - dock->y_pos + ex_y*ICON_SIZE > scr->scr_height-1) - return False; + if (dock->type == WM_DOCK) { + for (i=0; imax_icons; i++) { + nicon = dock->icon_array[i]; + if (nicon && nicon->yindex == ex_y) { + aicon = nicon; + break; + } + } - for (i=0; imax_icons; i++) { - nicon = dock->icon_array[i]; - if (nicon && nicon->xindex == ex_x && nicon->yindex == ex_y) { - aicon = nicon; - break; - } - } + *ret_x = 0; - if (!only_down) { - int neighbours = 0; - for (i=0; imax_icons; i++) { - nicon = dock->icon_array[i]; - if (nicon && nicon != icon && /* Icon can't be it's own neighbour */ - (abs(nicon->xindex - ex_x) <= CLIP_ATTACH_VICINITY && - abs(nicon->yindex - ex_y) <= CLIP_ATTACH_VICINITY)) { - neighbours = 1; - break; - } - } - if ((!redocking && neighbours && !aicon) || - (redocking && neighbours && (aicon == icon || !aicon))) { - *ret_x = ex_x; - *ret_y = ex_y; - return True; - } - } - else { - if ((!redocking && !aicon) || - (redocking && (aicon==icon || !aicon))) { - *ret_x = 0; - *ret_y = ex_y; - return True; - } + if (redocking) { + int sig, done, closest; + + /* Possible cases when redocking: + * + * icon dragged out of range of any slot -> false + * icon dragged to range of free slot + * icon dragged to range of same slot + * icon dragged to range of different icon + */ + if (abs(ex_x) > DOCK_DETTACH_THRESHOLD) + return False; + + if (ex_y >=0 && (aicon == icon || !aicon)) { + + *ret_y = ex_y; + + return True; + } + + /* start looking at the upper slot or lower? */ + if (ex_y*ICON_SIZE < (req_y + offset - dy)) + sig = 1; + else + sig = -1; + + closest = -1; + done = 0; + /* look for closest free slot */ + for (i=0; i<(DOCK_DETTACH_THRESHOLD+1)*2 && !done; i++) { + int j; + + done = 1; + closest = sig*(i/2) + ex_y; + /* check if this slot is used */ + if (closest >= 0) { + for (j = 0; jmax_icons; j++) { + if (dock->icon_array[j] + && dock->icon_array[j]->yindex==closest) { + /* slot is used by someone else */ + if (dock->icon_array[j]!=icon) + done = 0; + break; + } + } + } + sig = -sig; + } + if (done && closest >= 0 && + ((ex_y >= closest && ex_y - closest < DOCK_DETTACH_THRESHOLD+1) + || + (ex_y < closest && closest - ex_y <= DOCK_DETTACH_THRESHOLD+1))) { + + *ret_y = closest; + + return True; + } + } else { /* !redocking */ + + /* if slot is free and the icon is close enough, return it */ + if (!aicon && ex_x==0 && ex_y>=0) { + *ret_y = ex_y; + return True; + } + } + } else { /* CLIP */ + int neighbours = 0; + + for (i=0; imax_icons; i++) { + nicon = dock->icon_array[i]; + if (nicon && nicon->xindex == ex_x && nicon->yindex == ex_y) { + aicon = nicon; + break; + } + } + + for (i=0; imax_icons; i++) { + nicon = dock->icon_array[i]; + if (nicon && nicon != icon && /* Icon can't be it's own neighbour */ + (abs(nicon->xindex - ex_x) <= CLIP_ATTACH_VICINITY && + abs(nicon->yindex - ex_y) <= CLIP_ATTACH_VICINITY)) { + neighbours = 1; + break; + } + } + if ((!redocking && neighbours && !aicon) || + (redocking && neighbours && (aicon == icon || !aicon))) { + *ret_x = ex_x; + *ret_y = ex_y; + return True; + } } - return False; } @@ -2296,18 +2363,12 @@ wDockFindFreeSlot(WDock *dock, int *x_pos, int *y_pos) { WScreen *scr = dock->screen_ptr; WAppIcon *btn; -#if 1 unsigned char *slot_map; int mwidth; int r; int x, y; int i, done = False; int corner; -#else - int n = MAX(dock->max_icons, MAX(scr->scr_width, scr->scr_height)/ICON_SIZE + 1); - unsigned char *north, *south, *east, *west; - int i, j, done=False; -#endif int sx=0, sy=0, ex=scr->scr_width, ey=scr->scr_height; /* if the dock is full */ @@ -2326,7 +2387,6 @@ wDockFindFreeSlot(WDock *dock, int *x_pos, int *y_pos) ex = dock->x_pos; if (sx > dock->x_pos+ICON_SIZE) sx = dock->x_pos+ICON_SIZE; -#if 1 #define C_NONE 0 #define C_NW 1 #define C_NE 2 @@ -2348,9 +2408,6 @@ wDockFindFreeSlot(WDock *dock, int *x_pos, int *y_pos) } else corner = C_NONE; - /* This one checks for diagonal positions, uses less memory - * and CPU. -Alfredo */ - /* If the clip is in the corner, use only slots that are in the border * of the screen */ if (corner!=C_NONE) { @@ -2530,90 +2587,6 @@ wDockFindFreeSlot(WDock *dock, int *x_pos, int *y_pos) free(slot_map); #undef XY2OFS return done; -#else - north = (unsigned char*) wmalloc(sizeof(unsigned char) * n); - south = (unsigned char*) wmalloc(sizeof(unsigned char) * n); - east = (unsigned char*) wmalloc(sizeof(unsigned char) * n); - west = (unsigned char*) wmalloc(sizeof(unsigned char) * n); - - /* We allow 3 passes to find a free position. This can be increased, - * but usually is more than enough for a normal (<25 icons/clip) - * environment. 25 free slots are found in the first pass for a - * 1024x768 screen size. - * - */ - for (i=0; i<3 && !done; i++) { - memset(north, 0, sizeof(unsigned char) * n); - memset(south, 0, sizeof(unsigned char) * n); - memset(east, 0, sizeof(unsigned char) * n); - memset(west, 0, sizeof(unsigned char) * n); - for (j=0; jmax_icons; j++) { - btn = dock->icon_array[j]; - if (!btn) - continue; - - if (btn->yindex == i && btn->xindex >= 0) - east[btn->xindex] = 1; - else if (btn->yindex == -i && btn->xindex < 0) - west[-(btn->xindex)] = 1; - else if (btn->xindex == -i && btn->yindex >= 0) - south[btn->yindex] = 1; - else if (btn->xindex == i && btn->yindex < 0) - north[-(btn->yindex)] = 1; - } - for (j=1; jx_pos + j*ICON_SIZE; - y = dock->y_pos + i*ICON_SIZE; - if (ON_SCREEN(x, y, sx, ex, sy, ey)) { - *x_pos = j; - *y_pos = i; - done = True; - break; - } - } - if (west[j]==0) { - x = dock->x_pos + (-j)*ICON_SIZE; - y = dock->y_pos + (-i)*ICON_SIZE; - if (ON_SCREEN(x, y, sx, ex, sy, ey)) { - *x_pos = -j; - *y_pos = -i; - done = True; - break; - } - } - if (south[j]==0) { - x = dock->x_pos + (-i)*ICON_SIZE; - y = dock->y_pos + (j)*ICON_SIZE; - if (ON_SCREEN(x, y, sx, ex, sy, ey)) { - *x_pos = -i; - *y_pos = j; - done = True; - break; - } - } - if (north[j]==0) { - x = dock->x_pos + (i)*ICON_SIZE; - y = dock->y_pos + (-j)*ICON_SIZE; - if (ON_SCREEN(x, y, sx, ex, sy, ey)) { - *x_pos = i; - *y_pos = -j; - done = True; - break; - } - } - } - } - - free(north); - free(south); - free(east); - free(west); - - return done; /* If done is True this means that we found a free slot */ -#endif } @@ -2727,8 +2700,8 @@ execCommand(WAppIcon *btn, char *command, WSavedState *state) else state->workspace = scr->current_workspace; } - wAddWindowSavedState(btn->wm_instance, btn->wm_class, - cmdline, pid, state); + wWindowAddSavedState(btn->wm_instance, btn->wm_class, cmdline, pid, + state); wAddDeathHandler(pid, (WDeathHandler*)trackDeadProcess, btn->dock); } else if (state) { @@ -3051,7 +3024,7 @@ openDockMenu(WDock *dock, WAppIcon *aicon, XEvent *event) int appIsRunning = aicon->running && aicon->icon && aicon->icon->owner; if (dock->type == WM_DOCK) { - /* floating */ + /* keep on top */ entry = dock->menu->entries[index]; entry->flags.indicator_on = !dock->lowered; entry->clientdata = dock; @@ -3124,8 +3097,7 @@ openDockMenu(WDock *dock, WAppIcon *aicon, XEvent *event) if (dock->type == WM_CLIP) { x_pos = event->xbutton.x_root+2; - } - else { + } else { x_pos = dock->on_right_side ? scr->scr_width - dock->menu->frame->core->width - 2 : 0; } @@ -3609,13 +3581,6 @@ handleClipChangeWorkspace(WScreen *scr, XEvent *event) int new_dir; WDock *clip = scr->clip_icon->dock; - /* if this is reached during startup (before the 1st wWorkspaceForceChange) - * we will get undesired effects, like having all windows unmapped and - * don't having them back if the clip buttons are clicked. - */ - if (scr->flags.startup2 || scr->flags.startup) - return; - direction = getClipButton(event->xbutton.x, event->xbutton.y); clip->lclip_button_pushed = direction==CLIP_REWIND; @@ -3681,6 +3646,9 @@ iconMouseDown(WObjDescriptor *desc, XEvent *event) WDock *dock = aicon->dock; WScreen *scr = aicon->icon->core->screen_ptr; + if (aicon->editing) + return; + scr->last_dock = dock; if (dock->menu->flags.mapped) diff --git a/src/dock.h b/src/dock.h index fce24573..f7b418e8 100644 --- a/src/dock.h +++ b/src/dock.h @@ -1,6 +1,6 @@ /* dock.h- built-in Dock module for WindowMaker * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/dockedapp.c b/src/dockedapp.c index c293f83a..293ae99e 100644 --- a/src/dockedapp.c +++ b/src/dockedapp.c @@ -1,6 +1,6 @@ /* dockedapp.c- docked application settings panel * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1998 Alfredo K. Kojima * @@ -335,7 +335,7 @@ ShowDockAppSettingsPanel(WAppIcon *aicon) WMMoveWidget(panel->iconField, 10, 20); WMSetTextFieldText(panel->iconField, wDefaultGetIconFile(scr, aicon->wm_instance, - aicon->wm_class, False)); + aicon->wm_class, True)); panel->browseBtn = WMCreateCommandButton(panel->iconFrame); WMResizeWidget(panel->browseBtn, 70, 24); diff --git a/src/event.c b/src/event.c index 2d7a0d4c..d1697d23 100644 --- a/src/event.c +++ b/src/event.c @@ -1,6 +1,6 @@ /* event.c- event loop and handling * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -34,6 +34,11 @@ #ifdef SHAPE #include #endif +#ifdef XDE_DND +#include +#include +#endif + #include "WindowMaker.h" #include "window.h" @@ -67,20 +72,29 @@ extern WPreferences wPreferences; extern Atom _XA_WM_CHANGE_STATE; extern Atom _XA_WM_DELETE_WINDOW; -extern Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; extern Atom _XA_WINDOWMAKER_WM_FUNCTION; #ifdef OFFIX_DND extern Atom _XA_DND_PROTOCOL; #endif +#ifdef XDE_DND +extern Atom _XA_XDE_REQUEST; +extern Atom _XA_XDE_ENTER; +extern Atom _XA_XDE_LEAVE; +extern Atom _XA_XDE_DATA_AVAILABLE; +extern Atom _XDE_FILETYPE; +extern Atom _XDE_URLTYPE; +#endif + #ifdef SHAPE -extern int ShapeEventBase; +extern Bool wShapeSupported; +extern int wShapeEventBase; #endif /* special flags */ -extern char WRestartASAP; -extern char WExitASAP; +extern char WProgramState; extern char WDelayedActionSet; @@ -132,132 +146,9 @@ typedef struct DeathHandler { static DeathHandler *deathHandler=NULL; -static WWindowState *windowState=NULL; - - - - -WMagicNumber -wAddWindowSavedState(char *instance, char *class, char *command, - pid_t pid, WSavedState *state) -{ - WWindowState *wstate; - - wstate = malloc(sizeof(WWindowState)); - if (!wstate) - return 0; - - memset(wstate, 0, sizeof(WWindowState)); - wstate->pid = pid; - if (instance) - wstate->instance = wstrdup(instance); - if (class) - wstate->class = wstrdup(class); - if (command) - wstate->command = wstrdup(command); - wstate->state = state; - - wstate->next = windowState; - windowState = wstate; - -#ifdef DEBUG - printf("Added WindowState with ID %p, for %s.%s : \"%s\"\n", wstate, instance, - class, command); -#endif - - return wstate; -} - - -#define SAME(x, y) (((x) && (y) && !strcmp((x), (y))) || (!(x) && !(y))) - - -WMagicNumber -wGetWindowSavedState(Window win) -{ - char *instance, *class, *command=NULL; - WWindowState *wstate = windowState; - char **argv; - int argc; - - if (!wstate) - return NULL; - - if (XGetCommand(dpy, win, &argv, &argc) && argc>0) { - command = FlattenStringList(argv, argc); - XFreeStringList(argv); - } - if (!command) - return NULL; - - if (PropGetWMClass(win, &class, &instance)) { - while (wstate) { - if (SAME(instance, wstate->instance) && - SAME(class, wstate->class) && - SAME(command, wstate->command)) { - break; - } - wstate = wstate->next; - } - } else { - wstate = NULL; - } - -#ifdef DEBUG - printf("Read WindowState with ID %p, for %s.%s : \"%s\"\n", wstate, instance, - class, command); -#endif - - if (command) free(command); - if (instance) XFree(instance); - if (class) XFree(class); - - return wstate; -} - - -void -wDeleteWindowSavedState(WMagicNumber id) -{ - WWindowState *tmp, *wstate=(WWindowState*)id; - - if (!wstate || !windowState) - return; - - tmp = windowState; - if (tmp==wstate) { - windowState = wstate->next; -#ifdef DEBUG - printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", - wstate, wstate->instance, wstate->class, wstate->command); -#endif - if (wstate->instance) free(wstate->instance); - if (wstate->class) free(wstate->class); - if (wstate->command) free(wstate->command); - free(wstate->state); - free(wstate); - } else { - while (tmp->next) { - if (tmp->next==wstate) { - tmp->next=wstate->next; -#ifdef DEBUG - printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", - wstate, wstate->instance, wstate->class, wstate->command); -#endif - if (wstate->instance) free(wstate->instance); - if (wstate->class) free(wstate->class); - if (wstate->command) free(wstate->command); - free(wstate->state); - free(wstate); - break; - } - tmp = tmp->next; - } - } -} -WMagicNumber +WDeathHandlerID wAddDeathHandler(pid_t pid, WDeathHandler *callback, void *cdata) { DeathHandler *handler; @@ -280,7 +171,7 @@ wAddDeathHandler(pid_t pid, WDeathHandler *callback, void *cdata) void -wDeleteDeathHandler(WMagicNumber id) +wDeleteDeathHandler(WDeathHandlerID id) { DeathHandler *tmp, *handler=(DeathHandler*)id; @@ -312,8 +203,8 @@ DispatchEvent(XEvent *event) if (deathHandler) handleDeadProcess(NULL); - if (WExitASAP) { - WExitASAP = 0; + if (WProgramState==WSTATE_NEED_EXIT) { + WProgramState = WSTATE_EXITING; /* * WMHandleEvent() can't be called from anything @@ -331,8 +222,8 @@ DispatchEvent(XEvent *event) ExecExitScript(); /* received SIGTERM */ exit(0); - } else if (WRestartASAP) { - WRestartASAP = 0; + } else if (WProgramState == WSTATE_NEED_RESTART) { + WProgramState = WSTATE_RESTARTING; for (i=0; i0) { - tmpPtr--; - - wins = windowState; - while (wins) { - WWindowState *t; - - t = wins->next; + int i; - if (wins->pid == deadProcesses[tmpPtr].pid) { - wDeleteWindowSavedState(wins); - } - wins = t; - } - } + for (i=0; itype == (ShapeEventBase+ShapeNotify)) { + if (wShapeSupported && event->type == (wShapeEventBase+ShapeNotify)) { handleShapeNotify(event); } #endif @@ -1012,9 +887,88 @@ handleClientMessage(XEvent *event) } } } +#ifdef XDE_DND + } else if (event->xclient.message_type==_XA_XDE_DATA_AVAILABLE) { + GdkEvent gdkev; + WScreen *scr = wScreenForWindow(event->xclient.window); + Atom tmpatom; + int datalenght; + long tmplong; + char * tmpstr, * runstr, * freestr, * tofreestr; + printf("x\n"); + gdkev.dropdataavailable.u.allflags = event->xclient.data.l[1]; + gdkev.dropdataavailable.timestamp = event->xclient.data.l[4]; + + if(gdkev.dropdataavailable.u.flags.isdrop){ + gdkev.dropdataavailable.type = GDK_DROP_DATA_AVAIL; + gdkev.dropdataavailable.requestor = event->xclient.data.l[0]; + XGetWindowProperty(dpy,gdkev.dropdataavailable.requestor, + event->xclient.data.l[2], + 0, LONG_MAX -1, + 0, XA_PRIMARY, &tmpatom, + &datalenght, + &gdkev.dropdataavailable.data_numbytes, + &tmplong, + &tmpstr); + datalenght=gdkev.dropdataavailable.data_numbytes-1; + tofreestr=tmpstr; + runstr=NULL; + for(;datalenght>0;datalenght-=(strlen(tmpstr)+1),tmpstr=&tmpstr[strlen(tmpstr)+1]){ + freestr=runstr;runstr=wstrappend(runstr,tmpstr);free(freestr); + freestr=runstr;runstr=wstrappend(runstr," ");free(freestr); + } + free(tofreestr); + scr->xdestring=runstr; + /* no need to redirect ? */ + wDockReceiveDNDDrop(scr,event); + free(runstr); + scr->xdestring=NULL; + } + + } else if (event->xclient.message_type==_XA_XDE_LEAVE) { + printf("leave\n"); + } else if (event->xclient.message_type==_XA_XDE_ENTER) { + GdkEvent gdkev; + XEvent replyev; + + gdkev.dropenter.u.allflags=event->xclient.data.l[1]; + printf("from win %x\n",event->xclient.data.l[0]); + printf("to win %x\n",event->xclient.window); + printf("enter %x\n",event->xclient.data.l[1]); + printf("v %x ",event->xclient.data.l[2]); + printf("%x ",event->xclient.data.l[3]); + printf("%x\n",event->xclient.data.l[4]); + + if(event->xclient.data.l[2]==_XDE_FILETYPE || + event->xclient.data.l[3]==_XDE_FILETYPE || + event->xclient.data.l[4]==_XDE_FILETYPE || + event->xclient.data.l[2]==_XDE_URLTYPE || + event->xclient.data.l[3]==_XDE_URLTYPE || + event->xclient.data.l[4]==_XDE_URLTYPE) + if(gdkev.dropenter.u.flags.sendreply){ + /*reply*/ + replyev.xclient.type = ClientMessage; + replyev.xclient.window = event->xclient.data.l[0]; + replyev.xclient.format = 32; + replyev.xclient.message_type = _XA_XDE_REQUEST; + replyev.xclient.data.l[0] = event->xclient.window; + + gdkev.dragrequest.u.allflags = 0; + gdkev.dragrequest.u.flags.protocol_version = 0; + gdkev.dragrequest.u.flags.willaccept = 1; + gdkev.dragrequest.u.flags.delete_data = 0; + + replyev.xclient.data.l[1] = gdkev.dragrequest.u.allflags; + replyev.xclient.data.l[2] = replyev.xclient.data.l[3] = 0; + replyev.xclient.data.l[4] = event->xclient.data.l[2]; + XSendEvent(dpy, replyev.xclient.window, 0, NoEventMask, &replyev); + XSync(dpy, 0); + } +#endif /* XDE_DND */ #ifdef OFFIX_DND } else if (event->xclient.message_type==_XA_DND_PROTOCOL) { - if (wDockReceiveDNDDrop(wScreenForWindow(event->xclient.window),event)) + WScreen *scr = wScreenForWindow(event->xclient.window); + if (scr && wDockReceiveDNDDrop(scr,event)) goto redirect_message; #endif /* OFFIX_DND */ } else { @@ -1197,16 +1151,39 @@ handleShapeNotify(XEvent *event) { XShapeEvent *shev = (XShapeEvent*)event; WWindow *wwin; - puts("got shape notify"); + XEvent ev; + #ifdef DEBUG puts("got shape notify"); #endif - wwin = wWindowFor(event->xany.window); + + while (XCheckTypedWindowEvent(dpy, shev->window, event->type, &ev)) { + XShapeEvent *sev = (XShapeEvent*)&ev; + + if (sev->kind == ShapeBounding) { + if (sev->shaped == shev->shaped) { + *shev = *sev; + } else { + XPutBackEvent(dpy, &ev); + break; + } + } + } + + wwin = wWindowFor(shev->window); if (!wwin || shev->kind != ShapeBounding) return; - - wwin->flags.shaped = shev->shaped; - wWindowSetShape(wwin); + + if (!shev->shaped && wwin->flags.shaped) { + + wwin->flags.shaped = 0; + wWindowClearShape(wwin); + + } else if (shev->shaped) { + + wwin->flags.shaped = 1; + wWindowSetShape(wwin); + } } #endif /* SHAPE */ @@ -1263,15 +1240,14 @@ handleFocusIn(XEvent *event) { WWindow *wwin; - if (event->xfocus.mode == NotifyUngrab) { - return; - } /* * For applications that like stealing the focus. */ while (XCheckTypedEvent(dpy, FocusIn, event)); saveTimestamp(event); - if (event->xfocus.mode == NotifyUngrab) { + if (event->xfocus.mode == NotifyUngrab + || event->xfocus.mode == NotifyGrab + || event->xfocus.detail > NotifyNonlinearVirtual) { return; } @@ -1282,7 +1258,9 @@ handleFocusIn(XEvent *event) else wSetFocusTo(wwin->screen_ptr, NULL); } else if (!wwin) { - wSetFocusTo(wScreenForWindow(event->xfocus.window), NULL); + WScreen *scr = wScreenForWindow(event->xfocus.window); + if (scr) + wSetFocusTo(scr, NULL); } } @@ -1366,7 +1344,7 @@ handleKeyPress(XEvent *event) CloseWindowMenu(scr); if (wwin->protocols.MINIATURIZE_WINDOW) - wClientSendProtocol(wwin, _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW, + wClientSendProtocol(wwin, _XA_GNUSTEP_WM_MINIATURIZE_WINDOW, event->xbutton.time); else { if (!wwin->window_flags.no_miniaturizable) @@ -1469,36 +1447,30 @@ handleKeyPress(XEvent *event) wRaiseFrame(wwin->frame->core); } break; - case WKBD_WORKSPACE1: - wWorkspaceChange(scr, 0); - break; - case WKBD_WORKSPACE2: - wWorkspaceChange(scr, 1); - break; - case WKBD_WORKSPACE3: - wWorkspaceChange(scr, 2); - break; - case WKBD_WORKSPACE4: - wWorkspaceChange(scr, 3); - break; - case WKBD_WORKSPACE5: - wWorkspaceChange(scr, 4); - break; - case WKBD_WORKSPACE6: - wWorkspaceChange(scr, 5); - break; - case WKBD_WORKSPACE7: - wWorkspaceChange(scr, 6); - break; - case WKBD_WORKSPACE8: - wWorkspaceChange(scr, 7); - break; - case WKBD_WORKSPACE9: - wWorkspaceChange(scr, 8); - break; - case WKBD_WORKSPACE10: - wWorkspaceChange(scr, 9); - break; +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define GOTOWORKS(wk) case WKBD_WORKSPACE##wk:\ + i = (scr->current_workspace/10)*10 + wk - 1;\ + if (wPreferences.ws_advance || iworkspace_count)\ + wWorkspaceChange(scr, i);\ + break +#else +#define GOTOWORKS(wk) case WKBD_WORKSPACE/**/wk:\ + i = (scr->current_workspace/10)*10 + wk - 1;\ + if (wPreferences.ws_advance || iworkspace_count)\ + wWorkspaceChange(scr, i);\ + break +#endif + GOTOWORKS(1); + GOTOWORKS(2); + GOTOWORKS(3); + GOTOWORKS(4); + GOTOWORKS(5); + GOTOWORKS(6); + GOTOWORKS(7); + GOTOWORKS(8); + GOTOWORKS(9); + GOTOWORKS(10); +#undef GOTOWORKS case WKBD_NEXTWORKSPACE: if (scr->current_workspace < scr->workspace_count-1) wWorkspaceChange(scr, scr->current_workspace+1); diff --git a/src/framewin.c b/src/framewin.c index 59704dce..ad5bc1fa 100644 --- a/src/framewin.c +++ b/src/framewin.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -523,7 +523,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, } if (!img) { - wwarning(_("could not render gradient: %s"), RErrorString); + wwarning(_("could not render gradient: %s"), RMessageForError(RErrorCode)); return; } @@ -539,7 +539,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, if (limg) { RBevelImage(limg, RBEV_RAISED2); if (!RConvertImage(scr->rcontext, limg, lbutton)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } x += limg->width; w -= limg->width; @@ -554,7 +554,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, if (rimg) { RBevelImage(rimg, RBEV_RAISED2); if (!RConvertImage(scr->rcontext, rimg, rbutton)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } w -= rimg->width; RDestroyImage(rimg); @@ -565,21 +565,21 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, RBevelImage(mimg, RBEV_RAISED2); if (!RConvertImage(scr->rcontext, mimg, title)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } RDestroyImage(mimg); } else { RBevelImage(img, RBEV_RAISED2); if (!RConvertImage(scr->rcontext, img, title)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } } } else { RBevelImage(img, RBEV_RAISED2); if (!RConvertImage(scr->rcontext, img, title)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } } @@ -587,6 +587,98 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, } +static void +updateTexture(WFrameWindow *fwin) +{ + int i; + unsigned long pixel; + + i = fwin->flags.state; + if (fwin->titlebar) { + if (fwin->title_texture[i]->any.type!=WTEX_SOLID) { + XSetWindowBackgroundPixmap(dpy, fwin->titlebar->window, + fwin->title_back[i]); + if (wPreferences.new_style) { + if (fwin->left_button && fwin->lbutton_back[i]) + XSetWindowBackgroundPixmap(dpy, fwin->left_button->window, + fwin->lbutton_back[i]); + + if (fwin->right_button && fwin->rbutton_back[i]) + XSetWindowBackgroundPixmap(dpy, fwin->right_button->window, + fwin->rbutton_back[i]); + } + } else { + pixel = fwin->title_texture[i]->solid.normal.pixel; + XSetWindowBackground(dpy, fwin->titlebar->window, pixel); + if (wPreferences.new_style) { + if (fwin->left_button) + XSetWindowBackground(dpy, fwin->left_button->window, + pixel); + if (fwin->right_button) + XSetWindowBackground(dpy, fwin->right_button->window, + pixel); + } + } + XClearWindow(dpy, fwin->titlebar->window); + + if (fwin->left_button) { + XClearWindow(dpy, fwin->left_button->window); + handleButtonExpose(&fwin->left_button->descriptor, NULL); + } + if (fwin->right_button) { + XClearWindow(dpy, fwin->right_button->window); + handleButtonExpose(&fwin->right_button->descriptor, NULL); + } + } + + if (fwin->resizebar) { + XSetWindowBackground(dpy, fwin->resizebar->window, + fwin->resizebar_texture[0]->solid.normal.pixel); + XClearWindow(dpy, fwin->resizebar->window); + } +} + + + +static void +remakeTexture(WFrameWindow *fwin, int state) +{ + Pixmap pmap, lpmap, rpmap; + + if (fwin->title_texture[state] && fwin->titlebar) { + FREE_PIXMAP(fwin->title_back[state]); + if (wPreferences.new_style) { + FREE_PIXMAP(fwin->lbutton_back[state]); + FREE_PIXMAP(fwin->rbutton_back[state]); + } + + if (fwin->title_texture[state]->any.type!=WTEX_SOLID) { + int left, right; + int width; + + /* eventually surrounded by if new_style */ + left = fwin->left_button && !fwin->flags.hide_left_button + && !fwin->flags.lbutton_dont_fit; + right = fwin->right_button && !fwin->flags.hide_right_button + && !fwin->flags.rbutton_dont_fit; + + width = fwin->core->width+1; + + renderTexture(fwin->screen_ptr, fwin->title_texture[state], + width, fwin->titlebar->height, + fwin->titlebar->height, fwin->titlebar->height, + left, right, &pmap, &lpmap, &rpmap); + + fwin->title_back[state] = pmap; + if (wPreferences.new_style) { + fwin->lbutton_back[state] = lpmap; + fwin->rbutton_back[state] = rpmap; + } + } + } +} + + void wFrameWindowPaint(WFrameWindow *fwin) { @@ -596,103 +688,36 @@ wFrameWindowPaint(WFrameWindow *fwin) if (fwin->flags.need_texture_remake) { int i; - Pixmap pmap, lpmap, rpmap; fwin->flags.need_texture_remake = 0; + fwin->flags.need_texture_change = 0; - for (i=0; i < (fwin->flags.single_texture ? 1 : 3); i++) { - if (fwin->title_texture[i] && fwin->titlebar) { - FREE_PIXMAP(fwin->title_back[i]); - if (wPreferences.new_style) { - FREE_PIXMAP(fwin->lbutton_back[i]); - FREE_PIXMAP(fwin->rbutton_back[i]); - } - - if (fwin->title_texture[i]->any.type!=WTEX_SOLID) { - int left, right; - int width; - - /* eventually surrounded by if new_style */ - left = fwin->left_button && !fwin->flags.hide_left_button - && !fwin->flags.lbutton_dont_fit; - right = fwin->right_button && !fwin->flags.hide_right_button - && !fwin->flags.rbutton_dont_fit; - - width = fwin->core->width+1; - - renderTexture(fwin->screen_ptr, fwin->title_texture[i], - width, fwin->titlebar->height, - fwin->titlebar->height, fwin->titlebar->height, - left, right, &pmap, &lpmap, &rpmap); - - fwin->title_back[i] = pmap; - if (wPreferences.new_style) { - fwin->lbutton_back[i] = lpmap; - fwin->rbutton_back[i] = rpmap; - } - } + if (fwin->flags.single_texture) { + remakeTexture(fwin, 0); + updateTexture(fwin); + } else { + /* first render the texture for the current state... */ + remakeTexture(fwin, fwin->flags.state); + /* ... and paint it */ + updateTexture(fwin); + + for (i=0; i < 3; i++) { + if (i!=fwin->flags.state) + remakeTexture(fwin, i); } } - - fwin->flags.need_texture_change = 1; } - if (fwin->flags.need_texture_change) { - int i; - unsigned long pixel; - + if (fwin->flags.need_texture_change) { fwin->flags.need_texture_change = 0; - i = fwin->flags.state; - if (fwin->titlebar) { - if (fwin->title_texture[i]->any.type!=WTEX_SOLID) { - XSetWindowBackgroundPixmap(dpy, fwin->titlebar->window, - fwin->title_back[i]); - if (wPreferences.new_style) { - if (fwin->left_button && fwin->lbutton_back[i]) - XSetWindowBackgroundPixmap(dpy, - fwin->left_button->window, - fwin->lbutton_back[i]); - - if (fwin->right_button && fwin->rbutton_back[i]) - XSetWindowBackgroundPixmap(dpy, - fwin->right_button->window, - fwin->rbutton_back[i]); - } - } else { - pixel = fwin->title_texture[i]->solid.normal.pixel; - XSetWindowBackground(dpy, fwin->titlebar->window, pixel); - if (wPreferences.new_style) { - if (fwin->left_button) - XSetWindowBackground(dpy, fwin->left_button->window, - pixel); - if (fwin->right_button) - XSetWindowBackground(dpy, fwin->right_button->window, - pixel); - } - } - XClearWindow(dpy, fwin->titlebar->window); - - if (fwin->left_button) { - XClearWindow(dpy, fwin->left_button->window); - handleButtonExpose(&fwin->left_button->descriptor, NULL); - } - if (fwin->right_button) { - XClearWindow(dpy, fwin->right_button->window); - handleButtonExpose(&fwin->right_button->descriptor, NULL); - } - } - - if (fwin->resizebar) { - XSetWindowBackground(dpy, fwin->resizebar->window, - fwin->resizebar_texture[0]->solid.normal.pixel); - XClearWindow(dpy, fwin->resizebar->window); - } + updateTexture(fwin); } if (fwin->titlebar && !fwin->flags.repaint_only_resizebar && fwin->title_texture[fwin->flags.state]->any.type==WTEX_SOLID) { - wDrawBevel(fwin->titlebar, + wDrawBevel(fwin->titlebar->window, fwin->titlebar->width, + fwin->titlebar->height, (WTexSolid*)fwin->title_texture[fwin->flags.state], WREL_RAISED); } @@ -1011,10 +1036,12 @@ paintButton(WCoreWindow *button, WTexture *texture, unsigned long color, if (wPreferences.new_style) { if (texture->any.type==WTEX_SOLID || pushed) { - wDrawBevel(button, (WTexSolid*)texture, WREL_RAISED); + wDrawBevel(button->window, button->width, button->height, + (WTexSolid*)texture, WREL_RAISED); } } else { - wDrawBevel(button, scr->widget_texture, WREL_RAISED); + wDrawBevel(button->window, button->width, button->height, + scr->widget_texture, WREL_RAISED); } } diff --git a/src/framewin.h b/src/framewin.h index 64f8aef0..218fad57 100644 --- a/src/framewin.h +++ b/src/framewin.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/funcs.h b/src/funcs.h index b14b4db7..3d220243 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -31,7 +31,8 @@ typedef void (WCallBack)(void *cdata); typedef void (WDeathHandler)(pid_t pid, unsigned int status, void *cdata); -typedef void* WMagicNumber; +typedef void* WDeathHandlerID; + void RestoreDesktop(WScreen *scr); @@ -61,14 +62,7 @@ void UpdateSwitchMenu(WScreen *scr, WWindow *wwin, int action); void UpdateSwitchMenuWorkspace(WScreen *scr, int workspace); -WMagicNumber wAddDeathHandler(pid_t pid, WDeathHandler *callback, void *cdata); - -WMagicNumber wAddWindowSavedState(char *instance, char *class, char *command, - pid_t pid, WSavedState *state); - -WMagicNumber wGetWindowSavedState(Window win); - -void wDeleteWindowSavedState(WMagicNumber id); +WDeathHandlerID wAddDeathHandler(pid_t pid, WDeathHandler *callback, void *cdata); void wColormapInstallForWindow(WScreen *scr, WWindow *wwin); @@ -117,15 +111,13 @@ char *GetShortcutString(char *text); void wHackedGrabKey(int keycode, unsigned int modifiers, Window grab_window, Bool owner_events, int pointer_mode, int keyboard_mode); +#endif void wHackedGrabButton(unsigned int button, unsigned int modifiers, Window grab_window, Bool owner_events, unsigned int event_mask, int pointer_mode, int keyboard_mode, Window confine_to, Cursor cursor); -void wHackedUngrabButton(unsigned int button, unsigned int modifiers, - Window grab_window); -#endif /* this function is in dock.c */ void ParseCommand(char *command, char ***argv, int *argc); diff --git a/src/icon.c b/src/icon.c index d0fe636a..5cec2b28 100644 --- a/src/icon.c +++ b/src/icon.c @@ -1,6 +1,6 @@ /* icon.c - window icon and dock and appicon parent * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -27,8 +27,10 @@ #include #include #include +#include #include #include +#include #include "WindowMaker.h" #include "wcore.h" @@ -177,7 +179,7 @@ wIconCreateWithIconFile(WScreen *scr, char *iconfile, int tile) if (iconfile) { icon->image = RLoadImage(scr->rcontext, iconfile, 0); if (!icon->image) { - wwarning(_("error loading image file \"%s\""), iconfile, RErrorString); + wwarning(_("error loading image file \"%s\""), iconfile, RMessageForError(RErrorCode)); } icon->image = wIconValidateIconSize(scr, icon->image); @@ -291,7 +293,7 @@ makeIcon(WScreen *scr, RImage *icon, int titled, int shadowed, int tileType) } if (!RConvertImage(scr->rcontext, tile, &pixmap)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } RDestroyImage(tile); @@ -389,6 +391,106 @@ wIconChangeImageFile(WIcon *icon, char *file) return !error; } + + +static char* +getnameforicon(WWindow *wwin) +{ + char *prefix, *suffix; + char *path; + int len; + + if (wwin->wm_class && wwin->wm_instance) { + suffix = wmalloc(strlen(wwin->wm_class)+strlen(wwin->wm_instance)+2); + sprintf(suffix, "%s.%s", wwin->wm_instance, wwin->wm_class); + } else if (wwin->wm_class) { + suffix = wmalloc(strlen(wwin->wm_class)+1); + strcpy(suffix, wwin->wm_class); + } else { + suffix = wmalloc(strlen(wwin->wm_instance)+1); + strcpy(suffix, wwin->wm_instance); + } + + prefix = getenv("GNUSTEP_USER_PATH"); + if (!prefix) { + len = strlen(wgethomedir())+64+strlen(suffix); + path = wmalloc(len+1); + sprintf(path, "%s/GNUstep/.AppInfo", wgethomedir()); + } else { + prefix = wexpandpath(prefix); + len = strlen(prefix)+64+strlen(suffix); + path = wmalloc(len+1); + sprintf(path, "%s/.AppInfo", prefix); + free(prefix); + } + if (access(path, F_OK)!=0) { + if (mkdir(path, S_IRUSR|S_IWUSR|S_IXUSR)) { + wsyserror(_("could not create directory %s"), path); + free(path); + free(suffix); + return NULL; + } + } + strcat(path, "/WindowMaker"); + if (access(path, F_OK)!=0) { + if (mkdir(path, S_IRUSR|S_IWUSR|S_IXUSR)!=0) { + wsyserror(_("could not create directory %s"), path); + free(path); + free(suffix); + return NULL; + } + } + + strcat(path, "/"); + strcat(path, suffix); + strcat(path, ".xpm"); + free(suffix); + + return path; +} + + +/* + * wIconStore-- + * Stores the client supplied icon at ~/GNUstep/.AppInfo/WindowMaker + * and returns the path for that icon. Returns NULL if there is no + * client supplied icon or on failure. + * + * Side effects: + * New directories might be created. + */ +char* +wIconStore(WIcon *icon) +{ + char *path; + RImage *image; + WWindow *wwin = icon->owner; + + if (!wwin || !wwin->wm_hints || !(wwin->wm_hints->flags & IconPixmapHint) + || wwin->wm_hints->icon_pixmap == None) + return NULL; + + path = getnameforicon(wwin); + + image = RCreateImageFromDrawable(icon->core->screen_ptr->rcontext, + wwin->wm_hints->icon_pixmap, + (wwin->wm_hints->flags & IconMaskHint) + ? wwin->wm_hints->icon_mask : None); + if (!image) { + free(path); + return NULL; + } + + if (!RSaveImage(image, path, "XPM")) { + free(path); + path = NULL; + } + RDestroyImage(image); + + return path; +} + + /* void wIconChangeIconWindow(WIcon *icon, Window new_window); @@ -399,17 +501,14 @@ cycleColor(void *data) { WIcon *icon = (WIcon*)data; WScreen *scr = icon->core->screen_ptr; + XGCValues gcv; + + icon->step--; + gcv.dash_offset = icon->step; + XChangeGC(dpy, scr->icon_select_gc, GCDashOffset, &gcv); - icon->step = !icon->step; - if (icon->step) { - XSetForeground(dpy, scr->icon_select_gc, scr->white_pixel); - XSetBackground(dpy, scr->icon_select_gc, scr->black_pixel); - } else { - XSetForeground(dpy, scr->icon_select_gc, scr->black_pixel); - XSetBackground(dpy, scr->icon_select_gc, scr->white_pixel); - } XDrawRectangle(dpy, icon->core->window, scr->icon_select_gc, 0, 0, - icon->core->width-1, icon->core->height-1); + icon->core->width-1, icon->core->height-1); icon->handlerID = WMAddTimerHandler(COLOR_CYCLE_DELAY, cycleColor, icon); } @@ -517,17 +616,9 @@ wIconUpdate(WIcon *icon) if (XGetWindowAttributes(dpy, icon->icon_win, &attr)) { if (attr.all_event_masks & ButtonPressMask) { - XGrabButton(dpy, Button1, MOD_MASK, icon->core->window, True, - ButtonPressMask, GrabModeSync, GrabModeAsync, None, - wCursor[WCUR_ARROW]); - XGrabButton(dpy, Button1, MOD_MASK|LockMask, icon->core->window, - True, ButtonPressMask, GrabModeSync, GrabModeAsync, - None, wCursor[WCUR_ARROW]); -#ifdef NUMLOCK_HACK wHackedGrabButton(Button1, MOD_MASK, icon->core->window, True, ButtonPressMask, GrabModeSync, GrabModeAsync, None, wCursor[WCUR_ARROW]); -#endif } } } else if (wwin && wwin->wm_hints @@ -615,7 +706,7 @@ wIconUpdate(WIcon *icon) image = RLoadImage(scr->rcontext, path, 0); if (!image) { wwarning(_("could not load default icon \"%s\":%s"), - file, RErrorString); + file, RMessageForError(RErrorCode)); } free(path); } diff --git a/src/icon.h b/src/icon.h index f9efe5cf..7d2a8fcc 100644 --- a/src/icon.h +++ b/src/icon.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -41,14 +41,13 @@ typedef struct WIcon { char *file; /* the file with the icon image */ RImage *image; - - short tile_type; + unsigned int tile_type:4; unsigned int show_title:1; unsigned int has_titlebar:1; unsigned int force_paint:1; /* True for icon update and repaint */ unsigned int selected:1; - unsigned int step:1; + unsigned int step:3; /* selection cycle step */ unsigned int shadowed:1; /* If the icon is to be blured */ unsigned int mapped:1; unsigned int highlighted:1; @@ -71,4 +70,6 @@ void wIconSelect(WIcon *icon); RImage *wIconValidateIconSize(WScreen *scr, RImage *icon); +char *wIconStore(WIcon *icon); + #endif /* WMICON_H_ */ diff --git a/src/keybind.h b/src/keybind.h index 129b5122..b3d125e1 100644 --- a/src/keybind.h +++ b/src/keybind.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/list.c b/src/list.c index 6225ac48..9fa59e6f 100644 --- a/src/list.c +++ b/src/list.c @@ -131,7 +131,7 @@ list_remove_head(LinkedList** list) * The difference is that above function do a copying of the structure * unlike the below that only changes where list points. * This makes the above function twice slower, because it copies the - * whole structure, which contains 2 pointers. -Dan + * whole structure, which contains 2 pointers. -Dan. * * I don't know. I just copied this file from the gcc distribution * (I liked the API). One could think that the above function would diff --git a/src/main.c b/src/main.c index 2f87f072..098be86e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -96,7 +96,7 @@ Atom _XA_WM_CLIENT_LEADER; Atom _XA_WM_COLORMAP_WINDOWS; Atom _XA_GNUSTEP_WM_ATTR; -Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; +Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; Atom _XA_GNUSTEP_WM_RESIZEBAR; #ifdef MWM_HINTS @@ -114,6 +114,14 @@ Atom _XA_WINDOWMAKER_WM_FUNCTION; Atom _XA_DND_PROTOCOL; Atom _XA_DND_SELECTION; #endif +#ifdef XDE_DND +Atom _XA_XDE_REQUEST; +Atom _XA_XDE_ENTER; +Atom _XA_XDE_LEAVE; +Atom _XA_XDE_DATA_AVAILABLE; +Atom _XDE_FILETYPE; +Atom _XDE_URLTYPE; +#endif /* cursors */ @@ -125,13 +133,13 @@ Time LastTimestamp; Time LastFocusChange; #ifdef SHAPE -int ShapeEventBase; +Bool wShapeSupported; +int wShapeEventBase; #endif /* special flags */ -char WRestartASAP = 0; -char WExitASAP = 0; +char WProgramState = WSTATE_NORMAL; char WDelayedActionSet = 0; /* temporary stuff */ @@ -174,6 +182,7 @@ Restart(char *manager) /* fallback */ execv(Arguments[0], Arguments); } + wsyserror(_("could not exec window manager")); wfatal(_("Restart failed!!!")); exit(-1); } @@ -186,16 +195,19 @@ SetupEnvironment(WScreen *scr) char *tmp, *ptr; char buf[16]; - if (wScreenCount == 1) - return; - - tmp = wmalloc(strlen(DisplayName)+64); - sprintf(tmp, "DISPLAY=%s", XDisplayName(DisplayName)); - ptr = strchr(strchr(DisplayName, ':'), '.'); - if (ptr) - *ptr = 0; - sprintf(buf, ".%i", scr->screen); - strcat(tmp, buf); + if (wScreenCount > 1) { + tmp = wmalloc(strlen(DisplayName)+64); + sprintf(tmp, "DISPLAY=%s", XDisplayName(DisplayName)); + ptr = strchr(strchr(tmp, ':'), '.'); + if (ptr) + *ptr = 0; + sprintf(buf, ".%i", scr->screen); + strcat(tmp, buf); + putenv(tmp); + } + tmp = wmalloc(60); + sprintf(tmp, "WRASTER_COLOR_RESOLUTION%i=%i", scr->screen, + scr->rcontext->attribs->colors_per_channel); putenv(tmp); } @@ -253,8 +265,9 @@ check_defaults() path = wdefaultspathfordomain(""); if (access(path, R_OK)!=0) { - wfatal(_("could not find user GNUstep directory.\n" - "Make sure you have installed WindowMaker correctly and run wmaker.inst")); + wfatal(_("could not find user GNUstep directory (%s).\n" + "Make sure you have installed Window Maker correctly and run wmaker.inst"), + path); exit(1); } @@ -342,7 +355,7 @@ main(int argc, char **argv) } else if (strcmp(argv[i], "-noclip")==0) { wPreferences.flags.noclip=1; } else if (strcmp(argv[i], "-version")==0) { - printf("WindowMaker %s\n", VERSION); + printf("Window Maker %s\n", VERSION); exit(0); } else if (strcmp(argv[i], "-global_defaults_path")==0) { printf("%s/Defaults/WindowMaker", PKGDATADIR); @@ -367,7 +380,7 @@ main(int argc, char **argv) wwarning(_("too few arguments for %s"), argv[i-1]); exit(0); } - if (sscanf(argv[i], "%d", &wVisualID)!=1) { + if (sscanf(argv[i], "%i", &wVisualID)!=1) { wwarning(_("bad value for visualid: \"%s\""), argv[i]); exit(0); } @@ -415,6 +428,16 @@ main(int argc, char **argv) wwarning(_("cannot set locale modifiers")); } #endif + + if (Locale) { + char *ptr; + + Locale = wstrdup(Locale); + ptr = strchr(Locale, '.'); + if (ptr) + *ptr = 0; + } + /* open display */ dpy = XOpenDisplay(DisplayName); diff --git a/src/menu.c b/src/menu.c index 13087afa..69e22151 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,6 +1,6 @@ /* menu.c- generic menu, used for root menu, application menus etc. * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -51,8 +51,8 @@ extern WPreferences wPreferences; #define MOD_MASK wPreferences.modifier_mask -#define MENU_SCROLL_STEP menuScrollParameters[wPreferences.menu_scroll_speed].steps -#define MENU_SCROLL_DELAY menuScrollParameters[wPreferences.menu_scroll_speed].delay +#define MENU_SCROLL_STEP menuScrollParameters[(int)wPreferences.menu_scroll_speed].steps +#define MENU_SCROLL_DELAY menuScrollParameters[(int)wPreferences.menu_scroll_speed].delay @@ -858,7 +858,8 @@ keyboardMenu(WMenu *menu) while (!done) { XAllowEvents(dpy, AsyncKeyboard, CurrentTime); WMMaskEvent(dpy, ExposureMask|ButtonMotionMask|ButtonPressMask - |ButtonReleaseMask|KeyPressMask|KeyReleaseMask, &event); + |ButtonReleaseMask|KeyPressMask|KeyReleaseMask + |SubstructureNotifyMask, &event); switch (event.type) { case KeyPress: @@ -1750,7 +1751,7 @@ menuExpose(WObjDescriptor *desc, XEvent *event) typedef struct { int *delayed_select; WMenu *menu; - WMagicNumber magic; + WMHandlerID magic; } delay_data; @@ -1853,7 +1854,7 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) } while (!done) { - int x, y; + int x, y; WMMaskEvent(dpy, ExposureMask|ButtonMotionMask|ButtonReleaseMask |ButtonPressMask, &ev); switch (ev.type) { diff --git a/src/menu.h b/src/menu.h index b4943f04..d407d253 100644 --- a/src/menu.h +++ b/src/menu.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -97,6 +97,7 @@ typedef struct WMenu { unsigned int brother:1; /* if this is a copy of the menu*/ unsigned int editing:1; + unsigned int jump_back_pending:1; } flags; } WMenu; diff --git a/src/misc.c b/src/misc.c index d7bfeff0..03158bba 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -411,8 +412,10 @@ eatExpose() void SlideWindow(Window win, int from_x, int from_y, int to_x, int to_y) { + time_t time0 = time(NULL); float dx, dy, x=from_x, y=from_y, sx, sy, px, py; int dx_is_bigger=0; + /* animation parameters */ static struct { int delay; @@ -437,18 +440,18 @@ SlideWindow(Window win, int from_x, int from_y, int to_x, int to_y) } if (dx_is_bigger) { - px = dx / apars[wPreferences.icon_slide_speed].slowdown; - if (px < apars[wPreferences.icon_slide_speed].steps && px > 0) - px = apars[wPreferences.icon_slide_speed].steps; - else if (px > -apars[wPreferences.icon_slide_speed].steps && px < 0) - px = -apars[wPreferences.icon_slide_speed].steps; + px = dx / apars[(int)wPreferences.icon_slide_speed].slowdown; + if (px < apars[(int)wPreferences.icon_slide_speed].steps && px > 0) + px = apars[(int)wPreferences.icon_slide_speed].steps; + else if (px > -apars[(int)wPreferences.icon_slide_speed].steps && px < 0) + px = -apars[(int)wPreferences.icon_slide_speed].steps; py = (sx == 0 ? 0 : px*dy/dx); } else { - py = dy / apars[wPreferences.icon_slide_speed].slowdown; - if (py < apars[wPreferences.icon_slide_speed].steps && py > 0) - py = apars[wPreferences.icon_slide_speed].steps; - else if (py > -apars[wPreferences.icon_slide_speed].steps && py < 0) - py = -apars[wPreferences.icon_slide_speed].steps; + py = dy / apars[(int)wPreferences.icon_slide_speed].slowdown; + if (py < apars[(int)wPreferences.icon_slide_speed].steps && py > 0) + py = apars[(int)wPreferences.icon_slide_speed].steps; + else if (py > -apars[(int)wPreferences.icon_slide_speed].steps && py < 0) + py = -apars[(int)wPreferences.icon_slide_speed].steps; px = (sy == 0 ? 0 : py*dx/dy); } @@ -461,26 +464,28 @@ SlideWindow(Window win, int from_x, int from_y, int to_x, int to_y) y = (float)to_y; if (dx_is_bigger) { - px = px * (1.0 - 1/(float)apars[wPreferences.icon_slide_speed].slowdown); - if (px < apars[wPreferences.icon_slide_speed].steps && px > 0) - px = apars[wPreferences.icon_slide_speed].steps; - else if (px > -apars[wPreferences.icon_slide_speed].steps && px < 0) - px = -apars[wPreferences.icon_slide_speed].steps; + px = px * (1.0 - 1/(float)apars[(int)wPreferences.icon_slide_speed].slowdown); + if (px < apars[(int)wPreferences.icon_slide_speed].steps && px > 0) + px = apars[(int)wPreferences.icon_slide_speed].steps; + else if (px > -apars[(int)wPreferences.icon_slide_speed].steps && px < 0) + px = -apars[(int)wPreferences.icon_slide_speed].steps; py = (sx == 0 ? 0 : px*dy/dx); } else { - py = py * (1.0 - 1/(float)apars[wPreferences.icon_slide_speed].slowdown); - if (py < apars[wPreferences.icon_slide_speed].steps && py > 0) - py = apars[wPreferences.icon_slide_speed].steps; - else if (py > -apars[wPreferences.icon_slide_speed].steps && py < 0) - py = -apars[wPreferences.icon_slide_speed].steps; + py = py * (1.0 - 1/(float)apars[(int)wPreferences.icon_slide_speed].slowdown); + if (py < apars[(int)wPreferences.icon_slide_speed].steps && py > 0) + py = apars[(int)wPreferences.icon_slide_speed].steps; + else if (py > -apars[(int)wPreferences.icon_slide_speed].steps && py < 0) + py = -apars[(int)wPreferences.icon_slide_speed].steps; px = (sy == 0 ? 0 : py*dx/dy); } XMoveWindow(dpy, win, (int)x, (int)y); XFlush(dpy); - if (apars[wPreferences.icon_slide_speed].delay > 0) { - wusleep(apars[wPreferences.icon_slide_speed].delay*1000L); + if (apars[(int)wPreferences.icon_slide_speed].delay > 0) { + wusleep(apars[(int)wPreferences.icon_slide_speed].delay*1000L); } + if (time(NULL) - time0 > MAX_ANIMATION_TIME) + break; } XMoveWindow(dpy, win, to_x, to_y); @@ -723,16 +728,25 @@ ParseCommand(char *command, char ***argv, int *argc) *argc = count; } - +#if 0 static void timeup(void *foo) { *(int*)foo=1; } - +#endif static char* getselection(WScreen *scr) { + char *tmp; + extern char *W_GetTextSelection(); /* in WINGs */ + + tmp = W_GetTextSelection(scr->wmscreen, XA_PRIMARY); + if (!tmp) + tmp = W_GetTextSelection(scr->wmscreen, XA_CUT_BUFFER0); + return tmp; + +#if 0 XEvent event; int timeover=0; WMHandlerID *id; @@ -758,6 +772,7 @@ getselection(WScreen *scr) } wwarning(_("selection timed-out")); return NULL; +#endif } @@ -806,6 +821,11 @@ get_dnd_selection(WScreen *scr) char *flat_string; int count; +#ifdef XDE_DND + if(scr->xdestring) { + return (wstrdup(scr->xdestring)); + } +#endif result=XGetTextProperty(dpy, scr->root_win, &text_ret, _XA_DND_SELECTION); if (result==0 || text_ret.value==NULL || text_ret.encoding==None @@ -947,6 +967,10 @@ ExpandOptions(WScreen *scr, char *cmdline) out = nout; strcat(out,user_input); optr+=slen; + } else { + /* Not an error, but user has Canceled the dialog box. + * This will make the command to not be performed. */ + goto error; } break; @@ -974,13 +998,10 @@ ExpandOptions(WScreen *scr, char *cmdline) case 's': if (!selection) { - if (!XGetSelectionOwner(dpy, XA_PRIMARY)) { - wwarning(_("selection not available")); - goto error; - } selection = getselection(scr); } if (!selection) { + wwarning(_("selection not available")); goto error; } slen = strlen(selection); @@ -1157,7 +1178,7 @@ GetShortcutString(char *text) buffer = wstrappend(buffer, "^"); } buffer = wstrappend(buffer, text); - + /* get key */ /* ksym = XStringToKeysym(text); tmp = keysymToString(ksym, modmask); diff --git a/src/motif.h b/src/motif.h index d83e8332..9fba97b7 100644 --- a/src/motif.h +++ b/src/motif.h @@ -1,7 +1,7 @@ /* motif.h-- stuff for support for mwm hints * ripped from E.h (enlightenment) * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/moveres.c b/src/moveres.c index 3924e1df..ed055b5e 100644 --- a/src/moveres.c +++ b/src/moveres.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -70,10 +70,10 @@ wGetGeometryWindowSize(WScreen *scr, unsigned int *width, { #ifdef I18N_MB *width = XmbTextEscapement(scr->info_text_font->font, "-8888 x -8888", 13); - *height = (3 * scr->info_text_font->height) / 2; + *height = (7 * scr->info_text_font->height) / 4 - 1; #else *width = XTextWidth(scr->info_text_font->font, "-8888 x -8888", 13); - *height = (3 * scr->info_text_font->font->ascent) / 2; + *height = (7 * scr->info_text_font->font->ascent) / 4 - 1; #endif } @@ -132,7 +132,9 @@ showPosition(WWindow *wwin, int x, int y) scr->scr_height); #endif } else { - XClearWindow(dpy, scr->geometry_display); + XClearArea(dpy, scr->geometry_display, 1, 1, + scr->geometry_display_width-2, scr->geometry_display_height-2, + False); sprintf(num, "%+i %-+i", x, y); fw = wTextWidth(scr->info_text_font->font, num, strlen(num)); @@ -143,6 +145,9 @@ showPosition(WWindow *wwin, int x, int y) (scr->geometry_display_width - 2 - fw) / 2, (scr->geometry_display_height-fh)/2 + scr->info_text_font->y, num, strlen(num)); + wDrawBevel(scr->geometry_display, scr->geometry_display_width+1, + scr->geometry_display_height+1, scr->resizebar_texture[0], + WREL_RAISED); } } @@ -326,7 +331,9 @@ showGeometry(WWindow *wwin, int x1, int y1, int x2, int y2, int direction) wDrawString(root, scr->info_text_font, gc, mx - fw/2 + 1, y - s + fh/2 + 1, num, strlen(num)); } else { - XClearWindow(dpy, scr->geometry_display); + XClearArea(dpy, scr->geometry_display, 1, 1, + scr->geometry_display_width-2, scr->geometry_display_height-2, + False); sprintf(num, "%i x %-i", (x2 - x1 - wwin->normal_hints->base_width) / wwin->normal_hints->width_inc, (by - ty - wwin->normal_hints->base_height) @@ -342,6 +349,9 @@ showGeometry(WWindow *wwin, int x1, int y1, int x2, int y2, int direction) (scr->geometry_display_width-fw)/2, (scr->geometry_display_height-fh)/2 +scr->info_text_font->y, num, strlen(num)); + wDrawBevel(scr->geometry_display, scr->geometry_display_width+1, + scr->geometry_display_height+1, scr->resizebar_texture[0], + WREL_RAISED); } } diff --git a/src/pixmap.c b/src/pixmap.c index 03dfb501..c97d7fb1 100644 --- a/src/pixmap.c +++ b/src/pixmap.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -110,7 +110,7 @@ wPixmapCreateFromXBMData(WScreen *scr, char *data, char *mask, } - +#ifdef unused WPixmap* wPixmapCreateFromBitmap(WScreen *scr, Pixmap bitmap, Pixmap mask, unsigned long fg, unsigned long bg) @@ -169,7 +169,7 @@ wPixmapCreateFromBitmap(WScreen *scr, Pixmap bitmap, Pixmap mask, pix->depth = scr->w_depth; return pix; } - +#endif /* unused */ WPixmap* wPixmapCreate(WScreen *scr, Pixmap image, Pixmap mask) diff --git a/src/pixmap.h b/src/pixmap.h index 3cb6f400..7810989d 100644 --- a/src/pixmap.h +++ b/src/pixmap.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -42,12 +42,6 @@ WPixmap *wPixmapCreateFromXPMData(WScreen *scr, char **data); WPixmap *wPixmapCreateFromXBMData(WScreen *scr, char *data, char *mask, int width, int height, unsigned long fg, unsigned long bg); - -WPixmap *wPixmapLoadXBMFile(WScreen *scr, char *path, char *mask_path); - -WPixmap *wPixmapCreateFromBitmap(WScreen *scr, Pixmap bitmap, Pixmap mask, - unsigned long fg, unsigned long bg); - void wPixmapDestroy(WPixmap *pix); #endif diff --git a/src/placement.c b/src/placement.c index 13eaa4ab..78deb491 100644 --- a/src/placement.c +++ b/src/placement.c @@ -1,6 +1,6 @@ /* placement.c - window and icon placement on screen * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -325,13 +325,13 @@ smartPlaceWindow(WWindow *wwin, int *x_ret, int *y_ret) int extra_height; if (wwin->frame) - extra_height = wwin->frame->top_width + wwin->frame->bottom_width; + extra_height = wwin->frame->top_width + wwin->frame->bottom_width + 2; else extra_height = 24; /* random value */ swidth = scr->scr_width; sx = X_ORIGIN; - if (scr->dock && wPreferences.no_window_under_dock) { + if (scr->dock && !scr->dock->lowered) { if (scr->dock->on_right_side) swidth -= wPreferences.icon_size + DOCK_EXTRA_SPACE; else if (X_ORIGIN < wPreferences.icon_size + DOCK_EXTRA_SPACE) @@ -459,7 +459,7 @@ PlaceWindow(WWindow *wwin, int *x_ret, int *y_ret) if (wPreferences.window_placement == WPM_CASCADE) scr->cascade_index++; - if (scr->dock && wPreferences.no_window_under_dock) { + if (scr->dock && !scr->dock->lowered) { int x2; x2 = *x_ret + wwin->client.width; @@ -484,7 +484,7 @@ PlaceWindow(WWindow *wwin, int *x_ret, int *y_ret) if (h<1) h = 1; *x_ret = rand()%w; *y_ret = rand()%h; - if (scr->dock && wPreferences.no_window_under_dock) { + if (scr->dock && !scr->dock->lowered) { int x2; x2 = *x_ret + wwin->client.width; diff --git a/src/properties.c b/src/properties.c index b68f1d62..42fa2d63 100644 --- a/src/properties.c +++ b/src/properties.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -45,7 +45,7 @@ extern Atom _XA_WM_DELETE_WINDOW; extern Atom _XA_WM_SAVE_YOURSELF; extern Atom _XA_GNUSTEP_WM_ATTR; -extern Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; extern Atom _XA_WINDOWMAKER_WM_FUNCTION; extern Atom _XA_WINDOWMAKER_MENU; @@ -106,7 +106,7 @@ PropGetProtocols(Window window, WProtocols *prots) prots->DELETE_WINDOW=1; else if (protocols[i]==_XA_WM_SAVE_YOURSELF) prots->SAVE_YOURSELF=1; - else if (protocols[i]==_XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW) + else if (protocols[i]==_XA_GNUSTEP_WM_MINIATURIZE_WINDOW) prots->MINIATURIZE_WINDOW=1; } XFree(protocols); @@ -121,12 +121,11 @@ PropGetGNUstepWMAttr(Window window, GNUstepWMAttributes **attr) unsigned long nitems_ret; unsigned long bytes_after_ret; CARD32 *data; - - if (XGetWindowProperty(dpy, window, _XA_GNUSTEP_WM_ATTR, 0, - sizeof(GNUstepWMAttributes), + + if (XGetWindowProperty(dpy, window, _XA_GNUSTEP_WM_ATTR, 0, 9, False, _XA_GNUSTEP_WM_ATTR, &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, - (unsigned char **)&data)!=Success) + (unsigned char **)&data)!=Success || !data) return False; if (type_ret!=_XA_GNUSTEP_WM_ATTR || !data || fmt_ret!=32) return False; @@ -162,12 +161,32 @@ PropGetMotifWMHints(Window window, MWMHints **mwmhints) int fmt_ret; unsigned long nitems_ret; unsigned long bytes_after_ret; + CARD32 *data; - if (XGetWindowProperty(dpy, window, _XA_MOTIF_WM_HINTS, 0, 20, + if (XGetWindowProperty(dpy, window, _XA_MOTIF_WM_HINTS, 0, + PROP_MWM_HINTS_ELEMENTS, False, _XA_MOTIF_WM_HINTS, &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, - (unsigned char **)mwmhints)!=Success) + (unsigned char **)&data)!=Success) return 0; + + if (type_ret!=_XA_MOTIF_WM_HINTS || fmt_ret!=32 + || nitems_ret!=PROP_MWM_HINTS_ELEMENTS || !data) + return 0; + + *mwmhints = malloc(sizeof(MWMHints)); + if (!*mwmhints) { + XFree(data); + return 0; + } + + (*mwmhints)->flags = data[0]; + (*mwmhints)->functions = data[1]; + (*mwmhints)->decorations = data[2]; + (*mwmhints)->inputMode = data[3]; + + XFree(data); + if (type_ret==_XA_MOTIF_WM_HINTS) return 1; else @@ -199,8 +218,8 @@ PropGetClientLeader(Window window, Window *leader) unsigned long bytes_after_ret; Window *win; - if (XGetWindowProperty(dpy, window, _XA_WM_CLIENT_LEADER, 0, - sizeof(Window), False, AnyPropertyType, + if (XGetWindowProperty(dpy, window, _XA_WM_CLIENT_LEADER, 0, 4, + False, AnyPropertyType, &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, (unsigned char**)&win)!=Success) return 0; diff --git a/src/properties.h b/src/properties.h index 368c18a4..26867fc8 100644 --- a/src/properties.h +++ b/src/properties.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/proplist.c b/src/proplist.c index a9368e9d..a1b7e11f 100644 --- a/src/proplist.c +++ b/src/proplist.c @@ -4,7 +4,7 @@ * property lists with errors, but will print more descriptive error messages * and will hopefully not crash. * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1998 Alfredo K. Kojima * @@ -110,7 +110,7 @@ unescapestr(char *src) ch = *(++src_ptr); if((ch>='0') && (ch<='3')) /* assume next 2 chars are octal too */ { - *dest_ptr = ((ch & 07) << 3); + *dest_ptr = ((ch & 07) << 6); *dest_ptr |= ((*(++src_ptr)&07)<<3); *dest_ptr |= *(++src_ptr)&07; } diff --git a/src/resources.c b/src/resources.c index 9859ea1e..fae1618e 100644 --- a/src/resources.c +++ b/src/resources.c @@ -1,6 +1,6 @@ /* resources.c - manage X resources (fonts, colors etc) * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/resources.h b/src/resources.h index 7e0c0356..a490406a 100644 --- a/src/resources.h +++ b/src/resources.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/rootmenu.c b/src/rootmenu.c index b01bb51b..d2aecdd4 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -1,6 +1,6 @@ /* rootmenu.c- user defined menu * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -151,29 +151,16 @@ static void execCommand(WMenu *menu, WMenuEntry *entry) { char *cmdline; -#if 0 - char *path, *chr; -#endif - cmdline = ExpandOptions(menu->frame->screen_ptr, (char*)entry->clientdata); -#if 0 - path = wstrdup(cmdline); - chr = strchr(path, ' '); - if (chr) - *chr = 0; + static char *shell = NULL; - if (access(path, X_OK)!=0) { - path = realloc(path, strlen(cmdline)+128); - sprintf(path, _("Program \"%s\" not found or cannot be executed."), - cmdline); - wMessageDialog(menu->frame->screen_ptr, _("Error"), path, - _("OK"), NULL, NULL); - free(path); - free(cmdline); - return; + if (!shell) { + shell = getenv("SHELL"); + if (!shell) + shell = "/bin/sh"; } - - free(path); -#endif + + cmdline = ExpandOptions(menu->frame->screen_ptr, (char*)entry->clientdata); + XGrabPointer(dpy, menu->frame->screen_ptr->root_win, True, 0, GrabModeAsync, GrabModeAsync, None, wCursor[WCUR_WAIT], CurrentTime); @@ -184,7 +171,7 @@ execCommand(WMenu *menu, WMenuEntry *entry) * correctly '~/' expansion and '>' redirection. * While we can do '~/' expansion ourselves, we can do nothing about * '>' redirection. - * So we better let /bin/sh to do that for us. -Dan + * So we better let /bin/sh to do that for us. Dan. * Ok. -Alfredo */ if (fork()==0) { @@ -193,7 +180,8 @@ execCommand(WMenu *menu, WMenuEntry *entry) #ifdef HAVE_SETPGID setpgid(0, 0); #endif - execl("/bin/sh", "/bin/sh", "-c", cmdline, NULL); + execl(shell, shell, "-c", cmdline, NULL); + wsyserror("could not exec %s -c %s\n", shell, cmdline); exit(-1); } free(cmdline); @@ -206,8 +194,13 @@ execCommand(WMenu *menu, WMenuEntry *entry) static void exitCommand(WMenu *menu, WMenuEntry *entry) { + static int inside = 0; + /* prevent reentrant calls */ - wMenuSetEnabled(menu, entry->order, False); + if (inside) + return; + inside = 1; + if ((int)entry->clientdata==M_QUICK || wMessageDialog(menu->frame->screen_ptr, _("Exit"), _("Exit window manager?"), @@ -223,15 +216,20 @@ exitCommand(WMenu *menu, WMenuEntry *entry) ExecExitScript(); exit(0); } - wMenuSetEnabled(menu, entry->order, True); + inside = 0; } static void shutdownCommand(WMenu *menu, WMenuEntry *entry) { + static int inside = 0; + /* prevent reentrant calls */ - wMenuSetEnabled(menu, entry->order, False); + if (inside) + return; + inside = 1; + if ((int)entry->clientdata==M_QUICK || wMessageDialog(menu->frame->screen_ptr, _("Close X session"), _("Close Window System session?\n(all applications will be closed)"), @@ -245,7 +243,7 @@ shutdownCommand(WMenu *menu, WMenuEntry *entry) ExecExitScript(); exit(0); } - wMenuSetEnabled(menu, entry->order, True); + inside = 0; } diff --git a/src/screen.c b/src/screen.c index 9f3ab87b..098dfdd6 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,6 +1,6 @@ /* screen.c - screen management * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -402,7 +402,7 @@ createPixmaps(WScreen *scr) wwarning(_("could not load logo image for panels")); } else { if (!RConvertImageMask(scr->rcontext, image, &p, &m, 128)) { - wwarning(_("error making logo image for panel:%s"), RErrorString); + wwarning(_("error making logo image for panel:%s"), RMessageForError(RErrorCode)); } else { wmpix = WMCreatePixmapFromXPixmaps(scr->wmscreen, p, m, image->width, image->height, @@ -582,7 +582,7 @@ wScreenInit(int screen_number) scr->rcontext = RCreateContext(dpy, screen_number, &rattr); if (!scr->rcontext) { wwarning(_("could not initialize graphics library context: %s"), - RErrorString); + RMessageForError(RErrorCode)); wAbort(False); } else { char **formats; @@ -713,6 +713,7 @@ wScreenSaveState(WScreen *scr) WWindow *wwin; char *str; proplist_t path, old_state, foo; + CARD32 data[2]; make_keys(); @@ -722,11 +723,12 @@ wScreenSaveState(WScreen *scr) */ wstate.workspace = scr->current_workspace; + data[0] = wstate.flags; + data[1] = wstate.workspace; XChangeProperty(dpy, scr->root_win, _XA_WINDOWMAKER_STATE, _XA_WINDOWMAKER_STATE, 32, PropModeReplace, - (unsigned char *) &wstate, - sizeof(WWorkspaceState)/sizeof(int)); + (unsigned char *) data, 2); /* save state of windows */ wwin = scr->focused_window; diff --git a/src/screen.h b/src/screen.h index 0f18df46..1d896f21 100644 --- a/src/screen.h +++ b/src/screen.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -26,8 +26,13 @@ #include "WindowMaker.h" #include +#ifdef XDE_DND +#include +#endif + #include + typedef struct WFont { #ifndef I18N_MB XFontStruct *font; @@ -238,6 +243,10 @@ typedef struct _WScreen { Window autoRaiseWindow; /* window that is scheduled to be * raised */ +#ifdef XDE_DND + char *xdestring; +#endif + struct { unsigned int startup:1; /* during window manager startup */ unsigned int regenerate_icon_textures:1; @@ -256,6 +265,7 @@ typedef struct _WScreen { #define WSS_SWITCHMENU (1<<1) #define WSS_WSMENU (1<<2) +/* changes must update wSaveScreenState/getWorkspaceState */ typedef struct WWorkspaceState { int flags; int workspace; diff --git a/src/session.c b/src/session.c index 3857b95c..280d942e 100644 --- a/src/session.c +++ b/src/session.c @@ -2,7 +2,7 @@ * * Copyright (c) 1998 Dan Pascu * - * WindowMaker window manager + * Window Maker window manager * * 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 @@ -452,7 +452,7 @@ wSessionRestoreState(WScreen *scr) if (found) { wDockLaunchWithState(dock, btn, state); } else if ((pid = execCommand(scr, command, host)) > 0) { - wAddWindowSavedState(instance, class, command, pid, state); + wWindowAddSavedState(instance, class, command, pid, state); } else { free(state); } diff --git a/src/session.h b/src/session.h index 0c634ee1..55aaaf0b 100644 --- a/src/session.h +++ b/src/session.h @@ -2,7 +2,7 @@ * * Copyright (c) 1998 Dan Pascu * - * WindowMaker window manager + * Window Maker window manager * * 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 diff --git a/src/shutdown.c b/src/shutdown.c index 335208c5..f512914d 100644 --- a/src/shutdown.c +++ b/src/shutdown.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -111,9 +111,9 @@ WipeDesktop(WScreen *scr) wwin = scr->focused_window; while (wwin) { if (wwin->protocols.DELETE_WINDOW) - wClientSendProtocol(wwin, _XA_WM_DELETE_WINDOW, LastTimestamp); + wClientSendProtocol(wwin, _XA_WM_DELETE_WINDOW, LastTimestamp); else - wClientKill(wwin); + wClientKill(wwin); wwin = wwin->prev; } XSync(dpy, False); diff --git a/src/stacking.c b/src/stacking.c index 902caec3..1c322a2b 100644 --- a/src/stacking.c +++ b/src/stacking.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -111,7 +111,7 @@ RemakeStackList(WScreen *scr) scr->window_level_count[level]++; } XFree(windows); -#ifdef DEBUG0 +#ifdef DEBUG if (c!=scr->window_count) { puts("Found different number of windows than in window lists!!!"); } @@ -153,7 +153,7 @@ CommitStacking(WScreen *scr) for (level=MAX_WINDOW_LEVELS-1; level>=0; level--) { tmp = scr->stacking_list[level]; while (tmp) { -#ifndef DEBUG +#ifdef DEBUG if (i>=nwindows) { puts("Internal inconsistency! window_count is incorrect!!!"); printf("window_count says %i windows\n", nwindows); diff --git a/src/stacking.h b/src/stacking.h index 67835e54..2c05a884 100644 --- a/src/stacking.h +++ b/src/stacking.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/startup.c b/src/startup.c index 5129ea76..fd0280d2 100644 --- a/src/startup.c +++ b/src/startup.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -36,6 +36,9 @@ #include #include #include +#ifdef SHAPE +#include +#endif #include "WindowMaker.h" #include "GNUstep.h" @@ -80,6 +83,11 @@ extern WShortKey wKeyBindings[WKBD_LAST]; extern int wScreenCount; +#ifdef SHAPE +extern Bool wShapeSupported; +extern int wShapeEventBase; +#endif + /* contexts */ extern XContext wWinContext; extern XContext wAppWinContext; @@ -102,20 +110,27 @@ extern Atom _XA_WINDOWMAKER_WM_PROTOCOLS; extern Atom _XA_WINDOWMAKER_STATE; extern Atom _XA_WINDOWMAKER_WM_FUNCTION; -extern Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; -extern Atom _XA_GNUSTEP_WM_RESIZEBAR; +extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; #ifdef OFFIX_DND extern Atom _XA_DND_PROTOCOL; extern Atom _XA_DND_SELECTION; #endif +#ifdef XDE_DND +extern Atom _XA_XDE_REQUEST; +extern Atom _XA_XDE_ENTER; +extern Atom _XA_XDE_LEAVE; +extern Atom _XA_XDE_DATA_AVAILABLE; +extern Atom _XDE_FILETYPE; +extern Atom _XDE_URLTYPE; +#endif + /* cursors */ extern Cursor wCursor[WCUR_LAST]; /* special flags */ -extern char WRestartASAP; -extern char WExitASAP; +extern char WProgramState; extern char WDelayedActionSet; /***** Local *****/ @@ -160,6 +175,7 @@ catchXError(Display *dpy, XErrorEvent *error) */ || (error->request_code == X_InstallColormap))) { #ifndef DEBUG + return 0; #else printf("got X error %x %x %x\n", error->request_code, @@ -167,7 +183,7 @@ catchXError(Display *dpy, XErrorEvent *error) return 0; #endif } - FormatXError(dpy, error, buffer, MAXLINE); + FormatXError(dpy, error, buffer, MAXLINE); wwarning(_("internal X error: %s\n"), buffer); return -1; } @@ -217,6 +233,7 @@ static RETSIGTYPE handleSig(int sig) { static int already_crashed = 0; + int dumpcore = 0; #ifndef NO_EMERGENCY_AUTORESTART char *argv[2]; @@ -225,8 +242,8 @@ handleSig(int sig) /* * No functions that potentially do Xlib calls should be called from - * here. Xlib calls are not atomic so, so the logical integrity of - * Xlib is not guaranteed if a Xlib call is made from a signal handler. + * here. Xlib calls are not reentrant so the integrity of Xlib is + * not guaranteed if a Xlib call is made from a signal handler. */ if (sig == SIGHUP) { #ifdef SYS_SIGLIST_DECLARED @@ -235,7 +252,8 @@ handleSig(int sig) wwarning(_("got signal %i - restarting\n"), sig); #endif - WRestartASAP = 1; + WProgramState = WSTATE_NEED_RESTART; + /* setup idle handler, so that this will be handled when * the select() is returned becaused of the signal, even if * there are no X events in the queue */ @@ -244,10 +262,11 @@ handleSig(int sig) WMAddIdleHandler(delayedAction, NULL); } return; - } else if (sig==SIGTERM) { + } else if (sig == SIGTERM) { printf(_("%s: Received signal SIGTERM. Exiting..."), ProgName); - - WExitASAP = 1; + + WProgramState = WSTATE_NEED_EXIT; + if (!WDelayedActionSet) { WDelayedActionSet = 1; WMAddIdleHandler(delayedAction, NULL); @@ -260,14 +279,16 @@ handleSig(int sig) #else wfatal(_("got signal %i\n"), sig); #endif - + if (sig==SIGSEGV || sig==SIGFPE || sig==SIGBUS || sig==SIGILL) { if (already_crashed) { wfatal(_("crashed while trying to do some post-crash cleanup. Aborting immediatelly.")); abort(); } already_crashed = 1; - + + dumpcore = 1; + #ifndef NO_EMERGENCY_AUTORESTART /* restart another window manager so that the X session doesn't * go to space */ @@ -276,7 +297,7 @@ handleSig(int sig) if (dpy) XCloseDisplay(dpy); dpy = NULL; - + argv[0] = FALLBACK_WINDOWMANAGER; execvp(FALLBACK_WINDOWMANAGER, argv); @@ -287,8 +308,8 @@ handleSig(int sig) execvp("twm", argv); #endif /* !NO_EMERGENCY_AUTORESTART */ } - - wAbort(sig==SIGSEGV); + + wAbort(dumpcore); } @@ -328,14 +349,22 @@ getWorkspaceState(Window root, WWorkspaceState **state) int fmt_ret; unsigned long nitems_ret; unsigned long bytes_after_ret; + CARD32 *data; - if (XGetWindowProperty(dpy, root, _XA_WINDOWMAKER_STATE, 0, - sizeof(WWorkspaceState), + if (XGetWindowProperty(dpy, root, _XA_WINDOWMAKER_STATE, 0, 2, True, _XA_WINDOWMAKER_STATE, &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, - (unsigned char **)state)!=Success) + (unsigned char **)&data)!=Success || !data) return 0; - if (type_ret==_XA_WINDOWMAKER_STATE) + + *state = malloc(sizeof(WWorkspaceState)); + if (*state) { + (*state)->flags = data[0]; + (*state)->workspace = data[1]; + } + XFree(data); + + if (*state && type_ret==_XA_WINDOWMAKER_STATE) return 1; else return 0; @@ -410,7 +439,7 @@ wHackedGrabKey(int keycode, unsigned int modifiers, grab_window, owner_events, pointer_mode, keyboard_mode); /* phew, I guess that's all, right? */ } - +#endif void wHackedGrabButton(unsigned int button, unsigned int modifiers, @@ -418,9 +447,16 @@ wHackedGrabButton(unsigned int button, unsigned int modifiers, unsigned int event_mask, int pointer_mode, int keyboard_mode, Window confine_to, Cursor cursor) { + XGrabButton(dpy, button, modifiers, grab_window, owner_events, + event_mask, pointer_mode, keyboard_mode, confine_to, cursor); + if (modifiers==AnyModifier) return; + + XGrabButton(dpy, button, modifiers|LockMask, grab_window, owner_events, + event_mask, pointer_mode, keyboard_mode, confine_to, cursor); +#ifdef NUMLOCK_HACK /* same as above, but for mouse buttons */ if (_NumLockMask) XGrabButton(dpy, button, modifiers|_NumLockMask, @@ -446,9 +482,10 @@ wHackedGrabButton(unsigned int button, unsigned int modifiers, XGrabButton(dpy, button, modifiers|_ScrollLockMask|_NumLockMask|LockMask, grab_window, owner_events, event_mask, pointer_mode, keyboard_mode, confine_to, cursor); +#endif /* NUMLOCK_HACK */ } - +#ifdef notused void wHackedUngrabButton(unsigned int button, unsigned int modifiers, Window grab_window) @@ -466,7 +503,7 @@ wHackedUngrabButton(unsigned int button, unsigned int modifiers, XUngrabButton(dpy, button, modifiers|_NumLockMask|_ScrollLockMask|LockMask, grab_window); } -#endif /* NUMLOCK_HACK */ +#endif @@ -505,7 +542,10 @@ WScreen* wScreenForWindow(Window window) { XWindowAttributes attr; - + + if (wScreenCount==1) + return wScreen[0]; + if (XGetWindowAttributes(dpy, window, &attr)) { return wScreenForRootWindow(attr.root); } @@ -568,12 +608,9 @@ StartUp(Bool defaultScreenOnly) _XA_WINDOWMAKER_WM_PROTOCOLS = XInternAtom(dpy, "_WINDOWMAKER_WM_PROTOCOLS", False); - _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW = - XInternAtom(dpy, WINDOWMAKER_WM_MINIATURIZE_WINDOW, False); + _XA_GNUSTEP_WM_MINIATURIZE_WINDOW = + XInternAtom(dpy, GNUSTEP_WM_MINIATURIZE_WINDOW, False); - _XA_GNUSTEP_WM_RESIZEBAR = - XInternAtom(dpy, GNUSTEP_WM_RESIZEBAR, False); - _XA_WINDOWMAKER_WM_FUNCTION = XInternAtom(dpy, "_WINDOWMAKER_WM_FUNCTION", False); @@ -582,6 +619,15 @@ StartUp(Bool defaultScreenOnly) _XA_DND_SELECTION = XInternAtom(dpy, "DndSelection", False); _XA_DND_PROTOCOL = XInternAtom(dpy, "DndProtocol", False); #endif +#ifdef XDE_DND + _XA_XDE_ENTER = XInternAtom(dpy, "_XDE_ENTER", False); + _XA_XDE_REQUEST = XInternAtom(dpy, "_XDE_REQUEST", False); + _XA_XDE_LEAVE = XInternAtom(dpy, "_XDE_LEAVE", False); + _XA_XDE_DATA_AVAILABLE = XInternAtom(dpy, "_XDE_DATA_AVAILABLE", False); + _XDE_FILETYPE = XInternAtom(dpy, "file:ALL", False); + _XDE_URLTYPE = XInternAtom(dpy, "url:ALL", False); +#endif + /* cursors */ wCursor[WCUR_NORMAL] = XCreateFontCursor(dpy, XC_left_ptr); @@ -659,15 +705,18 @@ StartUp(Bool defaultScreenOnly) wwarning(_("could not read domain \"%s\" from defaults database"), "WMWindowAttributes"); } - + + XSetErrorHandler((XErrorHandler)catchXError); /* Sound init */ #ifdef WMSOUND wSoundInit(dpy); #endif - XSetErrorHandler((XErrorHandler)catchXError); - +#ifdef SHAPE + /* ignore j */ + wShapeSupported = XShapeQueryExtension(dpy, &wShapeEventBase, &j); +#endif if (defaultScreenOnly) { max = 1; @@ -675,32 +724,37 @@ StartUp(Bool defaultScreenOnly) max = ScreenCount(dpy); } wScreen = wmalloc(sizeof(WScreen*)*max); - + + wScreenCount = 0; + + /* manage the screens */ for (j = 0; j < max; j++) { if (defaultScreenOnly || max==1) { - wScreen[j] = wScreenInit(DefaultScreen(dpy)); - if (!wScreen[j]) { + wScreen[wScreenCount] = wScreenInit(DefaultScreen(dpy)); + if (!wScreen[wScreenCount]) { wfatal(_("it seems that there already is a window manager running")); exit(1); } } else { - wScreen[j] = wScreenInit(j); - if (!wScreen[j]) { + wScreen[wScreenCount] = wScreenInit(j); + if (!wScreen[wScreenCount]) { wwarning(_("could not manage screen %i"), j); continue; } } wScreenCount++; + } + /* initialize/restore state for the screens */ + for (j = 0; j < wScreenCount; j++) { /* restore workspace state */ if (!getWorkspaceState(wScreen[j]->root_win, &ws_state)) { ws_state = NULL; } wScreenRestoreState(wScreen[j]); - - /* manage all windows that were already - * here before us */ + + /* manage all windows that were already here before us */ if (!wPreferences.flags.nodock && wScreen[j]->dock) wScreen[j]->last_dock = wScreen[j]->dock; @@ -733,7 +787,7 @@ StartUp(Bool defaultScreenOnly) /* go to workspace where we were before restart */ if (ws_state) { wWorkspaceForceChange(wScreen[j], ws_state->workspace); - XFree(ws_state); + free(ws_state); } else { wSessionRestoreLastWorkspace(wScreen[j]); } @@ -772,6 +826,16 @@ getState(Window window) } +static Bool +windowInList(Window window, Window *list, int count) +{ + for (; count>=0; count--) { + if (window == list[count]) + return True; + } + return False; +} + /* *----------------------------------------------------------------------- * manageAllWindows-- @@ -865,8 +929,14 @@ manageAllWindows(WScreen *scr) (wwin->wm_hints->flags & StateHint) && state<0) state=wwin->wm_hints->initial_state; if (state==IconicState) { - wIconifyWindow(wwin); - wwin->flags.ignore_next_unmap=1; + /* iconify if it's not a transient */ + if (wwin->transient_for==None + || wwin->transient_for==wwin->client_win + || !windowInList(wwin->transient_for, + children, nchildren)) { + wIconifyWindow(wwin); + wwin->flags.ignore_next_unmap=1; + } } else { wClientSetState(wwin, NormalState, None); } diff --git a/src/superfluous.c b/src/superfluous.c index 44909460..56e72b00 100644 --- a/src/superfluous.c +++ b/src/superfluous.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -27,6 +27,8 @@ #include #include +#include + #include #include "WindowMaker.h" @@ -57,41 +59,106 @@ play(Display *dpy, int pitch, int delay) } #endif +#ifdef DEMATERIALIZE_ICON +void +DoKaboom(WScreen *scr, Window win, int x, int y) +{ + RImage *icon; + RImage *back; + RImage *image; + Pixmap pixmap; + XImage *ximage; + int i; + int w, h; + + h = w = wPreferences.icon_size; + if (x < 0 || x + w > scr->scr_width || y < 0 || y + h > scr->scr_height) + return; + + icon = RCreateImageFromDrawable(scr->rcontext, win, None); + if (!icon) + return; + + XUnmapWindow(dpy, win); + XSync(dpy, False); + + ximage = XGetImage(dpy, scr->root_win, x, y, w, h, AllPlanes, ZPixmap); + back = RCreateImageFromXImage(scr->rcontext, ximage, NULL); + XDestroyImage(ximage); + if (!back) { + RDestroyImage(icon); + return; + } + + for (i=0; ircontext, image, &pixmap); + XCopyArea(dpy, pixmap, scr->root_win, scr->copy_gc, 0, 0, w, h, x, y); + XFreePixmap(dpy, pixmap); + XFlush(dpy); + } + XClearArea(dpy, scr->root_win, x, y, w, h, False); + XFlush(dpy); + + RDestroyImage(icon); + RDestroyImage(back); +} +#else /* !DEMATERIALIZE_ICON */ void DoKaboom(WScreen *scr, Window win, int x, int y) { int i, j, k; int sw=scr->scr_width, sh=scr->scr_height; - short px[PIECES], py[PIECES]; +#define KAB_PRECISION 4 + int px[PIECES]; + short py[PIECES]; +#ifdef ICON_KABOOM_EXTRA + short ptx[2][PIECES], pty[2][PIECES]; + int ll; +#endif char pvx[PIECES], pvy[PIECES]; char ax[PIECES], ay[PIECES]; Pixmap tmp; - XImage *img; - - img=XGetImage(dpy, win, 0, 0, wPreferences.icon_size, - wPreferences.icon_size, AllPlanes, ZPixmap); - XUnmapWindow(dpy,win); - if (!img) - return; + XSetClipMask(dpy, scr->copy_gc, None); tmp = XCreatePixmap(dpy, scr->root_win, wPreferences.icon_size, wPreferences.icon_size, scr->depth); - XPutImage(dpy, tmp, scr->copy_gc, img, 0, 0, 0, 0, wPreferences.icon_size, - wPreferences.icon_size); - XDestroyImage(img); - for (i=0,k=0; iw_visual == DefaultVisual(dpy, scr->screen)) + XCopyArea(dpy, win, tmp, scr->copy_gc, 0, 0, wPreferences.icon_size, + wPreferences.icon_size, 0, 0); + else { + XImage *image; + + image = XGetImage(dpy, win, 0, 0, wPreferences.icon_size, + wPreferences.icon_size, AllPlanes, ZPixmap); + if (!image) { + XUnmapWindow(dpy, win); + return; + } + XPutImage(dpy, tmp, scr->copy_gc, image, 0, 0, 0, 0, + wPreferences.icon_size, wPreferences.icon_size); + XDestroyImage(image); + } + + for (i=0,k=0; i0) { for (i=0; i=0) { + int _px = px[i]>>KAB_PRECISION; +#ifdef ICON_KABOOM_EXTRA + XClearArea(dpy, scr->root_win, ptx[1][i], pty[1][i], + ICON_KABOOM_PIECE_SIZE, ICON_KABOOM_PIECE_SIZE, + False); + + ptx[1][i] = ptx[0][i]; + pty[1][i] = pty[0][i]; + ptx[0][i] = _px; + pty[0][i] = py[i]; +#else + XClearArea(dpy, scr->root_win, _px, py[i], + ICON_KABOOM_PIECE_SIZE, ICON_KABOOM_PIECE_SIZE, + False); +#endif px[i]+=pvx[i]; py[i]+=pvy[i]; -#ifdef SPREAD_ICON - pvx[i]+=(pvx[i]>0 ? 2 : -2); - pvy[i]+=(pvy[i]>0 ? 2 : -2); - /* The following are nice, but too slow. - * The animation can have an unknown duration, depending - * on what rand() returns. Until the animation ends, the user - * cannot do anything, which is not too good. -Dan - */ - /*pvx[i]+=rand()%5-2; - pvy[i]+=rand()%5-2;*/ - -#else + _px = px[i]>>KAB_PRECISION; pvy[i]++; -#endif - if (px[i]<-wPreferences.icon_size || px[i]>sw || py[i]>sh -#ifdef SPREAD_ICON - || px[i]<0 || py[i]<0 -#endif - ) { + if (_px<-wPreferences.icon_size || _px>sw || py[i]>=sh) { +#ifdef ICON_KABOOM_EXTRA + if (py[i]>sh && _px0) { + pvy[i] = -(pvy[i]/2); + if (abs(pvy[i]) > 3) { + py[i] = sh-ICON_KABOOM_PIECE_SIZE; + XCopyArea(dpy, tmp, scr->root_win, scr->copy_gc, + ax[i]*ICON_KABOOM_PIECE_SIZE, + ay[i]*ICON_KABOOM_PIECE_SIZE, + ICON_KABOOM_PIECE_SIZE, + ICON_KABOOM_PIECE_SIZE, + _px, py[i]); + } else { + ax[i] = -1; + } + } else { + ax[i] = -1; + } + if (ax[i]<0) { + for (ll=0; ll<2; ll++) + XClearArea(dpy, scr->root_win, ptx[ll][i], pty[ll][i], + ICON_KABOOM_PIECE_SIZE, + ICON_KABOOM_PIECE_SIZE, False); + k--; + } +#else /* !ICON_KABOOM_EXTRA */ ax[i]=-1; k--; +#endif /* !ICON_KABOOM_EXTRA */ } else { XCopyArea(dpy, tmp, scr->root_win, scr->copy_gc, - ax[i]*PSIZE, ay[i]*PSIZE, - PSIZE, PSIZE, px[i], py[i]); + ax[i]*ICON_KABOOM_PIECE_SIZE, ay[i]*ICON_KABOOM_PIECE_SIZE, + ICON_KABOOM_PIECE_SIZE, ICON_KABOOM_PIECE_SIZE, + _px, py[i]); } } } + + XFlush(dpy); #ifdef SPEAKER_SOUND play(dpy, 100+rand()%250, 12); #else -# if (MINIATURIZE_ANIMATION_DELAY_Z > 0) +# if (MINIATURIZE_ANIMATION_DELAY_Z > 0) wusleep(MINIATURIZE_ANIMATION_DELAY_Z*2); # endif #endif - for (i=0; i=0) { - XClearArea(dpy, scr->root_win, px[i], py[i], PSIZE, PSIZE, 1); - } - } } XFreePixmap(dpy, tmp); } - +#endif /* !DEMATERIALIZE_ICON */ Pixmap @@ -275,6 +368,7 @@ DoWindowBirth(WWindow *wwin) int x, y; int dw, dh; int i; + time_t time0 = time(NULL); dw = (width-w)/WINDOW_BIRTH_STEPS; dh = (height-h)/WINDOW_BIRTH_STEPS; @@ -294,8 +388,11 @@ DoWindowBirth(WWindow *wwin) h += dh; XMoveResizeWindow(dpy, wwin->frame->core->window, x, y, w, h); XFlush(dpy); + /* a timeout */ + if (time(NULL)-time0 > MAX_ANIMATION_TIME) + break; } - + XMoveResizeWindow(dpy, wwin->frame->core->window, wwin->frame_x, wwin->frame_y, width, height); XFlush(dpy); diff --git a/src/superfluous.h b/src/superfluous.h index 9030908c..831d9cde 100644 --- a/src/superfluous.h +++ b/src/superfluous.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -19,8 +19,7 @@ * USA. */ -#define PSIZE 4 -#define PIECES ((64/PSIZE)*(64/PSIZE)) +#define PIECES ((64/ICON_KABOOM_PIECE_SIZE)*(64/ICON_KABOOM_PIECE_SIZE)) diff --git a/src/switchmenu.c b/src/switchmenu.c index 2aea8965..03e65eaf 100644 --- a/src/switchmenu.c +++ b/src/switchmenu.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997 Shige Abe and * Alfredo K. Kojima diff --git a/src/texture.c b/src/texture.c index 144184ac..0c93ea0f 100644 --- a/src/texture.c +++ b/src/texture.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -271,7 +271,7 @@ wTextureMakePixmap(WScreen *scr, int style, char *pixmap_file, XColor *color) image = RLoadImage(scr->rcontext, file, 0); if (!image) { wwarning(_("could not load texture pixmap \"%s\":%s"), file, - RErrorString); + RMessageForError(RErrorCode)); free(file); return NULL; } @@ -374,7 +374,7 @@ wTextureRenderImage(WTexture *texture, int width, int height, int relief) } if (!image) { - wwarning(_("could not render texture: %s"), RErrorString); + wwarning(_("could not render texture: %s"), RMessageForError(RErrorCode)); return None; } @@ -485,11 +485,11 @@ renderTexture(WScreen *scr, int width, int height, WTexture *texture, img = wTextureRenderImage(texture, width, height, rel); if (!img) { - wwarning(_("could not render texture: %s"), RErrorString); + wwarning(_("could not render texture: %s"), RMessageForError(RErrorCode)); return None; } if (!RConvertImage(scr->rcontext, img, &pix)) { - wwarning(_("error rendering image:%s"), RErrorString); + wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } RDestroyImage(img); return pix; @@ -497,7 +497,8 @@ renderTexture(WScreen *scr, int width, int height, WTexture *texture, void -wDrawBevel(WCoreWindow *core, WTexSolid *texture, int relief) +wDrawBevel(Drawable d, unsigned width, unsigned height, + WTexSolid *texture, int relief) { GC light, dim, dark; XSegment segs[4]; @@ -514,53 +515,54 @@ wDrawBevel(WCoreWindow *core, WTexSolid *texture, int relief) case WREL_RAISED: case WREL_ICON: segs[0].x1 = 1; - segs[0].x2 = core->width - 2; - segs[0].y2 = segs[0].y1 = core->height - 2; - segs[1].x1 = core->width - 2; + segs[0].x2 = width - 2; + segs[0].y2 = segs[0].y1 = height - 2; + segs[1].x1 = width - 2; segs[1].y1 = 1; - segs[1].x2 = core->width - 2; - segs[1].y2 = core->height - 2; - XDrawSegments(dpy, core->window, dim, segs, 2); + segs[1].x2 = width - 2; + segs[1].y2 = height - 2; + XDrawSegments(dpy, d, dim, segs, 2); segs[0].x1 = 0; - segs[0].x2 = core->width - 1; - segs[0].y2 = segs[0].y1 = core->height - 1; - segs[1].x1 = segs[1].x2 = core->width - 1; + segs[0].x2 = width - 1; + segs[0].y2 = segs[0].y1 = height - 1; + segs[1].x1 = segs[1].x2 = width - 1; segs[1].y1 = 0; - segs[1].y2 = core->height - 1; - XDrawSegments(dpy, core->window, dark, segs, 2); + segs[1].y2 = height - 1; + XDrawSegments(dpy, d, dark, segs, 2); segs[0].x1 = segs[0].y1 = segs[0].y2 = 0; - segs[0].x2 = core->width - 2; + segs[0].x2 = width - 2; segs[1].x1 = segs[1].y1 = 0; segs[1].x2 = 0; - segs[1].y2 = core->height - 2; - XDrawSegments(dpy, core->window, light, segs, 2); + segs[1].y2 = height - 2; + XDrawSegments(dpy, d, light, segs, 2); if (relief==WREL_ICON) { segs[0].x1 = segs[0].y1 = segs[0].y2 = 1; - segs[0].x2 = core->width - 2; + segs[0].x2 = width - 2; segs[1].x1 = segs[1].y1 = 1; segs[1].x2 = 1; - segs[1].y2 = core->height - 2; - XDrawSegments(dpy, core->window, light, segs, 2); + segs[1].y2 = height - 2; + XDrawSegments(dpy, d, light, segs, 2); } break; - +#ifdef unused case WREL_SUNKEN: segs[0].x1 = 0; - segs[0].x2 = core->width - 1; + segs[0].x2 = width - 1; segs[0].y2 = segs[0].y1 = 0; segs[1].x1 = segs[1].x2 = 0; segs[1].y1 = 0; - segs[1].y2 = core->height - 1; - XDrawSegments(dpy, core->window, dark, segs, 2); + segs[1].y2 = height - 1; + XDrawSegments(dpy, d, dark, segs, 2); segs[0].x1 = 0; - segs[0].y1 = segs[0].y2 = core->height - 1; - segs[0].x2 = core->width - 1; - segs[1].x2 = segs[1].x1 = core->width - 1; + segs[0].y1 = segs[0].y2 = height - 1; + segs[0].x2 = width - 1; + segs[1].x2 = segs[1].x1 = width - 1; segs[1].y1 = 1; - segs[1].y2 = core->height - 1; - XDrawSegments(dpy, core->window, light, segs, 2); - break; + segs[1].y2 = height - 1; + XDrawSegments(dpy, d, light, segs, 2); + break; +#endif } } diff --git a/src/texture.h b/src/texture.h index 15559d00..4fe757ce 100644 --- a/src/texture.h +++ b/src/texture.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -151,6 +151,7 @@ void wTexturePaintTitlebar(struct WWindow *wwin, WTexture *texture, Pixmap *tdat #define FREE_PIXMAP(p) if ((p)!=None) XFreePixmap(dpy, (p)), (p)=None -void wDrawBevel(WCoreWindow *core, WTexSolid *texture, int relief); +void wDrawBevel(Drawable d, unsigned width, unsigned height, + WTexSolid *texture, int relief); #endif diff --git a/src/wconfig.h b/src/wconfig.h index 334e255c..c19adb50 100644 --- a/src/wconfig.h +++ b/src/wconfig.h @@ -1,5 +1,5 @@ /* - * wconfig.h- default configuration and definitions + * wconfig.h- default configuration and definitions + compile time options * * WindowMaker window manager * @@ -25,6 +25,8 @@ #include "config.h" +/*** Change it (wconfig.h) *after* you ran configure ***/ + /* *-------------------------------------------------------------------- * Feature Selection @@ -41,14 +43,6 @@ /* - * #undef if you dont want the window creation animation when superfluous - * is enabled. - * THIS WILL NOT BE MADE RUN-TIME. - */ -#define WINDOW_BIRTH_ZOOM - - -/* * mimic N*XTSTEP behaviour as close as possible. * affected behaviour: * - disable auto-lower miniwindows @@ -83,13 +77,11 @@ */ #define OFFIX_DND - -/* define CONFIGURE_WINDOW_WHILE_MOVING if you want WindowMaker to send - * the synthetic ConfigureNotify event to windows while moving at every - * single movement. Default is to send a synthetic ConfigureNotify event - * only at the end of window moving, which improves performance. +/* + * support for XDE drang and drop in the Dock. still in beta */ -#undef CONFIGURE_WINDOW_WHILE_MOVING +#undef XDE_DND + /* * Undefine BALLOON_TEXT if you don't want balloons for showing extra @@ -132,7 +124,36 @@ */ #define NUMLOCK_HACK +/* + * define REDUCE_APPICONS if you want apps with the same WM_INSTANCE && + * WM_CLASS to share an appicon + */ +#undef REDUCE_APPICONS + + +/* + * define OPTIMIZE_SHAPE if you want the shape setting code to be optimized + * for applications that change their shape frequently (like xdaliclock + * -shape), removing flickering. If wmaker and your display are on + * different machines and the network connection is slow, it is not + * recommended. + */ +#undef OPTIMIZE_SHAPE + +/* define CONFIGURE_WINDOW_WHILE_MOVING if you want WindowMaker to send + * the synthetic ConfigureNotify event to windows while moving at every + * single movement. Default is to send a synthetic ConfigureNotify event + * only at the end of window moving, which improves performance. + */ +#undef CONFIGURE_WINDOW_WHILE_MOVING + +/* + *.......................................................................... + * The following options WILL NOT BE MADE RUN-TIME. Please do not request. + * They will only add unneeded bloat. + *.......................................................................... + */ /* * define SHADOW_RESIZEBAR if you want a resizebar with shadows like in @@ -141,19 +162,24 @@ */ #undef SHADOW_RESIZEBAR + /* - * define REDUCE_APPICONS if you want apps with the same WM_INSTANCE && - * WM_CLASS to share an appicon + * Define DEMATERIALIZE_ICON if you want the undocked icon animation + * to be a progressive disaparison animation. */ -#undef REDUCE_APPICONS +#undef DEMATERIALIZE_ICON /* - * Define SPREAD_ICON if you want icon blowing animation (when detached from - * dock/clip in the superfluous mode), to spread the icon in four directions. - * If this is undefined, then the classic "Falling pieces" animation is used. + * Define ICON_KABOOM_EXTRA if you want extra fancy icon undocking + * explosion animation. */ -#undef SPREAD_ICON +#undef ICON_KABOOM_EXTRA +/* + * #undef if you dont want the window creation animation when superfluous + * is enabled. + */ +#undef WINDOW_BIRTH_ZOOM /* @@ -227,6 +253,12 @@ * opposed to OpenStep */ #define SINGLE_MENULEVEL +/* max. time to spend doing animations in seconds. If the animation + * time exceeds this value, it is immediately finished. Usefull for + * moments of high-load. + */ +#define MAX_ANIMATION_TIME 1 + /* Zoom animation */ #define MINIATURIZE_ANIMATION_FRAMES_Z 5 #define MINIATURIZE_ANIMATION_STEPS_Z 12 @@ -241,6 +273,9 @@ #define MINIATURIZE_ANIMATION_STEPS_F 16 #define MINIATURIZE_ANIMATION_DELAY_F 1000 #define MINIATURIZE_ANIMATION_TWIST_F 0.5 + + +#define HIDE_ANIMATION_STEPS (MINIATURIZE_ANIMATION_STEPS*2/3) #define BALLOON_DELAY 1000 @@ -303,9 +338,14 @@ /* window birth animation steps (DO NOT MAKE IT RUN-TIME) */ #define WINDOW_BIRTH_STEPS 20 +/* number of steps for icon dematerialization. */ +#define DEMATERIALIZE_STEPS 16 /* Delay when cycling colors of selected icons. */ -#define COLOR_CYCLE_DELAY 300 +#define COLOR_CYCLE_DELAY 200 + +/* size of the pieces in the undocked icon explosion */ +#define ICON_KABOOM_PIECE_SIZE 4 /* Position increment for smart placement. >= 1 raise these values if it's @@ -319,6 +359,10 @@ /* Vicinity in which an icon can be attached to the clip */ #define CLIP_ATTACH_VICINITY 1 +/* The amount of space (in multiples of the icon size) + * a docked icon must be dragged out to detach it */ +#define DOCK_DETTACH_THRESHOLD 3 + /* Delay (in ms) after which the clip will autocollapse when leaved */ #define AUTO_COLLAPSE_DELAY 1000 @@ -357,14 +401,6 @@ #undef WS_INDICATOR -/* the button positions in the clip */ -#define LCLIPB_X 4 -#define RCLIPB_X 32 -#define CLIPB_Y 41 -#define CLIPB_W 27 -#define CLIPB_H 18 - - /* *---------------------------------------------------------------------- * You should not modify the following values, unless you know @@ -413,18 +449,22 @@ #define MAXLINE 1024 + #ifdef _MAX_PATH # define DEFAULT_PATH_MAX _MAX_PATH #else # define DEFAULT_PATH_MAX 512 #endif + +#define DEBUG0 + +/* some rules */ + #ifndef SHAPE #undef SHAPED_BALLOON #endif -#define DEBUG0 - #if HAVE_LIBINTL_H && I18N # include diff --git a/src/wconfig.h.in b/src/wconfig.h.in index 11127c43..e07317ea 100644 --- a/src/wconfig.h.in +++ b/src/wconfig.h.in @@ -1,5 +1,5 @@ /* - * wconfig.h- default configuration and definitions + * wconfig.h- default configuration and definitions + compile time options * * WindowMaker window manager * @@ -25,6 +25,8 @@ #include "config.h" +/*** Change it (wconfig.h) *after* you ran configure ***/ + /* *-------------------------------------------------------------------- * Feature Selection @@ -41,14 +43,6 @@ /* - * #undef if you dont want the window creation animation when superfluous - * is enabled. - * THIS WILL NOT BE MADE RUN-TIME. - */ -#define WINDOW_BIRTH_ZOOM - - -/* * mimic N*XTSTEP behaviour as close as possible. * affected behaviour: * - disable auto-lower miniwindows @@ -83,13 +77,11 @@ */ #define OFFIX_DND - -/* define CONFIGURE_WINDOW_WHILE_MOVING if you want WindowMaker to send - * the synthetic ConfigureNotify event to windows while moving at every - * single movement. Default is to send a synthetic ConfigureNotify event - * only at the end of window moving, which improves performance. +/* + * support for XDE drang and drop in the Dock. still in beta */ -#undef CONFIGURE_WINDOW_WHILE_MOVING +#undef XDE_DND + /* * Undefine BALLOON_TEXT if you don't want balloons for showing extra @@ -132,7 +124,36 @@ */ #define NUMLOCK_HACK +/* + * define REDUCE_APPICONS if you want apps with the same WM_INSTANCE && + * WM_CLASS to share an appicon + */ +@REDUCE_APPICONS@ + + +/* + * define OPTIMIZE_SHAPE if you want the shape setting code to be optimized + * for applications that change their shape frequently (like xdaliclock + * -shape), removing flickering. If wmaker and your display are on + * different machines and the network connection is slow, it is not + * recommended. + */ +#undef OPTIMIZE_SHAPE + +/* define CONFIGURE_WINDOW_WHILE_MOVING if you want WindowMaker to send + * the synthetic ConfigureNotify event to windows while moving at every + * single movement. Default is to send a synthetic ConfigureNotify event + * only at the end of window moving, which improves performance. + */ +#undef CONFIGURE_WINDOW_WHILE_MOVING + +/* + *.......................................................................... + * The following options WILL NOT BE MADE RUN-TIME. Please do not request. + * They will only add unneeded bloat. + *.......................................................................... + */ /* * define SHADOW_RESIZEBAR if you want a resizebar with shadows like in @@ -141,19 +162,24 @@ */ #undef SHADOW_RESIZEBAR + /* - * define REDUCE_APPICONS if you want apps with the same WM_INSTANCE && - * WM_CLASS to share an appicon + * Define DEMATERIALIZE_ICON if you want the undocked icon animation + * to be a progressive disaparison animation. */ -@REDUCE_APPICONS@ +#undef DEMATERIALIZE_ICON /* - * Define SPREAD_ICON if you want icon blowing animation (when detached from - * dock/clip in the superfluous mode), to spread the icon in four directions. - * If this is undefined, then the classic "Falling pieces" animation is used. + * Define ICON_KABOOM_EXTRA if you want extra fancy icon undocking + * explosion animation. */ -#undef SPREAD_ICON +#undef ICON_KABOOM_EXTRA +/* + * #undef if you dont want the window creation animation when superfluous + * is enabled. + */ +#undef WINDOW_BIRTH_ZOOM /* @@ -227,6 +253,12 @@ * opposed to OpenStep */ #define SINGLE_MENULEVEL +/* max. time to spend doing animations in seconds. If the animation + * time exceeds this value, it is immediately finished. Usefull for + * moments of high-load. + */ +#define MAX_ANIMATION_TIME 1 + /* Zoom animation */ #define MINIATURIZE_ANIMATION_FRAMES_Z 5 #define MINIATURIZE_ANIMATION_STEPS_Z 12 @@ -241,6 +273,9 @@ #define MINIATURIZE_ANIMATION_STEPS_F 16 #define MINIATURIZE_ANIMATION_DELAY_F 1000 #define MINIATURIZE_ANIMATION_TWIST_F 0.5 + + +#define HIDE_ANIMATION_STEPS (MINIATURIZE_ANIMATION_STEPS*2/3) #define BALLOON_DELAY 1000 @@ -303,9 +338,14 @@ /* window birth animation steps (DO NOT MAKE IT RUN-TIME) */ #define WINDOW_BIRTH_STEPS 20 +/* number of steps for icon dematerialization. */ +#define DEMATERIALIZE_STEPS 16 /* Delay when cycling colors of selected icons. */ -#define COLOR_CYCLE_DELAY 300 +#define COLOR_CYCLE_DELAY 200 + +/* size of the pieces in the undocked icon explosion */ +#define ICON_KABOOM_PIECE_SIZE 4 /* Position increment for smart placement. >= 1 raise these values if it's @@ -319,6 +359,10 @@ /* Vicinity in which an icon can be attached to the clip */ #define CLIP_ATTACH_VICINITY 1 +/* The amount of space (in multiples of the icon size) + * a docked icon must be dragged out to detach it */ +#define DOCK_DETTACH_THRESHOLD 3 + /* Delay (in ms) after which the clip will autocollapse when leaved */ #define AUTO_COLLAPSE_DELAY 1000 @@ -357,14 +401,6 @@ #undef WS_INDICATOR -/* the button positions in the clip */ -#define LCLIPB_X 4 -#define RCLIPB_X 32 -#define CLIPB_Y 41 -#define CLIPB_W 27 -#define CLIPB_H 18 - - /* *---------------------------------------------------------------------- * You should not modify the following values, unless you know @@ -413,18 +449,22 @@ #define MAXLINE 1024 + #ifdef _MAX_PATH # define DEFAULT_PATH_MAX _MAX_PATH #else # define DEFAULT_PATH_MAX 512 #endif + +#define DEBUG0 + +/* some rules */ + #ifndef SHAPE #undef SHAPED_BALLOON #endif -#define DEBUG0 - #if HAVE_LIBINTL_H && I18N # include diff --git a/src/wcore.c b/src/wcore.c index dc9e21b3..ee73075e 100644 --- a/src/wcore.c +++ b/src/wcore.c @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -65,10 +65,13 @@ wCoreCreateTopLevel(WScreen *screen, int x, int y, int width, int height, attribs.override_redirect = True; attribs.cursor = wCursor[WCUR_DEFAULT]; attribs.background_pixmap = None; - attribs.background_pixel = screen->light_pixel; + attribs.background_pixel = screen->black_pixel; attribs.border_pixel = screen->frame_border_pixel; attribs.event_mask = SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ExposureMask | EnterWindowMask +#ifdef XDE_DND + | StructureNotifyMask +#endif | LeaveWindowMask; vmask |= CWColormap; diff --git a/src/wcore.h b/src/wcore.h index 3396300d..13399c9d 100644 --- a/src/wcore.h +++ b/src/wcore.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/wdefaults.c b/src/wdefaults.c index 6460fb4a..5d15b61f 100644 --- a/src/wdefaults.c +++ b/src/wdefaults.c @@ -1,6 +1,6 @@ /* wdefaults.c - window specific defaults * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -399,7 +399,7 @@ wDefaultGetImage(WScreen *scr, char *winstance, char *wclass) image = RLoadImage(scr->rcontext, path, 0); if (!image) { - wwarning(_("error loading image file \"%s\""), path, RErrorString); + wwarning(_("error loading image file \"%s\""), path, RMessageForError(RErrorCode)); } free(path); diff --git a/src/wdefaults.h b/src/wdefaults.h index 962ee6f3..c6c8d340 100644 --- a/src/wdefaults.h +++ b/src/wdefaults.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/window.c b/src/window.c index f4de8afc..4d61610c 100644 --- a/src/window.c +++ b/src/window.c @@ -1,6 +1,6 @@ /* window.c - client window managing class * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -55,8 +55,9 @@ extern WShortKey wKeyBindings[WKBD_LAST]; -/* modules */ -extern int ModuleNo; +#ifdef SHAPE +extern Bool wShapeSupported; +#endif /* contexts */ extern XContext wWinContext; @@ -66,7 +67,7 @@ extern Cursor wCursor[WCUR_LAST]; /* protocol atoms */ extern Atom _XA_WM_DELETE_WINDOW; -extern Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; extern Atom _XA_WINDOWMAKER_STATE; @@ -79,8 +80,14 @@ extern Time LastTimestamp; /* superfluous... */ extern void DoWindowBirth(WWindow*); + /***** Local Stuff *****/ + +static WWindowState *windowState=NULL; + + + /* local functions */ static FocusMode getFocusMode(WWindow *wwin); @@ -113,6 +120,10 @@ static void titlebarDblClick(WCoreWindow *sender, void *data, XEvent *event); static void resizebarMouseDown(WCoreWindow *sender, void *data, XEvent *event); + + + + WWindow* wWindowFor(Window window) { @@ -424,18 +435,17 @@ WWindow* wManageWindow(WScreen *scr, Window window) { WWindow *wwin; - int width, height; + int x, y; + unsigned width, height; XWindowAttributes wattribs; XSetWindowAttributes attribs; int iconic = 0; - WSavedState *wstate; WWindowState *win_state; #ifdef MWM_HINTS MWMHints *motif_hints = NULL; #endif int window_level; - int foo, gx, gy; - int resized_client; + int foo; int workspace = -1; char *title; @@ -456,7 +466,7 @@ wManageWindow(WScreen *scr, Window window) #endif #ifdef SHAPE - { + if (wShapeSupported) { int junk; unsigned int ujunk; int b_shaped; @@ -501,7 +511,8 @@ wManageWindow(WScreen *scr, Window window) } #ifdef MWM_HINTS - PropGetMotifWMHints(window, &motif_hints); + if (!PropGetMotifWMHints(window, &motif_hints)) + motif_hints = NULL; #endif /* MWM_HINTS */ if (!PropGetClientLeader(window, &wwin->client_leader)) { @@ -567,7 +578,7 @@ wManageWindow(WScreen *scr, Window window) wwin->focus_mode = getFocusMode(wwin); /* get geometry stuff */ - GetNormalHints(wwin, &wattribs, True); + wClientGetNormalHints(wwin, &wattribs, True, &x, &y, &width, &height); /* get colormap windows */ GetColormapWindows(wwin); @@ -607,7 +618,7 @@ wManageWindow(WScreen *scr, Window window) (unsigned)wwin->transient_for); #endif } - + /* if the window can't be resized, remove the resizebar */ if (wwin->normal_hints->flags & (PMinSize|PMaxSize) && (wwin->normal_hints->min_width==wwin->normal_hints->max_width) @@ -638,7 +649,7 @@ wManageWindow(WScreen *scr, Window window) } #ifdef MWM_HINTS if (motif_hints) - XFree(motif_hints); + free(motif_hints); #endif /* @@ -648,8 +659,8 @@ wManageWindow(WScreen *scr, Window window) */ wDefaultFillAttributes(scr, wwin->wm_instance, wwin->wm_class, &wwin->window_flags, False); - - + + /* * Sanity checks for attributes that depend on other attributes */ @@ -668,7 +679,7 @@ wManageWindow(WScreen *scr, Window window) *------------------------------------------------------------ * * Setup the initial state of the window - * + * *------------------------------------------------------------ */ if (wwin->window_flags.start_miniaturized @@ -680,9 +691,9 @@ wManageWindow(WScreen *scr, Window window) /* if there is a saved state, restore it */ win_state = NULL; if (wwin->main_window!=None/* && wwin->main_window!=window*/) { - win_state = (WWindowState*)wGetWindowSavedState(wwin->main_window); + win_state = (WWindowState*)wWindowGetSavedState(wwin->main_window); } else { - win_state = (WWindowState*)wGetWindowSavedState(window); + win_state = (WWindowState*)wWindowGetSavedState(window); } if (win_state && !(wwin->wm_hints && wwin->wm_hints->flags&StateHint && wwin->wm_hints->initial_state==WithdrawnState)) { @@ -709,19 +720,22 @@ wManageWindow(WScreen *scr, Window window) workspace = scr->current_workspace; } } + /* if we're restarting, restore saved state. This will overwrite previous */ - if (!getSavedState(window, &wstate)) { - wstate = NULL; - } else { - wwin->flags.shaded = wstate->shaded; - wwin->flags.hidden = wstate->hidden; - wwin->flags.miniaturized = 0; - workspace = wstate->workspace; + { + WSavedState *wstate; + + if (getSavedState(window, &wstate)) { + wwin->flags.shaded = wstate->shaded; + wwin->flags.hidden = wstate->hidden; + wwin->flags.miniaturized = 0; + workspace = wstate->workspace; + free(wstate); + } } - /* set workspace on which the window starts */ - + /* set workspace on which the window starts */ if (workspace >= 0) { if (workspace > scr->workspace_count-1) { wWorkspaceMake(scr, workspace - scr->workspace_count + 1); @@ -738,47 +752,29 @@ wManageWindow(WScreen *scr, Window window) } } - /* setup window geometry */ if (win_state && win_state->state->use_geometry) { width = win_state->state->w; height = win_state->state->h; - } else { - width = wwin->client.width; - height = wwin->client.height; } - wWindowConstrainSize(wwin, &width, &height); - resized_client = 0; - if (wwin->client.width != width) { - wwin->client.width = width; - resized_client = 1; - } - if (wwin->client.height != height) { - wwin->client.height = height; - resized_client = 1; - } - /* do not ask for window placement if the window is * transient, during startup, if the initial workspace is another one * or if the window wants to * start iconic. * If geometry was saved, restore it. */ if (win_state && win_state->state->use_geometry) { - wwin->frame_x = win_state->state->x; - wwin->frame_y = win_state->state->y; + x = win_state->state->x; + y = win_state->state->y; } else if (wwin->transient_for==None && !scr->flags.startup && workspace==scr->current_workspace && !iconic && !(wwin->normal_hints->flags & (USPosition|PPosition))) { - PlaceWindow(wwin, &wwin->frame_x, &wwin->frame_y); - } else { - wwin->frame_x = wwin->client.x; - wwin->frame_y = wwin->client.y; - } + PlaceWindow(wwin, &x, &y); + } if (wwin->window_flags.dont_move_off) - wScreenBringInside(scr, &wwin->frame_x, &wwin->frame_y, width, height); + wScreenBringInside(scr, &x, &y, width, height); /* *-------------------------------------------------- @@ -795,15 +791,13 @@ wManageWindow(WScreen *scr, Window window) foo |= WFF_RESIZEBAR; wwin->frame = wFrameWindowCreate(scr, window_level, - wwin->frame_x, wwin->frame_y, - width, height, foo, + x, y, width, height, foo, scr->window_title_texture, (WTexture**)scr->resizebar_texture, scr->window_title_pixel, &scr->window_title_gc, &scr->title_font); - - + wwin->frame->flags.is_client_window_frame = 1; wwin->frame->flags.justification = wPreferences.title_justification; @@ -838,23 +832,27 @@ wManageWindow(WScreen *scr, Window window) wwin->frame->on_mousedown_resizebar = resizebarMouseDown; - wwin->client.y += wwin->frame->top_width; XReparentWindow(dpy, wwin->client_win, wwin->frame->core->window, 0, wwin->frame->top_width); - wClientGetGravityOffsets(wwin, &gx, &gy); - /* set the positio of the frame on screen */ - wwin->frame_x += gx * (wwin->old_border_width - FRAME_BORDER_WIDTH); - wwin->frame_y += gy * (wwin->old_border_width - FRAME_BORDER_WIDTH); - /* if gravity is to the south, account for the border sizes */ - if (gy > 0) - wwin->frame_y -= wwin->frame->top_width + wwin->frame->bottom_width; + { + int gx, gy; + + wClientGetGravityOffsets(wwin, &gx, &gy); + /* set the positio of the frame on screen */ + x += gx * FRAME_BORDER_WIDTH; + y += gy * FRAME_BORDER_WIDTH; + /* if gravity is to the south, account for the border sizes */ + if (gy > 0) + y -= wwin->frame->top_width + wwin->frame->bottom_width; + } /* - * force wWindowConfigure() to update the client window's size + * wWindowConfigure() will init the client window's size + * (wwin->client.{width,height}) and all other geometry + * related variables (frame_x,frame_y) */ - wwin->client.width = 0; - wWindowConfigure(wwin, wwin->frame_x, wwin->frame_y, width, height); + wWindowConfigure(wwin, x, y, width, height); /* *-------------------------------------------------- @@ -874,7 +872,7 @@ wManageWindow(WScreen *scr, Window window) * itself */ leader = wWindowFor(wwin->main_window); if (leader && leader->main_window==None) { - leader->main_window = leader->client_win; + leader->main_window = leader->client_win; } app = wApplicationCreate(scr, wwin->main_window); @@ -909,11 +907,6 @@ wManageWindow(WScreen *scr, Window window) XLowerWindow(dpy, window); /* if window is in this workspace and should be mapped, then map it */ - /* - printf("%s %i %i %i %i\n", wwin->wm_class,iconic,workspace == scr->current_workspace, - wwin->flags.hidden,(wwin->wm_hints && (wwin->wm_hints->flags & StateHint) - && wwin->wm_hints->initial_state == WithdrawnState)); - * */ if (!iconic && (workspace == scr->current_workspace || wwin->window_flags.omnipresent) && !wwin->flags.hidden @@ -929,7 +922,25 @@ wManageWindow(WScreen *scr, Window window) wClientSetState(wwin, NormalState, None); } if (wPreferences.superfluous && !wPreferences.no_animations - && !scr->flags.startup && wwin->transient_for==None) { + && !scr->flags.startup && wwin->transient_for==None + /* + * The brain damaged idiotic non-click to focus modes will + * have trouble with this because: + * + * 1. window is created and mapped by the client + * 2. window is mapped by wmaker in small size + * 3. window is animated to grow to normal size + * 4. this function returns to normal event loop + * 5. eventually, the EnterNotify event that would trigger + * the window focusing (if the mouse is over that window) + * will be processed by wmaker. + * But since this event will be rather delayed + * (step 3 has a large delay) the time when the event ocurred + * and when it is processed, the client that owns that window + * will reject the XSetInputFocus() for it. + */ + && (wPreferences.focus_mode==WKF_CLICK + || wPreferences.auto_focus)) { DoWindowBirth(wwin); } XMapSubwindows(dpy, wwin->frame->core->window); @@ -937,7 +948,7 @@ wManageWindow(WScreen *scr, Window window) } else { XMapSubwindows(dpy, wwin->frame->core->window); } - + /* setup stacking descriptor */ if (wPreferences.on_top_transients && wwin->transient_for!=None && wwin->transient_for!=scr->root_win) { @@ -948,7 +959,7 @@ wManageWindow(WScreen *scr, Window window) } else { wwin->frame->core->stacking->child_of = NULL; } - + if (!scr->focused_window) { /* first window on the list */ @@ -967,17 +978,20 @@ wManageWindow(WScreen *scr, Window window) wwin->prev = NULL; } + + XUngrabServer(dpy); + /* *-------------------------------------------------- - * + * * Final preparations before window is ready to go - * - *-------------------------------------------------- + * + *-------------------------------------------------- */ - + wFrameWindowChangeState(wwin->frame, WS_UNFOCUSED); - + if (!iconic && workspace == scr->current_workspace) { WWindow *tmp = wWindowFor(wwin->transient_for); @@ -987,7 +1001,7 @@ wManageWindow(WScreen *scr, Window window) wwin->flags.ignore_next_unmap = 1; } wWindowResetMouseGrabs(wwin); - + if (!wwin->window_flags.no_bind_keys) { wWindowSetKeyGrabs(wwin); } @@ -998,21 +1012,19 @@ wManageWindow(WScreen *scr, Window window) */ wwin->flags.mapped=0; - XUngrabServer(dpy); XSync(dpy, 0); + wColormapInstallForWindow(wwin->screen_ptr, scr->cmap_window); - UpdateSwitchMenu(wwin->screen_ptr, wwin, ACTION_ADD); + UpdateSwitchMenu(wwin->screen_ptr, wwin, ACTION_ADD); /* *-------------------------------------------------- * Cleanup temporary stuff *-------------------------------------------------- */ - if (wstate) - XFree(wstate); if (win_state) - wDeleteWindowSavedState(win_state); + wWindowDeleteSavedState(win_state); return wwin; } @@ -1341,7 +1353,7 @@ wWindowUnfocus(WWindow *wwin) void wWindowConstrainSize(WWindow *wwin, int *nwidth, int *nheight) { - XSizeHints *sizeh=wwin->normal_hints; + XSizeHints *sizeh = wwin->normal_hints; int width = *nwidth; int height = *nheight; int winc = sizeh->width_inc; @@ -1370,8 +1382,8 @@ wWindowConstrainSize(WWindow *wwin, int *nwidth, int *nheight) } } else { width = (height * sizeh->max_aspect.x) / sizeh->max_aspect.y; - if (width < sizeh->min_width) { - width = sizeh->min_width; + if (width > sizeh->max_width) { + width = sizeh->max_width; height = (width*sizeh->max_aspect.y) / sizeh->max_aspect.x; } } @@ -1396,27 +1408,21 @@ wWindowConstrainSize(WWindow *wwin, int *nwidth, int *nheight) } } - if (sizeh->base_width != 0) - { + if (sizeh->base_width != 0) { width = (((width - sizeh->base_width) / winc) * winc) - + sizeh->base_width; - } - else - { + + sizeh->base_width; + } else { width = (((width - sizeh->min_width) / winc) * winc) + sizeh->min_width; - } + } - if (sizeh->base_width != 0) - { + if (sizeh->base_width != 0) { height = (((height - sizeh->base_height) / hinc) * hinc) + sizeh->base_height; - } - else - { + } else { height = (((height - sizeh->min_height) / hinc) * hinc) + sizeh->min_height; - } + } *nwidth = width; *nheight = height; @@ -1529,14 +1535,19 @@ int req_width, req_height; /* new size of the client */ if (wwin->window_flags.dont_move_off) wScreenBringInside(wwin->screen_ptr, &req_x, &req_y, req_width, req_height); - if (resize) { if (req_width < MIN_WINDOW_SIZE) req_width = MIN_WINDOW_SIZE; if (req_height < MIN_WINDOW_SIZE) req_height = MIN_WINDOW_SIZE; - - XResizeWindow(dpy, wwin->client_win, req_width, req_height); + + /* If growing, resize inner part before frame, + * if shrinking, resize frame before. + * This will prevent the frame (that can have a different color) + * to be exposed, causing flicker */ + if (req_height > wwin->frame->core->height + || req_width > wwin->frame->core->width) + XResizeWindow(dpy, wwin->client_win, req_width, req_height); if (wwin->flags.shaded) { wFrameWindowResize(wwin->frame, req_width, wwin->frame->core->height); @@ -1544,6 +1555,10 @@ int req_width, req_height; /* new size of the client */ } else { wFrameWindowResizeInternal(wwin->frame, req_width, req_height); } + + if (!(req_height > wwin->frame->core->height + || req_width > wwin->frame->core->width)) + XResizeWindow(dpy, wwin->client_win, req_width, req_height); wwin->client.x = req_x; wwin->client.y = req_y + wwin->frame->top_width; @@ -1559,27 +1574,16 @@ int req_width, req_height; /* new size of the client */ } wwin->frame_x = req_x; wwin->frame_y = req_y; - + #ifdef SHAPE - if (wwin->flags.shaped && resize) { - /* - * Kluge: it seems that without this delay, wmaker will - * use the shape mask of the client before the resize. - * The usleep() should give some time for the client - * to update itself. Wont work all the time, but thats - * better than nothing, I guess... - * There should be a better way of doing this or I'm just - * doing something wrong elsewhere. - */ - XSync(dpy, False); - wusleep(1000); + if (wShapeSupported && wwin->flags.shaped && resize) { wWindowSetShape(wwin); - XSync(dpy, False); } #endif - + if (synth_notify) wWindowSynthConfigureNotify(wwin); + XFlush(dpy); } @@ -1745,9 +1749,11 @@ wWindowConfigureBorders(WWindow *wwin) if (!wwin->window_flags.no_miniaturize_button && wwin->frame->flags.hide_left_button) flags |= WFF_LEFT_BUTTON; + if (!wwin->window_flags.no_close_button && wwin->frame->flags.hide_right_button) flags |= WFF_RIGHT_BUTTON; + if (flags!=0) { wWindowUpdateButtonImages(wwin); wFrameWindowShowButton(wwin->frame, flags); @@ -1757,11 +1763,19 @@ wWindowConfigureBorders(WWindow *wwin) if (wwin->window_flags.no_miniaturize_button && !wwin->frame->flags.hide_left_button) flags |= WFF_LEFT_BUTTON; + if (wwin->window_flags.no_close_button && !wwin->frame->flags.hide_right_button) flags |= WFF_RIGHT_BUTTON; + if (flags!=0) wFrameWindowHideButton(wwin->frame, flags); + +#ifdef SHAPE + if (wShapeSupported && wwin->flags.shaped) { + wWindowSetShape(wwin); + } +#endif } } @@ -1769,20 +1783,16 @@ wWindowConfigureBorders(WWindow *wwin) void wWindowSaveState(WWindow *wwin) { - WSavedState state; - -/* if (wwin->flags.miniaturized || wwin->flags.hidden) { - state.workspace = 0; - } else { - state.workspace = wwin->frame->workspace; - }*/ - state.workspace = wwin->frame->workspace; - state.shaded = wwin->flags.shaded; - state.hidden = wwin->flags.hidden; + CARD32 data[9]; + + memset(data, 0, sizeof(CARD32)*9); + data[0] = wwin->frame->workspace; + data[2] = wwin->flags.shaded; + data[3] = wwin->flags.hidden; XChangeProperty(dpy, wwin->client_win, _XA_WINDOWMAKER_STATE, _XA_WINDOWMAKER_STATE, 32, PropModeReplace, - (unsigned char *) &state, sizeof(WSavedState)/sizeof(int)); + (unsigned char *)data, 9); } @@ -1793,14 +1803,30 @@ getSavedState(Window window, WSavedState **state) int fmt_ret; unsigned long nitems_ret; unsigned long bytes_after_ret; + CARD32 *data; - if (XGetWindowProperty(dpy, window, _XA_WINDOWMAKER_STATE, 0, - sizeof(WSavedState), + if (XGetWindowProperty(dpy, window, _XA_WINDOWMAKER_STATE, 0, 9, True, _XA_WINDOWMAKER_STATE, &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, - (unsigned char **)state)!=Success) + (unsigned char **)&data)!=Success || !data) return 0; - if (type_ret==_XA_WINDOWMAKER_STATE) + + *state = malloc(sizeof(WSavedState)); + + if (*state) { + (*state)->workspace = data[0]; + (*state)->miniaturized = data[1]; + (*state)->shaded = data[2]; + (*state)->hidden = data[3]; + (*state)->use_geometry = data[4]; + (*state)->x = data[5]; + (*state)->y = data[6]; + (*state)->w = data[7]; + (*state)->h = data[8]; + } + XFree(data); + + if (*state && type_ret==_XA_WINDOWMAKER_STATE) return 1; else return 0; @@ -1808,40 +1834,105 @@ getSavedState(Window window, WSavedState **state) #ifdef SHAPE -void wWindowSetShape(WWindow *wwin) +void +wWindowClearShape(WWindow *wwin) +{ + XShapeCombineMask(dpy, wwin->frame->core->window, ShapeBounding, + 0, wwin->frame->top_width, None, ShapeSet); + XFlush(dpy); +} + +void +wWindowSetShape(WWindow *wwin) { XRectangle rect[2]; - int count=0; + int count; +#ifdef OPTIMIZE_SHAPE + XRectangle *rects; + XRectangle *urec; + int ordering; + + /* only shape is the client's */ + if (wwin->window_flags.no_titlebar && wwin->window_flags.no_resizebar) { + goto alt_code; + } + + /* Get array of rectangles describing the shape mask */ + rects = XShapeGetRectangles(dpy, wwin->client_win, ShapeBounding, + &count, &ordering); + if (!rects) { + goto alt_code; + } + + urec = malloc(sizeof(XRectangle)*(count+2)); + if (!urec) { + XFree(rects); + goto alt_code; + } + + /* insert our decoration rectangles in the rect list */ + memcpy(urec, rects, sizeof(XRectangle)*count); + XFree(rects); - XShapeCombineShape(dpy, wwin->frame->core->window, ShapeBounding, - 0, wwin->frame->top_width, wwin->client_win, - ShapeBounding, ShapeSet); if (!wwin->window_flags.no_titlebar) { - rect[count].x = -1; - rect[count].y = -1; - rect[count].width = wwin->frame->core->width+2; - rect[count].height = wwin->frame->top_width+1; + urec[count].x = -1; + urec[count].y = -1 - wwin->frame->top_width; + urec[count].width = wwin->frame->core->width + 2; + urec[count].height = wwin->frame->top_width + 1; count++; } if (!wwin->window_flags.no_resizebar) { + urec[count].x = -1; + urec[count].y = wwin->frame->core->height + - wwin->frame->bottom_width - wwin->frame->top_width; + urec[count].width = wwin->frame->core->width + 2; + urec[count].height = wwin->frame->bottom_width + 1; + count++; + } + + /* shape our frame window */ + XShapeCombineRectangles(dpy, wwin->frame->core->window, ShapeBounding, + 0, wwin->frame->top_width, urec, count, + ShapeSet, Unsorted); + XFlush(dpy); + free(urec); + return; + +alt_code: +#endif /* OPTIMIZE_SHAPE */ + count = 0; + if (!wwin->window_flags.no_titlebar) { + rect[count].x = -1; + rect[count].y = -1; + rect[count].width = wwin->frame->core->width + 2; + rect[count].height = wwin->frame->top_width + 1; + count++; + } + if (!wwin->window_flags.no_resizebar) { rect[count].x = -1; rect[count].y = wwin->frame->core->height - wwin->frame->bottom_width; - rect[count].width = wwin->frame->core->width+2; - rect[count].height = wwin->frame->bottom_width+1; + rect[count].width = wwin->frame->core->width + 2; + rect[count].height = wwin->frame->bottom_width + 1; count++; } - XShapeCombineRectangles(dpy,wwin->frame->core->window,ShapeBounding, - 0,0,rect,count,ShapeUnion,Unsorted); + if (count > 0) { + XShapeCombineRectangles(dpy, wwin->frame->core->window, ShapeBounding, + 0, 0, rect, count, ShapeSet, Unsorted); + } + XShapeCombineShape(dpy, wwin->frame->core->window, ShapeBounding, + 0, wwin->frame->top_width, wwin->client_win, + ShapeBounding, (count > 0 ? ShapeUnion : ShapeSet)); + XFlush(dpy); } -#endif +#endif /* SHAPE */ /* ====================================================================== */ static FocusMode getFocusMode(WWindow *wwin) -{ +{ FocusMode mode; - + if ((wwin->wm_hints) && (wwin->wm_hints->flags & InputHint)) { if (wwin->wm_hints->input == True) { if (wwin->protocols.TAKE_FOCUS) @@ -1869,8 +1960,8 @@ wWindowSetKeyGrabs(WWindow *wwin) for (i=0; ikeycode==0) + + if (key->keycode==0) continue; if (key->modifier!=AnyModifier) { XGrabKey(dpy, key->keycode, key->modifier|LockMask, @@ -1901,17 +1992,9 @@ wWindowResetMouseGrabs(WWindow *wwin) if (!wwin->window_flags.no_bind_mouse) { /* grabs for Meta+drag */ - XGrabButton(dpy, AnyButton, MOD_MASK, - wwin->client_win, True, ButtonPressMask, GrabModeSync, - GrabModeAsync, None, wCursor[WCUR_ARROW]); - XGrabButton(dpy, AnyButton, MOD_MASK|LockMask, - wwin->client_win, True, ButtonPressMask, GrabModeSync, - GrabModeAsync, None, wCursor[WCUR_ARROW]); -#ifdef NUMLOCK_HACK wHackedGrabButton(AnyButton, MOD_MASK, wwin->client_win, True, ButtonPressMask, GrabModeSync, GrabModeAsync, None, wCursor[WCUR_ARROW]); -#endif } if (!wwin->flags.focused) { @@ -1941,6 +2024,168 @@ wWindowUpdateGNUstepAttr(WWindow *wwin, GNUstepWMAttributes *attr) } +WMagicNumber +wWindowAddSavedState(char *instance, char *class, char *command, + pid_t pid, WSavedState *state) +{ + WWindowState *wstate; + + wstate = malloc(sizeof(WWindowState)); + if (!wstate) + return 0; + + memset(wstate, 0, sizeof(WWindowState)); + wstate->pid = pid; + if (instance) + wstate->instance = wstrdup(instance); + if (class) + wstate->class = wstrdup(class); + if (command) + wstate->command = wstrdup(command); + wstate->state = state; + + wstate->next = windowState; + windowState = wstate; + +#ifdef DEBUG + printf("Added WindowState with ID %p, for %s.%s : \"%s\"\n", wstate, instance, + class, command); +#endif + + return wstate; +} + + +#define SAME(x, y) (((x) && (y) && !strcmp((x), (y))) || (!(x) && !(y))) + + +WMagicNumber +wWindowGetSavedState(Window win) +{ + char *instance, *class, *command=NULL; + WWindowState *wstate = windowState; + char **argv; + int argc; + + if (!wstate) + return NULL; + + if (XGetCommand(dpy, win, &argv, &argc)) { + if (argc > 0) + command = FlattenStringList(argv, argc); + XFreeStringList(argv); + } + if (!command) + return NULL; + + if (PropGetWMClass(win, &class, &instance)) { + while (wstate) { + if (SAME(instance, wstate->instance) && + SAME(class, wstate->class) && + SAME(command, wstate->command)) { + break; + } + wstate = wstate->next; + } + } else { + wstate = NULL; + } + +#ifdef DEBUG + printf("Read WindowState with ID %p, for %s.%s : \"%s\"\n", wstate, instance, + class, command); +#endif + + if (command) free(command); + if (instance) XFree(instance); + if (class) XFree(class); + + return wstate; +} + + +void +wWindowDeleteSavedState(WMagicNumber id) +{ + WWindowState *tmp, *wstate=(WWindowState*)id; + + if (!wstate || !windowState) + return; + + tmp = windowState; + if (tmp==wstate) { + windowState = wstate->next; +#ifdef DEBUG + printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", + wstate, wstate->instance, wstate->class, wstate->command); +#endif + if (wstate->instance) free(wstate->instance); + if (wstate->class) free(wstate->class); + if (wstate->command) free(wstate->command); + free(wstate->state); + free(wstate); + } else { + while (tmp->next) { + if (tmp->next==wstate) { + tmp->next=wstate->next; +#ifdef DEBUG + printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", + wstate, wstate->instance, wstate->class, wstate->command); +#endif + if (wstate->instance) free(wstate->instance); + if (wstate->class) free(wstate->class); + if (wstate->command) free(wstate->command); + free(wstate->state); + free(wstate); + break; + } + tmp = tmp->next; + } + } +} + + +void +wWindowDeleteSavedStatesForPID(pid_t pid) +{ + WWindowState *tmp, *wstate; + + if (!windowState) + return; + + tmp = windowState; + if (tmp->pid == pid) { + wstate = windowState; + windowState = tmp->next; +#ifdef DEBUG + printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", + wstate, wstate->instance, wstate->class, wstate->command); +#endif + if (wstate->instance) free(wstate->instance); + if (wstate->class) free(wstate->class); + if (wstate->command) free(wstate->command); + free(wstate->state); + free(wstate); + } else { + while (tmp->next) { + if (tmp->next->pid==pid) { + wstate = tmp->next; + tmp->next = wstate->next; +#ifdef DEBUG + printf("Deleted WindowState with ID %p, for %s.%s : \"%s\"\n", + wstate, wstate->instance, wstate->class, wstate->command); +#endif + if (wstate->instance) free(wstate->instance); + if (wstate->class) free(wstate->class); + if (wstate->command) free(wstate->command); + free(wstate->state); + free(wstate); + break; + } + tmp = tmp->next; + } + } +} /* ====================================================================== */ @@ -1972,6 +2217,7 @@ resizebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) if (event->xbutton.state & MOD_MASK) { /* move the window */ +#if 0 if (XGrabPointer(dpy, wwin->frame->resizebar->window, True, ButtonMotionMask|ButtonReleaseMask|ButtonPressMask, GrabModeAsync, GrabModeAsync, None, @@ -1981,11 +2227,13 @@ resizebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) #endif return; } +#endif wMouseMoveWindow(wwin, event); XUngrabPointer(dpy, CurrentTime); } else { +#if 0 /* resize the window */ - if (XGrabPointer(dpy, wwin->frame->resizebar->window, False, + if (XGrabPointer(dpy, wwin->frame->resizebar->window, True, ButtonMotionMask|ButtonReleaseMask|ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime)!=GrabSuccess) { @@ -1994,6 +2242,7 @@ resizebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) #endif return; } +#endif wMouseResizeWindow(wwin, event); XUngrabPointer(dpy, CurrentTime); } @@ -2096,7 +2345,7 @@ titlebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) "Turn it off or some mouse actions and keyboard shortcuts will not work.")); } #endif - + event->xbutton.state &= ValidModMask; @@ -2122,7 +2371,8 @@ titlebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) wSelectWindow(wwin); return; } - if (XGrabPointer(dpy, wwin->frame->titlebar->window, False, +#if 0 + if (XGrabPointer(dpy, wwin->frame->titlebar->window, False, ButtonMotionMask|ButtonReleaseMask|ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime)!=GrabSuccess) { @@ -2131,6 +2381,7 @@ titlebarMouseDown(WCoreWindow *sender, void *data, XEvent *event) #endif return; } +#endif /* move the window */ wMouseMoveWindow(wwin, event); XUngrabPointer(dpy, CurrentTime); @@ -2195,7 +2446,7 @@ windowIconifyClick(WCoreWindow *sender, void *data, XEvent *event) CloseWindowMenu(wwin->screen_ptr); if (wwin->protocols.MINIATURIZE_WINDOW && event->xbutton.state==0) { - wClientSendProtocol(wwin, _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW, + wClientSendProtocol(wwin, _XA_GNUSTEP_WM_MINIATURIZE_WINDOW, LastTimestamp); } else { WApplication *wapp; diff --git a/src/window.h b/src/window.h index d750bd18..4ae86b1b 100644 --- a/src/window.h +++ b/src/window.h @@ -1,5 +1,5 @@ /* - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -128,6 +128,9 @@ typedef struct { /* WindowMaker specific */ unsigned int MINIATURIZE_WINDOW:1; +#ifdef MONITOR_HEARTBEAT + unsigned int HEARTBEAT:1; +#endif } WProtocols; @@ -184,6 +187,9 @@ typedef struct WWindow { FocusMode focus_mode; /* type of keyboard input focus */ +#ifdef MONITOR_HEARTBEAT + time_t last_beat; +#endif struct { /* state flags */ unsigned int mapped:1; @@ -219,19 +225,25 @@ typedef struct WWindow { unsigned int destroyed:1; /* window was already destroyed */ } flags; /* state of the window */ - char *icon_text; struct WIcon *icon; /* icon info for the window */ int icon_x, icon_y; /* position of the icon */ } WWindow; +/* + * Changes to this must update wWindowSaveState/getSavedState + * + */ typedef struct WSavedState { int workspace; int miniaturized; int shaded; int hidden; int use_geometry; - int x, y, w, h; + int x; + int y; + unsigned int w; + unsigned int h; } WSavedState; @@ -245,11 +257,16 @@ typedef struct WWindowState { } WWindowState; +typedef void* WMagicNumber; + + + void wWindowDestroy(WWindow *wwin); WWindow *wWindowCreate(); #ifdef SHAPE void wWindowSetShape(WWindow *wwin); +void wWindowClearShape(WWindow *wwin); #endif WWindow *wManageWindow(WScreen *scr, Window window); @@ -293,4 +310,14 @@ void wWindowMap(WWindow *wwin); Bool wWindowCanReceiveFocus(WWindow *wwin); +void wWindowDeleteSavedStatesForPID(pid_t pid); + +WMagicNumber wWindowAddSavedState(char *instance, char *class, char *command, + pid_t pid, WSavedState *state); + +WMagicNumber wWindowGetSavedState(Window win); + +void wWindowDeleteSavedState(WMagicNumber id); + + #endif diff --git a/src/winmenu.c b/src/winmenu.c index d15fae50..7d5d16e2 100644 --- a/src/winmenu.c +++ b/src/winmenu.c @@ -1,6 +1,6 @@ /* winmenu.c - command menu for windows * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -60,7 +60,7 @@ /**** Global data ***/ extern Time LastTimestamp; extern Atom _XA_WM_DELETE_WINDOW; -extern Atom _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; extern WShortKey wKeyBindings[WKBD_LAST]; @@ -92,7 +92,7 @@ execMenuCommand(WMenu *menu, WMenuEntry *entry) break; case MC_MINIATURIZE: if (wwin->protocols.MINIATURIZE_WINDOW) { - wClientSendProtocol(wwin, _XA_WINDOWMAKER_WM_MINIATURIZE_WINDOW, + wClientSendProtocol(wwin, _XA_GNUSTEP_WM_MINIATURIZE_WINDOW, LastTimestamp); } else { wIconifyWindow(wwin); diff --git a/src/winspector.c b/src/winspector.c index ff374305..2868ef55 100644 --- a/src/winspector.c +++ b/src/winspector.c @@ -1,6 +1,6 @@ /* winspector.c - window attribute inspector * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -291,7 +291,7 @@ showIconFor(WMScreen *scrPtr, InspectorPanel *panel, buf = wmalloc(strlen(file)+80); sprintf(buf, _("Could not open specified icon \"%s\":%s"), - file, RErrorString); + file, RMessageForError(RErrorCode)); wMessageDialog(panel->frame->screen_ptr, _("Error"), buf, _("OK"), NULL, NULL); free(buf); @@ -936,10 +936,14 @@ textEditedObserver(void *observerData, WMNotification *notification) if ((int)WMGetNotificationClientData(notification) != WMReturnTextMovement) return; - showIconFor(WMWidgetScreen(panel->win), panel, NULL, NULL, USE_TEXT_FIELD); + if (observerData == panel->fileText) { + showIconFor(WMWidgetScreen(panel->win), panel, NULL, NULL, + USE_TEXT_FIELD); /* - WMPerformButtonClick(panel->updateIconBtn); + WMPerformButtonClick(panel->updateIconBtn); */ + } else + WMPerformButtonClick(panel->setRb); } static InspectorPanel* @@ -1242,6 +1246,9 @@ createInspectorForWindow(WWindow *wwin) panel->wsText = WMCreateTextField(panel->wsFrm); WMMoveWidget(panel->wsText, 30, 40); WMResizeWidget(panel->wsText, PWIDTH - (2 * 15) - 25 - 10 - (2 * 5), 20); + WMAddNotificationObserver(textEditedObserver, panel, + WMTextDidEndEditingNotification, + panel->wsText); i = wDefaultGetStartWorkspace(wwin->screen_ptr, wwin->wm_instance, diff --git a/src/winspector.h b/src/winspector.h index f8cde86b..5cf162f6 100644 --- a/src/winspector.h +++ b/src/winspector.h @@ -1,6 +1,6 @@ /* winspector.h - window attribute inspector header file * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/workspace.c b/src/workspace.c index 35d9251e..fa912c03 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -1,6 +1,6 @@ /* workspace.c- Workspace management * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * @@ -182,6 +182,10 @@ wWorkspaceDelete(WScreen *scr, int workspace) void wWorkspaceChange(WScreen *scr, int workspace) { + if (scr->flags.startup || scr->flags.startup2) { + return; + } + if (workspace != scr->current_workspace) { wWorkspaceForceChange(scr, workspace); } diff --git a/src/workspace.h b/src/workspace.h index eab80ff5..07963a4e 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -1,6 +1,6 @@ /* workspace.c- Workspace management * - * WindowMaker window manager + * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * diff --git a/src/xutil.c b/src/xutil.c index 09a42b7c..efde1c3a 100644 --- a/src/xutil.c +++ b/src/xutil.c @@ -30,8 +30,9 @@ #include "xutil.h" #include - +#if 0 static Atom Clipboard=0; +#endif static char *requestCodes[] = { "DUMMY", @@ -169,7 +170,7 @@ FormatXError(Display *dpy, XErrorEvent *error, char *buffer, int size) return; buffer += i; if (error->request_code >= sizeof(requestCodes)/sizeof(char*)) { - sprintf(buffer, "\n Unknown request code: %i\n", + sprintf(buffer, "\n Request code: %i\n", error->request_code); } else { sprintf(buffer, "\n Request code: %i %s\n", error->request_code, @@ -194,6 +195,7 @@ FormatXError(Display *dpy, XErrorEvent *error, char *buffer, int size) } +#if 0 /* *---------------------------------------------------------------------- * GetSelection-- @@ -231,3 +233,4 @@ GetSelection(Display *dpy, Window requestor) } } +#endif diff --git a/test/Makefile.in b/test/Makefile.in index 9e2f7cd5..85c28fb5 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/util/Makefile.am b/util/Makefile.am index 31e98c73..668f686a 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -5,28 +5,32 @@ pkgdatadir = $(datadir)/@PACKAGE@ bin_PROGRAMS = wxcopy wxpaste wdwrite getstyle setstyle seticons geticonset wmsetbg -bin_SCRIPTS = wmaker.inst dockit +bin_SCRIPTS = wmaker.inst wm-oldmenu2new -EXTRA_DIST = wmaker.inst.in bughint dockit +EXTRA_DIST = wmaker.inst.in bughint wm-oldmenu2new -INCLUDES = @DFLAGS@ -I$(top_srcdir)/wrlib @XCFLAGS@ @LIBPL_INC_PATH@ @GFXFLAGS@ +INCLUDES = @DFLAGS@ @XCFLAGS@ -I$(top_srcdir)/wrlib -I$(top_srcdir)/libPropList @GFXFLAGS@ -wdwrite_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +# X_EXTRA_LIBS is for libproplist in systems that need -lsocket +liblist= -L$(top_builddir)/libPropList -lPropList @X_EXTRA_LIBS@ + + +wdwrite_LDADD = $(liblist) wxcopy_LDADD = @XLFLAGS@ @XLIBS@ wxpaste_LDADD = @XLFLAGS@ @XLIBS@ -getstyle_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +getstyle_LDADD = $(liblist) -setstyle_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +setstyle_LDADD = $(liblist) -seticons_LDADD= @LIBPL_LIBS@ @X_EXTRA_LIBS@ +seticons_LDADD= $(liblist) -geticonset_LDADD= @LIBPL_LIBS@ @X_EXTRA_LIBS@ +geticonset_LDADD= $(liblist) -wmsetbg_LDADD = @LIBPL_LIBS@ -L$(top_builddir)/wrlib -lwraster @XLFLAGS@\ - @GFXLIBS@ @XLIBS@ -lm +wmsetbg_LDADD = -L$(top_builddir)/libPropList -lPropList \ + -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ -lm getstyle_SOURCES = getstyle.c diff --git a/util/Makefile.in b/util/Makefile.in index cc990089..04211933 100644 --- a/util/Makefile.in +++ b/util/Makefile.in @@ -66,8 +66,6 @@ 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@ @@ -95,28 +93,31 @@ pkgdatadir = $(datadir)/@PACKAGE@ bin_PROGRAMS = wxcopy wxpaste wdwrite getstyle setstyle seticons geticonset wmsetbg -bin_SCRIPTS = wmaker.inst dockit +bin_SCRIPTS = wmaker.inst wm-oldmenu2new -EXTRA_DIST = wmaker.inst.in bughint dockit +EXTRA_DIST = wmaker.inst.in bughint wm-oldmenu2new -INCLUDES = @DFLAGS@ -I$(top_srcdir)/wrlib @XCFLAGS@ @LIBPL_INC_PATH@ @GFXFLAGS@ +INCLUDES = @DFLAGS@ @XCFLAGS@ -I$(top_srcdir)/wrlib -I$(top_srcdir)/libPropList @GFXFLAGS@ -wdwrite_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +# X_EXTRA_LIBS is for libproplist in systems that need -lsocket +liblist= -L$(top_builddir)/libPropList -lPropList @X_EXTRA_LIBS@ + +wdwrite_LDADD = $(liblist) wxcopy_LDADD = @XLFLAGS@ @XLIBS@ wxpaste_LDADD = @XLFLAGS@ @XLIBS@ -getstyle_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +getstyle_LDADD = $(liblist) -setstyle_LDADD = @LIBPL_LIBS@ @X_EXTRA_LIBS@ +setstyle_LDADD = $(liblist) -seticons_LDADD= @LIBPL_LIBS@ @X_EXTRA_LIBS@ +seticons_LDADD= $(liblist) -geticonset_LDADD= @LIBPL_LIBS@ @X_EXTRA_LIBS@ +geticonset_LDADD= $(liblist) -wmsetbg_LDADD = @LIBPL_LIBS@ -L$(top_builddir)/wrlib -lwraster @XLFLAGS@\ - @GFXLIBS@ @XLIBS@ -lm +wmsetbg_LDADD = -L$(top_builddir)/libPropList -lPropList \ + -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ -lm getstyle_SOURCES = getstyle.c diff --git a/util/README b/util/README index 0802106b..4908106d 100644 --- a/util/README +++ b/util/README @@ -1,3 +1,6 @@ +wm-oldmenu2new - converts between the plain text file menu format to the + property list menu format. + bughint- gathers some information for bug reporting dockit- a Tcl/Tk for docking applications that normally can't be docked. diff --git a/util/dockit b/util/dockit deleted file mode 100755 index cecd25e1..00000000 --- a/util/dockit +++ /dev/null @@ -1,298 +0,0 @@ -#!/bin/sh -# Only run the following line once \ -exec wish -f $0 $@ - -########################################## -#Copyright 1998 Kenneth W. Persinger Jr. # -# Written for WindowMaker # -########################################## - - -# You can add the full path for Xprop here. -set xprop xprop - -############################### -# DO NOT EDIT BELOW THIS LINE # -############################### -global xprop; -global instance;set instance "" -global class;set class "" -global command; set command "" -global Version;set Version "V1.3" - - - global Version - global instance - global class - global command - wm withdraw . - wm group . . - - toplevel .dockit -class Dockit - wm group .dockit .dockit - wm command .dockit "$argv0 $argv" - wm iconname .dockit "Dockit ${Version}" - wm protocol .dockit WM_DELETE_WINDOW {exit} - wm focusmodel .dockit passive - wm title .dockit "Dockit ${Version}" - wm geometry .dockit 309x157+440+412 - wm maxsize .dockit 1265 994 - wm minsize .dockit 1 1 - wm overrideredirect .dockit 0 - wm resizable .dockit 0 0 - wm deiconify .dockit - - label .dockit.msgbar \ - -anchor nw -borderwidth 1 -justify left -relief raised \ - -text "" - label .dockit.instlbl \ - -borderwidth 1 -relief raised -text Instance - label .dockit.cllbl \ - -borderwidth 1 -relief raised -text Class - label .dockit.comlbl \ - -borderwidth 1 -relief raised -text Command - entry .dockit.instent -textvariable instance - entry .dockit.clent -textvariable class - entry .dockit.coment -textvariable command - button .dockit.create \ - -padx 9 -pady 3 -text {Create Icon} -command {docreate} - button .dockit.exit \ - -padx 9 -pady 3 -text Quit -command exit - button .dockit.grab \ - -padx 9 -pady 3 -text Grab -command {dograb} - button .dockit.help \ - -padx 9 -pady 3 -text Help -command {dohelp} - ################### - # SETTING GEOMETRY - ################### - place .dockit.msgbar \ - -x 5 -y 120 -width 296 -height 33 -anchor nw -bordermode ignore - place .dockit.instlbl \ - -x 5 -y 5 -width 76 -height 23 -anchor nw -bordermode ignore - place .dockit.cllbl \ - -x 5 -y 30 -width 76 -height 23 -anchor nw -bordermode ignore - place .dockit.comlbl \ - -x 5 -y 55 -width 76 -height 23 -anchor nw -bordermode ignore - place .dockit.instent \ - -x 85 -y 5 -width 216 -height 22 -anchor nw -bordermode ignore - place .dockit.clent \ - -x 85 -y 30 -width 216 -height 22 -anchor nw -bordermode ignore - place .dockit.coment \ - -x 85 -y 55 -width 216 -height 22 -anchor nw -bordermode ignore - place .dockit.create \ - -x 5 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore - place .dockit.exit \ - -x 230 -y 80 -width 72 -height 36 -anchor nw -bordermode ignore - place .dockit.grab \ - -x 80 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore - place .dockit.help \ - -x 155 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore -############ -# Bindings # -############ - bind all {message ""} - bind .dockit.instlbl {message "Instance name goes here. -(the 1st string of WM_CLASS)"} - bind .dockit.instent {message "Instance name goes here. -(the 1st string of WM_CLASS)"} - bind .dockit.cllbl {message "Class name goes here. -(the 2nd string of WM_CLASS)"} - bind .dockit.clent {message "Class name goes here. -(the 2nd string of WM_CLASS)"} - bind .dockit.comlbl {message "The command to execute goes here. -(all of WM_COMMAND)"} - bind .dockit.coment {message "The command to execute goes here. -(all of WM_COMMAND)"} - bind .dockit.create {message "Create you custom AppIcon."} - bind .dockit.exit {message "Exit Dockit!"} - bind .dockit.help {message "Help with creating AppIcons, -and for these commands."} - bind .dockit.grab {message "Grab AppInfo from a running App."} - - -################### -# Actual Code # -################### - -proc message {message} { - .dockit.msgbar configure -text $message -} - -proc docreate {} { - global Version - global instance - global class - global command - - if {$command == ""} { - tk_dialog .error "DockIt ${Version}: ERROR" \ - "You must supply a command line. Otherwise your icon would do nothing!" \ - "" "" "Doh!" - } else { - set insttmp $instance - set classtmp $class - set commandtmp $command - - if {$insttmp == ""} { set insttmp "dockit" } - if {$classtmp == ""} { set classtmp "DockedApp" } - - toplevel .$insttmp -class $classtmp - wm command .$insttmp "$commandtmp" - wm group .$insttmp .$insttmp - label .$insttmp.l1 -text " -Great! Your new App-Icon should be finished now. -once you have dragged it to the Dock, Click Finish. -If your Icon doesn't Dock, or does not appear, -Try again. If problems persist, see Dockit's Help." - button .$insttmp.b1 -text "Finish" -command "destroy .$insttmp" - pack .$insttmp.l1 - pack .$insttmp.b1 - wm title .$insttmp "Dockit ${Version}: Confirmation" - } -} - -proc dohelp {} { - global Version - -set HLPTXT { Dockit V1.2 - -General Info: - - Dockit is a tool designed to provide the ability to Dock - poorly coded programs within WindowMaker. - - This is not a 100% accurate solution. It was not designed to be. - It will however, generate a dockable icon 99% of the time. - for that other 1%, you will need to edit by hand. - -Troubleshooting: - -Error: 'window name starts with an upper-case letter': - - This is a limitation of Tcl/Tk. - window/pathnames cannot start with an uppercase letter. - This behavior is most noticable in Netscape's Navigator. - It's instance is 'Navigator' - A work-around to this limitation, is to double-define your App - settings. (ex:'navigator', and 'Navigator') - - -Error: couldn't execute "xprop": no such file or directory - - This means that /usr/X11R6/bin (or its equivilent) - is not defined in your path. - You must add this to your path. - - - -AppIcon does not appear as it should: - - This could happen for a number of reasons. - A: You have NoAppIcon defined for that particular App. - B: One word: El Ni~no - - - -App Closes, but Dots do not appear/ Cannot remove Icon from the Dock: - - This is the result of a VERY poorly coded App. - As far as WIndowMaker can tell, the program is still running. - The only real fix for this, is CTRL + ALT + BACKSPACE - -} - - - toplevel .userhelp -class Dockit - wm group .userhelp .dockit - wm iconname .userhelp "Dockit HELP" - wm focusmodel .userhelp passive - wm geometry .userhelp 456x635 - wm maxsize .userhelp 1265 1265 - wm minsize .userhelp 1 1 - wm overrideredirect .userhelp 0 - wm resizable .userhelp 1 1 - wm deiconify .userhelp - wm title .userhelp "Dockit ${Version}: HELP" - label .userhelp.text \ - -anchor nw -justify left -borderwidth 1 \ - -text $HLPTXT - place .userhelp.text \ - -x 0 -y 0 -anchor nw -bordermode ignore - - - -} -proc dograb {} { - global xprop - global class - global instance - global command - - catch "open ~/GNUstep/.AppInfo/xprop1 w+" m1 - exec ${xprop} >@ $m1 - seek $m1 0 - set tmpmsg [read $m1] - set tmpmsg [split $tmpmsg \n] - close $m1 - #Make sure we are the leader - foreach junk $tmpmsg { - if {[string match "WM_TRANSIENT_FOR(WINDOW): window id \# *" $junk]} { - dograb+ [lindex $junk 4] NNNN - return 1 - } elseif {[string match "*window id # of group leader: *" $junk]} { - dograb+ [lindex $junk 6] NNNN - return 1 - } - } - - set tclass [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_CLASS*]] - set tclass [split $tclass ,] - set class [string trim [lindex $tclass 1] \ \"] - set instance [string tolower \ - [string trim [lindex [lindex $tclass 0] 2] \ \"]] - set tcom [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_COMMAND*]] - set tcom [split [lindex $tcom 2] \,] - set tcom [split [join $tcom] \"] - set command [join [join $tcom]] -} - - -proc dograb+ {winid sourcewin} { - global xprop - global class - global instance - global command - - catch "open ~/GNUstep/.AppInfo/xprop1 w+" m1 - exec ${xprop} -id $winid >@ $m1 - seek $m1 0 - set tmpmsg [read $m1] - set tmpmsg [split $tmpmsg \n] - - # Make sure we arent hitting a Loop, where we show ourself as - # The group leader. - if { ![string match $sourcewin $winid]} { - - # recurse to the toplevel leader. - foreach junk $tmpmsg { - if {[string match "WM_TRANSIENT_FOR(WINDOW): window id # *" $junk]} { - dograb+ [lindex $junk 4] $winid - return 1 - } elseif {[string match "*window id # of group leader: *" $junk]} { - dograb+ [lindex $junk 6] $winid - return 1 - } - } - } - - set tclass [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_CLASS*]] - set tclass [split $tclass ,] - set class [string trim [lindex $tclass 1] \ \"] - set instance [string tolower \ - [string trim [lindex [lindex $tclass 0] 2] \ \"]] - set tcom [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_COMMAND*]] - set tcom [split [lindex $tcom 2] \,] - set tcom [split [join $tcom] \"] - set command [join [join $tcom]] - close $m1 -} diff --git a/util/wm-oldmenu2new b/util/wm-oldmenu2new new file mode 100755 index 00000000..61f32f85 --- /dev/null +++ b/util/wm-oldmenu2new @@ -0,0 +1,203 @@ +#!/bin/sh +# +# wm-oldmenu2new: script to convert from old-style WindowMaker +# menu file to the new PropertyList style of the WMRootMenu. +# +# Note: ex in all the Linux systems I've used is badly +# broken, except for nex. perl can be relied on however. +# Re-written to use perl. +# +# Local dependencies: +# None. +# +# Authors: Luke Kendall, Toby J Sargeant +# +# Copyright waived; no warranty provided. +# + +GLW=GNUstep/Library/WindowMaker +GD=GNUstep/Defaults +WLW=$HOME/$GLW +WD=$HOME/$GD + +MYNAME=`basename $0` +USAGE="usage: $MYNAME [menu-file-specifier] + E.g. $MYNAME menu.pt + or $MYNAME pt + the default menu if no arguments are given is the English one, 'menu'." + +# +# Process arguments - work out which language menu we're converting. +# I am *assuming* that foreign language locales have the .lang suffix +# attached to the WMRootMenu name. I hope that's right! +# +OLD_MENU=menu +NEW_MENU=WMRootMenu +if [ $# = 1 ] +then + if [ -s "$WLW/menu.$1" ] + then + OLD_MENU="menu.$1" + NEW_MENU="WMRootMenu.$1" + elif [ -s "$WLW/$1" ] + then + OLD_MENU="$1" + x=`expr "$1" : "menu\.\(.*\)"` + [ "x$x" != "x" ] && NEW_MENU="WMRootMenu.$x" + else + echo "$MYNAME: $WLW/$1 does not exist" >&2 + exit 1 + fi +elif [ $# != 0 ] +then + echo "$USAGE" >&2 + exit 1 +fi + +# +# For working out what cc is installed +# +which1() +{ + oldpath=$PATH + PATH=/bin:/usr/bin:/usr/local/bin + + IFS=":" + for j in $oldpath + do + test -x $j/$1 && test ! -d $j/$1 && echo $j/$1 && return 0 + done + IFS=" " + return 1 +} + +# +# Expand macros if necessary. +# Create a temp copy of the menu file to edit to turn into the new. +# +T=/tmp/wmmenu$$ +echo "Converting $GLW/$OLD_MENU --> $GD/$NEW_MENU" +cd $WLW || exit 1 +if [ ! -s "$OLD_MENU" ] +then + echo "$MYNAME: $WLW/$OLD_MENU does not exist" >&2 + exit 1 +fi +# +# Always pre-process, to join lines split with \, and to strip comments. +# Not to mention the main purpose, include & process wmmacros if used. +# +set -e +CC=`which1 cc` +[ "x$CC" = "x" ] && CC=`which1 gcc` +[ "x$CC" = "x" ] && "$MYNAME: no cc, gcc found - can't preprocess" >&2 && exit 1 +cp $OLD_MENU $T-c +# +# Given the set -e, the exit 1 shouldn't be needed. But it is, on my NeXT! +# +$CC -E -I. $T-c > $T+c || exit 1 +sed '/^#/d;/^[ ]*$/d' $T+c > $T +rm $T-c $T+c +set +e + +# +# This is the interesting bit. Edit the old style menu and +# convert into new style property-list menu. +# +perl - $T <<-'EOF' > $T-p + $v=chr(22); + for (<>) { + push @foo,$_; + } + for (@foo) { + s/\s*$//; + s/^(\s*)"*(Workspaces*)"*\s\s*(WORKSPACE_MENU)/\1(\2, \3),/; + s/^(\s*)("[^"]*")\s+MENU/\1($v\n\1\2,/; + push @foo2,split "\n"; + } + @foo=(); + for (@foo2) { + s/^(\s*)"([^"]*)"\s\s*END/\1),/; + s/^(\s*)"([^"]*)"\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/; + push @foo,split "\n"; + } + @foo2=(); + for (@foo) { + s/^(\s*)"([^"]*)"\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/; + push @foo2,split "\n"; + } + @foo=(); + for (@foo2) { + s/^(\s*)([^ ]*)\s\s*MENU/\1($v\n\1"\2",/; + push @foo,split "\n"; + } + @foo2=(); + for (@foo) { + s/^(\s*)([^ ]*)\s\s*END/\1),/; + s/^(\s*)([^ ]*)\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/; + push @foo2,split "\n"; + } + @foo=(); + for (@foo2) { + s/^(\s*)([^ ]*)\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/; + push @foo,split "\n"; + } + @foo2=(); + for (@foo) { + s/ WITH / QQQjjQQQ /; + s/^(\s*)"([^"]*)"\s\s*([A-Z_][A-Z_]*)$/\1("\2", \3),/; + s/^(\s*)"([^"]*)"\s+([A-Z_][A-Z_]*)\s\s*(.*)$/\1("\2", \3, \4),/; + s/"(.*".*)"/JJJqqJJJ\1JJJqqJJJ/; + /JJJqqJJJ/ && s/"/\\"/g; + s/JJJqqJJJ/"/g; + s/ QQQjjQQQ / WITH /; + print "$_\n"; + } +EOF +mv $T-p $T + +# +# Now strip off spurious commas from lines like: +# ), +# ) +# since comma is a property separator, not terminator. Sigh. +# Also correct for another problem - Linux ex's require the CTRL-V +# above; a real vi/ex doesn't; so we have to strip out any spurious +# CTRL-V characters if we're using a real ex: +# +sed 's///g' $T | awk ' + { + if (last_line != null) + { + if ((last_line ~ /,$/) && ($0 ~ /^[ ]*\)/)) + print substr(last_line, 0, length(last_line)-1) + else + print last_line + } + last_line = $0 + } + +END { + if (last_line != null) + { + if (last_line ~ /,$/) + print substr(last_line, 0, length(last_line)-1) + else + print last_line + } + } +' > $WD/$NEW_MENU.new || exit 1 + +rm $T + +# +# Now install it. +# +cd $WD +if [ -s $NEW_MENU ] +then + echo "Preserving $NEW_MENU as $NEW_MENU.sav in $WD" + mv $NEW_MENU $NEW_MENU.sav +fi +mv $NEW_MENU.new $NEW_MENU && echo "Created new $WD/$NEW_MENU" + diff --git a/util/wmaker.inst.in b/util/wmaker.inst.in index a653721e..7dc1de26 100644 --- a/util/wmaker.inst.in +++ b/util/wmaker.inst.in @@ -1,6 +1,6 @@ #!/bin/sh # -# Install WindowMaker for the current user +# Install Window Maker for the current user # # directory where system wide configuration is stored @@ -16,9 +16,22 @@ BINDIR="#bindir#" make_script() { ISCRIPT=$1 - echo '#!/bin/sh' >> $ISCRIPT - echo '# WindowMaker Default .xinitrc' >> $ISCRIPT - echo "exec $BINDIR/wmaker" >> $ISCRIPT + + cat << EOF >> $ISCRIPT +#!/bin/sh +# Window Maker default X session startup script + +PATH="\$PATH:$BINDIR" + +# If you login from xdm, uncomment this to make error messages appear +# in the console window. +# +# tail -f $HOME/.xsession-errors > /dev/console + +exec wmaker + +EOF + chmod +rx $ISCRIPT } @@ -51,7 +64,7 @@ echo "Installing WindowMaker $VERSION for current user..." if [ ! -d $GLOBALDIR ]; then echo "Could not find global configurations files" - echo "Make sure you've installed WindowMaker correctly" + echo "Make sure you've installed Window Maker correctly" exit 1 fi @@ -175,6 +188,14 @@ else fi +if [ ! -d "$GSDIR/Library/WindowMaker/SoundSets" ]; then + echo "Creating sound set library $GSDIR/Library/WindowMaker/SoundSets" + mkdir $GSDIR/Library/WindowMaker/SoundSets +else + echo "Default SoundSets directory already exists. Skipping..." +fi + + echo "Copying default menu configuration files..." FILES=`(cd $GLOBALDIR;ls -1 menu* plmenu wmmacros)` all="" @@ -206,11 +227,28 @@ chmod +rx $GSDIR/Library/WindowMaker/autostart DATE=`date +%m%d%H%M` +show_end_message() { + +echo +echo "Installation Finished" +echo +echo "There are menus in 2 different file formats. The plain text format and" +echo "the property list format. The plain text format is more flexible, but" +echo "the menu in the property list format can be edited graphically. The" +echo "menu that will be used by default is the plain text. Read" +echo "$GSDIR/Library/WindowMaker/README for information on how to change it." + +} + + +trap "show_end_message;exit" 2 + echo echo "Now the .xinitrc, .Xclients or .xsession script must be updated so that" echo "it calls wmaker when you start an X session." echo "Type the name of the file that must be changed (normally .xinitrc)." echo "If the file already exists, it will be backed up with a .old.$DATE extension" +echo "If you want to edit it by hand, hit -C now." read file if test "x$file" = "x"; then @@ -224,12 +262,5 @@ fi make_script $USERDIR/$file -echo "Installation Finished" -echo -echo "There are menus in 2 different file formats. The plain text format and" -echo "the property list format. The plain text format is more flexible, but" -echo "the menu in the property list format can be edited graphically. The" -echo "menu that will be used by default is the plain text. Read" -echo "$GSDIR/Library/WindowMaker/README for information on how to change it." - +show_end_message diff --git a/util/wmsetbg.c b/util/wmsetbg.c index 3a3bf325..1eeaebaf 100644 --- a/util/wmsetbg.c +++ b/util/wmsetbg.c @@ -21,7 +21,6 @@ * USA. */ - #include #include #include @@ -49,7 +48,7 @@ char *ProgName; - +#ifdef at_one_step_from_the_trash /* Alfredo please take a look at this function. I don't like the way * it sends the XKillClient. Should it interfere this way with the rest? * This was added by the patch to allow the transparent background for Eterm. @@ -76,25 +75,34 @@ setPixmapProperty(Pixmap pixmap, Display *dpy, Window root) XGetWindowProperty(dpy, root, prop, 0L, 1L, True, AnyPropertyType, &type, &format, &length, &after, &data); + /* I think this is OK -Alfredo */ if ((type == XA_PIXMAP) && (format == 32) && (length == 1)) { XKillClient(dpy, *((Pixmap *)data)); } XDeleteProperty(dpy, root, prop); + /* I don't understand this one. The atom is *always* created in + the previous XInternAtom() -Alfredo */ prop = XInternAtom(dpy, "_XROOTPMAP_ID", True); if (prop == None) return; /* Now add the new one. We use PropModeAppend because PropModeReplace doesn't seem to work if there isn't already a property there. */ + /* Must be something wrong with this code. + * Anyways, better do a XGrabServer() between the XDeleteProperty() and + * this XChangeProperty() if things will be this way. -Alfredo */ XChangeProperty(dpy, root, prop, XA_PIXMAP, 32, PropModeAppend, (unsigned char *) &pixmap, 1); XFlush(dpy); + /* Potential resource leak. Must check the rest of the + * program for other resources that rely on XCloseDisplay() to + * free them. -Alfredo */ XSetCloseDownMode(dpy, RetainPermanent); XFlush(dpy); } - +#endif void* wmalloc(size_t size) @@ -235,6 +243,11 @@ getPixmapPath(char *domain) } + + + + + int main(int argc, char **argv) { @@ -361,7 +374,7 @@ main(int argc, char **argv) execlp(program, program, domain, "WorkspaceBack", value, NULL); printf("%s: warning could not run \"%s\"\n", ProgName, program); /* Do not exit. At least try to put the image in the background */ - /* Won't this waste CPU for nothing? We're going to be called again, + /* Won't this waste CPU for nothing? We're going to be called again, * anyways. -Alfredo */ /* If it fails to update the WindowMaker domain with "wdwrite" we * won't be called again, because Window Maker will not notice any @@ -400,7 +413,7 @@ main(int argc, char **argv) rcontext = RCreateContext(dpy, screen_number, &rattr); if (!rcontext) { printf("could not initialize graphics library context: %s\n", - RErrorString); + RMessageForError(RErrorCode)); exit(1); } @@ -418,7 +431,7 @@ main(int argc, char **argv) #endif if (!image) { - printf("could not load image %s:%s\n", image_name, RErrorString); + printf("could not load image %s:%s\n", image_name, RMessageForError(RErrorCode)); exit(1); } @@ -433,7 +446,7 @@ main(int argc, char **argv) exit(1); } RDestroyImage(image); - image = tmp; + image = tmp; } else if (style==WTP_CENTER && (image->width!=scr_width || image->height!=scr_height)) { RColor color; @@ -445,13 +458,13 @@ main(int argc, char **argv) tmp = RMakeCenteredImage(image, scr_width, scr_height, &color); if (!tmp) { printf("could not create centered image: %s\n", image_name); - exit(1); + exit(1); } RDestroyImage(image); image = tmp; } #ifdef DEBUG - gettimeofday(&timev, NULL); + gettimeofday(&timev, NULL); t2 = (double)timev.tv_sec + (((double)timev.tv_usec)/1000000); total = t2 - t1; printf("scale image in %f sec\n", total); @@ -470,7 +483,9 @@ main(int argc, char **argv) #endif RDestroyImage(image); if (secretBuffer==None) { +#ifdef at_one_step_from_the_trash setPixmapProperty(pixmap, dpy, root_win); +#endif XSetWindowBackgroundPixmap(dpy, root_win, pixmap); XClearWindow(dpy, root_win); } else { diff --git a/util/wxcopy.c b/util/wxcopy.c index 674352ab..ce43a1be 100644 --- a/util/wxcopy.c +++ b/util/wxcopy.c @@ -20,7 +20,9 @@ #include #include #include +#include #include +#include #define LINESIZE (4*1024) @@ -29,7 +31,16 @@ void help(char *progn) { - printf("usage: %s [-cutbuffer number] [filename]\n", progn); + fprintf + ( + stderr, + "usage: %s [options] [filename]\n" + " -display display\n" + " -cutbuffer number\n" + " -nolimit\n" + " -clearselection\n", + progn + ); } static int @@ -48,8 +59,12 @@ main(int argc, char **argv) char *filename=NULL; FILE *file=stdin; char *buf=NULL; + char *display_name=""; int l=0; - + int buf_len = 0; + int limit_check = 1; + int clear_selection = 0; + for (i=1; i 7) { - printf("%s: invalid buffer number %i\n", argv[0], - buffer); + fprintf(stderr, "%s: invalid buffer number %i\n", + argv[0], buffer); exit(1); } } else { help(argv[0]); exit(1); } + } else if (strcmp(argv[i], "-display")==0) { + if (i < argc-1) { + display_name = argv[++i]; + } else { + help(argv[0]); + exit(1); + } + } else if (strcmp(argv[i],"-clearselection")==0) { + clear_selection = 1; + } else if (strcmp(argv[i],"-nolimit")==0) { + limit_check = 0; } else { help(argv[0]); exit(1); @@ -90,10 +116,11 @@ main(int argc, char **argv) } } - dpy = XOpenDisplay(""); + dpy = XOpenDisplay(display_name); XSetErrorHandler(errorHandler); if (!dpy) { - printf("%s: could not open display\n", argv[0]); + fprintf(stderr, "%s: could not open display \"%s\"\n", argv[0], + XDisplayName(display_name)); exit(1); } if (buffer<0) { @@ -105,34 +132,61 @@ main(int argc, char **argv) char tmp[LINESIZE+2]; int nl=0; - if (!fgets(tmp, LINESIZE, file)) { + /* + * Use read() instead of fgets() to preserve NULs, since + * especially since there's no reason to read one line at a time. + */ + if ((nl = fread(tmp, 1, LINESIZE, file)) <= 0) { break; } - nl = strlen(tmp); - if (!buf) - nbuf = malloc(l+nl+1); - else - nbuf = realloc(buf, l+nl+1); + if (buf_len == 0) { + nbuf = malloc(buf_len = l+nl+1); + } + else { + if (buf_len < l+nl+1) { + /* + * To avoid terrible performance on big input buffers, + * grow by doubling, not by the minimum needed for the + * current line. + */ + buf_len = 2 * buf_len + nl + 1; + nbuf = realloc(buf, buf_len); + } + else { + nbuf = buf; + } + } if (!nbuf) { - printf("%s: out of memory\n", argv[0]); + fprintf(stderr, "%s: out of memory\n", argv[0]); exit(1); } buf=nbuf; - if (l==0) { - strcpy(buf,tmp); - } else { - strcat(buf, tmp); - } + /* + * Don't strcat, since it would make the algorithm n-squared. + * Don't use strcpy, since it stops on a NUL. + */ + memcpy(buf+l, tmp, nl); l+=nl; - if (l>=MAXDATA) { - printf("%s: too much data in input\n", argv[0]); + if (limit_check && l>=MAXDATA) { + fprintf + ( + stderr, + "%s: too much data in input - more than %d bytes\n" + " use the -nolimit argument to remove the limit check.\n", + argv[0], MAXDATA + ); exit(1); } } - if (buf) - XStoreBuffer(dpy, buf, l, buffer); + + if (clear_selection) { + XSetSelectionOwner(dpy, XA_PRIMARY, None, CurrentTime); + } + if (buf) { + XStoreBuffer(dpy, buf, l, buffer); + } XFlush(dpy); XCloseDisplay(dpy); - exit(1); + exit(buf == NULL || errno != 0); } diff --git a/util/wxpaste.c b/util/wxpaste.c index 086e80fb..d66bfbe1 100644 --- a/util/wxpaste.c +++ b/util/wxpaste.c @@ -17,20 +17,140 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "../src/config.h" + #include #include +#include #include #include +#include +#include +#include +#ifdef HAVE_SYS_SELECT_H +# include +#endif + +#define MAXDATA (4*1024*1024) -#define LINESIZE (4*1024) void help(char *progn) { - printf("usage: %s [-cutbuffer number]\n", progn); + fprintf(stderr, + "usage: %s [options]\n" + " -display display-name\n" + " -cutbuffer number\n" + " -selection [selection-name]\n" + , progn); +} + + +Time +getTimestamp(Display *dpy, Window win) +{ + XEvent ev; + + /* So we do this trickery to get a time stamp: + * + * 1. Grab the server because we are paranoid and don't want to + * get in a race with another instance of wxpaste being ran at the + * same time. + * + * 2. Set a dummy property in our window. + * + * 3. Get the PropertyNotify event and get it's timestamp. + * + * 4. Ungrab the server. + */ + + XSelectInput(dpy, win, PropertyChangeMask); + + /* Generate a PropertyNotify event */ + XStoreName(dpy, win, "shit"); + + /* wait for the event */ + while (1) { + XNextEvent(dpy, &ev); + if (ev.type == PropertyNotify) + break; + } + + return ev.xproperty.time; +} + + +char* +fetchSelection(Display *dpy, char *selection, char *progName) +{ + Atom selatom = XInternAtom(dpy, selection, False); + Atom clipatom = XInternAtom(dpy, "CLIPBOARD", False); + Time now; + XEvent ev; + Window win; + int ok = 0; + struct timeval timeout; + fd_set fdset; + + win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, + 0, 0, 0); + /* + * The ICCCM says that we can't pass CurrentTime as the timestamp + * for XConvertSelection(), but we don't have anything to use as + * a timestamp... + */ + now = getTimestamp(dpy, win); + + XConvertSelection(dpy, selatom, XA_STRING, clipatom, win, now); + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* wait for the convertion */ + while (0) { + int res; + + if (XPending(dpy)==0) { + FD_ZERO(&fdset); + FD_SET(ConnectionNumber(dpy), &fdset); + res = select(ConnectionNumber(dpy)+1, &fdset, NULL, NULL, + &timeout); + if (res <= 0) { + ok = 0; + break; + } + } + if (res > 0 || XPending(dpy) > 0) { + XNextEvent(dpy, &ev); + if (ev.type == SelectionNotify && ev.xany.window == win) { + ok = 1; + break; + } + } + } + + /* if success, return the data */ + if (ok) { + Atom rtype; + int bits; + unsigned long len, bytes; + unsigned char *data; + + if (XGetWindowProperty(dpy, win, clipatom, 0, MAXDATA/4, False, + XA_STRING, &rtype, &bits, &len, &bytes, &data)!=0) + return NULL; + + if ((rtype!=XA_STRING) || (bits!=8)) { + return NULL; + } else { + return (char*)data; + } + } + return NULL; } + int main(int argc, char **argv) { @@ -38,23 +158,39 @@ main(int argc, char **argv) int i, l; int buffer=0; char *buf; - + int status; + char *display_name=""; + char *selection_name=NULL; + for (i=1; i 7) { - printf("%s: invalid buffer number %i\n", argv[0], - buffer); + fprintf(stderr, "%s: invalid buffer number %i\n", + argv[0], buffer); exit(1); } } else { @@ -67,15 +203,32 @@ main(int argc, char **argv) exit(1); } } - dpy = XOpenDisplay(""); + dpy = XOpenDisplay(display_name); if (!dpy) { - printf("%s: could not open display\n", argv[0]); + fprintf(stderr, "%s: could not open display \"%s\"\n", argv[0], + XDisplayName(display_name)); exit(1); } - buf=XFetchBuffer(dpy, &l, buffer); - if (buf) - printf("%s", buf); + + if (selection_name) { + buf = fetchSelection(dpy, selection_name, argv[0]); + } else { + buf = NULL; + } + + if (buf == NULL) { + buf = XFetchBuffer(dpy, &l, buffer); + } + + if (buf == NULL) { + status = 1; + } else { + if (write(STDIN_FILENO, buf, l) == -1) + status = errno; + else + status = 0; + } XCloseDisplay(dpy); - exit(1); + exit(status); } diff --git a/wmlib/Makefile.in b/wmlib/Makefile.in index d457e60a..639ce0e1 100644 --- a/wmlib/Makefile.in +++ b/wmlib/Makefile.in @@ -68,8 +68,6 @@ 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@ diff --git a/wrlib/Makefile.am b/wrlib/Makefile.am index 4ccf2e41..6ff0be3e 100644 --- a/wrlib/Makefile.am +++ b/wrlib/Makefile.am @@ -15,6 +15,7 @@ libwraster_a_SOURCES = \ draw.c \ color.c \ load.c \ + save.c \ gradient.c \ xpixmap.c \ convert.c \ diff --git a/wrlib/Makefile.in b/wrlib/Makefile.in index 8d39df70..63de6b6c 100644 --- a/wrlib/Makefile.in +++ b/wrlib/Makefile.in @@ -68,8 +68,6 @@ 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@ @@ -106,6 +104,7 @@ libwraster_a_SOURCES = \ draw.c \ color.c \ load.c \ + save.c \ gradient.c \ xpixmap.c \ convert.c \ @@ -155,7 +154,7 @@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ libwraster_a_DEPENDENCIES = @ALLOCA@ -libwraster_a_OBJECTS = raster.o draw.o color.o load.o gradient.o \ +libwraster_a_OBJECTS = raster.o draw.o color.o load.o save.o gradient.o \ xpixmap.o convert.o context.o misc.o scale.o convolve.o nxpm.o xpm.o \ xutil.o ppm.o png.o jpeg.o tiff.o gif.o AR = ar diff --git a/wrlib/context.c b/wrlib/context.c index 21efc0e4..3c3c983f 100644 --- a/wrlib/context.c +++ b/wrlib/context.c @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -65,14 +66,11 @@ allocatePseudoColor(RContext *ctx) ncolors = cpc * cpc * cpc; } - if (cpc < 2 || ncolors > (1<depth)) { - sprintf(RErrorString, "invalid colormap size %i", cpc); - return NULL; - } + assert(cpc >= 2 && ncolors <= (1<depth)); colors = malloc(sizeof(XColor)*ncolors); if (!colors) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return NULL; } i=0; @@ -89,7 +87,6 @@ allocatePseudoColor(RContext *ctx) for (r=0; rdepth; } else { - if ( ncolors > (1<depth) ) { - /* reduce colormap size */ - cpc = ctx->attribs->colors_per_channel = 1<<((int)ctx->depth/3); - ncolors = cpc * cpc * cpc; - } + if ( ncolors > (1<depth) ) { + /* reduce colormap size */ + cpc = ctx->attribs->colors_per_channel = 1<<((int)ctx->depth/3); + ncolors = cpc * cpc * cpc; + } - if (cpc < 2 || ncolors > (1<depth)) { - sprintf(RErrorString, "invalid colormap size %i", cpc); - return NULL; - } + assert(cpc >= 2 && ncolors <= (1<depth)); } if (ncolors>=256 && ctx->vclass==StaticGray) { @@ -210,7 +204,7 @@ allocateGrayScale(RContext *ctx) colors = malloc(sizeof(XColor)*ncolors); if (!colors) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return False; } for (i=0; iattribs->bgamma = g3; } } + ptr = mygetenv("WRASTER_COLOR_RESOLUTION", screen_n); + if (ptr) { + int i; + if (sscanf(ptr, "%d", &i)!=1 || i<2 || i>6) { + printf("wrlib: invalid value for color resolution \"%s\"\n",ptr); + } else { + context->attribs->flags |= RC_ColorsPerChannel; + context->attribs->colors_per_channel = i; + } + } } @@ -355,6 +357,7 @@ getColormap(RContext *context, int screen_number) color.red = color.green = color.blue = 0xffff; XAllocColor(context->dpy, cmap, &color); context->white = color.pixel; + } context->cmap = cmap; } @@ -381,10 +384,9 @@ RCreateContext(Display *dpy, int screen_number, RContextAttributes *attribs) XGCValues gcv; - RErrorString[0]=0; context = malloc(sizeof(RContext)); if (!context) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return NULL; } memset(context, 0, sizeof(RContext)); @@ -396,7 +398,7 @@ RCreateContext(Display *dpy, int screen_number, RContextAttributes *attribs) context->attribs = malloc(sizeof(RContextAttributes)); if (!context->attribs) { free(context); - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return NULL; } if (!attribs) @@ -415,34 +417,34 @@ RCreateContext(Display *dpy, int screen_number, RContextAttributes *attribs) templ.visualid = context->attribs->visualid; vinfo = XGetVisualInfo(context->dpy, VisualIDMask|VisualScreenMask, &templ, &nret); - if (!vinfo || nret==0) { - sprintf(RErrorString, "invalid visual id %x\n", - (unsigned int)context->attribs->visualid); + free(context); + RErrorCode = RERR_BADVISUALID; + return NULL; + } + + if (vinfo[0].visual == DefaultVisual(dpy, screen_number)) { + context->attribs->flags |= RC_DefaultVisual; } else { - if (vinfo[0].visual == DefaultVisual(dpy, screen_number)) { - context->attribs->flags |= RC_DefaultVisual; - } else { - XSetWindowAttributes attr; - unsigned long mask; + XSetWindowAttributes attr; + unsigned long mask; - context->visual = vinfo[0].visual; - context->depth = vinfo[0].depth; - context->vclass = vinfo[0].class; - getColormap(context, screen_number); - attr.colormap = context->cmap; - attr.override_redirect = True; - attr.border_pixel = 0; - attr.background_pixel = 0; - mask = CWBorderPixel|CWColormap|CWOverrideRedirect|CWBackPixel; - context->drawable = - XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1, - 1, 1, 0, context->depth, CopyFromParent, - context->visual, mask, &attr); -/* XSetWindowColormap(dpy, context->drawable, attr.colormap);*/ - } - XFree(vinfo); + context->visual = vinfo[0].visual; + context->depth = vinfo[0].depth; + context->vclass = vinfo[0].class; + getColormap(context, screen_number); + attr.colormap = context->cmap; + attr.override_redirect = True; + attr.border_pixel = 0; + attr.background_pixel = 0; + mask = CWBorderPixel|CWColormap|CWOverrideRedirect|CWBackPixel; + context->drawable = + XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1, + 1, 1, 0, context->depth, CopyFromParent, + context->visual, mask, &attr); + /* XSetWindowColormap(dpy, context->drawable, attr.colormap);*/ } + XFree(vinfo); } /* use default */ diff --git a/wrlib/convert.c b/wrlib/convert.c index 3736f416..29029d30 100644 --- a/wrlib/convert.c +++ b/wrlib/convert.c @@ -48,7 +48,10 @@ char *alloca (); #include "wraster.h" -#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#ifdef XSHM +Pixmap R_CreateXImageMappedPixmap(RContext *context, RXImage *ximage); + +#endif typedef struct RConversionTable { @@ -58,51 +61,6 @@ typedef struct RConversionTable { } RConversionTable; -/* - * Lookup table for index*3/8 - */ -static char errorTable1[]={ - 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, - 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, - 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, - 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, - 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, - 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, - 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, - 42, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, - 48, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, - 54, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, - 60, 60, 60, 61, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, - 66, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, - 72, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, - 78, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, - 84, 84, 84, 85, 85, 85, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, - 90, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 94, 95 -}; -/* - * Lookup table for index*2/8 - */ -static char errorTable2[]={ - 0, 1, 2, 1, 2, 3, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, - 4, 5, 6, 5, 6, 7, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, - 8, 9, 10, 9, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, - 12, 13, 14, 13, 14, 15, 14, 15, 14, 15, 16, 15, 16, 17, 16, 17, - 16, 17, 18, 17, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, - 20, 21, 22, 21, 22, 23, 22, 23, 22, 23, 24, 23, 24, 25, 24, 25, - 24, 25, 26, 25, 26, 27, 26, 27, 26, 27, 28, 27, 28, 29, 28, 29, - 28, 29, 30, 29, 30, 31, 30, 31, 30, 31, 32, 31, 32, 33, 32, 33, - 32, 33, 34, 33, 34, 35, 34, 35, 34, 35, 36, 35, 36, 37, 36, 37, - 36, 37, 38, 37, 38, 39, 38, 39, 38, 39, 40, 39, 40, 41, 40, 41, - 40, 41, 42, 41, 42, 43, 42, 43, 42, 43, 44, 43, 44, 45, 44, 45, - 44, 45, 46, 45, 46, 47, 46, 47, 46, 47, 48, 47, 48, 49, 48, 49, - 48, 49, 50, 49, 50, 51, 50, 51, 50, 51, 52, 51, 52, 53, 52, 53, - 52, 53, 54, 53, 54, 55, 54, 55, 54, 55, 56, 55, 56, 57, 56, 57, - 56, 57, 58, 57, 58, 59, 58, 59, 58, 59, 60, 59, 60, 61, 60, 61, - 60, 61, 62, 61, 62, 63, 62, 63, 62, 63, 64, 63, 64, 65, 64 -}; - - - static RConversionTable *conversionTable = NULL; @@ -145,6 +103,7 @@ image2TrueColor(RContext *ctx, RImage *image) unsigned short rmask, gmask, bmask; unsigned short roffs, goffs, boffs; unsigned short *rtable, *gtable, *btable; + int ofs; ximg = RCreateXImage(ctx, ctx->depth, image->width, image->height); if (!ximg) { @@ -187,7 +146,7 @@ image2TrueColor(RContext *ctx, RImage *image) btable = computeTable(bmask); if (rtable==NULL || gtable==NULL || btable==NULL) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } @@ -197,133 +156,114 @@ image2TrueColor(RContext *ctx, RImage *image) #ifdef DEBUG puts("true color match"); #endif - for (y=0; y < image->height; y++) { - for (x=0; x < image->width; x++) { + for (y=0, ofs=0; y < image->height; y++) { + for (x=0; x < image->width; x++, ofs++) { /* reduce pixel */ - r = rtable[*red++]; - g = gtable[*grn++]; - b = btable[*blu++]; + r = rtable[red[ofs]]; + g = gtable[grn[ofs]]; + b = btable[blu[ofs]]; pixel = (r<image, x, y, pixel); } } } else { /* dither */ - unsigned char *rerr, *gerr, *berr; - unsigned char *nrerr, *ngerr, *nberr; - unsigned char *rerr_, *gerr_, *berr_; - unsigned char *nrerr_, *ngerr_, *nberr_; - unsigned char *terr; - register int ac, err; - int width = image->width; - int dr=0xff-rmask; - int dg=0xff-gmask; - int db=0xff-bmask; - - while ((dr & 1)==0) dr = dr >> 1; - while ((dg & 1)==0) dg = dg >> 1; - while ((db & 1)==0) db = db >> 1; + short *rerr, *gerr, *berr; + short *nrerr, *ngerr, *nberr; + short *terr; + int rer, ger, ber; + const int dr=0xff/rmask; + const int dg=0xff/gmask; + const int db=0xff/bmask; #ifdef DEBUG puts("true color dither"); #endif - rerr_ = rerr = (unsigned char*)alloca((width+2)*sizeof(char)); - gerr_ = gerr = (unsigned char*)alloca((width+2)*sizeof(char)); - berr_ = berr = (unsigned char*)alloca((width+2)*sizeof(char)); - nrerr_ = nrerr = (unsigned char*)alloca((width+2)*sizeof(char)); - ngerr_ = ngerr = (unsigned char*)alloca((width+2)*sizeof(char)); - nberr_ = nberr = (unsigned char*)alloca((width+2)*sizeof(char)); + rerr = (short*)alloca((image->width+2)*sizeof(short)); + gerr = (short*)alloca((image->width+2)*sizeof(short)); + berr = (short*)alloca((image->width+2)*sizeof(short)); + nrerr = (short*)alloca((image->width+2)*sizeof(short)); + ngerr = (short*)alloca((image->width+2)*sizeof(short)); + nberr = (short*)alloca((image->width+2)*sizeof(short)); if (!rerr || !gerr || !berr || !nrerr || !ngerr || !nberr) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } - for (x=0; xwidth; x++) { + rerr[x] = red[x]; + gerr[x] = grn[x]; + berr[x] = blu[x]; } rerr[x] = gerr[x] = berr[x] = 0; /* convert and dither the image to XImage */ - for (y=0; yheight; y++) { + for (y=0, ofs=0; yheight; y++) { if (yheight-1) { - memcpy(nrerr, red, width); - memcpy(ngerr, grn, width); - memcpy(nberr, blu, width); - red+=width; - grn+=width; - blu+=width; + int x1; + for (x=0, x1=ofs+image->width; xwidth; x++, x1++) { + nrerr[x] = red[x1]; + ngerr[x] = grn[x1]; + nberr[x] = blu[x1]; + } /* last column */ - nrerr[x] = *(red-1); - ngerr[x] = *(grn-1); - nberr[x] = *(blu-1); + x1--; + nrerr[x] = red[x1]; + ngerr[x] = grn[x1]; + nberr[x] = blu[x1]; } - for (x=0; xwidth; x++) { /* reduce pixel */ - pixel = (rtable[*rerr]<image, x, y, pixel); - /* calc error */ - err = *rerr&dr; - rerr++; - /* distribute error */ - ac = errorTable1[err] + *rerr; - *rerr=MIN(ac, 0xff); - ac = errorTable1[err] + *nrerr; - *nrerr=MIN(ac, 0xff); - nrerr++; - ac = *nrerr + errorTable2[err]; - *nrerr=MIN(ac,0xff); + if (rerr[x]>0xff) rerr[x]=0xff; else if (rerr[x]<0) rerr[x]=0; + if (gerr[x]>0xff) gerr[x]=0xff; else if (gerr[x]<0) gerr[x]=0; + if (berr[x]>0xff) berr[x]=0xff; else if (berr[x]<0) berr[x]=0; - /* calc error */ - err = *gerr&dg; - gerr++; - /* distribute error */ - ac = errorTable1[err] + *gerr; - *gerr=MIN(ac, 0xff); - ac = errorTable1[err] + *ngerr; - *ngerr=MIN(ac, 0xff); - ngerr++; - ac = *ngerr + errorTable2[err]; - *ngerr=MIN(ac,0xff); + r = rtable[rerr[x]]; + g = gtable[gerr[x]]; + b = btable[berr[x]]; + pixel = (r<image, x, y, pixel); /* calc error */ - err = *berr&db; - berr++; + rer = rerr[x] - r*dr; + ger = gerr[x] - g*dg; + ber = berr[x] - b*db; + /* distribute error */ - ac = errorTable1[err] + *berr; - *berr=MIN(ac, 0xff); - ac = errorTable1[err] + *nberr; - *nberr=MIN(ac, 0xff); - nberr++; - ac = *nberr + errorTable2[err]; - *nberr=MIN(ac,0xff); + r = (rer*3)/8; + g = (ger*3)/8; + b = (ber*3)/8; + /* x+1, y */ + rerr[x+1]+=r; + gerr[x+1]+=g; + berr[x+1]+=b; + /* x, y+1 */ + nrerr[x]+=r; + ngerr[x]+=g; + nberr[x]+=b; + /* x+1, y+1 */ + nrerr[x+1]+=rer-2*r; + ngerr[x+1]+=ger-2*g; + nberr[x+1]+=ber-2*b; } + ofs+=image->width; /* skip to next line */ - rerr = nrerr_; - nrerr = rerr_; - terr = nrerr_; - nrerr_ = rerr_; - rerr_ = terr; - - gerr = ngerr_; - ngerr = gerr_; - terr = ngerr_; - ngerr_ = gerr_; - gerr_ = terr; - - berr = nberr_; - nberr = berr_; - terr = nberr_; - nberr_ = berr_; - berr_ = terr; + terr = rerr; + rerr = nrerr; + nrerr = terr; + + terr = gerr; + gerr = ngerr; + ngerr = terr; + + terr = berr; + berr = nberr; + nberr = terr; } } return ximg; } - static RXImage* image2PseudoColor(RContext *ctx, RImage *image) { @@ -358,7 +298,7 @@ image2PseudoColor(RContext *ctx, RImage *image) btable = computeTable(bmask); if (rtable==NULL || gtable==NULL || btable==NULL) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } @@ -399,7 +339,7 @@ image2PseudoColor(RContext *ctx, RImage *image) ngerr = (short*)alloca((image->width+2)*sizeof(short)); nberr = (short*)alloca((image->width+2)*sizeof(short)); if (!rerr || !gerr || !berr || !nrerr || !ngerr || !nberr) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } @@ -437,12 +377,32 @@ image2PseudoColor(RContext *ctx, RImage *image) pixel = r*cpccpc + g*cpc + b; /*data[ofs] = ctx->colors[pixel].pixel;*/ XPutPixel(ximg->image, x, y, ctx->colors[pixel].pixel); + /* calc error */ rer = rerr[x] - r*dr; ger = gerr[x] - g*dg; ber = berr[x] - b*db; /* distribute error */ + rerr[x+1]+=(rer*7)/16; + gerr[x+1]+=(ger*7)/16; + berr[x+1]+=(ber*7)/16; + + nrerr[x]+=(rer*5)/16; + ngerr[x]+=(ger*5)/16; + nberr[x]+=(ber*5)/16; + + if (x>0) { + nrerr[x-1]+=(rer*3)/16; + ngerr[x-1]+=(ger*3)/16; + nberr[x-1]+=(ber*3)/16; + } + + nrerr[x+1]+=rer/16; + ngerr[x+1]+=ger/16; + nberr[x+1]+=ber/16; +#if 0 + /* distribute error */ r = (rer*3)/8; g = (ger*3)/8; b = (ber*3)/8; @@ -458,6 +418,7 @@ image2PseudoColor(RContext *ctx, RImage *image) nrerr[x+1]+=rer-2*r; ngerr[x+1]+=ger-2*g; nberr[x+1]+=ber-2*b; +#endif } /* skip to next line */ terr = rerr; @@ -473,6 +434,7 @@ image2PseudoColor(RContext *ctx, RImage *image) nberr = terr; } } + ximg->image->data = (char*)data; return ximg; } @@ -510,7 +472,7 @@ image2GrayScale(RContext *ctx, RImage *image) table = computeTable(gmask); if (table==NULL) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } @@ -543,7 +505,7 @@ image2GrayScale(RContext *ctx, RImage *image) gerr = (short*)alloca((image->width+2)*sizeof(short)); ngerr = (short*)alloca((image->width+2)*sizeof(short)); if (!gerr || !ngerr) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; RDestroyXImage(ctx, ximg); return NULL; } @@ -623,32 +585,57 @@ int RConvertImage(RContext *context, RImage *image, Pixmap *pixmap) { RXImage *ximg=NULL; - +#ifdef XSHM + Pixmap tmp; +#endif + assert(context!=NULL); assert(image!=NULL); assert(pixmap!=NULL); - /* clear error message */ - RErrorString[0] = 0; - + /* clear error message */ if (context->vclass == TrueColor) ximg = image2TrueColor(context, image); else if (context->vclass == PseudoColor || context->vclass == StaticColor) ximg = image2PseudoColor(context, image); else if (context->vclass == GrayScale || context->vclass == StaticGray) ximg = image2GrayScale(context, image); - + if (!ximg) { - strcat(RErrorString, ":could not convert RImage to XImage"); #ifdef C_ALLOCA alloca(0); #endif return False; } + + *pixmap = XCreatePixmap(context->dpy, context->drawable, image->width, image->height, context->depth); + +#ifdef XSHM + tmp = R_CreateXImageMappedPixmap(context, ximg); + if (tmp) { + /* + * We have to copy the shm Pixmap into a normal Pixmap because + * otherwise, we would have to control when Pixmaps are freed so + * that we can detach their shm segments. This is a problem if the + * program crash, leaving stale shared memory segments in the + * system (lots of them). But with some work, we can optimize + * things and remove this XCopyArea. This will require + * explicitly freeing all pixmaps when exiting or restarting + * wmaker. + */ + XCopyArea(context->dpy, tmp, *pixmap, context->copy_gc, 0, 0, + image->width, image->height, 0, 0); + XFreePixmap(context->dpy, tmp); + } else { + RPutXImage(context, *pixmap, context->copy_gc, ximg, 0, 0, 0, 0, + image->width, image->height); + } +#else /* !XSHM */ RPutXImage(context, *pixmap, context->copy_gc, ximg, 0, 0, 0, 0, - image->width, image->height); + image->width, image->height); +#endif /* !XSHM */ RDestroyXImage(context, ximg); @@ -683,7 +670,6 @@ RConvertImageMask(RContext *context, RImage *image, Pixmap *pixmap, ximg = image2Bitmap(context, image, threshold); if (!ximg) { - strcat(RErrorString, ":could not convert RImage mask to XImage"); #ifdef C_ALLOCA alloca(0); #endif @@ -710,8 +696,6 @@ RConvertImageMask(RContext *context, RImage *image, Pixmap *pixmap, Bool RGetClosestXColor(RContext *context, RColor *color, XColor *retColor) { - RErrorString[0] = 0; - if (context->vclass == TrueColor) { unsigned short rmask, gmask, bmask; unsigned short roffs, goffs, boffs; @@ -751,7 +735,7 @@ RGetClosestXColor(RContext *context, RColor *color, XColor *retColor) btable = computeTable(bmask); if (rtable==NULL || gtable==NULL || btable==NULL) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return False; } index = rtable[color->red]*cpccpc + gtable[color->green]*cpc @@ -777,8 +761,7 @@ RGetClosestXColor(RContext *context, RColor *color, XColor *retColor) *retColor = context->colors[index]; } else { - sprintf(RErrorString, "internal bug:unsupported visual:%i", - context->vclass); + RErrorCode = RERR_INTERNAL; return False; } diff --git a/wrlib/convolve.c b/wrlib/convolve.c index 8631adc3..901a9aee 100644 --- a/wrlib/convolve.c +++ b/wrlib/convolve.c @@ -130,7 +130,7 @@ RBlurImage(RImage *image) return True; outofmem: - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; #ifdef C_ALLOCA alloca(0); #endif diff --git a/wrlib/draw.c b/wrlib/draw.c index 1f0e59bc..89f5b955 100644 --- a/wrlib/draw.c +++ b/wrlib/draw.c @@ -68,8 +68,8 @@ RPutPixel(RImage *image, int x, int y, RColor *color) assert(image!=NULL); assert(color!=NULL); - assert(x >= 0 && x < image->width); - assert(y >= 0 && y < image->height); + if (x < 0 || x >= image->width || y < 0 || y >= image->height) + return; ofs = y*image->width + x; sr = image->data[0] + ofs; diff --git a/wrlib/gif.c b/wrlib/gif.c index 35030e69..0a98ebb8 100644 --- a/wrlib/gif.c +++ b/wrlib/gif.c @@ -58,12 +58,22 @@ RLoadGIF(RContext *context, char *file, int index) index = 0; /* default error message */ - sprintf(RErrorString, "file does not contain image of index %i", index); + RErrorCode = RERR_BADINDEX; gif = DGifOpenFileName(file); if (!gif) { - sprintf(RErrorString, "could not load gif file"); + switch (GifLastError()) { + case D_GIF_ERR_OPEN_FAILED: + RErrorCode = RERR_OPEN; + break; + case D_GIF_ERR_READ_FAILED: + RErrorCode = RERR_READ; + break; + default: + RErrorCode = RERR_BADIMAGEFILE; + break; + } return NULL; } @@ -76,8 +86,7 @@ RLoadGIF(RContext *context, char *file, int index) GifByteType *extension; if (DGifGetRecordType(gif, &recType) == GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } switch (recType) { case IMAGE_DESC_RECORD_TYPE: @@ -85,8 +94,7 @@ RLoadGIF(RContext *context, char *file, int index) break; if (DGifGetImageDesc(gif)==GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } width = gif->Image.Width; @@ -103,7 +111,6 @@ RLoadGIF(RContext *context, char *file, int index) * lets just render it with whatever garbage the stack * has :) * - sprintf(RErrorString, "bad gif file"); goto bye; */ @@ -117,13 +124,12 @@ RLoadGIF(RContext *context, char *file, int index) buffer = malloc(width * sizeof(GifColorType)); if (!buffer) { - sprintf(RErrorString, "out of memory while loading gif"); + RErrorCode = RERR_NOMEMORY; goto bye; } image = RCreateImage(width, height, False); if (!image) { - sprintf(RErrorString, "out of memory while loading gif"); goto bye; } @@ -134,8 +140,7 @@ RLoadGIF(RContext *context, char *file, int index) for (k = InterlacedOffset[j]; k < height; k += InterlacedJumps[j]) { if (DGifGetLine(gif, buffer, width)==GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } ofs = k*width; for (l = 0; l < width; l++, ofs++) { @@ -149,8 +154,7 @@ RLoadGIF(RContext *context, char *file, int index) } else { for (j = 0; j < height; j++) { if (DGifGetLine(gif, buffer, width)==GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } for (k = 0; k < width; k++, ofs++) { int pixel = buffer[k]; @@ -165,13 +169,11 @@ RLoadGIF(RContext *context, char *file, int index) case EXTENSION_RECORD_TYPE: /* skip all extension blocks */ if (DGifGetExtension(gif, &extCode, &extension)==GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } while (extension) { if (DGifGetExtensionNext(gif, &extension)==GIF_ERROR) { - sprintf(RErrorString, "error while loading gif"); - goto bye; + goto giferr; } } break; @@ -183,6 +185,18 @@ RLoadGIF(RContext *context, char *file, int index) /* yuck! */ goto did_not_get_any_errors; +giferr: + switch (GifLastError()) { + case D_GIF_ERR_OPEN_FAILED: + RErrorCode = RERR_OPEN; + break; + case D_GIF_ERR_READ_FAILED: + RErrorCode = RERR_READ; + break; + default: + RErrorCode = RERR_BADIMAGEFILE; + break; + } bye: if (image) RDestroyImage(image); diff --git a/wrlib/gradient.c b/wrlib/gradient.c index 8bbb5f58..cfaad316 100644 --- a/wrlib/gradient.c +++ b/wrlib/gradient.c @@ -220,8 +220,8 @@ renderVGradient(unsigned width, unsigned height, int r0, int g0, int b0, *---------------------------------------------------------------------- */ #if 0 -/* This version is slower then the second below. It uses more operations, - * most of them multiplication of floats. -Dan +/* This version is slower then the one below. It uses more operations, + * most of them multiplication of floats. Dan. */ static RImage* renderDGradient(unsigned width, unsigned height, int r0, int g0, int b0, diff --git a/wrlib/jpeg.c b/wrlib/jpeg.c index a26e0718..20beed11 100644 --- a/wrlib/jpeg.c +++ b/wrlib/jpeg.c @@ -109,12 +109,10 @@ RLoadJPEG(RContext *context, char *file_name, int index) file = fopen(file_name, "r"); if (!file) { - sprintf(RErrorString, "could not open JPEG file \"%s\"", file_name); + RErrorCode = RERR_OPEN; return NULL; } - RErrorString[0] = 0; - cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ @@ -135,13 +133,13 @@ RLoadJPEG(RContext *context, char *file_name, int index) buffer[0] = (JSAMPROW)malloc(cinfo.image_width*cinfo.num_components); if (!buffer[0]) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; goto bye; } image = RCreateImage(cinfo.image_width, cinfo.image_height, False); if (!image) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; goto bye; } diff --git a/wrlib/load.c b/wrlib/load.c index 1e23a5dd..ffb8023a 100644 --- a/wrlib/load.c +++ b/wrlib/load.c @@ -29,6 +29,7 @@ #include #include #include +#include #ifdef USE_PNG #include @@ -213,13 +214,13 @@ RLoadImage(RContext *context, char *file, int index) RImage *image = NULL; int i; struct stat st; - - RErrorString[0] = 0; - + + assert(file!=NULL); + if (RImageCacheSize<0) { init_cache(); } - + if (RImageCacheSize>0) { for (i=0; iwidth<3 || image->height<3) - return False; + return; w = image->width; h = image->height; @@ -86,11 +86,10 @@ RBevelImage(RImage *image, int bevel_type) ROperateLine(image, RAddOperation, 0, h-1, w-1, h-1, &cdelta); /* bottom */ ROperateLine(image, RAddOperation, w-1, 0, w-1, h-2, &cdelta); /* right */ } - return True; } -int +void RClearImage(RImage *image, RColor *color) { int bytes; @@ -111,21 +110,64 @@ RClearImage(RImage *image, RColor *color) dr = image->data[0]; dg = image->data[1]; db = image->data[2]; - - r = color->red; - g = color->green; - b = color->blue; + alpha = color->alpha; + r = color->red * alpha; + g = color->green * alpha; + b = color->blue * alpha; nalpha = 255 - alpha; for (i=0; i #include #include +#include #include "wraster.h" @@ -100,7 +101,7 @@ RGetImageFromXPMData(RContext *context, char **data) if (!color_table[0] || !color_table[1] || !color_table[2] || !color_table[3] || !symbol_table || !bsize) { - sprintf(RErrorString, "out of memory while converting XPM data"); + RErrorCode = RERR_MEMORY; alloca(0); return NULL; } @@ -149,7 +150,6 @@ RGetImageFromXPMData(RContext *context, char **data) image = RCreateImage(w, h, transp); if (!image) { - sprintf(RErrorString, "out of memory while converting XPM data"); alloca(0); return NULL; } @@ -205,7 +205,7 @@ RGetImageFromXPMData(RContext *context, char **data) return image; bad_format: - sprintf(RErrorString, "XPM data is not in the normalized format"); + RErrorCode = RERR_BADIMAGEFILE; #ifdef C_ALLOCA alloca(0); #endif @@ -234,7 +234,7 @@ RLoadXPM(RContext *context, char *file, int index) f = fopen(file, "r"); if (!f) { - sprintf(RErrorString, "can't open XPM file \"%s\"", file); + RErrorCode = RERR_OPEN; return NULL; } /* sig */ @@ -270,8 +270,7 @@ RLoadXPM(RContext *context, char *file, int index) if (!color_table[0] || !color_table[1] || !color_table[2] || !color_table[3] || !symbol_table || !bsize) { - sprintf(RErrorString, "out of memory while loading XPM file \"%s\"", - file); + RErrorCode = RERR_MEMORY; fclose(f); alloca(0); return NULL; @@ -325,8 +324,6 @@ RLoadXPM(RContext *context, char *file, int index) image = RCreateImage(w, h, transp); if (!image) { - sprintf(RErrorString, "out of memory while loading XPM file \"%s\"", - file); fclose(f); alloca(0); return NULL; @@ -390,7 +387,7 @@ RLoadXPM(RContext *context, char *file, int index) return image; bad_format: - sprintf(RErrorString, "XPM file \"%s\" is not in the normalized format", file); + RErrorCode = RERR_BADIMAGEFILE; fclose(f); #ifdef C_ALLOCA alloca(0); @@ -400,7 +397,7 @@ RLoadXPM(RContext *context, char *file, int index) return NULL; bad_file: - sprintf(RErrorString, "bad XPM file \"%s\"", file); + RErrorCode = RERR_BADIMAGEFILE; fclose(f); #ifdef C_ALLOCA alloca(0); @@ -411,3 +408,214 @@ RLoadXPM(RContext *context, char *file, int index) } #endif + + +typedef struct XPMColor { + unsigned char red; + unsigned char green; + unsigned char blue; + char text[12]; + struct XPMColor *next; +} XPMColor; + + + +#define I2CHAR(i) ((i)<12 ? (i)+'0' : ((i)<38 ? (i)+'A'-12 : (i)+'a'-38)) +#define CINDEX(xpmc) (((unsigned)(xpmc)->red)<<16|((unsigned)(xpmc)->green)<<8|((unsigned)(xpmc)->blue)) + + + +static XPMColor* +lookfor(XPMColor *list, int index) +{ + if (!list) + return NULL; + + for (; list!=NULL; list=list->next) { + if (CINDEX(list) == index) + return list; + } + return NULL; +} + +/* + * Looks for the color in the colormap and inserts if it is not found. + * + * list is a binary search list. The unbalancing problem is just ignored. + * + * Returns False on error + */ +static Bool +addcolor(XPMColor **list, unsigned r, unsigned g, unsigned b, int *colors) +{ + XPMColor *tmpc; + XPMColor *newc; + int index; + + index = r<<16|g<<8|b; + tmpc = *list; + + tmpc = lookfor(*list, index); + + if (tmpc) + return True; + + newc = malloc(sizeof(XPMColor)); + + if (!newc) { + + RErrorCode = RERR_NOMEMORY; + + return False; + } + + newc->red = r; + newc->green = g; + newc->blue = b; + newc->next = *list; + *list = newc; + + (*colors)++; + + return True; +} + + +static void +outputcolormap(FILE *file, XPMColor *colormap, int colorCount) +{ + int j; + int i,index; + + if (!colormap) + return; + + for (index=0; colormap!=NULL; colormap=colormap->next,index++) { + j = index; + for (i=0; itext[i] = I2CHAR(j&63); + j >>= 5; + } + colormap->text[i] = 0; + fprintf(file, "\"%s c #%02x%02x%02x\",\n", colormap->text, colormap->red, + colormap->green, colormap->blue); + } +} + + +static void +freecolormap(XPMColor *colormap) +{ + XPMColor *tmp; + + while (colormap) { + tmp = colormap->next; + free(colormap); + colormap = tmp; + } +} + + + +/* save routine is common to internal support and library support */ +Bool +RSaveXPM(RImage *image, char *filename) +{ + FILE *file; + int x, y; + int colorCount=0; + XPMColor *colormap = NULL; + XPMColor *tmpc; + int i; + int ok = 0; + unsigned char *r, *g, *b, *a; + char transp[16]; + + file = fopen(filename, "w+"); + if (!file) { + RErrorCode = RERR_OPEN; + return False; + } + + fprintf(file, "/* XPM */\n"); + + fprintf(file, "static char *image[] = {\n"); + + r = image->data[0]; + g = image->data[1]; + b = image->data[2]; + a = image->data[3]; + + /* first pass: make colormap for the image */ + if (a) + colorCount = 1; + for (y = 0; y < image->height; y++) { + for (x = 0; x < image->width; x++) { + if (!a || *a++>127) + if (!addcolor(&colormap, *r, *g, *b, &colorCount)) { + goto uhoh; + } + r++; g++; b++; + } + } + + /* write header info */ + fprintf(file, "\"%i %i %i %i\",\n", image->width, image->height, + colorCount, colorCount/64+1); + + + /* write colormap data */ + if (image->data[3]) { + for (i=0; idata[0]; + g = image->data[1]; + b = image->data[2]; + a = image->data[3]; + + /* write data */ + for (y = 0; y < image->height; y++) { + + fprintf(file, "\""); + + for (x = 0; x < image->width; x++) { + + if (!a || *a++>127) { + tmpc = lookfor(colormap, (unsigned)*r<<16|(unsigned)*g<<8|(unsigned)*b); + + fprintf(file, tmpc->text); + } else { + fprintf(file, transp); + } + + r++; g++; b++; + } + + if (y < image->height-1) + fprintf(file, "\",\n"); + else + fprintf(file, "\"};\n"); + } + + ok = 1; +uhoh: + errno = 0; + fclose(file); + if (ok && errno==ENOSPC) { + RErrorCode = RERR_WRITE; + } + + freecolormap(colormap); + + return ok ? True : False; +} + + diff --git a/wrlib/png.c b/wrlib/png.c index add88aa6..fa214422 100644 --- a/wrlib/png.c +++ b/wrlib/png.c @@ -73,20 +73,20 @@ RLoadPNG(RContext *context, char *file, int index) f = fopen(file, "r"); if (!f) { - sprintf(RErrorString, "could not open file \"%s\"", file); + RErrorCode = RERR_OPEN; return NULL; } png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)NULL, (png_error_ptr)NULL); if (!png) { - sprintf(RErrorString, "error loading PNG file \"%s\"", file); + RErrorCode = RERR_NOMEMORY; fclose(f); return NULL; } pinfo = png_create_info_struct(png); if (!pinfo) { - sprintf(RErrorString, "error loading PNG file \"%s\"", file); + RErrorCode = RERR_NOMEMORY; fclose(f); png_destroy_read_struct(&png, NULL, NULL); return NULL; @@ -94,14 +94,14 @@ RLoadPNG(RContext *context, char *file, int index) einfo = png_create_info_struct(png); if (!einfo) { - sprintf(RErrorString, "error loading PNG file \"%s\"", file); + RErrorCode = RERR_NOMEMORY; fclose(f); png_destroy_read_struct(&png, &pinfo, NULL); return NULL; } + RErrorCode = RERR_INTERNAL; if (setjmp(png->jmpbuf)) { - sprintf(RErrorString, "error loading PNG file \"%s\"", file); fclose(f); png_destroy_read_struct(&png, &pinfo, &einfo); if (image) @@ -126,7 +126,6 @@ RLoadPNG(RContext *context, char *file, int index) /* allocate RImage */ image = RCreateImage(width, height, alpha); if (!image) { - sprintf(RErrorString, "could not create RImage"); fclose(f); png_destroy_read_struct(&png, &pinfo, &einfo); return NULL; @@ -157,7 +156,7 @@ RLoadPNG(RContext *context, char *file, int index) } else if ((tmp = getenv("DISPLAY_GAMMA")) != NULL) { sgamma = atof(tmp); if (sgamma==0) - sgamma = 1; + sgamma = 1; } else { sgamma = 2.0; } @@ -179,7 +178,7 @@ RLoadPNG(RContext *context, char *file, int index) png_rows = alloca(sizeof(char*)*height); if (!png_rows) { - sprintf(RErrorString, "out of memory loading \"%s\"", file); + RErrorCode = RERR_NOMEMORY; fclose(f); RDestroyImage(image); png_destroy_read_struct(&png, &pinfo, &einfo); @@ -191,7 +190,7 @@ RLoadPNG(RContext *context, char *file, int index) for (y=0; ydata[0]; @@ -98,7 +96,7 @@ load_pixmap(char *file_name, FILE *file, int w, int h, int max, int raw) return image; short_file: - sprintf(RErrorString, "PPM file \"%s\" seems to be truncated", file_name); + RErrorCode = RERR_BADIMAGEFILE; return NULL; } @@ -114,11 +112,9 @@ RLoadPPM(RContext *context, char *file_name, int index) #define GETL() if (!fgets(buffer, 255, file)) goto short_file - RErrorString[0] = 0; - file = fopen(file_name, "r"); if (!file) { - sprintf(RErrorString, "could not open PPM file \"%s\"", file_name); + RErrorCode = RERR_OPEN; return NULL; } @@ -127,7 +123,7 @@ RLoadPPM(RContext *context, char *file_name, int index) /* only accept raw pixmaps or graymaps */ if (buffer[0] != 'P' || (buffer[1] != '5' && buffer[1] != '6')) { - sprintf(RErrorString, "unknown PPM format in \"%s\"", file_name); + RErrorCode = RERR_BADFORMAT; fclose(file); return NULL; } @@ -160,12 +156,8 @@ RLoadPPM(RContext *context, char *file_name, int index) return image; bad_file: - sprintf(RErrorString, "PPM file \"%s\" seems to be corrupted", file_name); - fclose(file); - return NULL; - short_file: - sprintf(RErrorString, "PPM file \"%s\" seems to be truncated", file_name); + RErrorCode = RERR_BADIMAGEFILE; fclose(file); return NULL; } diff --git a/wrlib/raster.c b/wrlib/raster.c index 9fbad280..fe94d426 100644 --- a/wrlib/raster.c +++ b/wrlib/raster.c @@ -29,12 +29,10 @@ #include -#define MAXERRLEN 512 +char *WRasterLibVersion="0.9"; -char *WRasterLibVersion="0.2"; - -char RErrorString[MAXERRLEN]; +int RErrorCode=RERR_NONE; @@ -48,7 +46,7 @@ RCreateImage(unsigned width, unsigned height, int alpha) image = malloc(sizeof(RImage)); if (!image) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return NULL; } @@ -69,7 +67,7 @@ RCreateImage(unsigned width, unsigned height, int alpha) } if (image) free(image); - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; return NULL; } @@ -207,11 +205,10 @@ RCombineImages(RImage *image, RImage *src) *dg = (((int)*dg * calpha) + ((int)*sg * alpha))/256; *db = (((int)*db * calpha) + ((int)*sb * alpha))/256; if (image->data[3]) - *da |= *sa; + *da++ |= *sa; dr++; dg++; db++; sr++; sg++; sb++; sa++; - da++; } } } @@ -223,7 +220,7 @@ void RCombineImagesWithOpaqueness(RImage *image, RImage *src, int opaqueness) { register int i; - unsigned char *dr, *dg, *db; + unsigned char *dr, *dg, *db, *da; unsigned char *sr, *sg, *sb, *sa; int c_opaqueness; @@ -234,6 +231,7 @@ RCombineImagesWithOpaqueness(RImage *image, RImage *src, int opaqueness) dr = image->data[0]; dg = image->data[1]; db = image->data[2]; + da = image->data[3]; sr = src->data[0]; sg = src->data[1]; @@ -255,14 +253,30 @@ RCombineImagesWithOpaqueness(RImage *image, RImage *src, int opaqueness) } else { int tmp; - for (i=0; iwidth*image->height; i++) { - tmp= (*sa * opaqueness)/256; - *dr = (((int)*dr *(int)(255-tmp)) + ((int)*sr *(int)tmp))/256; - *dg = (((int)*dg *(int)(255-tmp)) + ((int)*sg *(int)tmp))/256; - *db = (((int)*db *(int)(255-tmp)) + ((int)*sb *(int)tmp))/256; + if (image->data[3]) { + for (i=0; iwidth*image->height; i++) { + tmp = (*sa * opaqueness)/256; + *dr = (((int)*dr * (255-tmp)) + ((int)*sr * tmp))/256; + *dg = (((int)*dg * (255-tmp)) + ((int)*sg * tmp))/256; + *db = (((int)*db * (255-tmp)) + ((int)*sb * tmp))/256; + *da |= tmp; + + dr++; dg++; db++; + sr++; sg++; sb++; + sa++; + da++; + } + } else { + for (i=0; iwidth*image->height; i++) { + tmp = (*sa * opaqueness)/256; + *dr = (((int)*dr * (255-tmp)) + ((int)*sr * tmp))/256; + *dg = (((int)*dg * (255-tmp)) + ((int)*sg * tmp))/256; + *db = (((int)*db * (255-tmp)) + ((int)*sb * tmp))/256; + dr++; dg++; db++; sr++; sg++; sb++; sa++; + } } } #undef OP diff --git a/wrlib/save.c b/wrlib/save.c new file mode 100644 index 00000000..cfbd2238 --- /dev/null +++ b/wrlib/save.c @@ -0,0 +1,49 @@ +/* save.c - save image to file + * + * Raster graphics library + * + * Copyright (c) 1998 Alfredo K. Kojima + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "wraster.h" + + +extern Bool RSaveXPM(RImage *image, char *filename); + + +Bool +RSaveImage(RImage *image, char *filename, char *format) +{ + if (strcmp(format, "XPM")!=0) { + RErrorCode = RERR_BADFORMAT; + return False; + } + return RSaveXPM(image, filename); +} + diff --git a/wrlib/test.c b/wrlib/test.c index 20442cf4..66a663e9 100644 --- a/wrlib/test.c +++ b/wrlib/test.c @@ -1,7 +1,6 @@ -#include "wraster.h" - #include +#include "wraster.h" #include Display *dpy; @@ -57,12 +56,12 @@ void main(int argc, char **argv) #endif if (!img) { - puts(RErrorString); + puts(RMessageForError(RErrorCode)); exit(1); } new = RLoadImage(ctx, "tile.xpm", 0); if (!new) { - puts(RErrorString); + puts(RMessageForError(RErrorCode)); exit(1); } RCombineArea(new, img, 0, 0, img->width, img->height, 8, 8); diff --git a/wrlib/testdraw.c b/wrlib/testdraw.c index a982e0be..3ddbc84d 100644 --- a/wrlib/testdraw.c +++ b/wrlib/testdraw.c @@ -1,7 +1,6 @@ -#include "wraster.h" - #include +#include "wraster.h" #include #include #include @@ -9,6 +8,7 @@ #include #include + Display *dpy; RContext *ctx; char *ProgName; @@ -63,7 +63,7 @@ testDraw() * in the second slot, and also save a copy for later use. */ icon = RLoadImage(ctx, "ballot_box.xpm", 0); if (!icon) { - puts(RErrorString); + puts(RMessageForError(RErrorCode)); exit(1); } RCombineArea(img, icon, 0, 0, icon->width, icon->height, 8, 8); @@ -538,7 +538,7 @@ void main(int argc, char **argv) if (!ctx) { printf("could not initialize graphics library context: %s\n", - RErrorString); + RMessageForError(RErrorCode)); exit(1); } @@ -546,10 +546,10 @@ void main(int argc, char **argv) testDraw(); testBevel(); -/* + drawClip(); - benchmark(); -*/ + /* benchmark();*/ + getchar(); } diff --git a/wrlib/testgrad.c b/wrlib/testgrad.c index ed736856..c3ab7e30 100644 --- a/wrlib/testgrad.c +++ b/wrlib/testgrad.c @@ -1,7 +1,7 @@ -#include "wraster.h" #include +#include "wraster.h" #include #include #include @@ -116,7 +116,7 @@ void main(int argc, char **argv) if (!ctx) { printf("could not initialize graphics library context: %s\n", - RErrorString); + RMessageForError(RErrorCode)); exit(1); } @@ -139,14 +139,15 @@ void main(int argc, char **argv) val.background_pixel = ctx->black; val.colormap = ctx->cmap; + val.backing_store = Always; #ifdef BENCH win = XCreateWindow(dpy, DefaultRootWindow(dpy), 10, 10, 250, 250, 0, ctx->depth, InputOutput, ctx->visual, - CWColormap|CWBackPixel, &val); + CWColormap|CWBackPixel|CWBackingStore, &val); #else win = XCreateWindow(dpy, DefaultRootWindow(dpy), 10, 10, 750, 250, 0, ctx->depth, InputOutput, ctx->visual, - CWColormap|CWBackPixel, &val); + CWColormap|CWBackPixel|CWBackingStore, &val); #endif XMapRaised(dpy, win); XFlush(dpy); diff --git a/wrlib/tiff.c b/wrlib/tiff.c index 2cd11bd3..bd67d703 100644 --- a/wrlib/tiff.c +++ b/wrlib/tiff.c @@ -57,7 +57,7 @@ RLoadTIFF(RContext *context, char *file, int index) i = index; while (i>0) { if (!TIFFReadDirectory(tif)) { - sprintf(RErrorString, "bad index %i for file \"%s\"", index, file); + RErrorCode = RERR_BADINDEX; TIFFClose(tif); return NULL; } @@ -76,7 +76,7 @@ RLoadTIFF(RContext *context, char *file, int index) amode = (extrasamples == 1 && sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); if (width<1 || height<1) { - sprintf(RErrorString, "bad data in file \"%s\"", file); + RErrorCode = RERR_BADIMAGEFILE; TIFFClose(tif); return NULL; } @@ -85,10 +85,10 @@ RLoadTIFF(RContext *context, char *file, int index) ptr = data = (uint32*)_TIFFmalloc(width * height * sizeof(uint32)); if (!data) { - sprintf(RErrorString, "out of memory"); + RErrorCode = RERR_NOMEMORY; } else { if (!TIFFReadRGBAImage(tif, width, height, data, 0)) { - sprintf(RErrorString, "error reading file \"%s\"", file); + RErrorCode = RERR_BADIMAGEFILE; } else { /* convert data */ diff --git a/wrlib/view.c b/wrlib/view.c index a05b2dbd..ae69a7df 100644 --- a/wrlib/view.c +++ b/wrlib/view.c @@ -1,7 +1,6 @@ -#include "wraster.h" - #include +#include "wraster.h" #include #include #include "tile.xpm" @@ -32,11 +31,11 @@ void main(int argc, char **argv) img = RLoadImage(ctx, argv[1], argc>2 ? atol(argv[2]) : 0); if (!img) { - puts(RErrorString); + puts(RMessageForError(RErrorCode)); exit(1); } if (!RConvertImage(ctx, img, &pix)) { - puts(RErrorString); + puts(RMessageForError(RErrorCode)); exit(1); } diff --git a/wrlib/wraster.h b/wrlib/wraster.h index b86d5e28..252284b9 100644 --- a/wrlib/wraster.h +++ b/wrlib/wraster.h @@ -39,8 +39,8 @@ #define RLRASTER_H_ -/* version of the header for the library: 0.8 */ -#define WRASTER_HEADER_VERSION 8 +/* version of the header for the library: 0.10 */ +#define WRASTER_HEADER_VERSION 10 #ifdef HAVE_ALLOCA_H #include @@ -158,9 +158,11 @@ typedef struct RImage { */ typedef struct RXImage { XImage *image; + + /* Private data. Do not access */ #ifdef XSHM XShmSegmentInfo info; - int is_shared; + char is_shared; #endif } RXImage; @@ -216,6 +218,22 @@ enum { +/* error codes */ +#define RERR_NONE 0 +#define RERR_OPEN 1 /* cant open file */ +#define RERR_READ 2 /* error reading from file */ +#define RERR_WRITE 3 /* error writing to file */ +#define RERR_NOMEMORY 4 /* out of memory */ +#define RERR_NOCOLOR 5 /* out of color cells */ +#define RERR_BADIMAGEFILE 6 /* image file is corrupted or invalid */ +#define RERR_BADFORMAT 7 /* image file format is unknown */ +#define RERR_BADINDEX 8 /* no such image index in file */ + +#define RERR_BADVISUALID 16 /* invalid visual ID requested for context */ + +#define RERR_XERROR 127 /* internal X error */ +#define RERR_INTERNAL 128 /* should not happen */ + /* * Returns a NULL terminated array of strings containing the @@ -231,6 +249,7 @@ void RFreeStringList(char **list); RContext *RCreateContext(Display *dpy, int screen_number, RContextAttributes *attribs); +void RDestroyContext(RContext *context); Bool RGetClosestXColor(RContext *context, RColor *color, XColor *retColor); @@ -251,6 +270,10 @@ void RDestroyImage(RImage *image); RImage *RGetImageFromXPMData(RContext *context, char **data); +/* + * RImage storing + */ +Bool RSaveImage(RImage *image, char *filename, char *format); /* * Area manipulation @@ -320,9 +343,9 @@ void RHSVtoRGB(RHSVColor *hsv, RColor *rgb); /* * Painting */ -int RClearImage(RImage *image, RColor *color); +void RClearImage(RImage *image, RColor *color); -int RBevelImage(RImage *image, int bevel_type); +void RBevelImage(RImage *image, int bevel_type); RImage *RRenderGradient(unsigned width, unsigned height, RColor *from, RColor *to, int style); @@ -343,7 +366,7 @@ int RConvertImageMask(RContext *context, RImage *image, Pixmap *pixmap, /* * misc. utilities */ -RXImage *RCreateXImage(RContext *context, int depth, +RXImage *RCreateXImage(RContext *context, int depth, unsigned width, unsigned height); void RDestroyXImage(RContext *context, RXImage *ximage); @@ -352,13 +375,12 @@ void RPutXImage(RContext *context, Drawable d, GC gc, RXImage *ximage, int src_x, int src_y, int dest_x, int dest_y, unsigned width, unsigned height); +/* do not free the returned string! */ +const char *RMessageForError(int errorCode); -/****** Global Variables *******/ -/* - * Where error strings are stored - */ -extern char RErrorString[]; +/****** Global Variables *******/ +extern int RErrorCode; #endif diff --git a/wrlib/xpixmap.c b/wrlib/xpixmap.c index 7a8e3431..92885230 100644 --- a/wrlib/xpixmap.c +++ b/wrlib/xpixmap.c @@ -56,8 +56,6 @@ RCreateImageFromXImage(RContext *context, XImage *image, XImage *mask) int rshift, gshift, bshift; int rmask, gmask, bmask; - RErrorString[0] = 0; - assert(image!=NULL); assert(image->format==ZPixmap); assert(!mask || mask->format==ZPixmap); @@ -69,9 +67,7 @@ RCreateImageFromXImage(RContext *context, XImage *image, XImage *mask) /* I don't know why, but XGetImage() for pixmaps don't set the - * {red,green,blue}_mask values correctly. This will not - * work for imageis of depth different than the root window - * one used in wrlib + * {red,green,blue}_mask values correctly. */ if (context->depth==image->depth) { rmask = context->visual->red_mask; @@ -100,12 +96,25 @@ RCreateImageFromXImage(RContext *context, XImage *image, XImage *mask) #define NORMALIZE_BLUE(pixel) ((bshift>0) ? ((pixel) & bmask) >> bshift \ : ((pixel) & bmask) << -bshift) - for (y = 0; y < image->height; y++) { - for (x = 0; x < image->width; x++) { - pixel = XGetPixel(image, x, y); - *(r++) = NORMALIZE_RED(pixel); - *(g++) = NORMALIZE_GREEN(pixel); - *(b++) = NORMALIZE_BLUE(pixel); + if (image->depth==1) { + for (y = 0; y < image->height; y++) { + for (x = 0; x < image->width; x++) { + pixel = XGetPixel(image, x, y); + if (pixel) { + *(r++) = *(g++) = *(b++) = 0; + } else { + *(r++) = *(g++) = *(b++) = 0xff; + } + } + } + } else { + for (y = 0; y < image->height; y++) { + for (x = 0; x < image->width; x++) { + pixel = XGetPixel(image, x, y); + *(r++) = NORMALIZE_RED(pixel); + *(g++) = NORMALIZE_GREEN(pixel); + *(b++) = NORMALIZE_BLUE(pixel); + } } } @@ -115,7 +124,7 @@ RCreateImageFromXImage(RContext *context, XImage *image, XImage *mask) if (XGetPixel(mask, x, y)) { *(a++) = 0xff; } else { - *(a++) = 0xff; + *(a++) = 0; } } } @@ -134,7 +143,6 @@ RCreateImageFromDrawable(RContext *context, Drawable drawable, Pixmap mask) int foo; Window baz; - RErrorString[0] = 0; assert(drawable!=None); @@ -147,7 +155,7 @@ RCreateImageFromDrawable(RContext *context, Drawable drawable, Pixmap mask) ZPixmap); if (!pimg) { - sprintf(RErrorString, "could not get image"); + RErrorCode = RERR_XERROR; return NULL; } mimg = NULL; diff --git a/wrlib/xpm.c b/wrlib/xpm.c index 53bcbdb8..628d8dc6 100644 --- a/wrlib/xpm.c +++ b/wrlib/xpm.c @@ -45,25 +45,37 @@ RGetImageFromXPMData(RContext *context, char **data) int i; int transp=-1; - RErrorString[0] = 0; - if (XpmCreateXpmImageFromData(data, &xpm, (XpmInfo *)NULL)!=XpmSuccess) { - sprintf(RErrorString, "error converting XPM data"); + i = XpmCreateXpmImageFromData(data, &xpm, (XpmInfo *)NULL); + if (i!=XpmSuccess) { + switch (i) { + case XpmOpenFailed: + RErrorCode = RERR_OPEN; + break; + case XpmFileInvalid: + RErrorCode = RERR_BADIMAGEFILE; + break; + case XpmNoMemory: + RErrorCode = RERR_NOMEMORY; + break; + default: + RErrorCode = RERR_BADIMAGEFILE; + break; + } return NULL; } if (xpm.height<1 || xpm.width < 1) { - sprintf(RErrorString, "can't convert XPM data. Size too weird"); + RErrorCode = RERR_BADIMAGEFILE; XpmFreeXpmImage(&xpm); return NULL; } if (xpm.colorTable==NULL) { - sprintf(RErrorString, "error converting XPM data"); + RErrorCode = RERR_BADIMAGEFILE; XpmFreeXpmImage(&xpm); return NULL; } image = RCreateImage(xpm.width, xpm.height, True); if (!image) { - sprintf(RErrorString, ":could not create RImage"); XpmFreeXpmImage(&xpm); return NULL; } @@ -77,7 +89,7 @@ RGetImageFromXPMData(RContext *context, char **data) free(color_table[i]); } RDestroyImage(image); - sprintf(RErrorString, "out of memory while converting XPM data"); + RErrorCode = RERR_NOMEMORY; XpmFreeXpmImage(&xpm); return NULL; } @@ -141,26 +153,37 @@ RLoadXPM(RContext *context, char *file, int index) int i; int transp=-1; - RErrorString[0] = 0; - if (XpmReadFileToXpmImage(file, &xpm, (XpmInfo *)NULL)!=XpmSuccess) { - sprintf(RErrorString, "error loading XPM file \"%s\"", file); + i = XpmReadFileToXpmImage(file, &xpm, (XpmInfo *)NULL); + if (i!=XpmSuccess) { + switch (i) { + case XpmOpenFailed: + RErrorCode = RERR_OPEN; + break; + case XpmFileInvalid: + RErrorCode = RERR_BADIMAGEFILE; + break; + case XpmNoMemory: + RErrorCode = RERR_NOMEMORY; + break; + default: + RErrorCode = RERR_BADIMAGEFILE; + break; + } return NULL; } if (xpm.height<1 || xpm.width < 1) { - sprintf(RErrorString, "can't load XPM file \"%s\". Size too weird", - file); + RErrorCode = RERR_BADIMAGEFILE; XpmFreeXpmImage(&xpm); return NULL; } if (xpm.colorTable==NULL) { - sprintf(RErrorString, "error loading XPM file \"%s\"", file); + RErrorCode = RERR_BADIMAGEFILE; XpmFreeXpmImage(&xpm); return NULL; } image = RCreateImage(xpm.width, xpm.height, True); if (!image) { - strcat(RErrorString, ":could not create RImage"); XpmFreeXpmImage(&xpm); return NULL; } @@ -174,8 +197,7 @@ RLoadXPM(RContext *context, char *file, int index) free(color_table[i]); } RDestroyImage(image); - sprintf(RErrorString, "out of memory while loading file \"%s\"", - file); + RErrorCode = RERR_NOMEMORY; XpmFreeXpmImage(&xpm); return NULL; } @@ -224,5 +246,4 @@ RLoadXPM(RContext *context, char *file, int index) return image; } - #endif /* USE_XPM */ diff --git a/wrlib/xutil.c b/wrlib/xutil.c index 5a6ce952..8cc31a3f 100644 --- a/wrlib/xutil.c +++ b/wrlib/xutil.c @@ -39,6 +39,7 @@ #ifdef XSHM + static int shmError; static int (*oldErrorHandler)(); @@ -52,6 +53,8 @@ errorHandler(Display *dpy, XErrorEvent *err) return 0; } + + #endif @@ -59,26 +62,27 @@ RXImage* RCreateXImage(RContext *context, int depth, unsigned width, unsigned height) { RXImage *rximg; + Visual *visual = context->visual; rximg = malloc(sizeof(RXImage)); if (!rximg) { - sprintf(RErrorString, "out of memory trying to create XImage"); + RErrorCode = RERR_NOMEMORY; return NULL; } #ifndef XSHM - rximg->image = XCreateImage(context->dpy, context->visual, depth, + rximg->image = XCreateImage(context->dpy, visual, depth, ZPixmap, 0, NULL, width, height, 8, 0); if (!rximg->image) { free(rximg); - sprintf(RErrorString, "error creating XImage"); + RErrorCode = RERR_XERROR; return NULL; } rximg->image->data = malloc(rximg->image->bytes_per_line*height); if (!rximg->image->data) { XDestroyImage(rximg->image); free(rximg); - sprintf(RErrorString, "out of memory trying to create XImage"); + RErrorCode = RERR_NOMEMORY; return NULL; } @@ -86,42 +90,44 @@ RCreateXImage(RContext *context, int depth, unsigned width, unsigned height) if (!context->attribs->use_shared_memory) { retry_without_shm: rximg->is_shared = 0; - rximg->image = XCreateImage(context->dpy, context->visual, depth, + rximg->image = XCreateImage(context->dpy, visual, depth, ZPixmap, 0, NULL, width, height, 8, 0); if (!rximg->image) { free(rximg); - sprintf(RErrorString, "error creating XImage"); + RErrorCode = RERR_XERROR; return NULL; } rximg->image->data = malloc(rximg->image->bytes_per_line*height); if (!rximg->image->data) { XDestroyImage(rximg->image); free(rximg); - sprintf(RErrorString, "out of memory trying to create XImage"); + RErrorCode = RERR_NOMEMORY; return NULL; } } else { rximg->is_shared = 1; - rximg->image = XShmCreateImage(context->dpy, context->visual, depth, + rximg->info.readOnly = False; + + rximg->image = XShmCreateImage(context->dpy, visual, depth, ZPixmap, NULL, &rximg->info, width, height); rximg->info.shmid = shmget(IPC_PRIVATE, rximg->image->bytes_per_line*height, - IPC_CREAT|0770); + IPC_CREAT|0666); if (rximg->info.shmid < 0) { context->attribs->use_shared_memory = 0; - perror("wrlib:could not allocate shared memory segment:"); + perror("wrlib:could not allocate shared memory segment"); XDestroyImage(rximg->image); goto retry_without_shm; } rximg->info.shmaddr = shmat(rximg->info.shmid, 0, 0); - if (rximg->info.shmaddr == (void*)-1) { + if ((int)rximg->info.shmaddr < 0) { context->attribs->use_shared_memory = 0; if (shmctl(rximg->info.shmid, IPC_RMID, 0) < 0) - perror("wrlib:shmctl:"); + perror("wrlib:shmctl"); perror("wrlib:could not allocate shared memory"); XDestroyImage(rximg->image); goto retry_without_shm; @@ -141,13 +147,12 @@ RCreateXImage(RContext *context, int depth, unsigned width, unsigned height) context->attribs->use_shared_memory = 0; XDestroyImage(rximg->image); if (shmdt(rximg->info.shmaddr) < 0) - perror("wrlib:shmdt:"); + perror("wrlib:shmdt"); if (shmctl(rximg->info.shmid, IPC_RMID, 0) < 0) - perror("wrlib:shmctl:"); + perror("wrlib:shmctl"); printf("wrlib:error attaching shared memory segment to XImage\n"); goto retry_without_shm; } - } #endif /* XSHM */ @@ -160,20 +165,19 @@ RDestroyXImage(RContext *context, RXImage *rximage) { #ifndef XSHM XDestroyImage(rximage->image); + free(rximage); #else /* XSHM */ if (rximage->is_shared) { - XSync(context->dpy, False); XShmDetach(context->dpy, &rximage->info); XDestroyImage(rximage->image); if (shmdt(rximage->info.shmaddr) < 0) - perror("wrlib:shmdt:"); + perror("wrlib:shmdt"); if (shmctl(rximage->info.shmid, IPC_RMID, 0) < 0) - perror("wrlib:shmctl:"); + perror("wrlib:shmctl"); } else { XDestroyImage(rximage->image); } #endif - free(rximage); } @@ -197,3 +201,19 @@ RPutXImage(RContext *context, Drawable d, GC gc, RXImage *ximage, int src_x, #endif /* XSHM */ } + +#ifdef XSHM +Pixmap +R_CreateXImageMappedPixmap(RContext *context, RXImage *rximage) +{ + Pixmap pix; + + pix = XShmCreatePixmap(context->dpy, context->drawable, + rximage->image->data, &rximage->info, + rximage->image->width, rximage->image->height, + rximage->image->depth); + + return pix; +} + +#endif /* XSHM */ -- 2.11.4.GIT