diff options
Diffstat (limited to 'mac')
57 files changed, 0 insertions, 36321 deletions
diff --git a/mac/MW_TkBuildLibHeader.h b/mac/MW_TkBuildLibHeader.h deleted file mode 100644 index cbca0c2..0000000 --- a/mac/MW_TkBuildLibHeader.h +++ /dev/null @@ -1,7 +0,0 @@ -#if __POWERPC__ -#include "MW_TkBuildLibHeaderPPC" -#elif __CFM68K__ -#include "MW_TkBuildLibHeaderCFM68K" -#else -#include "MW_TkBuildLibHeader68K" -#endif diff --git a/mac/MW_TkBuildLibHeader.pch b/mac/MW_TkBuildLibHeader.pch deleted file mode 100644 index 727d7b9..0000000 --- a/mac/MW_TkBuildLibHeader.pch +++ /dev/null @@ -1,36 +0,0 @@ -/* - * MW_TkBuildLibHeader.pch -- - * - * This file is the source for a pre-compilied header that gets used - * for all files in the Tk projects. This make compilies go a bit - * faster. This file is only intended to be used in the MetroWerks - * CodeWarrior environment. It essentially acts as a place to set - * compiler flags. See MetroWerks documention for more details. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id$ - */ - -/* - * To use the compilied header you need to set the "Prefix file" in - * the "C/C++ Language" preference panel to point to the created - * compilied header. The name of the header depends on the - * architecture we are compiling for (see the code below). For - * example, for a 68k app the prefix file should be: MW_TclHeader68K. - */ - -#if __POWERPC__ -#pragma precompile_target "MW_TkBuildLibHeaderPPC" -#elif __CFM68K__ -#pragma precompile_target "MW_TkBuildLibHeaderCFM68K" -#else -#pragma precompile_target "MW_TkBuildLibHeader68K" -#endif - -#define BUILD_tk 1 - -#include "MW_TkHeaderCommon.h" diff --git a/mac/MW_TkHeader.h b/mac/MW_TkHeader.h deleted file mode 100755 index a5ee464..0000000 --- a/mac/MW_TkHeader.h +++ /dev/null @@ -1,7 +0,0 @@ -#if __POWERPC__ -#include "MW_TkHeaderPPC" -#elif __CFM68K__ -#include "MW_TkHeaderCFM68K" -#else -#include "MW_TkHeader68K" -#endif diff --git a/mac/MW_TkHeader.pch b/mac/MW_TkHeader.pch deleted file mode 100644 index c8a92d0..0000000 --- a/mac/MW_TkHeader.pch +++ /dev/null @@ -1,34 +0,0 @@ -/* - * MW_TkHeader.pch -- - * - * This file is the source for a pre-compilied header that gets used - * for all files in the Tk projects. This make compilies go a bit - * faster. This file is only intended to be used in the MetroWerks - * CodeWarrior environment. It essentially acts as a place to set - * compiler flags. See MetroWerks documention for more details. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: MW_TkHeader.pch,v 1.4 2001/11/23 02:04:25 das Exp $ - */ - -/* - * To use the compilied header you need to set the "Prefix file" in - * the "C/C++ Language" preference panel to point to the created - * compilied header. The name of the header depends on the - * architecture we are compiling for (see the code below). For - * example, for a 68k app the prefix file should be: MW_TclHeader68K. - */ - -#if __POWERPC__ -#pragma precompile_target "MW_TkHeaderPPC" -#elif __CFM68K__ -#pragma precompile_target "MW_TkHeaderCFM68K" -#else -#pragma precompile_target "MW_TkHeader68K" -#endif - -#include "MW_TkHeaderCommon.h" diff --git a/mac/MW_TkHeaderCommon.h b/mac/MW_TkHeaderCommon.h deleted file mode 100644 index ab43eb5..0000000 --- a/mac/MW_TkHeaderCommon.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * MW_TkHeaderCommon.h -- - * - * Common includes for precompiled headers - * - * Copyright (c) 1998 by Scriptics Corporation. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id$ - */ - -#pragma once - -#include "tclMacCommonPch.h" - -#ifdef TCL_DEBUG - #define TK_TEST -#endif - -/* - * The following defines are for the Xlib.h file to force - * it to generate prototypes in the way we need it. This is - * defined here in case X.h & company are ever included before - * tk.h. - */ - -#define NeedFunctionPrototypes 1 -#define NeedWidePrototypes 0 - -/* - * Place any includes below that will are needed by the majority of the - * and is OK to be in any file in the system. - */ - -#include "tcl.h" - -#include "tk.h" -#include "tkInt.h" diff --git a/mac/MW_TkOldImgHeader.h b/mac/MW_TkOldImgHeader.h deleted file mode 100755 index 309ca20..0000000 --- a/mac/MW_TkOldImgHeader.h +++ /dev/null @@ -1,3 +0,0 @@ -#define USE_OLD_IMAGE - -#include "MW_TkBuildLibHeader.pch" diff --git a/mac/MW_TkOldImgStaticHeader.h b/mac/MW_TkOldImgStaticHeader.h deleted file mode 100644 index 967b763..0000000 --- a/mac/MW_TkOldImgStaticHeader.h +++ /dev/null @@ -1,3 +0,0 @@ -#define USE_OLD_IMAGE - -#include "MW_TkStaticHeader.pch" diff --git a/mac/MW_TkStaticHeader.h b/mac/MW_TkStaticHeader.h deleted file mode 100644 index b381c22..0000000 --- a/mac/MW_TkStaticHeader.h +++ /dev/null @@ -1,7 +0,0 @@ -#if __POWERPC__ -#include "MW_TkStaticHeaderPPC" -#elif __CFM68K__ -#include "MW_TkStaticHeaderCFM68K" -#else -#include "MW_TkStaticHeader68K" -#endif diff --git a/mac/MW_TkStaticHeader.pch b/mac/MW_TkStaticHeader.pch deleted file mode 100644 index e6f7494..0000000 --- a/mac/MW_TkStaticHeader.pch +++ /dev/null @@ -1,36 +0,0 @@ -/* - * MW_TkStaticHeader.pch -- - * - * This file is the source for a pre-compilied header that gets used - * for all files in the Tk projects. This make compilies go a bit - * faster. This file is only intended to be used in the MetroWerks - * CodeWarrior environment. It essentially acts as a place to set - * compiler flags. See MetroWerks documention for more details. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id$ - */ - -/* - * To use the compilied header you need to set the "Prefix file" in - * the "C/C++ Language" preference panel to point to the created - * compilied header. The name of the header depends on the - * architecture we are compiling for (see the code below). For - * example, for a 68k app the prefix file should be: MW_TclHeader68K. - */ - -#if __POWERPC__ -#pragma precompile_target "MW_TkStaticHeaderPPC" -#elif __CFM68K__ -#pragma precompile_target "MW_TkStaticHeaderCFM68K" -#else -#pragma precompile_target "MW_TkStaticHeader68K" -#endif - -#define STATIC_BUILD 1 - -#include "MW_TkHeaderCommon.h" diff --git a/mac/MW_TkTestHeader.h b/mac/MW_TkTestHeader.h deleted file mode 100755 index 995e9fd..0000000 --- a/mac/MW_TkTestHeader.h +++ /dev/null @@ -1,7 +0,0 @@ -#if __POWERPC__ -#include "MW_TkTestHeaderPPC" -#elif __CFM68K__ -#include "MW_TkTestHeaderCFM68K" -#else -#include "MW_TkTestHeader68K" -#endif diff --git a/mac/MW_TkTestHeader.pch b/mac/MW_TkTestHeader.pch deleted file mode 100755 index 59a2a9a..0000000 --- a/mac/MW_TkTestHeader.pch +++ /dev/null @@ -1,42 +0,0 @@ -/* - * MW_TkTestHeader.pch -- - * - * This file is the source for a pre-compilied header that gets used - * for all files in the Tk projects. This make compilies go a bit - * faster. This file is only intended to be used in the MetroWerks - * CodeWarrior environment. It essentially acts as a place to set - * compiler flags. See MetroWerks documention for more details. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: MW_TkTestHeader.pch,v 1.2 2001/11/23 02:04:31 das Exp $ - */ - -/* - * To use the compilied header you need to set the "Prefix file" in - * the "C/C++ Language" preference panel to point to the created - * compilied header. The name of the header depends on the - * architecture we are compiling for (see the code below). For - * example, for a 68k app the prefix file should be: MW_TclHeader68K. - */ - -#if __POWERPC__ -#pragma precompile_target "MW_TkTestHeaderPPC" -#elif __CFM68K__ -#pragma precompile_target "MW_TkTestHeaderCFM68K" -#else -#pragma precompile_target "MW_TkTestHeader68K" -#endif - -#define BUILD_tk 1 - -#define STATIC_BUILD 1 - -#define TCL_DEBUG 1 - -#define TCL_THREADS 1 - -#include "MW_TkHeaderCommon.h" diff --git a/mac/README b/mac/README deleted file mode 100644 index 290f628..0000000 --- a/mac/README +++ /dev/null @@ -1,93 +0,0 @@ -Tk 8.4 for Macintosh - -Originally by Ray Johnson while at Sun Microsystems Labs -with major help from Jim Ingham while at Cygnus Solutions - -RCS: @(#) $Id: README,v 1.17.2.1 2005/12/04 00:51:29 das Exp $ - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -Note that Tk on Mac OS Classic is no longer supported and likely no longer -compiles, the last release known to work is 8.4.2. The 'mac' source -directory and all other Mac Classic code have been removed from Tk 8.5. - -The Mac OS X port of Tk can be found in the 'macosx' source directory. - -The information and URLs below are known to be outdated and incorrect. - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -1. Introduction ---------------- - -This is the README file for the Macintosh version of the Tk -extension for the Tcl scripting language. The file consists of -information specific to the Macintosh version of Tcl and Tk. For more -general information please read the README file in the main Tk -directory. - -3. Mac specific features ------------------------- - -There are several features or enhancements in Tk that are unique to -the Macintosh version of Tk. The list of these features is -maintained at - http://www.tcl.tk/software/mac/features.html - -4. The Distribution -------------------- - -Macintosh Tk is distributed in three different forms. This should -make it easier to only download what you need. Replace <version> -with the current version of Tk. The packages are as follows: - -mactk<version>.sea.hqx - - This distribution is a "binary" only release. It contains an - installer program that will install a 68k, PowerPC, or Fat - version of the "Wish" application. In addition, in installs - the Tcl & Tk libraries in the Extensions folder inside your - System Folder. (No "INIT"'s or Control Pannels are installed.) - -mactcltk-full-<version>.sea.hqx - - This release contains the full release of Tcl and Tk for the - Macintosh plus the More Files package on which Macintosh Tcl and - Tk rely. - -mactk-source-<version>.sea.hqx - - This release contains the complete source to Tk for the Macintosh - In addition, Metrowerks CodeWarrior libraries and project files - are included. However, you must already have the More Files - package to compile this code. - -5. Compiling Tk ---------------- - -In order to compile Macintosh Tk you must have the -following items: - - CodeWarrior Pro 5 or higher - Mac Tcl (source) - (which requires More Files 1.4.9) - Mac Tk (source) - -The project files included with the Mac Tcl source should work -fine. The only thing you may need to update are the access paths. -As with Tcl, you need to upgrade to the 2.0.1 version of the C -compilers or later to build the CFM68K version of Tcl/Tk. - -Special notes: - -* Check out the file bugs.doc for information about known bugs. - -* We are starting to support the new Appearance Manager that shipped - with MacOS 8.0. The Tk 8.0.3 release is the first Tk release - that supported the Appearance Manager well. Tk 8.0.4 extended this support - to the menu system, though you have to have Appearance 1.0.1 or later - installed for this to work. - - -If you have comments or Bug reports, use our on-line database at - http://tcl.sourceforge.net/ diff --git a/mac/bugs.doc b/mac/bugs.doc deleted file mode 100644 index 5f8081c..0000000 --- a/mac/bugs.doc +++ /dev/null @@ -1,54 +0,0 @@ -Known bug list for Tk 8.0 for Macintosh - -Originally by Ray Johnson -Sun Microsystems Laboratories -rjohnson@eng.sun.com - -Maintained by: -Jim Ingham -Cygnus Solutions, a Red Hat Company -jingham@cygnus.com - -RCS: @(#) $Id: bugs.doc,v 1.5 2000/02/10 08:47:16 jingham Exp $ - -We are now very close to passing the test suite for Tk. We are very -interested in finding remaining bugs that still linger. Please let us -know (and send us test cases) of any bugs you find. - -Known bugs: - -* Transient windows (set by wm transient) do not go away when the - master does. - -* Tearoff menus should be floating windows & floating windows should - float. They also shouldn't be resizable. - -* The -use and -container windows only work with other Tk windows in - the same process. Also, if you try really hard (for instance by binding - on Destroy of an embedded window and destroying the container's toplevel) - you can get Tk to crash. This should never be necessary, however, since - the destruction of the embedded window triggers the destruction of the - container, so you can watch that instead. - All the focus bugs in Tk8.0 have been fixed, however. - -* The send command is only implemented within the same app. - -* You cannot color buttons, and the indicators for radiobuttons and - checkbuttons under Appearance. They will always use the current - Theme color. But, then, you are not supposed to... - -* Drawing is not really correct. This shows up mostly in the canvas - when line widths are greater than one. Unfortunantly, this will not - be easy to fix. - -* The active menu highlight color in Tearoff menus will not match the system-wide - menu highlight color under Appearance. It will be black instead. This is not - easy to fix, since the Appearance API's don't really allow you to get your hands - on this information... - -There are many other bugs. However, will no get listed until they -are reported at least once. Send those bug reports in! - - - -Jim diff --git a/mac/tclets.r b/mac/tclets.r deleted file mode 100755 index e4553ae..0000000 --- a/mac/tclets.r +++ /dev/null @@ -1,172 +0,0 @@ -/* - * tclets.r -- - * - */ - -/* - * New style DLOG templates have an extra field for the positioning - * options for the Dialog Box. We will not use this, for now, so we - * turn it off here. - */ - -#define DLOG_RezTemplateVersion 0 - -#include <Types.r> -#include <SysTypes.r> -#include <AEUserTermTypes.r> - -/* - * We now load the Tclets code into the resource fork - */ - -#define TK_LIBRARY_RESOURCES 3000 - -read 'TEXT' (TK_LIBRARY_RESOURCES+114, "tclshrc", purgeable) - "::mac:tclets.tcl"; - -data 'icns' (-16455) { - $"6963 6E73 0000 08F8 6963 7323 0000 0048" /* icns...¯ics#...H */ - $"0100 02EE 05CE 09EE 13DE 23FF 47CE 86C6" /* ...Ó.‘Ó.Þ#G‘Ü */ - $"4681 22C2 12C4 0888 0410 0220 0140 0080" /* FÅ"¬.Ÿ.à... .@.Ä */ - $"0100 03EE 07CE 0FEE 1FFE 3FFF 7FFE FFFE" /* ...Ó.‘.Ó.œ?.œœ */ - $"7FFF 3FFE 1FFC 0FF8 07F0 03E0 01C0 0080" /* .?œ.¸.¯.•.ý.¿.Ä */ - $"6963 7334 0000 0088 0000 000F 0000 0000" /* ics4...à........ */ - $"0000 00FC F6D0 FFF0 0000 0FC5 DD00 F6F0" /* ...¸–•...‰ð.–• */ - $"0000 FCCD 66F0 F6F0 000F CC6E 66CE F6F0" /* ..¸Õf•–•..Ãnf‘–• */ - $"00FC CC6E 67EF F6FF 0FCC CD66 66CC F6F0" /* .¸ÃngÔ–.ÃÕffÖ• */ - $"FCCC CDDC 66CC CFA0 0FCC CD6C EDCC CC0F" /* ¸ÃÕÐfæÝ.ÃÕlÌÃÃ. */ - $"00FC CC6C E6CC CCF0 000F CC6C 66CC CF00" /* .¸ÃlÊÃÕ..Ãlfæ. */ - $"0000 FCCC 6CCC F000 0000 0FCC DCCF 0000" /* ..¸ÃlÕ....ÃЦ.. */ - $"0000 00FD DCF0 0000 0000 000F CF00 0000" /* ...›Ð•......¦... */ - $"0000 0000 F000 0000 6963 7338 0000 0108" /* ....•...ics8.... */ - $"0000 0000 0000 00FF 0000 0000 0000 0000" /* ............... */ - $"0000 0000 0000 FF2B FFEC 7F00 FFFF FF00" /* ......+Ï... */ - $"0000 0000 00FF 2BB0 7F7F 0000 FFEC FF00" /* .....+ƒ....Ï. */ - $"0000 0000 FF2B 2B7F ECEC FF00 FFEC FF00" /* ....++.ÏÏ.Ï. */ - $"0000 00FF 2B2B ECFC ECEC 2BFB FFEC FF00" /* ...++ϸÏÏ+šÏ. */ - $"0000 FF2B 2B2B ECFC ECC0 FBFF FFEC FFFF" /* ..+++ϸϿšÏ */ - $"00FF 2B2B 2B7F ECEC ECEC 2B2B FFEC FF00" /* .+++.ÏÏÏÏ++Ï. */ - $"FF2B 2B2B 2B7F 7FF6 ECEC 2B2B 2BFF FD00" /* ++++..–ÏÏ+++›. */ - $"00FF 2B2B 2B7F ECF6 FCF9 2B2B 2B2B 00FF" /* .+++.Ï–¸˜++++. */ - $"0000 FF2B 2B2B ECF6 FCEC 2B2B 2B2B FF00" /* ..+++Ï–¸Ï++++. */ - $"0000 00FF 2B2B ECF6 ECEC 2B2B 2BFF 0000" /* ...++Ï–ÏÏ+++.. */ - $"0000 0000 FF2B 2BF6 EC2B 2B2B FF00 0000" /* ....++–Ï+++... */ - $"0000 0000 00FF 2BF6 F92B 2BFF 0000 0000" /* .....+–˜++.... */ - $"0000 0000 0000 FFF9 F92B FF00 0000 0000" /* ......˜˜+..... */ - $"0000 0000 0000 00FF 2BFF 0000 0000 0000" /* .......+...... */ - $"0000 0000 0000 0000 FF00 0000 0000 0000" /* ............... */ - $"4943 4E23 0000 0108 0001 0000 0002 8000" /* ICN#..........Ä. */ - $"0004 78F8 0008 70F8 0010 F0F8 0021 E8F8" /* ..x¯..p¯..•¯.!˯ */ - $"0043 C4F8 0081 FAF8 0107 F1F8 0207 F0F8" /* .CŸ¯.Å™¯..Ò¯..•¯ */ - $"0407 F7FF 0807 E3FE 1007 E1FC 200E E0F8" /* ..—..“œ..·¸ .ý¯ */ - $"4002 E074 800E E022 400E E001 200E C002" /* @.ýtÄ.ý"@.ý. .¿. */ - $"1006 E004 0806 C008 0406 E010 0202 C020" /* ..ý...¿...ý...¿ */ - $"0102 C040 0080 8080 0040 0100 0020 0200" /* ..¿@.ÄÄÄ.@... .. */ - $"0010 0400 0008 0800 0004 1000 0002 2000" /* .............. . */ - $"0001 4000 0000 8000 0001 0000 0003 8000" /* ..@...Ä.......Ä. */ - $"0007 F8F8 000F F0F8 001F F0F8 003F F8F8" /* ..¯¯..•¯..•¯.?¯¯ */ - $"007F FCF8 00FF FEF8 01FF FFF8 03FF FFF8" /* ..¸¯.œ¯.¯.¯ */ - $"07FF FFFF 0FFF FFFE 1FFF FFFC 3FFF FFF8" /* ..œ.¸?¯ */ - $"7FFF FFFC FFFF FFFE 7FFF FFFF 3FFF FFFE" /* .¸œ.?œ */ - $"1FFF FFFC 0FFF FFF8 07FF FFF0 03FF FFE0" /* .¸.¯.•.ý */ - $"01FF FFC0 00FF FF80 007F FF00 003F FE00" /* .¿.Ä....?œ. */ - $"001F FC00 000F F800 0007 F000 0003 E000" /* ..¸...¯...•...ý. */ - $"0001 C000 0000 8000 6963 6C34 0000 0208" /* ..¿...Ä.icl4.... */ - $"0000 0000 0000 000F 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 00FC F000 0000 0000 0000" /* .......¸•....... */ - $"0000 0000 0000 0FCC CFD6 D000 FFFF F000" /* .......æ÷.•. */ - $"0000 0000 0000 FCCC C556 0000 F767 F000" /* ......¸Ã‰V..—g•. */ - $"0000 0000 000F CCCC 566F 0000 F676 F000" /* ......ÃÃVo..–v•. */ - $"0000 0000 00FC CCC5 6F5C F000 F767 F000" /* .....¸Ã‰o\•.—g•. */ - $"0000 0000 0FCC CC66 66CC 0F00 F676 F000" /* .....ÃÃffÃ..–v•. */ - $"0000 0000 FCCC CCD5 5666 FCF0 F767 F000" /* ....¸ÃùVf¸•—g•. */ - $"0000 000F CCCC C656 5667 CCCF F676 F000" /* ....ÃÃVVgæ–v•. */ - $"0000 00FC CCCC C6E5 5566 CCCC F767 F000" /* ...¸ÃÃÂUfÃ×g•. */ - $"0000 0FCC CCCC C656 5657 CFFF F676 FFFF" /* ...ÃÃÃVVW¦–v */ - $"0000 FCCC CCCC C6E5 565C CCF7 6767 67F0" /* ..¸ÃÃÃÂV\×ggg• */ - $"000F CCCC CCCC C655 565C CCCF 7676 7F00" /* ..ÃÃÃÃUV\ævv.. */ - $"00FC CCCC CCCC 7660 556C CCCC F767 F000" /* .¸ÃÃÃÃv`UlÃ×g•. */ - $"0FCC CCCC CCCC CD5D 567C CCCC CF7F CF00" /* .ÃÃÃÃÃÕ]V|Ãæ.¦. */ - $"FCCC CCCC CCCC 6660 556C CCCC CCFC CCF0" /* ¸ÃÃÃÃÃf`UlÃÃøÕ */ - $"0FCC CCCC CCCC 665C 565C CCCC CCCC CCCF" /* .ÃÃÃÃÃf\V\ÃÃÃÃæ */ - $"00FC CCCC CCCC 6660 E6DC CCCC CCCC CCF0" /* .¸ÃÃÃÃf`ÊÐÃÃÃÃÕ */ - $"000F CCCC CCCC C650 656C CCCC CCCC CF00" /* ..ÃÃÃÃPelÃÃÃæ. */ - $"0000 FCCC CCCC C6EC 5ECC CCCC CCCC F000" /* ..¸ÃÃÃÏ^ÃÃÃÃÕ. */ - $"0000 0FCC CCCC C650 566C CCCC CCCF 0000" /* ...ÃÃÃPVlÃÃæ.. */ - $"0000 00FC CCCC CC50 D5CC CCCC CCF0 0000" /* ...¸ÃÃÃP¹ÃÃÃÕ.. */ - $"0000 000F CCCC CC50 56CC CCCC CF00 0000" /* ....ÃÃÃPVÃÃæ... */ - $"0000 0000 FCCC CCD0 5CCC CCCC F000 0000" /* ....¸ÃÃ\ÃÃÕ... */ - $"0000 0000 0FCC CCD0 DCCC CCCF 0000 0000" /* .....ÃÃÐÃæ.... */ - $"0000 0000 00FC CCD0 DCCC CCF0 0000 0000" /* .....¸ÃÐÃÕ.... */ - $"0000 0000 000F CCD0 DCCC CF00 0000 0000" /* ......ÃÐæ..... */ - $"0000 0000 0000 FCC0 CCCC F000 0000 0000" /* ......¸¿ÃÕ..... */ - $"0000 0000 0000 0FCD CCCF 0000 0000 0000" /* .......Õæ...... */ - $"0000 0000 0000 00FC CCF0 0000 0000 0000" /* .......¸Ã•...... */ - $"0000 0000 0000 000F CF00 0000 0000 0000" /* ........¦....... */ - $"0000 0000 0000 0000 F000 0000 0000 0000" /* ........•....... */ - $"6963 6C38 0000 0408 0000 0000 0000 0000" /* icl8............ */ - $"0000 0000 0000 00FF 0000 0000 0000 0000" /* ............... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 FF2B FF00 0000 0000 0000" /* ......+....... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 00FF 2B2B 2BFF 7FEC 7F00 0000" /* .....+++.Ï.... */ - $"FFFF FFFF FF00 0000 0000 0000 0000 0000" /* ........... */ - $"0000 0000 FF2B 2B2B 2BB0 B0EC 0000 0000" /* ....++++ƒƒÏ.... */ - $"FFC0 ECC0 FF00 0000 0000 0000 0000 0000" /* ¿Ï¿........... */ - $"0000 00FF 2B2B 2B2B B0EC ECFF 0000 0000" /* ...++++ƒÏÏ.... */ - $"FFEC C0EC FF00 0000 0000 0000 0000 0000" /* Ï¿Ï........... */ - $"0000 FF2B 2B2B 2BB0 ECFF B02B FF00 0000" /* ..++++ƒÏƒ+... */ - $"FFC0 ECC0 FF00 0000 0000 0000 0000 0000" /* ¿Ï¿........... */ - $"00FF 2B2B 2B2B ECEC ECEC 2B2B 00FF 0000" /* .++++ÏÏÏÏ++... */ - $"FFEC C0EC FF00 0000 0000 0000 0000 0000" /* Ï¿Ï........... */ - $"FF2B 2B2B 2B2B F9B0 B0EC ECEC FF2B FF00" /* +++++˜ƒƒÏÏÏ+. */ - $"FFC0 ECC0 FF00 0000 0000 0000 0000 00FF" /* ¿Ï¿.......... */ - $"2B2B 2B2B 2BEC B0EC B0EC ECC0 2B2B 2BFF" /* +++++σσÏÏ¿+++ */ - $"FFEC C0EC FF00 0000 0000 0000 0000 FF2B" /* Ï¿Ï.........+ */ - $"2B2B 2B2B 2BEC FCB0 B0B0 ECEC 2B2B 2B2B" /* +++++ϸƒƒƒÏÏ++++ */ - $"FFC0 ECC0 FF00 0000 0000 0000 00FF 2B2B" /* ¿Ï¿........++ */ - $"2B2B 2B2B 2BEC B0EC B0EC B0C0 2BFF FFFF" /* +++++σσσ¿+ */ - $"FFEC C0EC FFFF FFFF 0000 0000 FF2B 2B2B" /* Ï¿Ï....+++ */ - $"2B2B 2B2B 2BEC FCB0 B0EC B02B 2B2B FFC0" /* +++++ϸƒƒÏƒ+++¿ */ - $"ECC0 ECC0 ECC0 FF00 0000 00FF 2B2B 2B2B" /* Ï¿Ï¿Ï¿....++++ */ - $"2B2B 2B2B 2BEC B0B0 B0EC B02B 2B2B 2BFF" /* +++++σƒƒÏƒ++++ */ - $"C0EC C0EC C0FF 0000 0000 FF2B 2B2B 2B2B" /* ¿Ï¿Ï¿....+++++ */ - $"2B2B 2B2B C0EC EC00 B0B0 EC2B 2B2B 2B2B" /* ++++¿ÏÏ.ƒƒÏ+++++ */ - $"FFC0 ECC0 FF00 0000 00FF 2B2B 2B2B 2B2B" /* ¿Ï¿....++++++ */ - $"2B2B 2B2B 2BF9 B0F9 B0EC C02B 2B2B 2B2B" /* +++++˜ƒ˜ƒÏ¿+++++ */ - $"2BFF C0FF 2BFF 0000 FF2B 2B2B 2B2B 2B2B" /* +¿+..+++++++ */ - $"2B2B 2B2B ECEC EC00 B0B0 EC2B 2B2B 2B2B" /* ++++ÏÏÏ.ƒƒÏ+++++ */ - $"2B2B FF2B 2B2B FF00 00FF 2B2B 2B2B 2B2B" /* +++++..++++++ */ - $"2B2B 2B2B ECEC B02B B0EC B02B 2B2B 2B2B" /* ++++Ïσ+ƒÏƒ+++++ */ - $"2B2B 2B2B 2B2B 2BFF 0000 FF2B 2B2B 2B2B" /* +++++++..+++++ */ - $"2B2B 2B2B ECEC EC00 FCEC F92B 2B2B 2B2B" /* ++++ÏÏÏ.¸Ï˜+++++ */ - $"2B2B 2B2B 2B2B FF00 0000 00FF 2B2B 2B2B" /* ++++++....++++ */ - $"2B2B 2B2B 2BEC B000 ECB0 EC2B 2B2B 2B2B" /* +++++σ.σÏ+++++ */ - $"2B2B 2B2B 2BFF 0000 0000 0000 FF2B 2B2B" /* +++++......+++ */ - $"2B2B 2B2B 2BEC FC2B B0FC 2B2B 2B2B 2B2B" /* +++++ϸ+ƒ¸++++++ */ - $"2B2B 2B2B FF00 0000 0000 0000 00FF 2B2B" /* ++++........++ */ - $"2B2B 2B2B 2BEC B000 B0EC EC2B 2B2B 2B2B" /* +++++σ.ƒÏÏ+++++ */ - $"2B2B 2BFF 0000 0000 0000 0000 0000 FF2B" /* +++..........+ */ - $"2B2B 2B2B 2B2B B000 7FB0 2B2B 2B2B 2B2B" /* ++++++ƒ..ƒ++++++ */ - $"2B2B FF00 0000 0000 0000 0000 0000 00FF" /* ++............ */ - $"2B2B 2B2B 2B2B B000 B0EC 2B2B 2B2B 2B2B" /* ++++++ƒ.ƒÏ++++++ */ - $"2BFF 0000 0000 0000 0000 0000 0000 0000" /* +.............. */ - $"FF2B 2B2B 2B2B F900 B02B 2B2B 2B2B 2B2B" /* +++++˜.ƒ+++++++ */ - $"FF00 0000 0000 0000 0000 0000 0000 0000" /* ............... */ - $"00FF 2B2B 2B2B F900 F92B 2B2B 2B2B 2BFF" /* .++++˜.˜++++++ */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 FF2B 2B2B F900 F92B 2B2B 2B2B FF00" /* ..+++˜.˜+++++. */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 00FF 2B2B F900 F92B 2B2B 2BFF 0000" /* ...++˜.˜++++.. */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 FF2B 2B00 2B2B 2B2B FF00 0000" /* ....++.++++... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 00FF 2BF9 2B2B 2BFF 0000 0000" /* .....+˜+++.... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 FF2B 2B2B FF00 0000 0000" /* ......+++..... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 00FF 2BFF 0000 0000 0000" /* .......+...... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 0000 FF00 0000 0000 0000" /* ............... */ - $"0000 0000 0000 0000" /* ........ */ -}; diff --git a/mac/tclets.tcl b/mac/tclets.tcl deleted file mode 100644 index 993a9b5..0000000 --- a/mac/tclets.tcl +++ /dev/null @@ -1,225 +0,0 @@ -# tclets.tcl -- -# -# Drag & Drop Tclets -# by Ray Johnson -# -# A simple way to create Tcl applications. This applications will copy a -# droped Tcl file into a copy of a stub application (the user can pick). -# The file is placed into the TEXT resource named "tclshrc" which is -# automatically executed on startup. -# -# RCS: @(#) $Id: tclets.tcl,v 1.3 2001/08/06 18:29:41 dgp Exp $ -# -# Copyright (c) 1997 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -namespace eval ::tk {} -namespace eval ::tk::mac {} - -# ::tk::mac::OpenDocument -- -# -# This procedure is a called whenever Wish recieves an "Open" event. The -# procedure must be named ::tk::mac::OpenDocument for this to work. -# Passed in files are assumed to be Tcl files that the user wants to be -# made into Tclets. (Only the first one is used.) The procedure then -# creates a copy of the stub app and places the Tcl file in the new -# application's resource fork. -# -# Parameters: -# args List of files -# -# Results: -# One success a new Tclet is created. - -proc ::tk::mac::OpenDocument {args} { - variable Droped_to_start - - # We only deal with the one file droped on the App - set tclFile [lindex $args 0] - set stub [GetStub] - - # Give a helper screen to guide user - toplevel .helper -menu .bar - ::tk::unsupported::MacWindowStyle style .helper dBoxProc - message .helper.m -aspect 300 -text \ - "Select the name & location of your target Tcl application." - pack .helper.m - wm geometry .helper +20+40 - update idletasks - - # Get the target file from the end user - set target [tk_getSaveFile] - destroy .helper - if {$target == ""} return - - # Copy stub, copy the droped file into the stubs text resource - file copy $stub $target - set id [open $tclFile r] - set rid [resource open $target w] - resource write -name tclshrc -file $rid TEXT [read $id] - resource close $rid - close $id - - # This is a hint to the start-up code - always set to true - set Droped_to_start true -} - -# ::tk::mac::GetStub -- -# -# Get the location of our stub application. The value may be cached, -# in the preferences file, or we may need to ask the user. -# -# Parameters: -# None. -# -# Results: -# A path to the stub application. - -proc ::tk::mac::GetStub {} { - global env - variable Stub_location - - if {[info exists Stub_location]} { - return $Stub_location - } - - set file $env(PREF_FOLDER) - append file "D&D Tclet Preferences" - - - if {[file exists $file]} { - uplevel #0 [list source $file] - if {[info exists Stub_location] && [file exists $Stub_location]} { - return $Stub_location - } - } - - SelectStub - - if {[info exists Stub_location]} { - return $Stub_location - } else { - exit - } -} - -# ::tk::mac::SelectStub -- -# -# This procedure uses tk_getOpenFile to allow the user to select -# the copy of "Wish" that is used as the basis for Tclets. The -# result is stored in a preferences file. -# -# Parameters: -# None. -# -# Results: -# None. The prefernce file is updated. - -proc ::tk::mac::SelectStub {} { - global env - variable Stub_location - - # Give a helper screen to guide user - toplevel .helper -menu .bar - ::tk::unsupported::MacWindowStyle style .helper dBoxProc - message .helper.m -aspect 300 -text \ - "Select \"Wish\" stub to clone. A copy of this application will be made to create your Tclet." \ - - pack .helper.m - wm geometry .helper +20+40 - update idletasks - - set new_location [tk_getOpenFile] - destroy .helper - if {$new_location != ""} { - set Stub_location $new_location - set file [file join $env(PREF_FOLDER) "D&D Tclet Preferences"] - - set id [open $file w] - puts $id [list set [namespace which -variable Stub_location] \ - $Stub_location] - close $id - } -} - -# ::tk::mac::CreateMenus -- -# -# Create the menubar for this application. -# -# Parameters: -# None. -# -# Results: -# None. - -proc ::tk::mac::CreateMenus {} { - menu .bar - .bar add cascade -menu .bar.file -label File - .bar add cascade -menu .bar.apple - . configure -menu .bar - - menu .bar.apple -tearoff 0 - .bar.apple add command -label "About Drag & Drop Tclets..." \ - -command [namespace code ShowAbout] - - menu .bar.file -tearoff 0 - .bar.file add command -label "Show Console..." -command {console show} - .bar.file add command -label "Select Wish Stub..." \ - -command [namespace code SelectStub] - .bar.file add separator - .bar.file add command -label "Quit" -accel Command-Q -command exit -} - -# ::tk::mac::ShowAbout -- -# -# Show the about box for Drag & Drop Tclets. -# -# Parameters: -# None. -# -# Results: -# None. - -proc ::tk::mac::ShowAbout {} { - tk_messageBox -icon info -type ok -message \ -"Drag & Drop Tclets -by Ray Johnson\n\n\ -Copyright (c) 1997 Sun Microsystems, Inc." -} - -# ::tk::mac::Start -- -# -# This procedure provides the main start-up code for the application. -# It should be run first thing on start up. It will create the UI -# and set up the rest of the state of the application. -# -# Parameters: -# None. -# -# Results: -# None. - -proc ::tk::mac::Start {} { - variable Droped_to_start - - # Hide . & console - see if we ran as a droped item - wm geometry . 1x1-25000-25000 - console hide - - # Run update - if we get any drop events we know that we were - # started by a drag & drop - if so, we quit automatically when done - set Droped_to_start false - update - if {$Droped_to_start == "true"} { - exit - } - - # We were not started by a drag & drop - create the UI - CreateMenus -} - -# Now that everything is defined, lets start the app! -::tk::mac::Start diff --git a/mac/tkMac.h b/mac/tkMac.h deleted file mode 100644 index 07b22e9..0000000 --- a/mac/tkMac.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * tkMacInt.h -- - * - * Declarations of Macintosh specific exported variables and procedures. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMac.h,v 1.8 2001/11/23 02:05:24 das Exp $ - */ - -#ifndef _TKMAC -#define _TKMAC - -#ifndef _TK -#include <tk.h> -#endif - -#ifndef _TKINT -#include "tkInt.h" -#endif - -#include <Windows.h> -#include <QDOffscreen.h> - -#ifdef BUILD_tk -# undef TCL_STORAGE_CLASS -# define TCL_STORAGE_CLASS DLLEXPORT -#endif - -/* - * This variable is exported and can be used by extensions. It is the - * way Tk extensions should access the QD Globals. This is so Tk - * can support embedding itself in another window. - */ - -EXTERN QDGlobalsPtr tcl_macQdPtr; - -/* - * Structures and function types for handling Netscape-type in process - * embedding where Tk does not control the top-level - */ -typedef int (Tk_MacEmbedRegisterWinProc) (int winID, Tk_Window window); -typedef GWorldPtr (Tk_MacEmbedGetGrafPortProc) (Tk_Window window); -typedef int (Tk_MacEmbedMakeContainerExistProc) (Tk_Window window); -typedef void (Tk_MacEmbedGetClipProc) (Tk_Window window, RgnHandle rgn); -typedef void (Tk_MacEmbedGetOffsetInParentProc) (Tk_Window window, Point *ulCorner); - -#include "tkPlatDecls.h" - -# undef TCL_STORAGE_CLASS -# define TCL_STORAGE_CLASS DLLIMPORT - -#endif /* _TKMAC */ diff --git a/mac/tkMacAppInit.c b/mac/tkMacAppInit.c deleted file mode 100644 index abbe279..0000000 --- a/mac/tkMacAppInit.c +++ /dev/null @@ -1,420 +0,0 @@ -/* - * tkMacAppInit.c -- - * - * Provides a version of the Tcl_AppInit procedure for the example shell. - * - * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacAppInit.c,v 1.15 2002/10/18 03:01:33 das Exp $ - */ - -#include <Gestalt.h> -#include <ToolUtils.h> -#include <Fonts.h> -#include <Dialogs.h> -#include <SegLoad.h> -#include <Traps.h> -#include <Appearance.h> - -#include "tk.h" -#include "tkInt.h" -#include "tkMacInt.h" -#include "tclInt.h" -#include "tclMac.h" -#include "tclMacInt.h" - -#ifdef TK_TEST -extern int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp)); -#endif /* TK_TEST */ - -Tcl_Interp *gStdoutInterp = NULL; - -int TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr)); - -/* - * Prototypes for functions the ANSI library needs to link against. - */ -short InstallConsole _ANSI_ARGS_((short fd)); -void RemoveConsole _ANSI_ARGS_((void)); -long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n)); -long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n)); -extern char * __ttyname _ANSI_ARGS_((long fildes)); -int kbhit _ANSI_ARGS_((void)); -int getch _ANSI_ARGS_((void)); -void clrscr _ANSI_ARGS_((void)); -short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event)); - -/* - * Forward declarations for procedures defined later in this file: - */ - -static int MacintoshInit _ANSI_ARGS_((void)); -static int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp)); -static void SetupSIOUX _ANSI_ARGS_((void)); - -static int inMacExit = 0; -static pascal void NoMoreOutput() { inMacExit = 1; } - -/* - *---------------------------------------------------------------------- - * - * main -- - * - * Main program for Wish. - * - * Results: - * None. This procedure never returns (it exits the process when - * it's done - * - * Side effects: - * This procedure initializes the wish world and then - * calls Tk_Main. - * - *---------------------------------------------------------------------- - */ - -void -main( - int argc, /* Number of arguments. */ - char **argv) /* Array of argument strings. */ -{ - char *newArgv[2]; - - if (MacintoshInit() != TCL_OK) { - Tcl_Exit(1); - } - - argc = 1; - newArgv[0] = "Wish"; - newArgv[1] = NULL; - - /* Tk_Main is actually #defined to - * Tk_MainEx(argc, argv, Tcl_AppInit, Tcl_CreateInterp()) - * Unfortunately, you also HAVE to call Tcl_FindExecutable - * BEFORE creating the first interp, or the tcl_library will not - * get set properly. So we call it by hand here... - */ - - Tcl_FindExecutable(newArgv[0]); - Tk_Main(argc, newArgv, Tcl_AppInit); -} - -/* - *---------------------------------------------------------------------- - * - * Tcl_AppInit -- - * - * This procedure performs application-specific initialization. - * Most applications, especially those that incorporate additional - * packages, will have their own version of this procedure. - * - * Results: - * Returns a standard Tcl completion code, and leaves an error - * message in the interp's result if an error occurs. - * - * Side effects: - * Depends on the startup script. - * - *---------------------------------------------------------------------- - */ - -int -Tcl_AppInit( - Tcl_Interp *interp) /* Interpreter for application. */ -{ - if (Tcl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - if (Tk_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); - - /* - * Call the init procedures for included packages. Each call should - * look like this: - * - * if (Mod_Init(interp) == TCL_ERROR) { - * return TCL_ERROR; - * } - * - * where "Mod" is the name of the module. - */ - -#ifdef TK_TEST - if (Tktest_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - Tcl_StaticPackage(interp, "Tktest", Tktest_Init, - (Tcl_PackageInitProc *) NULL); -#endif /* TK_TEST */ - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - * Each call would look like this: - * - * Tcl_CreateCommand(interp, "tclName", CFuncCmd, NULL, NULL); - */ - - SetupMainInterp(interp); - - /* - * Specify a user-specific startup script to invoke if the application - * is run interactively. On the Mac we can specifiy either a TEXT resource - * which contains the script or the more UNIX like file location - * may also used. (I highly recommend using the resource method.) - */ - - Tcl_SetVar(interp, "tcl_rcRsrcName", "tclshrc", TCL_GLOBAL_ONLY); - /* Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); */ - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * MacintoshInit -- - * - * This procedure calls Mac specific initilization calls. Most of - * these calls must be made as soon as possible in the startup - * process. - * - * Results: - * Returns TCL_OK if everything went fine. If it didn't the - * application should probably fail. - * - * Side effects: - * Inits the application. - * - *---------------------------------------------------------------------- - */ - -static int -MacintoshInit() -{ - int i; - long result, mask = 0x0700; /* mask = system 7.x */ - -#if GENERATING68K && !GENERATINGCFM - SetApplLimit(GetApplLimit() - (TK_MAC_68K_STACK_GROWTH)); -#endif - MaxApplZone(); - for (i = 0; i < 4; i++) { - (void) MoreMasters(); - } - - /* - * Tk needs us to set the qd pointer it uses. This is needed - * so Tk doesn't have to assume the availablity of the qd global - * variable. Which in turn allows Tk to be used in code resources. - */ - tcl_macQdPtr = &qd; - - /* - * If appearance is present, then register Tk as an Appearance client - * This means that the mapping from non-Appearance to Appearance cdefs - * will be done for Tk regardless of the setting in the Appearance - * control panel. - */ - - if (TkMacHaveAppearance()) { - RegisterAppearanceClient(); - } - - InitGraf(&tcl_macQdPtr->thePort); - InitFonts(); - if (TkMacHaveAppearance() >= 0x110) { - InitFloatingWindows(); - } else { - InitWindows(); - } - InitMenus(); - InitDialogs((long) NULL); - InitCursor(); - - /* - * Make sure we are running on system 7 or higher - */ - - if ((NGetTrapAddress(_Gestalt, ToolTrap) == - NGetTrapAddress(_Unimplemented, ToolTrap)) - || (((Gestalt(gestaltSystemVersion, &result) != noErr) - || (result < mask)))) { - panic("Tcl/Tk requires System 7 or higher."); - } - - /* - * Make sure we have color quick draw - * (this means we can't run on 68000 macs) - */ - - if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr) - || (result < gestalt32BitQD13))) { - panic("Tk requires Color QuickDraw."); - } - - - FlushEvents(everyEvent, 0); - SetEventMask(everyEvent); - - - Tcl_MacSetEventProc(TkMacConvertEvent); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * SetupMainInterp -- - * - * This procedure calls initalization routines require a Tcl - * interp as an argument. This call effectively makes the passed - * iterpreter the "main" interpreter for the application. - * - * Results: - * Returns TCL_OK if everything went fine. If it didn't the - * application should probably fail. - * - * Side effects: - * More initilization. - * - *---------------------------------------------------------------------- - */ - -static int -SetupMainInterp( - Tcl_Interp *interp) -{ - /* - * Initialize the console only if we are running as an interactive - * application. - */ - - TkMacInitAppleEvents(interp); - TkMacInitMenus(interp); - - if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1") - == 0) { - if (Tk_CreateConsoleWindow(interp) == TCL_ERROR) { - goto error; - } - SetupSIOUX(); - TclMacInstallExitToShellPatch(NoMoreOutput); - } - - /* - * Attach the global interpreter to tk's expected global console - */ - - gStdoutInterp = interp; - - return TCL_OK; - -error: - panic(Tcl_GetStringResult(interp)); - return TCL_ERROR; -} - -/* - *---------------------------------------------------------------------- - * - * InstallConsole, RemoveConsole, etc. -- - * - * The following functions provide the UI for the console package. - * Users wishing to replace SIOUX with their own console package - * need only provide the four functions below in a library. - * - * Results: - * See SIOUX documentation for details. - * - * Side effects: - * See SIOUX documentation for details. - * - *---------------------------------------------------------------------- - */ - -short -InstallConsole(short fd) -{ -#pragma unused (fd) - - return 0; -} - -void -RemoveConsole(void) -{ -} - -long -WriteCharsToConsole(char *buffer, long n) -{ - if (!inMacExit) { - Tcl_DString ds; - Tcl_ExternalToUtfDString(NULL, buffer, n, &ds); - TkConsolePrint(gStdoutInterp, TCL_STDOUT, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); - Tcl_DStringFree(&ds); - return n; - } else { - return 0; - } -} - -long -ReadCharsFromConsole(char *buffer, long n) -{ - return 0; -} - -extern char * -__ttyname(long fildes) -{ - static char *__devicename = "null device"; - - if (fildes >= 0 && fildes <= 2) { - return (__devicename); - } - - return (0L); -} - -int kbhit(void) -{ - return 0; -} - -int getch(void) -{ - return 0; -} - -void clrscr(void) -{ - return; -} - -short -SIOUXHandleOneEvent(EventRecord *event) -{ - return 0; -} -static void SetupSIOUX(void) { -#ifndef STATIC_BUILD - extern DLLIMPORT void SetupConsolePlugins(void*, void*, void*, void*, - void*, void*, void*, void*); - SetupConsolePlugins( &InstallConsole, - &RemoveConsole, - &WriteCharsToConsole, - &ReadCharsFromConsole, - &__ttyname, - &kbhit, - &getch, - &clrscr); -#endif -} diff --git a/mac/tkMacAppearanceStubs.c b/mac/tkMacAppearanceStubs.c deleted file mode 100755 index 0fd0fee..0000000 --- a/mac/tkMacAppearanceStubs.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * tkMacAppearanceStubs.c -- - * - * This file contains stubs for some MacOS8.6+ Toolbox calls that - * are not contained in any of the CFM68K stubs libraries. Their - * use must be conditionalized by checks (usually for Appearance version - * greater than 1.1), so they will never get called on a CFM68k system. - * Putting in the stubs means I don't have to clutter the code BOTH - * with appearance version checks & #ifdef GENERATING_CFM68K... - * - * Copyright (c) 1999 Scriptics Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * - */ - -#include <MacWindows.h> -#include <Appearance.h> - -/* Export these calls from the Tk library, since we may need to use - * them in shell calls. - */ - -pascal OSStatus -MoveWindowStructure( - WindowPtr window, - short hGlobal, - short vGlobal) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; - -} - -pascal OSStatus -CreateNewWindow( - WindowClass windowClass, - WindowAttributes attributes, - const Rect *bounds, - WindowPtr *outWindow) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; - -} - -pascal WindowPtr -FrontNonFloatingWindow() -{ - panic("Error: Running stub for PPC-Only routine"); - return NULL; -} - -pascal OSStatus -GetWindowClass( - WindowPtr window, - WindowClass *outClass) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; -} - -pascal OSStatus -ApplyThemeBackground( - ThemeBackgroundKind inKind, - const Rect* bounds, - ThemeDrawState inState, - SInt16 inDepth, - Boolean inColorDev) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; -} - -pascal OSStatus -InitFloatingWindows(void) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; -} - -pascal OSStatus -ShowFloatingWindows(void) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; -} - -pascal OSStatus -HideFloatingWindows(void) -{ - panic("Error: Running stub for PPC-Only routine"); - return noErr; -} - -pascal Boolean -IsValidWindowPtr(GrafPtr grafPort) -{ - panic("Error: Running stub for PPC-Only routine"); - return true; -} - diff --git a/mac/tkMacApplication.r b/mac/tkMacApplication.r deleted file mode 100644 index 9b61a5c..0000000 --- a/mac/tkMacApplication.r +++ /dev/null @@ -1,317 +0,0 @@ -/* - * tkMacApplication.r -- - * - * This file creates resources for use in the Wish application. - * - * Copyright (c) 1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacApplication.r,v 1.7 2002/09/12 17:34:16 das Exp $ - */ - -#include <Types.r> -#include <SysTypes.r> -#include <Balloons.r> -#include <BalloonTypes.r> -#include <AEUserTermTypes.r> - -/* - * The folowing include and defines help construct - * the version string for Tcl. - */ - -#define RC_INVOKED -#include "tk.h" - -#if (TK_RELEASE_LEVEL == 0) -# define RELEASE_LEVEL alpha -#elif (TK_RELEASE_LEVEL == 1) -# define RELEASE_LEVEL beta -#elif (TK_RELEASE_LEVEL == 2) -# define RELEASE_LEVEL final -#endif - -#if (TK_RELEASE_LEVEL == 2) -# define MINOR_VERSION (TK_MINOR_VERSION * 16) + TK_RELEASE_SERIAL -# define RELEASE_CODE 0x00 -#else -# define MINOR_VERSION TK_MINOR_VERSION * 16 -# define RELEASE_CODE TK_RELEASE_SERIAL -#endif - -resource 'vers' (1) { - TK_MAJOR_VERSION, MINOR_VERSION, - RELEASE_LEVEL, RELEASE_CODE, verUS, - TK_PATCH_LEVEL, - TK_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team" -}; - -resource 'vers' (2) { - TK_MAJOR_VERSION, MINOR_VERSION, - RELEASE_LEVEL, RELEASE_CODE, verUS, - TK_PATCH_LEVEL, - "Wish " TK_PATCH_LEVEL " © 1993-2001" -}; - -#define TK_APP_RESOURCES 128 -#define TK_APP_CREATOR 'WIsH' - -/* - * The 'BNDL' resource is the primary link between a file's - * creator/type and its icon. This resource acts for all Tcl shared - * libraries; other libraries will not need one and ought to use - * custom icons rather than new file types for a different appearance. - */ - -resource 'BNDL' (TK_APP_RESOURCES, "Tk app bundle", purgeable) -{ - TK_APP_CREATOR, - 0, - { - 'FREF', - { - 0, TK_APP_RESOURCES, - 1, TK_APP_RESOURCES+1 - }, - 'ICN#', - { - 0, TK_APP_RESOURCES, - 1, TK_APP_RESOURCES+1 - } - } -}; - -resource 'FREF' (TK_APP_RESOURCES, purgeable) -{ - 'APPL', 0, "" -}; -resource 'FREF' (TK_APP_RESOURCES+1, purgeable) -{ - 'TEXT', 1, "" -}; - -type TK_APP_CREATOR as 'STR '; -resource TK_APP_CREATOR (0, purgeable) { - "Wish " TK_PATCH_LEVEL " © 1993-2001" -}; - -/* - * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open - * to affect the text the Finder displays in the "kind" column and - * file info dialog. This information will be applied to all files - * with the listed creator and type. - */ -resource 'kind' (TK_APP_RESOURCES, "Tcl kind", purgeable) { - TK_APP_CREATOR, - 0, /* region = USA */ - { - 'APPL', "Wish", - 'TEXT', "Tcl/Tk Script" - } -}; - -#define kIconHelpString 256 - -resource 'hfdr' (-5696, purgeable) { - HelpMgrVersion, hmDefaultOptions, 0, 0, - {HMSTRResItem {kIconHelpString}} -}; -resource 'STR ' (kIconHelpString, purgeable) { - "This is the interpreter for Tcl & Tk scripts" - " running on Macintosh computers." -}; - -/* - * The following resource define the icon used by Tcl scripts. Any - * TEXT file with the creator of WIsH will get this icon. - */ - -data 'icl4' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) { - $"000F FFFF FFFF FFFF FFFF FFF0 0000 0000" - $"000F 3333 3333 3333 3333 33FF 0000 0000" - $"000F 3333 3333 3333 3433 33F2 F000 0000" - $"000F 3333 3333 3333 7D43 33F2 2F00 0000" - $"000F 3333 3333 3335 5623 33F2 22F0 0000" - $"000F 3333 3333 3356 6343 33FF FFFF 0000" - $"000F 3333 3333 256F 5223 3333 333F 0000" - $"000F 3333 3333 D666 2433 3333 333F 0000" - $"000F 3333 3333 D5F6 6633 3333 333F 0000" - $"000F 3333 3332 5666 6733 3333 333F 0000" - $"000F 3333 3336 E56F 6633 3333 333F 0000" - $"000F 3333 3336 5656 5733 3333 333F 0000" - $"000F 3333 3336 E5B6 5233 3333 333F 0000" - $"000F 3333 3336 5ED6 3333 3333 333F 0000" - $"000F 3333 3376 6475 6233 3333 333F 0000" - $"000F 3333 333D 5D56 7333 3333 333F 0000" - $"000F 3333 3336 6C55 6333 3333 333F 0000" - $"000F 3333 3336 5C56 7333 3333 333F 0000" - $"000F 3333 3362 6CE6 D333 3333 333F 0000" - $"000F 3333 3336 5C65 6333 3333 333F 0000" - $"000F 3333 3336 EC5E 3333 3333 333F 0000" - $"000F 3333 3336 5C56 6333 3333 333F 0000" - $"000F 3333 3333 5C75 3333 3333 333F 0000" - $"000F 3333 3333 5DD6 3333 3333 333F 0000" - $"000F 3333 3333 3CDD 3333 3333 333F 0000" - $"000F 3333 3333 3303 3333 3333 333F 0000" - $"000F 3333 3333 3C33 3333 3333 333F 0000" - $"000F 3333 3333 3C33 3333 3333 333F 0000" - $"000F 3333 3333 3C33 3333 3333 333F 0000" - $"000F 3333 3333 3333 3333 3333 333F 0000" - $"000F 3333 3333 3333 3333 3333 333F 0000" - $"000F FFFF FFFF FFFF FFFF FFFF FFFF 0000" -}; - -data 'ICN#' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) { - $"1FFF FE00 1000 0300 1000 F280 1003 F240" - $"1003 E220 1007 E3F0 100F C010 100F C010" - $"100F C010 101F F010 101F F010 101F F010" - $"101F F010 101F F010 101D E010 101D E010" - $"101D E010 101D C010 101D C010 101D C010" - $"101D C010 100D 8010 100D 8010 100D 8010" - $"1005 8010 1002 0010 1002 0010 1002 0010" - $"1002 0010 1002 0010 1000 0010 1FFF FFF0" - $"1FFF FE00 1FFF FF00 1FFF FF80 1FFF FFC0" - $"1FFF FFE0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" - $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" -}; - -data 'ics#' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) { - $"7FF0 41D8 419C 4384 43C4 47C4 47C4 4784" - $"4684 4684 4284 4284 4104 4104 4104 7FFC" - $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC" - $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" -}; - -data 'ics4' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) { - $"0FFF FFFF FFFF 0000 0F33 3333 53F2 F000" - $"0F33 3335 52FF FF00 0F33 33E6 3333 3F00" - $"0F33 3256 6333 3F00 0F33 3556 6333 3F00" - $"0F33 3A5E 3333 3F00 0F33 65D6 D333 3F00" - $"0F33 3655 5333 3F00 0F33 65C6 3333 3F00" - $"0F33 3EC5 E333 3F00 0F33 36C6 3333 3F00" - $"0F33 33CD 3333 3F00 0F33 33C3 3333 3F00" - $"0F33 33C3 3333 3F00 0FFF FFFF FFFF FF00" -}; - -/* - * The following resources define the icons for the Wish - * application. - */ - -data 'icl4' (TK_APP_RESOURCES, "Tk App", purgeable) { - $"0000 0000 0000 000F 0000 0000 0000 0000" - $"0000 0000 0000 00FC F000 0000 0000 0000" - $"0000 0000 0000 0FCC CF66 0000 0000 0000" - $"0000 0000 0000 FCCC C556 0000 0000 0000" - $"0000 0000 000F CCCC 566F 0000 0000 0000" - $"0000 0000 00FC CCC5 6F5C F000 0000 0000" - $"0000 0000 0FCC CC66 66CC CF00 0000 0000" - $"0000 0000 FCCC CCD5 5666 CCF0 0000 0000" - $"0000 000F CCCC C656 5667 CCCF 0000 0000" - $"0000 00FC CCCC C6E5 5566 CCCC F000 0000" - $"0000 0FCC CCCC C656 5657 CCCC CF00 0000" - $"0000 FCCC CCCC C6E5 565C CCCC CCF0 0000" - $"000F CCCC CCCC C655 565C CCCC CCCF 0000" - $"00FC CCCC CCCC 7660 556C CCCC CCCC F000" - $"0FCC CCCC CCCC CD5D 567C CCCC CCCC CF00" - $"FCCC CCCC CCCC 6660 556C CCCC CCCC CCF0" - $"0FCC CCCC CCCC 665C 565C CCCC CCCC C0CF" - $"00FC CCCC CCCC 6660 E6DC CCCC CCCC CCF0" - $"000F CCCC CCCC C650 656C CCCC CCCC CF00" - $"0000 FCCC CCCC C6EC 5ECC CCCC CCCC F000" - $"0000 0FCC CCCC C650 566C CCCC CCCF 0000" - $"0000 00FC CCCC CC50 75CC CCCC CCF0 0000" - $"0000 000F CCCC CC50 56CC CCCC CF00 0000" - $"0000 0000 FCCC CCC0 5CCC CCCC F000 0000" - $"0000 0000 0FCC CCC0 CCCC CCCF 0000 0000" - $"0000 0000 00FC CCC0 CCCC CCF0 0000 0000" - $"0000 0000 000F CCC0 CCCC CF00 0000 0000" - $"0000 0000 0000 FCCC CCCC F000 0000 0000" - $"0000 0000 0000 0FCC CCCF 0000 0000 0000" - $"0000 0000 0000 00FC CCF0 0000 0000 0000" - $"0000 0000 0000 000F CF00 0000 0000 0000" - $"0000 0000 0000 0000 F000 0000 0000 0000" -}; - -data 'ICN#' (TK_APP_RESOURCES, "Tk App", purgeable) { - $"0001 0000 0002 8000 0004 7000 0008 7000" - $"0010 F000 0021 E800 0043 C400 0081 F200" - $"0107 F100 0207 F080 0407 F040 0807 E020" - $"1007 E010 200E E008 4002 E004 800E E002" - $"400E E001 200E C002 1006 E004 0806 C008" - $"0406 E010 0202 C020 0102 C040 0080 8080" - $"0041 0100 0021 0200 0011 0400 0009 0800" - $"0004 1000 0002 2000 0001 4000 0000 8000" - $"0001 0000 0003 8000 0007 F000 000F F000" - $"001F F000 003F F800 007F FC00 00FF FE00" - $"01FF FF00 03FF FF80 07FF FFC0 0FFF FFE0" - $"1FFF FFF0 3FFF FFF8 7FFF FFFC FFFF FFFE" - $"7FFF FFFF 3FFF FFFE 1FFF FFFC 0FFF FFF8" - $"07FF FFF0 03FF FFE0 01FF FFC0 00FF FF80" - $"007F FF00 003F FE00 001F FC00 000F F800" - $"0007 F000 0003 E000 0001 C000 0000 8000" -}; - -data 'ics#' (TK_APP_RESOURCES, "Tk App", purgeable) { - $"01C0 0260 04E0 09D0 1388 23C4 43C2 8281" - $"8282 4284 2188 1190 0920 0540 0280 0100" - $"01C0 03E0 07E0 0FF0 1FF8 3FFC 7FFE FFFF" - $"FFFE 7FFC 3FF8 1FF0 0FE0 07C0 0380 0100" -}; - -data 'ics4' (TK_APP_RESOURCES, "Tk App", purgeable) { - $"0000 000F C000 0000 0000 00FC 6600 0000" - $"0000 0FCC 6600 0000 0000 FCC6 66F0 0000" - $"000F CCD5 56CF 0000 00FC CC66 57CC F000" - $"0FCC CC65 56CC CF00 FCCC CC56 57CC CCF0" - $"0FCC CCC6 6CCC CCCF 00FC CCC6 5CCC CCF0" - $"000F CCC6 6CCC CF00 0000 FCCC 5CCC F000" - $"0000 0FCC CCCF 0000 0000 00FC CCF0 0000" - $"0000 000F CF00 0000 0000 0000 F000 0000" -}; - -/* - * The following resource is used when creating the 'env' variable in - * the Macintosh environment. The creation mechanisim looks for the - * 'STR#' resource named "Tcl Environment Variables" rather than a - * specific resource number. (In other words, feel free to change the - * resource id if it conflicts with your application.) Each string in - * the resource must be of the form "KEYWORD=SOME STRING". See Tcl - * documentation for futher information about the env variable. - */ - -/* A good example of something you may want to set is: - * "TCL_LIBRARY=My disk:etc." - */ - -resource 'STR#' (128, "Tcl Environment Variables") { - { - /* - "SCHEDULE_NAME=Agent Controller Schedule", - "SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler" - */ - }; -}; - -data 'alis' (1000, "Library Folder") { - $"0000 0000 00BA 0002 0001 012F 0000 0000" /* .....†...../.... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 985C FB00 4244 0000 0000" /* ......ò\š.BD.... */ - $"0002 1328 5375 7070 6F72 7420 4C69 6272" /* ...(Support Libr */ - $"6172 6965 7329 0000 0000 0000 0000 0000" /* aries).......... */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0076 8504 B617 A796 003D 0027 025B" /* ...vÖ..ßñ.=.'.[ */ - $"01E4 0001 0001 0000 0000 0000 0000 0000" /* .”.............. */ - $"0000 0000 0000 0000 0001 2F00 0002 0015" /* ........../..... */ - $"2F3A 2853 7570 706F 7274 204C 6962 7261" /* /:(Support Libra */ - $"7269 6573 2900 FFFF 0000" /* ries)... */ -}; - diff --git a/mac/tkMacBitmap.c b/mac/tkMacBitmap.c deleted file mode 100644 index 7b59149..0000000 --- a/mac/tkMacBitmap.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * tkMacBitmap.c -- - * - * This file handles the implementation of native bitmaps. - * - * Copyright (c) 1996-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacBitmap.c,v 1.6 2002/10/09 11:56:36 das Exp $ - */ - -#include "tkPort.h" -#include "tk.h" -#include "tkMacInt.h" - -#include <Icons.h> -#include <Dialogs.h> -#include <Resources.h> -#include <Strings.h> - -/* - * Depending on the resource type there are different ways to - * draw native icons. - */ -#define TYPE1 0 /* Family icon suite. */ -#define TYPE2 1 /* ICON resource. */ -#define TYPE3 2 /* cicn resource. */ - -/* - * This data structure describes the id and type of a given icon. - * It is used as the source for native icons. - */ -typedef struct { - int id; /* Resource Id for Icon. */ - long int type; /* Type of icon. */ -} NativeIcon; - -/* - * This structure holds information about native bitmaps. - */ - -typedef struct { - char *name; /* Name of icon. */ - long int type; /* Type of icon. */ - int id; /* Id of icon. */ - int size; /* Size of icon. */ -} BuiltInIcon; - -/* - * This array mapps a string name to the supported builtin icons - * on the Macintosh. - */ - -static BuiltInIcon builtInIcons[] = { - {"document", TYPE1, kGenericDocumentIconResource, 32}, - {"stationery", TYPE1, kGenericStationeryIconResource, 32}, - {"edition", TYPE1, kGenericEditionFileIconResource, 32}, - {"application", TYPE1, kGenericApplicationIconResource, 32}, - {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32}, - {"folder", TYPE1, kGenericFolderIconResource, 32}, - {"pfolder", TYPE1, kPrivateFolderIconResource, 32}, - {"trash", TYPE1, kTrashIconResource, 32}, - {"floppy", TYPE1, kFloppyIconResource, 32}, - {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32}, - {"cdrom", TYPE1, kGenericCDROMIconResource, 32}, - {"preferences", TYPE1, kGenericPreferencesIconResource, 32}, - {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32}, - {"stop", TYPE2, kStopIcon, 32}, - {"note", TYPE2, kNoteIcon, 32}, - {"caution", TYPE2, kCautionIcon, 32}, - {(char *) NULL, 0, 0, 0} -}; - -/* - *---------------------------------------------------------------------- - * - * TkpDefineNativeBitmaps -- - * - * Add native bitmaps. - * - * Results: - * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in the interp's result. - * - * Side effects: - * "Name" is entered into the bitmap table and may be used from - * here on to refer to the given bitmap. - * - *---------------------------------------------------------------------- - */ - -void -TkpDefineNativeBitmaps() -{ - int new; - Tcl_HashEntry *predefHashPtr; - TkPredefBitmap *predefPtr; - CONST char * name; - BuiltInIcon *builtInPtr; - NativeIcon *nativeIconPtr; - Tcl_HashTable *tablePtr; - - for (builtInPtr = builtInIcons; builtInPtr->name != NULL; builtInPtr++) { - name = Tk_GetUid(builtInPtr->name); - tablePtr = TkGetBitmapPredefTable(); - predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &new); - if (!new) { - continue; - } - predefPtr = (TkPredefBitmap *) ckalloc(sizeof(TkPredefBitmap)); - nativeIconPtr = (NativeIcon *) ckalloc(sizeof(NativeIcon)); - nativeIconPtr->id = builtInPtr->id; - nativeIconPtr->type = builtInPtr->type; - predefPtr->source = (char *) nativeIconPtr; - predefPtr->width = builtInPtr->size; - predefPtr->height = builtInPtr->size; - predefPtr->native = 1; - Tcl_SetHashValue(predefHashPtr, predefPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpCreateNativeBitmap -- - * - * Add native bitmaps. - * - * Results: - * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in the interp's result. - * - * Side effects: - * "Name" is entered into the bitmap table and may be used from - * here on to refer to the given bitmap. - * - *---------------------------------------------------------------------- - */ - -Pixmap -TkpCreateNativeBitmap( - Display *display, - CONST char * source) /* Info about the icon to build. */ -{ - Pixmap pix; - GWorldPtr destPort; - Rect destRect; - Handle icon; - CGrafPtr saveWorld; - GDHandle saveDevice; - NativeIcon *nativeIconPtr; - - pix = Tk_GetPixmap(display, None, 32, 32, 0); - destPort = TkMacGetDrawablePort(pix); - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - nativeIconPtr = (NativeIcon *) source; - SetRect(&destRect, 0, 0, 32, 32); - if (nativeIconPtr->type == TYPE1) { - RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF}; - - RGBForeColor(&white); - PaintRect(&destRect); - PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id); - } else if (nativeIconPtr->type == TYPE2) { - icon = GetIcon(nativeIconPtr->id); - if (icon != NULL) { - RGBColor black = {0, 0, 0}; - - RGBForeColor(&black); - PlotIcon(&destRect, icon); - ReleaseResource(icon); - } - } - - SetGWorld(saveWorld, saveDevice); - return pix; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetNativeAppBitmap -- - * - * Add native bitmaps. - * - * Results: - * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in the interp's result. - * - * Side effects: - * "Name" is entered into the bitmap table and may be used from - * here on to refer to the given bitmap. - * - *---------------------------------------------------------------------- - */ - -Pixmap -TkpGetNativeAppBitmap( - Display *display, /* The display. */ - CONST char *name, /* The name of the bitmap. */ - int *width, /* The width & height of the bitmap. */ - int *height) -{ - Pixmap pix; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - Rect destRect; - Handle resource; - int type, destWrote; - Str255 nativeName; - - /* - * macRoman is the encoding that the resource fork uses. - */ - - Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), name, - strlen(name), 0, NULL, - (char *) &nativeName[1], - 255, NULL, &destWrote, NULL); /* Internalize native */ - nativeName[0] = destWrote; - - resource = GetNamedResource('cicn', nativeName); - if (resource != NULL) { - type = TYPE3; - } else { - resource = GetNamedResource('ICON', nativeName); - if (resource != NULL) { - type = TYPE2; - } - } - - if (resource == NULL) { - return NULL; - } - - pix = Tk_GetPixmap(display, None, 32, 32, 0); - destPort = TkMacGetDrawablePort(pix); - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - SetRect(&destRect, 0, 0, 32, 32); - if (type == TYPE2) { - RGBColor black = {0, 0, 0}; - - RGBForeColor(&black); - PlotIcon(&destRect, resource); - ReleaseResource(resource); - } else if (type == TYPE3) { - RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF}; - short id; - ResType theType; - Str255 dummy; - - /* - * We need to first paint the background white. Also, for - * some reason we *must* use GetCIcon instead of GetNamedResource - * for PlotCIcon to work - so we use GetResInfo to get the id. - */ - RGBForeColor(&white); - PaintRect(&destRect); - GetResInfo(resource, &id, &theType, dummy); - ReleaseResource(resource); - resource = (Handle) GetCIcon(id); - PlotCIcon(&destRect, (CIconHandle) resource); - DisposeCIcon((CIconHandle) resource); - } - - *width = 32; - *height = 32; - SetGWorld(saveWorld, saveDevice); - return pix; -} diff --git a/mac/tkMacButton.c b/mac/tkMacButton.c deleted file mode 100644 index e0f0d38..0000000 --- a/mac/tkMacButton.c +++ /dev/null @@ -1,1711 +0,0 @@ -/* - * tkMacButton.c -- - * - * This file implements the Macintosh specific portion of the - * button widgets. - * - * Copyright (c) 1996-1997 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacButton.c,v 1.17.2.3 2004/10/27 00:37:38 davygrvy Exp $ - */ - -#include "tkButton.h" -#include "tkMacInt.h" -#include <Controls.h> -#include <ControlDefinitions.h> -#include <LowMem.h> -#include <Appearance.h> - - -#include <ToolUtils.h> - -/* - * Some defines used to control what type of control is drawn. - */ - -#define DRAW_LABEL 0 /* Labels are treated genericly. */ -#define DRAW_CONTROL 1 /* Draw using the Native control. */ -#define DRAW_CUSTOM 2 /* Make our own button drawing. */ -#define DRAW_BEVEL 3 - -/* - * The following structures are used to draw our controls. Rather than - * having many Mac controls we just use one control of each type and - * reuse them for all Tk widgets. When the windowRef variable is NULL - * it means none of the data structures have been allocated. - */ - -static WindowRef windowRef = NULL; -static CWindowRecord windowRecord; -static ControlRef buttonHandle; -static ControlRef checkHandle; -static ControlRef radioHandle; -static ControlRef smallBevelHandle; -static ControlRef smallStickyBevelHandle; -static ControlRef medBevelHandle; -static ControlRef medStickyBevelHandle; -static ControlRef largeBevelHandle; -static ControlRef largeStickyBevelHandle; - -/* - * These are used to store the image content for - * beveled buttons - i.e. buttons with images. - */ - -static ControlButtonContentInfo bevelButtonContent; -static OpenCPicParams picParams; - -static CCTabHandle buttonTabHandle; -static CCTabHandle checkTabHandle; -static CCTabHandle radioTabHandle; -static PixMapHandle oldPixPtr; - -/* - * These functions are used when Appearance is present. - * By embedding all our controls in a userPane control, - * we can color the background of the text in radiobuttons - * and checkbuttons. Thanks to Peter Gontier of Apple DTS - * for help on this one. - */ - -static ControlRef userPaneHandle; -static RGBColor gUserPaneBackground = { ~0, ~0, ~0}; -static pascal OSErr SetUserPaneDrawProc(ControlRef control, - ControlUserPaneDrawProcPtr upp); -static pascal OSErr SetUserPaneSetUpSpecialBackgroundProc(ControlRef control, - ControlUserPaneBackgroundProcPtr upp); -static pascal void UserPaneDraw(ControlRef control, ControlPartCode cpc); -static pascal void UserPaneBackgroundProc(ControlHandle, - ControlBackgroundPtr info); - -/* - * Forward declarations for procedures defined later in this file: - */ - -static void ButtonEventProc _ANSI_ARGS_(( - ClientData clientData, XEvent *eventPtr)); -static int UpdateControlColors _ANSI_ARGS_((TkButton *butPtr, - ControlRef controlHandle, CCTabHandle ccTabHandle, - RGBColor *saveColorPtr)); -static void DrawBufferedControl _ANSI_ARGS_((TkButton *butPtr, - GWorldPtr destPort, GC gc, Pixmap pixmap)); -static void InitSampleControls(); -static void SetupBevelButton _ANSI_ARGS_((TkButton *butPtr, - ControlRef controlHandle, - GWorldPtr destPort, GC gc, Pixmap pixmap)); -static void ChangeBackgroundWindowColor _ANSI_ARGS_(( - WindowRef macintoshWindow, RGBColor rgbColor, - RGBColor *oldColor)); -static void ButtonExitProc _ANSI_ARGS_((ClientData clientData)); - -/* - * The class procedure table for the button widgets. - */ - -Tk_ClassProcs tkpButtonProcs = { - sizeof(Tk_ClassProcs), /* size */ - TkButtonWorldChanged, /* worldChangedProc */ -}; - -/* - *---------------------------------------------------------------------- - * - * TkpCreateButton -- - * - * Allocate a new TkButton structure. - * - * Results: - * Returns a newly allocated TkButton structure. - * - * Side effects: - * Registers an event handler for the widget. - * - *---------------------------------------------------------------------- - */ - -TkButton * -TkpCreateButton( - Tk_Window tkwin) -{ - TkButton *buttonPtr; - buttonPtr = (TkButton *) ckalloc(sizeof(TkButton)); - Tk_CreateEventHandler(tkwin, ActivateMask, - ButtonEventProc, (ClientData) buttonPtr); - return buttonPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDisplayButton -- - * - * This procedure is invoked to display a button widget. It is - * normally invoked as an idle handler. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the button in its - * current mode. The REDRAW_PENDING flag is cleared. - * - *---------------------------------------------------------------------- - */ - -void -TkpDisplayButton( - ClientData clientData) /* Information about widget. */ -{ - TkButton *butPtr = (TkButton *) clientData; - Pixmap pixmap; - GC gc; - Tk_3DBorder border; - int x = 0; /* Initialization only needed to stop - * compiler warning. */ - int y, relief; - register Tk_Window tkwin = butPtr->tkwin; - int width, height, fullWidth, fullHeight; - int textXOffset, textYOffset; - int haveImage = 0, haveText = 0; - int offset; /* 0 means this is a normal widget. 1 means - * it is an image button, so we offset the - * image to make the button appear to move - * up and down as the relief changes. */ - int hasImageOrBitmap; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - int drawType, borderWidth; - int imageWidth, imageHeight; - int imageXOffset = 0, imageYOffset = 0; /* image information that will - * be used to restrict disabled - * pixmap as well */ - - GetGWorld(&saveWorld, &saveDevice); - - butPtr->flags &= ~REDRAW_PENDING; - if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { - return; - } - - /* - * In order to avoid screen flashes, this procedure redraws - * the button in a pixmap, then copies the pixmap to the - * screen in a single operation. This means that there's no - * point in time where the on-sreen image has been cleared. - */ - - pixmap = Tk_GetPixmap(butPtr->display, Tk_WindowId(tkwin), - Tk_Width(tkwin), Tk_Height(tkwin), Tk_Depth(tkwin)); - - hasImageOrBitmap = ((butPtr->image != NULL) || (butPtr->bitmap != None)); - offset = (butPtr->type == TYPE_BUTTON) && hasImageOrBitmap; - - border = butPtr->normalBorder; - if ((butPtr->state == STATE_DISABLED) && (butPtr->disabledFg != NULL)) { - gc = butPtr->disabledGC; - } else if ((butPtr->type == TYPE_BUTTON) - && (butPtr->state == STATE_ACTIVE)) { - gc = butPtr->activeTextGC; - border = butPtr->activeBorder; - } else { - gc = butPtr->normalTextGC; - } - - if ((butPtr->flags & SELECTED) && (butPtr->state != STATE_ACTIVE) - && (butPtr->selectBorder != NULL) && !butPtr->indicatorOn) { - border = butPtr->selectBorder; - } - - /* - * Override the relief specified for the button if this is a - * checkbutton or radiobutton and there's no indicator. - * However, don't do this in the presence of Appearance, since - * then the bevel button will take care of the relief. - */ - - relief = butPtr->relief; - - if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) { - if (!TkMacHaveAppearance() || !hasImageOrBitmap) { - if (butPtr->flags & SELECTED) { - relief = TK_RELIEF_SUNKEN; - } else if (butPtr->overRelief != relief) { - relief = butPtr->offRelief; - } - } - } - - /* - * See the comment in UpdateControlColors as to why we use the - * highlightbackground for the border of Macintosh buttons. - */ - - if (butPtr->type == TYPE_BUTTON) { - Tk_Fill3DRectangle(tkwin, pixmap, butPtr->highlightBorder, 0, 0, - Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); - } else { - Tk_Fill3DRectangle(tkwin, pixmap, butPtr->normalBorder, 0, 0, - Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); - } - - if (butPtr->type == TYPE_LABEL) { - drawType = DRAW_LABEL; - } else if (butPtr->type == TYPE_BUTTON) { - if (!hasImageOrBitmap) { - drawType = DRAW_CONTROL; - } else if (butPtr->image != None) { - drawType = DRAW_BEVEL; - } else { - /* - * TO DO - The current way the we draw bitmaps (XCopyPlane) - * uses CopyDeepMask in this one case. The Picture recording - * does not record this call, and so we can't use the - * Appearance bevel button here. The only case that would - * exercise this is if you use a bitmap, with - * -data & -mask specified. We should probably draw the - * appearance button and overprint the image in this case. - * This just punts and draws the old-style, ugly, button. - */ - - if (gc->clip_mask == 0) { - drawType = DRAW_BEVEL; - } else { - TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; - if ((clipPtr->type == TKP_CLIP_PIXMAP) && - (clipPtr->value.pixmap != butPtr->bitmap)) { - drawType = DRAW_CUSTOM; - } else { - drawType = DRAW_BEVEL; - } - } - } - } else { - if (butPtr->indicatorOn) { - drawType = DRAW_CONTROL; - } else if (hasImageOrBitmap) { - if (gc->clip_mask == 0) { - drawType = DRAW_BEVEL; - } else { - TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; - if ((clipPtr->type == TKP_CLIP_PIXMAP) && - (clipPtr->value.pixmap != butPtr->bitmap)) { - drawType = DRAW_CUSTOM; - } else { - drawType = DRAW_BEVEL; - } - } - } else { - drawType = DRAW_CUSTOM; - } - } - - /* - * Draw the native portion of the buttons. Start by creating the control - * if it doesn't already exist. Then configure the Macintosh control from - * the Tk info. Finally, we call Draw1Control to draw to the screen. - */ - - if ((drawType == DRAW_CONTROL) || - ((drawType == DRAW_BEVEL) && TkMacHaveAppearance())) { - borderWidth = 0; - - /* - * This part uses Macintosh rather than Tk calls to draw - * to the screen. Make sure the ports etc. are set correctly. - */ - - destPort = TkMacGetDrawablePort(pixmap); - SetGWorld(destPort, NULL); - DrawBufferedControl(butPtr, destPort, gc, pixmap); - } - - if ((drawType == DRAW_CUSTOM) || (drawType == DRAW_LABEL)) { - borderWidth = butPtr->borderWidth; - } - - /* - * Display image or bitmap or text for button. This has - * already been done under Appearance with the Bevel - * button types. - */ - - if ((drawType == DRAW_BEVEL) && TkMacHaveAppearance()) { - /* Empty Body */ - } else { - if (butPtr->image != None) { - Tk_SizeOfImage(butPtr->image, &width, &height); - haveImage = 1; - } else if (butPtr->bitmap != None) { - Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); - haveImage = 1; - } - imageWidth = width; - imageHeight = height; - - haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); - if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - textXOffset = 0; - textYOffset = 0; - fullWidth = 0; - fullHeight = 0; - - switch ((enum compound) butPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - /* Image is above or below text */ - if (butPtr->compound == COMPOUND_TOP) { - textYOffset = height + butPtr->padY; - } else { - imageYOffset = butPtr->textHeight + butPtr->padY; - } - fullHeight = height + butPtr->textHeight + butPtr->padY; - fullWidth = (width > butPtr->textWidth ? width : - butPtr->textWidth); - textXOffset = (fullWidth - butPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - /* Image is left or right of text */ - if (butPtr->compound == COMPOUND_LEFT) { - textXOffset = width + butPtr->padX; - } else { - imageXOffset = butPtr->textWidth + butPtr->padX; - } - fullWidth = butPtr->textWidth + butPtr->padX + width; - fullHeight = (height > butPtr->textHeight ? height : - butPtr->textHeight); - textYOffset = (fullHeight - butPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; - } - case COMPOUND_CENTER: { - /* Image and text are superimposed */ - fullWidth = (width > butPtr->textWidth ? width : - butPtr->textWidth); - fullHeight = (height > butPtr->textHeight ? height : - butPtr->textHeight); - textXOffset = (fullWidth - butPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - textYOffset = (fullHeight - butPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; - } - case COMPOUND_NONE: {break;} - } - - TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY, - butPtr->indicatorSpace + fullWidth, fullHeight, &x, &y); - - x += butPtr->indicatorSpace; - - x += offset; - y += offset; - if (relief == TK_RELIEF_RAISED) { - x -= offset; - y -= offset; - } else if (relief == TK_RELIEF_SUNKEN) { - x += offset; - y += offset; - } - imageXOffset += x; - imageYOffset += y; - if (butPtr->image != NULL) { - if ((butPtr->selectImage != NULL) && - (butPtr->flags & SELECTED)) { - Tk_RedrawImage(butPtr->selectImage, 0, 0, - width, height, pixmap, imageXOffset, imageYOffset); - } else { - Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, imageXOffset, imageYOffset); - } - } else { - XSetClipOrigin(butPtr->display, gc, - imageXOffset, imageYOffset); - XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, - 0, 0, (unsigned int) width, (unsigned int) height, - imageXOffset, imageYOffset, 1); - XSetClipOrigin(butPtr->display, gc, 0, 0); - } - - Tk_DrawTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout, - x + textXOffset, y + textYOffset, 0, -1); - Tk_UnderlineTextLayout(butPtr->display, pixmap, gc, - butPtr->textLayout, x + textXOffset, y + textYOffset, - butPtr->underline); - y += fullHeight/2; - } else { - if (haveImage) { - TkComputeAnchor(butPtr->anchor, tkwin, 0, 0, - butPtr->indicatorSpace + width, height, &x, &y); - x += butPtr->indicatorSpace; - - x += offset; - y += offset; - if (relief == TK_RELIEF_RAISED) { - x -= offset; - y -= offset; - } else if (relief == TK_RELIEF_SUNKEN) { - x += offset; - y += offset; - } - imageXOffset += x; - imageYOffset += y; - if (butPtr->image != NULL) { - if ((butPtr->selectImage != NULL) && - (butPtr->flags & SELECTED)) { - Tk_RedrawImage(butPtr->selectImage, 0, 0, width, - height, pixmap, imageXOffset, imageYOffset); - } else { - Tk_RedrawImage(butPtr->image, 0, 0, width, height, - pixmap, imageXOffset, imageYOffset); - } - } else { - XSetClipOrigin(butPtr->display, gc, x, y); - XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, - 0, 0, (unsigned int) width, - (unsigned int) height, x, y, 1); - XSetClipOrigin(butPtr->display, gc, 0, 0); - } - y += height/2; - } else { - TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, - butPtr->padY, - butPtr->indicatorSpace + butPtr->textWidth, - butPtr->textHeight, &x, &y); - - x += butPtr->indicatorSpace; - - Tk_DrawTextLayout(butPtr->display, pixmap, gc, - butPtr->textLayout, x, y, 0, -1); - y += butPtr->textHeight/2; - } - } - } - - /* - * If the button is disabled with a stipple rather than a special - * foreground color, generate the stippled effect. If the widget - * is selected and we use a different background color when selected, - * must temporarily modify the GC so the stippling is the right color. - */ - - if ((butPtr->state == STATE_DISABLED) - && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { - if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn - && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->stippleGC, - Tk_3DBorderColor(butPtr->selectBorder)->pixel); - } - /* - * Stipple the whole button if no disabledFg was specified, - * otherwise restrict stippling only to displayed image - */ - if (butPtr->disabledFg == NULL) { - XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, 0, 0, - (unsigned) Tk_Width(tkwin), (unsigned) Tk_Height(tkwin)); - } else { - XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, - imageXOffset, imageYOffset, - (unsigned) imageWidth, (unsigned) imageHeight); - } - if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn - && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->stippleGC, - Tk_3DBorderColor(butPtr->normalBorder)->pixel); - } - } - - /* - * Draw the border and traversal highlight last. This way, if the - * button's contents overflow they'll be covered up by the border. - */ - - if (relief != TK_RELIEF_FLAT) { - int inset = butPtr->highlightWidth; - Tk_Draw3DRectangle(tkwin, pixmap, border, inset, inset, - Tk_Width(tkwin) - 2*inset, Tk_Height(tkwin) - 2*inset, - butPtr->borderWidth, relief); - } - - /* - * Copy the information from the off-screen pixmap onto the screen, - * then delete the pixmap. - */ - - XCopyArea(butPtr->display, pixmap, Tk_WindowId(tkwin), - butPtr->copyGC, 0, 0, (unsigned) Tk_Width(tkwin), - (unsigned) Tk_Height(tkwin), 0, 0); - Tk_FreePixmap(butPtr->display, pixmap); - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * TkpComputeButtonGeometry -- - * - * After changes in a button's text or bitmap, this procedure - * recomputes the button's geometry and passes this information - * along to the geometry manager for the window. - * - * Results: - * None. - * - * Side effects: - * The button's window may change size. - * - *---------------------------------------------------------------------- - */ - -void -TkpComputeButtonGeometry( - TkButton *butPtr) /* Button whose geometry may have changed. */ -{ - int width, height, avgWidth, haveImage = 0, haveText = 0; - int txtWidth, txtHeight; - Tk_FontMetrics fm; - - width = 0; - height = 0; - txtWidth = 0; - txtHeight = 0; - avgWidth = 0; - - /* - * First figure out the size of the contents of the button. - */ - - butPtr->indicatorSpace = 0; - if (butPtr->image != NULL) { - Tk_SizeOfImage(butPtr->image, &width, &height); - haveImage = 1; - } else if (butPtr->bitmap != None) { - Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); - haveImage = 1; - } - - if (haveImage == 0 || butPtr->compound != COMPOUND_NONE) { - Tk_FreeTextLayout(butPtr->textLayout); - butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont, - Tcl_GetString(butPtr->textPtr), -1, butPtr->wrapLength, - butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight); - - txtWidth = butPtr->textWidth; - txtHeight = butPtr->textHeight; - avgWidth = Tk_TextWidth(butPtr->tkfont, "0", 1); - Tk_GetFontMetrics(butPtr->tkfont, &fm); - haveText = (txtWidth != 0 && txtHeight != 0); - } - - /* - * If the button is compound (ie, it shows both an image and text), - * the new geometry is a combination of the image and text geometry. - * We only honor the compound bit if the button has both text and an - * image, because otherwise it is not really a compound button. - */ - - if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - switch ((enum compound) butPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - /* Image is above or below text */ - height += txtHeight + butPtr->padY; - width = (width > txtWidth ? width : txtWidth); - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - /* Image is left or right of text */ - width += txtWidth + butPtr->padX; - height = (height > txtHeight ? height : txtHeight); - break; - } - case COMPOUND_CENTER: { - /* Image and text are superimposed */ - width = (width > txtWidth ? width : txtWidth); - height = (height > txtHeight ? height : txtHeight); - break; - } - case COMPOUND_NONE: {break;} - } - if (butPtr->width > 0) { - width = butPtr->width; - } - if (butPtr->height > 0) { - height = butPtr->height; - } - - if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) { - butPtr->indicatorSpace = height; - if (butPtr->type == TYPE_CHECK_BUTTON) { - butPtr->indicatorDiameter = (65*height)/100; - } else { - butPtr->indicatorDiameter = (75*height)/100; - } - } - - width += 2*butPtr->padX; - height += 2*butPtr->padY; - - } else { - if (haveImage) { - if (butPtr->width > 0) { - width = butPtr->width; - } - if (butPtr->height > 0) { - height = butPtr->height; - } - if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) { - butPtr->indicatorSpace = height; - if (butPtr->type == TYPE_CHECK_BUTTON) { - butPtr->indicatorDiameter = (65*height)/100; - } else { - butPtr->indicatorDiameter = (75*height)/100; - } - } - } else { - width = txtWidth; - height = txtHeight; - if (butPtr->width > 0) { - width = butPtr->width * avgWidth; - } - if (butPtr->height > 0) { - height = butPtr->height * fm.linespace; - } - if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) { - butPtr->indicatorDiameter = fm.linespace; - if (butPtr->type == TYPE_CHECK_BUTTON) { - butPtr->indicatorDiameter = - (80*butPtr->indicatorDiameter)/100; - } - butPtr->indicatorSpace = butPtr->indicatorDiameter + avgWidth; - } - } - } - - /* - * Now figure out the size of the border decorations for the button. - */ - - if (butPtr->highlightWidth < 0) { - butPtr->highlightWidth = 0; - } - - /* - * The width and height calculation for Appearance buttons with images & - * non-Appearance buttons with images is different. In the latter case, - * we add the borderwidth to the inset, since we are going to stamp a - * 3-D border over the image. In the former, we add it to the height, - * directly, since Appearance will draw the border as part of our control. - * - * When issuing the geometry request, add extra space for the indicator, - * if any, and for the border and padding, plus if this is an image two - * extra pixels so the display can be offset by 1 pixel in either - * direction for the raised or lowered effect. - * - * The highlight width corresponds to the default ring on the Macintosh. - * As such, the highlight width is only added if the button is the default - * button. The actual width of the default ring is one less than the - * highlight width as there is also one pixel of spacing. - * Appearance buttons with images do not have a highlight ring, because the - * Bevel button type does not support one. - */ - - if ((butPtr->image == None) && (butPtr->bitmap == None)) { - width += 2*butPtr->padX; - height += 2*butPtr->padY; - } - - if ((butPtr->type == TYPE_BUTTON)) { - if ((butPtr->image == None) && (butPtr->bitmap == None)) { - butPtr->inset = 0; - if (butPtr->defaultState != STATE_DISABLED) { - butPtr->inset += butPtr->highlightWidth; - } - } else if (TkMacHaveAppearance()) { - butPtr->inset = 0; - width += (2 * butPtr->borderWidth + 4); - height += (2 * butPtr->borderWidth + 4); - } else { - butPtr->inset = butPtr->borderWidth; - width += 2; - height += 2; - if (butPtr->defaultState != STATE_DISABLED) { - butPtr->inset += butPtr->highlightWidth; - } - } - } else if ((butPtr->type != TYPE_LABEL)) { - if (butPtr->indicatorOn) { - butPtr->inset = 0; - } else { - /* - * Under Appearance, the Checkbutton or radiobutton with an image - * is represented by a BevelButton with the Sticky defProc... - * So we must set its height in the same way as the Button - * with an image or bitmap. - */ - if (((butPtr->image != None) || (butPtr->bitmap != None)) - && TkMacHaveAppearance()) { - int border; - butPtr->inset = 0; - if ( butPtr->borderWidth <= 2 ) { - border = 6; - } else { - border = 2 * butPtr->borderWidth + 2; - } - width += border; - height += border; - } else { - butPtr->inset = butPtr->borderWidth; - } - } - } else { - butPtr->inset = butPtr->borderWidth; - } - - - - Tk_GeometryRequest(butPtr->tkwin, (int) (width + butPtr->indicatorSpace - + 2*butPtr->inset), (int) (height + 2*butPtr->inset)); - Tk_SetInternalBorder(butPtr->tkwin, butPtr->inset); -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyButton -- - * - * Free data structures associated with the button control. - * - * Results: - * None. - * - * Side effects: - * Restores the default control state. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyButton( - TkButton *butPtr) -{ - /* Do nothing. */ -} - -/* - *-------------------------------------------------------------- - * - * DrawBufferedControl -- - * - * This function uses a dummy Macintosh window to allow - * drawing Mac controls to any GWorld (including off-screen - * bitmaps). In addition, this code may apply custom - * colors passed in the TkButton. - * - * Results: - * None. - * - * Side effects: - * Control is to the GWorld. Static state created on - * first invocation of this routine. - * - *-------------------------------------------------------------- - */ - -static void -DrawBufferedControl( - TkButton *butPtr, /* Tk button. */ - GWorldPtr destPort, /* Off screen GWorld. */ - GC gc, /* The GC we are drawing into - needed for - * the bevel button */ - Pixmap pixmap /* The pixmap we are drawing into - needed - for the bevel button */ - ) -{ - ControlRef controlHandle; - CCTabHandle ccTabHandle; - int windowColorChanged = false; - RGBColor saveBackColor; - int isBevel = 0; - - if (windowRef == NULL) { - InitSampleControls(); - } - - /* - * Now swap in the passed in GWorld for the portBits of our fake - * window. We also adjust various fields in the WindowRecord to make - * the system think this is a normal window. - * Note, we can use DrawControlInCurrentPort under Appearance, so we don't - * need to swap pixmaps. - */ - - if (!TkMacHaveAppearance()) { - ((CWindowPeek) windowRef)->port.portPixMap = destPort->portPixMap; - } - - ((CWindowPeek) windowRef)->port.portRect = destPort->portRect; - RectRgn(((CWindowPeek) windowRef)->port.visRgn, &destPort->portRect); - RectRgn(((CWindowPeek) windowRef)->strucRgn, &destPort->portRect); - RectRgn(((CWindowPeek) windowRef)->updateRgn, &destPort->portRect); - RectRgn(((CWindowPeek) windowRef)->contRgn, &destPort->portRect); - PortChanged(windowRef); - - /* - * Set up control in hidden window to match what we need - * to draw in the buffered window. - */ - - isBevel = 0; - switch (butPtr->type) { - case TYPE_BUTTON: - if (TkMacHaveAppearance()) { - if ((butPtr->image == None) && (butPtr->bitmap == None)) { - controlHandle = buttonHandle; - ccTabHandle = buttonTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medBevelHandle; - } else { - controlHandle = largeBevelHandle; - } - ccTabHandle = buttonTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } - } else { - controlHandle = buttonHandle; - ccTabHandle = buttonTabHandle; - } - break; - case TYPE_RADIO_BUTTON: - if (TkMacHaveAppearance()) { - if (((butPtr->image == None) && (butPtr->bitmap == None)) - || (butPtr->indicatorOn)) { - controlHandle = radioHandle; - ccTabHandle = radioTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallStickyBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medStickyBevelHandle; - } else { - controlHandle = largeStickyBevelHandle; - } - ccTabHandle = radioTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } - } else { - controlHandle = radioHandle; - ccTabHandle = radioTabHandle; - } - break; - case TYPE_CHECK_BUTTON: - if (TkMacHaveAppearance()) { - if (((butPtr->image == None) && (butPtr->bitmap == None)) - || (butPtr->indicatorOn)) { - controlHandle = checkHandle; - ccTabHandle = checkTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallStickyBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medStickyBevelHandle; - } else { - controlHandle = largeStickyBevelHandle; - } - ccTabHandle = checkTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } - } else { - controlHandle = checkHandle; - ccTabHandle = checkTabHandle; - } - break; - } - - (**controlHandle).contrlRect.left = butPtr->inset; - (**controlHandle).contrlRect.top = butPtr->inset; - (**controlHandle).contrlRect.right = Tk_Width(butPtr->tkwin) - - butPtr->inset; - (**controlHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin) - - butPtr->inset; - - /* - * Setting the control visibility by hand does not - * seem to work under Appearance. - */ - - if (TkMacHaveAppearance()) { - SetControlVisibility(controlHandle, true, false); - (**userPaneHandle).contrlRect.left = 0; - (**userPaneHandle).contrlRect.top = 0; - (**userPaneHandle).contrlRect.right = Tk_Width(butPtr->tkwin); - (**userPaneHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin); - } else { - (**controlHandle).contrlVis = 255; - } - - - - if (butPtr->flags & SELECTED) { - (**controlHandle).contrlValue = 1; - } else { - (**controlHandle).contrlValue = 0; - } - - if (!tkMacAppInFront || butPtr->state == STATE_DISABLED) { - (**controlHandle).contrlHilite = kControlInactivePart; - } else if (butPtr->state == STATE_ACTIVE) { - if (isBevel) { - (**controlHandle).contrlHilite = kControlButtonPart; - } else { - switch (butPtr->type) { - case TYPE_BUTTON: - (**controlHandle).contrlHilite = kControlButtonPart; - break; - case TYPE_RADIO_BUTTON: - (**controlHandle).contrlHilite = kControlRadioButtonPart; - break; - case TYPE_CHECK_BUTTON: - (**controlHandle).contrlHilite = kControlCheckBoxPart; - break; - } - } - } else { - (**controlHandle).contrlHilite = kControlNoPart; - } - /* - * Before we draw the control we must add the hidden window back to the - * main window list. Otherwise, radiobuttons and checkbuttons will draw - * incorrectly. I don't really know why - but clearly the control draw - * proc needs to have the controls window in the window list. This is not - * necessary under Appearance, and will have to go when we Carbonize Tk... - */ - if (!TkMacHaveAppearance()) { - ((CWindowPeek) windowRef)->nextWindow = (CWindowPeek) LMGetWindowList(); - LMSetWindowList(windowRef); - } - - /* - * Now we can set the port to our doctered up window. We next need - * to muck with the colors for the port & window to draw the control - * with the proper Tk colors. If we need to we also draw a default - * ring for buttons. - * Under Appearance, we draw the control directly into destPort, and - * just set the default control data. - */ - - if (TkMacHaveAppearance()) { - SetPort((GrafPort *) destPort); - } else { - SetPort(windowRef); - } - - windowColorChanged = UpdateControlColors(butPtr, controlHandle, - ccTabHandle, &saveBackColor); - - if ((butPtr->type == TYPE_BUTTON) && TkMacHaveAppearance()) { - Boolean isDefault; - - if (butPtr->defaultState == STATE_ACTIVE) { - isDefault = true; - } else { - isDefault = false; - } - SetControlData(controlHandle, kControlNoPart, - kControlPushButtonDefaultTag, - sizeof(isDefault), (Ptr) &isDefault); - } - - if (TkMacHaveAppearance()) { - DrawControlInCurrentPort(userPaneHandle); - } else { - Draw1Control(controlHandle); - } - - if (!TkMacHaveAppearance() && - (butPtr->type == TYPE_BUTTON) && - (butPtr->defaultState == STATE_ACTIVE)) { - Rect box = (**controlHandle).contrlRect; - RGBColor rgbColor; - - TkSetMacColor(butPtr->highlightColorPtr->pixel, &rgbColor); - RGBForeColor(&rgbColor); - PenSize(butPtr->highlightWidth - 1, butPtr->highlightWidth - 1); - InsetRect(&box, -butPtr->highlightWidth, -butPtr->highlightWidth); - FrameRoundRect(&box, 16, 16); - } - - if (windowColorChanged) { - RGBColor dummyColor; - ChangeBackgroundWindowColor(windowRef, saveBackColor, &dummyColor); - } - - /* - * Clean up: remove the hidden window from the main window list, and - * hide the control we drew. - */ - - if (TkMacHaveAppearance()) { - SetControlVisibility(controlHandle, false, false); - if (isBevel) { - KillPicture(bevelButtonContent.u.picture); - } - } else { - (**controlHandle).contrlVis = 0; - } - if (!TkMacHaveAppearance()) { - LMSetWindowList((WindowRef) ((CWindowPeek) windowRef)->nextWindow); - } -} - -/* - *-------------------------------------------------------------- - * - * InitSampleControls -- - * - * This function initializes a dummy Macintosh window and - * sample controls to allow drawing Mac controls to any GWorld - * (including off-screen bitmaps). - * - * Results: - * None. - * - * Side effects: - * Controls & a window are created. - * - *-------------------------------------------------------------- - */ - -static void -InitSampleControls() -{ - Rect geometry = {0, 0, 10, 10}; - CWindowPeek windowList; - GWorldPtr frontWin = NULL; - TkMacWindowList *winListPtr; - - /* - * Create a dummy window that we can draw to. We will - * actually replace this window's bitmap with the one - * we want to draw to at a later time. This window and - * the data structures attached to it are only deallocated - * on exit of the application. - */ - - /* - * This is a bit of a hack... The problem is that under appearance, - * taking a window out of the window list causes instability, so we can't - * do that. OTOH, we need to make sure that this window is NEVER the front - * window, or we may inadvertently send keystrokes to it... - * So we put it BEHIND ".", and then we won't ever be able to destroy - * ALL the windows that are above it. - */ - - for (winListPtr = tkMacWindowListPtr; winListPtr != NULL; - winListPtr = winListPtr->nextPtr) { - frontWin = ((MacDrawable *) tkMacWindowListPtr->winPtr->privatePtr)->portPtr; - if (strcmp(tkMacWindowListPtr->winPtr->pathName, ".") == 0) { - break; - } - } - - windowRef = NewCWindow(NULL, &geometry, "\pempty", false, - zoomDocProc, (WindowRef) frontWin, true, 0); - if (windowRef == NULL) { - panic("Can't allocate buffer window."); - } - - /* - * Now add the three standard controls to hidden window. We - * only create one of each and reuse them for every widget in - * Tk. - * Under Appearance, we have to embed the controls in a UserPane - * control, so that we can color the background text in - * radiobuttons and checkbuttons. - */ - - SetPort(windowRef); - - if (TkMacHaveAppearance()) { - - OSErr err; - ControlRef dontCare; - - /* - * Adding UserPaneBackgroundProcs to the root control does - * not seem to work, so we have to add another UserPane to - * the root control. - */ - - err = CreateRootControl(windowRef, &dontCare); - if (err != noErr) { - panic("Can't create root control in DrawBufferedControl"); - } - - userPaneHandle = NewControl(windowRef, &geometry, "\p", - true, kControlSupportsEmbedding|kControlHasSpecialBackground, - 0, 1, kControlUserPaneProc, (SInt32) 0); - SetUserPaneSetUpSpecialBackgroundProc(userPaneHandle, - UserPaneBackgroundProc); - SetUserPaneDrawProc(userPaneHandle, UserPaneDraw); - - buttonHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlPushButtonProc, (SInt32) 0); - EmbedControl(buttonHandle, userPaneHandle); - checkHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlCheckBoxProc, (SInt32) 0); - EmbedControl(checkHandle, userPaneHandle); - radioHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlRadioButtonProc, (SInt32) 0); - EmbedControl(radioHandle, userPaneHandle); - smallBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 - | kControlContentPictHandle, - kControlBevelButtonSmallBevelProc, (SInt32) 0); - EmbedControl(smallBevelHandle, userPaneHandle); - medBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 - | kControlContentPictHandle, - kControlBevelButtonNormalBevelProc, (SInt32) 0); - EmbedControl(medBevelHandle, userPaneHandle); - largeBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 - | kControlContentPictHandle, - kControlBevelButtonLargeBevelProc, (SInt32) 0); - EmbedControl(largeBevelHandle, userPaneHandle); - bevelButtonContent.contentType = kControlContentPictHandle; - smallStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents - | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonSmallBevelProc, (SInt32) 0); - EmbedControl(smallStickyBevelHandle, userPaneHandle); - medStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents - | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonNormalBevelProc, (SInt32) 0); - EmbedControl(medStickyBevelHandle, userPaneHandle); - largeStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents - | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonLargeBevelProc, (SInt32) 0); - EmbedControl(largeStickyBevelHandle, userPaneHandle); - - picParams.version = -2; - picParams.hRes = 0x00480000; - picParams.vRes = 0x00480000; - picParams.srcRect.top = 0; - picParams.srcRect.left = 0; - - ((CWindowPeek) windowRef)->visible = true; - } else { - buttonHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, pushButProc, (SInt32) 0); - checkHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, checkBoxProc, (SInt32) 0); - radioHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, radioButProc, (SInt32) 0); - ((CWindowPeek) windowRef)->visible = true; - - buttonTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab)); - checkTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab)); - radioTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab)); - } - - /* - * Remove our window from the window list. This way our - * applications and others will not be confused that this - * window exists - but no one knows about it. - * I actually don't see the point of doing this, and it causes Floating - * Window support to crash under Appearance, so I just leave it out. - * Note that we have to do without this under Carbon, since you can't - * go poking at the window list... - */ - - if (!TkMacHaveAppearance()) { - windowList = (CWindowPeek) LMGetWindowList(); - if (windowList == (CWindowPeek) windowRef) { - LMSetWindowList((WindowRef) windowList->nextWindow); - } else { - while ((windowList != NULL) - && (windowList->nextWindow != (CWindowPeek) windowRef)) { - windowList = windowList->nextWindow; - } - if (windowList != NULL) { - windowList->nextWindow = windowList->nextWindow->nextWindow; - } - } - ((CWindowPeek) windowRef)->nextWindow = NULL; - } - - /* - * Create an exit handler to clean up this mess if we our - * unloaded etc. We need to remember the windows portPixMap - * so it isn't leaked. - * - * TODO: The ButtonExitProc doesn't currently work and the - * code it includes will crash the Mac on exit from Tk. - - oldPixPtr = ((CWindowPeek) windowRef)->port.portPixMap; - TkCreateExitHandler(ButtonExitProc, (ClientData) NULL); - */ - -} - -/* - *-------------------------------------------------------------- - * - * SetupBevelButton -- - * - * Sets up the Bevel Button with image by copying the - * source image onto the PicHandle for the button. - * - * Results: - * None - * - * Side effects: - * The image or bitmap for the button is copied over to a picture. - * - *-------------------------------------------------------------- - */ -void -SetupBevelButton( - TkButton *butPtr, /* Tk button. */ - ControlRef controlHandle, /* The control to set this picture to */ - GWorldPtr destPort, /* Off screen GWorld. */ - GC gc, /* The GC we are drawing into - needed for - * the bevel button */ - Pixmap pixmap /* The pixmap we are drawing into - needed - for the bevel button */ - ) -{ - int height, width; - ControlButtonGraphicAlignment theAlignment; - - SetPort((GrafPtr) destPort); - - if (butPtr->image != None) { - Tk_SizeOfImage(butPtr->image, - &width, &height); - } else { - Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, - &width, &height); - } - - if ((butPtr->width > 0) && (butPtr->width < width)) { - width = butPtr->width; - } - if ((butPtr->height > 0) && (butPtr->height < height)) { - height = butPtr->height; - } - - picParams.srcRect.right = width; - picParams.srcRect.bottom = height; - - bevelButtonContent.u.picture = OpenCPicture(&picParams); - - /* - * TO DO - There is one case where XCopyPlane calls CopyDeepMask, - * which does not get recorded in the picture. So the bitmap code - * will fail in that case. - */ - - if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { - Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height, - pixmap, 0, 0); - } else if (butPtr->image != NULL) { - Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, 0, 0); - } else { - XSetClipOrigin(butPtr->display, gc, 0, 0); - XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, 0, 0, - (unsigned int) width, (unsigned int) height, 0, 0, 1); - } - - ClosePicture(); - - SetControlData(controlHandle, kControlButtonPart, - kControlBevelButtonContentTag, - sizeof(ControlButtonContentInfo), - (char *) &bevelButtonContent); - - if (butPtr->anchor == TK_ANCHOR_N) { - theAlignment = kControlBevelButtonAlignTop; - } else if (butPtr->anchor == TK_ANCHOR_NE) { - theAlignment = kControlBevelButtonAlignTopRight; - } else if (butPtr->anchor == TK_ANCHOR_E) { - theAlignment = kControlBevelButtonAlignRight; - } else if (butPtr->anchor == TK_ANCHOR_SE) { - theAlignment = kControlBevelButtonAlignBottomRight; - } else if (butPtr->anchor == TK_ANCHOR_S) { - theAlignment = kControlBevelButtonAlignBottom; - } else if (butPtr->anchor == TK_ANCHOR_SW) { - theAlignment = kControlBevelButtonAlignBottomLeft; - } else if (butPtr->anchor == TK_ANCHOR_W) { - theAlignment = kControlBevelButtonAlignLeft; - } else if (butPtr->anchor == TK_ANCHOR_NW) { - theAlignment = kControlBevelButtonAlignTopLeft; - } else if (butPtr->anchor == TK_ANCHOR_CENTER) { - theAlignment = kControlBevelButtonAlignCenter; - } - - SetControlData(controlHandle, kControlButtonPart, - kControlBevelButtonGraphicAlignTag, - sizeof(ControlButtonGraphicAlignment), - (char *) &theAlignment); - -} - -/* - *-------------------------------------------------------------- - * - * SetUserPaneDrawProc -- - * - * Utility function to add a UserPaneDrawProc - * to a userPane control. From MoreControls code - * from Apple DTS. - * - * Results: - * MacOS system error. - * - * Side effects: - * The user pane gets a new UserPaneDrawProc. - * - *-------------------------------------------------------------- - */ -pascal OSErr SetUserPaneDrawProc ( - ControlRef control, - ControlUserPaneDrawProcPtr upp) -{ - ControlUserPaneDrawUPP myControlUserPaneDrawUPP; - myControlUserPaneDrawUPP = NewControlUserPaneDrawProc(upp); - return SetControlData (control, - kControlNoPart, kControlUserPaneDrawProcTag, - sizeof(myControlUserPaneDrawUPP), - (Ptr) &myControlUserPaneDrawUPP); -} - -/* - *-------------------------------------------------------------- - * - * SetUserPaneSetUpSpecialBackgroundProc -- - * - * Utility function to add a UserPaneBackgroundProc - * to a userPane control - * - * Results: - * MacOS system error. - * - * Side effects: - * The user pane gets a new UserPaneBackgroundProc. - * - *-------------------------------------------------------------- - */ -pascal OSErr -SetUserPaneSetUpSpecialBackgroundProc( - ControlRef control, - ControlUserPaneBackgroundProcPtr upp) -{ - ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP; - myControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundProc(upp); - return SetControlData (control, kControlNoPart, - kControlUserPaneBackgroundProcTag, - sizeof(myControlUserPaneBackgroundUPP), - (Ptr) &myControlUserPaneBackgroundUPP); -} - -/* - *-------------------------------------------------------------- - * - * UserPaneDraw -- - * - * This function draws the background of the user pane that will - * lie under checkboxes and radiobuttons. - * - * Results: - * None. - * - * Side effects: - * The user pane gets updated to the current color. - * - *-------------------------------------------------------------- - */ -pascal void -UserPaneDraw( - ControlRef control, - ControlPartCode cpc) -{ - Rect contrlRect = (**control).contrlRect; - RGBBackColor (&gUserPaneBackground); - EraseRect (&contrlRect); -} - -/* - *-------------------------------------------------------------- - * - * UserPaneBackgroundProc -- - * - * This function sets up the background of the user pane that will - * lie under checkboxes and radiobuttons. - * - * Results: - * None. - * - * Side effects: - * The user pane background gets set to the current color. - * - *-------------------------------------------------------------- - */ - -pascal void -UserPaneBackgroundProc( - ControlHandle, - ControlBackgroundPtr info) -{ - if (info->colorDevice) { - RGBBackColor (&gUserPaneBackground); - } -} - -/* - *-------------------------------------------------------------- - * - * UpdateControlColors -- - * - * This function will review the colors used to display - * a Macintosh button. If any non-standard colors are - * used we create a custom palette for the button, populate - * with the colors for the button and install the palette. - * - * Under Appearance, we just set the pointer that will be - * used by the UserPaneDrawProc. - * - * Results: - * None. - * - * Side effects: - * The Macintosh control may get a custom palette installed. - * - *-------------------------------------------------------------- - */ - -static int -UpdateControlColors( - TkButton *butPtr, - ControlRef controlHandle, - CCTabHandle ccTabHandle, - RGBColor *saveColorPtr) -{ - XColor *xcolor; - - /* - * Under Appearance we cannot change the background of the - * button itself. However, the color we are setting is the color - * of the containing userPane. This will be the color that peeks - * around the rounded corners of the button. - * We make this the highlightbackground rather than the background, - * because if you color the background of a frame containing a - * button, you usually also color the highlightbackground as well, - * or you will get a thin grey ring around the button. - */ - - if (TkMacHaveAppearance() && (butPtr->type == TYPE_BUTTON)) { - xcolor = Tk_3DBorderColor(butPtr->highlightBorder); - } else { - xcolor = Tk_3DBorderColor(butPtr->normalBorder); - } - if (TkMacHaveAppearance()) { - TkSetMacColor(xcolor->pixel, &gUserPaneBackground); - } else { - (**ccTabHandle).ccSeed = 0; - (**ccTabHandle).ccRider = 0; - (**ccTabHandle).ctSize = 3; - (**ccTabHandle).ctTable[0].value = cBodyColor; - TkSetMacColor(xcolor->pixel, - &(**ccTabHandle).ctTable[0].rgb); - (**ccTabHandle).ctTable[1].value = cTextColor; - TkSetMacColor(butPtr->normalFg->pixel, - &(**ccTabHandle).ctTable[1].rgb); - (**ccTabHandle).ctTable[2].value = cFrameColor; - TkSetMacColor(butPtr->highlightColorPtr->pixel, - &(**ccTabHandle).ctTable[2].rgb); - SetControlColor(controlHandle, ccTabHandle); - - if (((xcolor->pixel >> 24) != CONTROL_BODY_PIXEL) && - ((butPtr->type == TYPE_CHECK_BUTTON) || - (butPtr->type == TYPE_RADIO_BUTTON))) { - RGBColor newColor; - - if (TkSetMacColor(xcolor->pixel, &newColor)) { - ChangeBackgroundWindowColor((**controlHandle).contrlOwner, - newColor, saveColorPtr); - } - return true; - } - } - - return false; -} - -/* - *-------------------------------------------------------------- - * - * ChangeBackgroundWindowColor -- - * - * This procedure will change the background color entry - * in the Window's colortable. The system isn't notified - * of the change. This call should only be used to fool - * the drawing routines for checkboxes and radiobuttons. - * Any change should be temporary and be reverted after - * the widget is drawn. - * - * Results: - * None. - * - * Side effects: - * The Window's color table will be adjusted. - * - *-------------------------------------------------------------- - */ - -static void -ChangeBackgroundWindowColor( - WindowRef macintoshWindow, /* A Mac window whose color to change. */ - RGBColor rgbColor, /* The new RGB Color for the background. */ - RGBColor *oldColor) /* The old color of the background. */ -{ - AuxWinHandle auxWinHandle; - WCTabHandle winCTabHandle; - short ctIndex; - ColorSpecPtr rgbScan; - - GetAuxWin(macintoshWindow, &auxWinHandle); - winCTabHandle = (WCTabHandle) ((**auxWinHandle).awCTable); - - /* - * Scan through the color table until we find the content - * (background) color for the window. Don't tell the system - * about the change - it will generate damage and we will get - * into an infinite loop. - */ - - ctIndex = (**winCTabHandle).ctSize; - while (ctIndex > -1) { - rgbScan = ctIndex + (**winCTabHandle).ctTable; - - if (rgbScan->value == wContentColor) { - *oldColor = rgbScan->rgb; - rgbScan->rgb = rgbColor; - break; - } - ctIndex--; - } -} - -/* - *-------------------------------------------------------------- - * - * ButtonEventProc -- - * - * This procedure is invoked by the Tk dispatcher for various - * events on buttons. - * - * Results: - * None. - * - * Side effects: - * When it gets exposed, it is redisplayed. - * - *-------------------------------------------------------------- - */ - -static void -ButtonEventProc( - ClientData clientData, /* Information about window. */ - XEvent *eventPtr) /* Information about event. */ -{ - TkButton *buttonPtr = (TkButton *) clientData; - - if (eventPtr->type == ActivateNotify - || eventPtr->type == DeactivateNotify) { - if ((buttonPtr->tkwin == NULL) || (!Tk_IsMapped(buttonPtr->tkwin))) { - return; - } - if ((buttonPtr->flags & REDRAW_PENDING) == 0) { - Tcl_DoWhenIdle(TkpDisplayButton, (ClientData) buttonPtr); - buttonPtr->flags |= REDRAW_PENDING; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * ButtonExitProc -- - * - * This procedure is invoked just before the application exits. - * It frees all of the control handles, our dummy window, etc. - * - * Results: - * None. - * - * Side effects: - * Memory is freed. - * - *---------------------------------------------------------------------- - */ - -static void -ButtonExitProc(clientData) - ClientData clientData; /* Not used. */ -{ - Rect pixRect = {0, 0, 10, 10}; - Rect rgnRect = {0, 0, 0, 0}; - - /* - * Restore our dummy window to it's origional state by putting it - * back in the window list and restoring it's bits. The destroy - * the controls and window. - */ - - ((CWindowPeek) windowRef)->nextWindow = (CWindowPeek) LMGetWindowList(); - LMSetWindowList(windowRef); - ((CWindowPeek) windowRef)->port.portPixMap = oldPixPtr; - ((CWindowPeek) windowRef)->port.portRect = pixRect; - RectRgn(((CWindowPeek) windowRef)->port.visRgn, &rgnRect); - RectRgn(((CWindowPeek) windowRef)->strucRgn, &rgnRect); - RectRgn(((CWindowPeek) windowRef)->updateRgn, &rgnRect); - RectRgn(((CWindowPeek) windowRef)->contRgn, &rgnRect); - PortChanged(windowRef); - - DisposeControl(buttonHandle); - DisposeControl(checkHandle); - DisposeControl(radioHandle); - DisposeWindow(windowRef); - windowRef = NULL; -} diff --git a/mac/tkMacClipboard.c b/mac/tkMacClipboard.c deleted file mode 100644 index c565392..0000000 --- a/mac/tkMacClipboard.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * tkMacClipboard.c -- - * - * This file manages the clipboard for the Tk toolkit. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacClipboard.c,v 1.6 2000/02/10 08:53:11 jingham Exp $ - */ - -#include "tkInt.h" -#include "tkPort.h" -#include "tkMacInt.h" - -#include <Scrap.h> -#include <Events.h> - -#include "tkSelect.h" - -/* - *---------------------------------------------------------------------- - * - * TkSelGetSelection -- - * - * Retrieve the specified selection from another process. For - * now, only fetching XA_STRING from CLIPBOARD is supported. - * Eventually other types should be allowed. - * - * Results: - * The return value is a standard Tcl return value. - * If an error occurs (such as no selection exists) - * then an error message is left in the interp's result. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkSelGetSelection( - Tcl_Interp *interp, /* Interpreter to use for reporting - * errors. */ - Tk_Window tkwin, /* Window on whose behalf to retrieve - * the selection (determines display - * from which to retrieve). */ - Atom selection, /* Selection to retrieve. */ - Atom target, /* Desired form in which selection - * is to be returned. */ - Tk_GetSelProc *proc, /* Procedure to call to process the - * selection, once it has been retrieved. */ - ClientData clientData) /* Arbitrary value to pass to proc. */ -{ - int result; - long length, offset = 0; - Handle handle; - - if ((selection == Tk_InternAtom(tkwin, "CLIPBOARD")) - && (target == XA_STRING)) { - /* - * Get the scrap from the Macintosh global clipboard. - */ - handle = NewHandle(1); - length = GetScrap(handle, 'TEXT', &offset); - if (length > 0) { - Tcl_DString encodedText; - - SetHandleSize(handle, (Size) length + 1); - HLock(handle); - (*handle)[length] = '\0'; - - Tcl_ExternalToUtfDString(NULL, *handle, length, &encodedText); - result = (*proc)(clientData, interp, - Tcl_DStringValue(&encodedText)); - Tcl_DStringFree(&encodedText); - - HUnlock(handle); - DisposeHandle(handle); - return result; - } - - DisposeHandle(handle); - } - - Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection), - " selection doesn't exist or form \"", Tk_GetAtomName(tkwin, target), - "\" not defined", (char *) NULL); - return TCL_ERROR; -} - -/* - *---------------------------------------------------------------------- - * - * TkSetSelectionOwner -- - * - * This function claims ownership of the specified selection. - * If the selection is CLIPBOARD, then we empty the system - * clipboard. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XSetSelectionOwner( - Display* display, /* X Display. */ - Atom selection, /* What selection to own. */ - Window owner, /* Window to be the owner. */ - Time time) /* The current time? */ -{ - Tk_Window tkwin; - TkDisplay *dispPtr; - - /* - * This is a gross hack because the Tk_InternAtom interface is broken. - * It expects a Tk_Window, even though it only needs a Tk_Display. - */ - - tkwin = (Tk_Window) TkGetMainInfoList()->winPtr; - - if (selection == Tk_InternAtom(tkwin, "CLIPBOARD")) { - - /* - * Only claim and empty the clipboard if we aren't already the - * owner of the clipboard. - */ - - dispPtr = TkGetMainInfoList()->winPtr->dispPtr; - if (dispPtr->clipboardActive) { - return; - } - ZeroScrap(); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkSelUpdateClipboard -- - * - * This function is called to force the clipboard to be updated - * after new data is added. On the Mac we don't need to do - * anything. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkSelUpdateClipboard( - TkWindow *winPtr, /* Window associated with clipboard. */ - TkClipboardTarget *targetPtr) /* Info about the content. */ -{ -} - -/* - *-------------------------------------------------------------- - * - * TkSelEventProc -- - * - * This procedure is invoked whenever a selection-related - * event occurs. - * - * Results: - * None. - * - * Side effects: - * Lots: depends on the type of event. - * - *-------------------------------------------------------------- - */ - -void -TkSelEventProc( - Tk_Window tkwin, /* Window for which event was - * targeted. */ - register XEvent *eventPtr) /* X event: either SelectionClear, - * SelectionRequest, or - * SelectionNotify. */ -{ - if (eventPtr->type == SelectionClear) { - TkSelClearSelection(tkwin, eventPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkSelPropProc -- - * - * This procedure is invoked when property-change events - * occur on windows not known to the toolkit. This is a stub - * function under Windows. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkSelPropProc( - register XEvent *eventPtr) /* X PropertyChange event. */ -{ -} - -/* - *---------------------------------------------------------------------- - * - * TkSuspendClipboard -- - * - * Handle clipboard conversion as required by the suppend event. - * This function is also called on exit. - * - * Results: - * None. - * - * Side effects: - * The local scrap is moved to the global scrap. - * - *---------------------------------------------------------------------- - */ - -void -TkSuspendClipboard() -{ - TkClipboardTarget *targetPtr; - TkClipboardBuffer *cbPtr; - TkDisplay *dispPtr; - char *buffer, *p, *endPtr, *buffPtr; - long length; - - dispPtr = TkGetDisplayList(); - if ((dispPtr == NULL) || !dispPtr->clipboardActive) { - return; - } - - for (targetPtr = dispPtr->clipTargetPtr; targetPtr != NULL; - targetPtr = targetPtr->nextPtr) { - if (targetPtr->type == XA_STRING) - break; - } - if (targetPtr != NULL) { - Tcl_DString encodedText; - - length = 0; - for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL; - cbPtr = cbPtr->nextPtr) { - length += cbPtr->length; - } - - buffer = ckalloc(length); - buffPtr = buffer; - for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL; - cbPtr = cbPtr->nextPtr) { - for (p = cbPtr->buffer, endPtr = p + cbPtr->length; - p < endPtr; p++) { - if (*p == '\n') { - *buffPtr++ = '\r'; - } else { - *buffPtr++ = *p; - } - } - } - - ZeroScrap(); - Tcl_UtfToExternalDString(NULL, buffer, length, &encodedText); - PutScrap(Tcl_DStringLength(&encodedText), 'TEXT', - Tcl_DStringValue(&encodedText)); - Tcl_DStringFree(&encodedText); - ckfree(buffer); - } - - /* - * The system now owns the scrap. We tell Tk that it has - * lost the selection so that it will look for it the next time - * it needs it. (Window list NULL if quiting.) - */ - - if (TkGetMainInfoList() != NULL) { - Tk_ClearSelection((Tk_Window) TkGetMainInfoList()->winPtr, - Tk_InternAtom((Tk_Window) TkGetMainInfoList()->winPtr, - "CLIPBOARD")); - } - - return; -} diff --git a/mac/tkMacColor.c b/mac/tkMacColor.c deleted file mode 100644 index 65c73fe..0000000 --- a/mac/tkMacColor.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - * tkMacColor.c -- - * - * This file maintains a database of color values for the Tk - * toolkit, in order to avoid round-trips to the server to - * map color names to pixel values. - * - * Copyright (c) 1990-1994 The Regents of the University of California. - * Copyright (c) 1994-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacColor.c,v 1.6 1999/05/22 06:32:36 jingham Exp $ - */ - -#include <tkColor.h> -#include "tkMacInt.h" - -#include <LowMem.h> -#include <Palettes.h> -#include <Quickdraw.h> - -/* - * Default Auxillary Control Record for all controls. This is cached once - * and is updated by the system. We use this to get the default system - * colors used by controls. - */ -static AuxCtlHandle defaultAuxCtlHandle = NULL; - -/* - * Forward declarations for procedures defined later in this file: - */ - -static int GetControlPartColor _ANSI_ARGS_((short part, RGBColor *macColor)); -static int GetMenuPartColor _ANSI_ARGS_((int part, RGBColor *macColor)); -static int GetWindowPartColor _ANSI_ARGS_((short part, RGBColor *macColor)); - -/* - *---------------------------------------------------------------------- - * - * TkSetMacColor -- - * - * Populates a Macintosh RGBColor structure from a X style - * pixel value. - * - * Results: - * Returns false if not a real pixel, true otherwise. - * - * Side effects: - * The variable macColor is updated to the pixels value. - * - *---------------------------------------------------------------------- - */ - -int -TkSetMacColor( - unsigned long pixel, /* Pixel value to convert. */ - RGBColor *macColor) /* Mac color struct to modify. */ -{ - switch (pixel >> 24) { - case HIGHLIGHT_PIXEL: - LMGetHiliteRGB(macColor); - return true; - case HIGHLIGHT_TEXT_PIXEL: - LMGetHiliteRGB(macColor); - if ((macColor->red == 0) && (macColor->green == 0) - && (macColor->blue == 0)) { - macColor->red = macColor->green = macColor->blue = 0xFFFFFFFF; - } else { - macColor->red = macColor->green = macColor->blue = 0; - } - return true; - case CONTROL_TEXT_PIXEL: - GetControlPartColor(cTextColor, macColor); - return true; - case CONTROL_BODY_PIXEL: - GetControlPartColor(cBodyColor, macColor); - return true; - case CONTROL_FRAME_PIXEL: - GetControlPartColor(cFrameColor, macColor); - return true; - case WINDOW_BODY_PIXEL: - GetWindowPartColor(wContentColor, macColor); - return true; - case MENU_ACTIVE_PIXEL: - case MENU_ACTIVE_TEXT_PIXEL: - case MENU_BACKGROUND_PIXEL: - case MENU_DISABLED_PIXEL: - case MENU_TEXT_PIXEL: - return GetMenuPartColor((pixel >> 24), macColor); - case APPEARANCE_PIXEL: - return false; - case PIXEL_MAGIC: - default: - macColor->blue = (unsigned short) ((pixel & 0xFF) << 8); - macColor->green = (unsigned short) (((pixel >> 8) & 0xFF) << 8); - macColor->red = (unsigned short) (((pixel >> 16) & 0xFF) << 8); - return true; - } -} - -/* - *---------------------------------------------------------------------- - * - * Stub functions -- - * - * These functions are just stubs for functions that either - * don't make sense on the Mac or have yet to be implemented. - * - * Results: - * None. - * - * Side effects: - * These calls do nothing - which may not be expected. - * - *---------------------------------------------------------------------- - */ - -Status -XAllocColor( - Display *display, /* Display. */ - Colormap map, /* Not used. */ - XColor *colorPtr) /* XColor struct to modify. */ -{ - display->request++; - colorPtr->pixel = TkpGetPixel(colorPtr); - return 1; -} - -Colormap -XCreateColormap( - Display *display, /* Display. */ - Window window, /* X window. */ - Visual *visual, /* Not used. */ - int alloc) /* Not used. */ -{ - static Colormap index = 1; - - /* - * Just return a new value each time. - */ - return index++; -} - -void -XFreeColormap( - Display* display, /* Display. */ - Colormap colormap) /* Colormap. */ -{ -} - -void -XFreeColors( - Display* display, /* Display. */ - Colormap colormap, /* Colormap. */ - unsigned long* pixels, /* Array of pixels. */ - int npixels, /* Number of pixels. */ - unsigned long planes) /* Number of pixel planes. */ -{ - /* - * The Macintosh version of Tk uses TrueColor. Nothing - * needs to be done to release colors as there really is - * no colormap in the Tk sense. - */ -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetColor -- - * - * Allocate a new TkColor for the color with the given name. - * - * Results: - * Returns a newly allocated TkColor, or NULL on failure. - * - * Side effects: - * May invalidate the colormap cache associated with tkwin upon - * allocating a new colormap entry. Allocates a new TkColor - * structure. - * - *---------------------------------------------------------------------- - */ - -TkColor * -TkpGetColor( - Tk_Window tkwin, /* Window in which color will be used. */ - Tk_Uid name) /* Name of color to allocated (in form - * suitable for passing to XParseColor). */ -{ - Display *display = Tk_Display(tkwin); - Colormap colormap = Tk_Colormap(tkwin); - TkColor *tkColPtr; - XColor color; - - /* - * Check to see if this is a system color. Otherwise, XParseColor - * will do all the work. - */ - if (strncasecmp(name, "system", 6) == 0) { - int foundSystemColor = false; - RGBColor rgbValue; - char pixelCode; - - if (!strcasecmp(name+6, "Highlight")) { - LMGetHiliteRGB(&rgbValue); - pixelCode = HIGHLIGHT_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "HighlightText")) { - LMGetHiliteRGB(&rgbValue); - if ((rgbValue.red == 0) && (rgbValue.green == 0) - && (rgbValue.blue == 0)) { - rgbValue.red = rgbValue.green = rgbValue.blue = 0xFFFFFFFF; - } else { - rgbValue.red = rgbValue.green = rgbValue.blue = 0; - } - pixelCode = HIGHLIGHT_TEXT_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "ButtonText")) { - GetControlPartColor(cTextColor, &rgbValue); - pixelCode = CONTROL_TEXT_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "ButtonFace")) { - GetControlPartColor(cBodyColor, &rgbValue); - pixelCode = CONTROL_BODY_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "ButtonFrame")) { - GetControlPartColor(cFrameColor, &rgbValue); - pixelCode = CONTROL_FRAME_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "WindowBody")) { - GetWindowPartColor(wContentColor, &rgbValue); - pixelCode = WINDOW_BODY_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "MenuActive")) { - GetMenuPartColor(MENU_ACTIVE_PIXEL, &rgbValue); - pixelCode = MENU_ACTIVE_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "MenuActiveText")) { - GetMenuPartColor(MENU_ACTIVE_TEXT_PIXEL, &rgbValue); - pixelCode = MENU_ACTIVE_TEXT_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "Menu")) { - GetMenuPartColor(MENU_BACKGROUND_PIXEL, &rgbValue); - pixelCode = MENU_BACKGROUND_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "MenuDisabled")) { - GetMenuPartColor(MENU_DISABLED_PIXEL, &rgbValue); - pixelCode = MENU_DISABLED_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "MenuText")) { - GetMenuPartColor(MENU_TEXT_PIXEL, &rgbValue); - pixelCode = MENU_TEXT_PIXEL; - foundSystemColor = true; - } else if (!strcasecmp(name+6, "AppearanceColor")) { - color.red = 0; - color.green = 0; - color.blue = 0; - pixelCode = APPEARANCE_PIXEL; - foundSystemColor = true; - } - - if (foundSystemColor) { - color.red = rgbValue.red; - color.green = rgbValue.green; - color.blue = rgbValue.blue; - color.pixel = ((((((pixelCode << 8) - | ((color.red >> 8) & 0xff)) << 8) - | ((color.green >> 8) & 0xff)) << 8) - | ((color.blue >> 8) & 0xff)); - - tkColPtr = (TkColor *) ckalloc(sizeof(TkColor)); - tkColPtr->color = color; - return tkColPtr; - } - } - - if (XParseColor(display, colormap, name, &color) == 0) { - return (TkColor *) NULL; - } - - tkColPtr = (TkColor *) ckalloc(sizeof(TkColor)); - tkColPtr->color = color; - - return tkColPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetColorByValue -- - * - * Given a desired set of red-green-blue intensities for a color, - * locate a pixel value to use to draw that color in a given - * window. - * - * Results: - * The return value is a pointer to an TkColor structure that - * indicates the closest red, blue, and green intensities available - * to those specified in colorPtr, and also specifies a pixel - * value to use to draw in that color. - * - * Side effects: - * May invalidate the colormap cache for the specified window. - * Allocates a new TkColor structure. - * - *---------------------------------------------------------------------- - */ - -TkColor * -TkpGetColorByValue( - Tk_Window tkwin, /* Window in which color will be used. */ - XColor *colorPtr) /* Red, green, and blue fields indicate - * desired color. */ -{ - TkColor *tkColPtr = (TkColor *) ckalloc(sizeof(TkColor)); - - tkColPtr->color.red = colorPtr->red; - tkColPtr->color.green = colorPtr->green; - tkColPtr->color.blue = colorPtr->blue; - tkColPtr->color.pixel = TkpGetPixel(&tkColPtr->color); - return tkColPtr; -} - -/* - *---------------------------------------------------------------------- - * - * GetControlPartColor -- - * - * Given a part number this function will return the standard - * system default color for that part. It does this by looking - * in the system's 'cctb' resource. - * - * Results: - * True if a color is found, false otherwise. - * - * Side effects: - * If a color is found then the RGB variable will be changed to - * the parts color. - * - *---------------------------------------------------------------------- - */ - -static int -GetControlPartColor( - short part, /* Part code. */ - RGBColor *macColor) /* Pointer to Mac color. */ -{ - short index; - CCTabHandle ccTab; - - if (defaultAuxCtlHandle == NULL) { - GetAuxiliaryControlRecord(NULL, &defaultAuxCtlHandle); - } - ccTab = (**defaultAuxCtlHandle).acCTable; - if(ccTab && (ResError() == noErr)) { - for(index = 0; index <= (**ccTab).ctSize; index++) { - if((**ccTab).ctTable[index].value == part) { - *macColor = (**ccTab).ctTable[index].rgb; - return true; - } - } - } - return false; -} - -/* - *---------------------------------------------------------------------- - * - * GetWindowPartColor -- - * - * Given a part number this function will return the standard - * system default color for that part. It does this by looking - * in the system's 'wctb' resource. - * - * Results: - * True if a color is found, false otherwise. - * - * Side effects: - * If a color is found then the RGB variable will be changed to - * the parts color. - * - *---------------------------------------------------------------------- - */ - -static int -GetWindowPartColor( - short part, /* Part code. */ - RGBColor *macColor) /* Pointer to Mac color. */ -{ - short index; - WCTabHandle wcTab; - - wcTab = (WCTabHandle) GetResource('wctb', 0); - if(wcTab && (ResError() == noErr)) { - for(index = 0; index <= (**wcTab).ctSize; index++) { - if((**wcTab).ctTable[index].value == part) { - *macColor = (**wcTab).ctTable[index].rgb; - return true; - } - } - } - return false; -} - -/* - *---------------------------------------------------------------------- - * - * GetMenuPartColor -- - * - * Given a magic pixel value, returns the RGB color associated - * with it by looking the value up in the system's 'mctb' resource. - * - * Results: - * True if a color is found, false otherwise. - * - * Side effects: - * If a color is found then the RGB variable will be changed to - * the parts color. - * - *---------------------------------------------------------------------- - */ - -static int -GetMenuPartColor( - int pixel, /* The magic pixel value */ - RGBColor *macColor) /* Pointer to Mac color */ -{ - RGBColor backColor, foreColor; - GDHandle maxDevice; - Rect globalRect; - MCEntryPtr mcEntryPtr; - - /* Under Appearance, we don't want to set any menu colors when we - are asked for the standard menu colors. So we return false (which - means don't use this color... */ - - if (TkMacHaveAppearance()) { - macColor->red = 0xFFFF; - macColor->green = 0; - macColor->blue = 0; - return false; - } else { - mcEntryPtr = GetMCEntry(0, 0); - switch (pixel) { - case MENU_ACTIVE_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0; - } else { - *macColor = mcEntryPtr->mctRGB3; - } - return true; - case MENU_ACTIVE_TEXT_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0xFFFF; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - return true; - case MENU_BACKGROUND_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0xFFFF; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - return true; - case MENU_DISABLED_PIXEL: - if (mcEntryPtr == NULL) { - backColor.red = backColor.blue = backColor.green = 0xFFFF; - foreColor.red = foreColor.blue = foreColor.green = 0x0000; - } else { - backColor = mcEntryPtr->mctRGB2; - foreColor = mcEntryPtr->mctRGB3; - } - SetRect(&globalRect, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); - maxDevice = GetMaxDevice(&globalRect); - if (GetGray(maxDevice, &backColor, &foreColor)) { - *macColor = foreColor; - } else { - - /* - * Pointer may have been moved by GetMaxDevice or GetGray. - */ - - mcEntryPtr = GetMCEntry(0,0); - if (mcEntryPtr == NULL) { - macColor->red = macColor->green = macColor->blue = 0x7777; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - } - return true; - case MENU_TEXT_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->green = macColor->blue = 0; - } else { - *macColor = mcEntryPtr->mctRGB3; - } - return true; - } - return false; -} -} diff --git a/mac/tkMacConfig.c b/mac/tkMacConfig.c deleted file mode 100644 index 9c80591..0000000 --- a/mac/tkMacConfig.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * tkMacConfig.c -- - * - * This module implements the Macintosh system defaults for - * the configuration package. - * - * Copyright (c) 1997 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacConfig.c,v 1.3 2002/08/05 04:30:40 dgp Exp $ - */ - -#include "tk.h" -#include "tkInt.h" - - -/* - *---------------------------------------------------------------------- - * - * TkpGetSystemDefault -- - * - * Given a dbName and className for a configuration option, - * return a string representation of the option. - * - * Results: - * Returns a Tk_Uid that is the string identifier that identifies - * this option. Returns NULL if there are no system defaults - * that match this pair. - * - * Side effects: - * None, once the package is initialized. - * - *---------------------------------------------------------------------- - */ - -Tcl_Obj * -TkpGetSystemDefault( - Tk_Window tkwin, /* A window to use. */ - CONST char *dbName, /* The option database name. */ - CONST char *className) /* The name of the option class. */ -{ - return NULL; -} diff --git a/mac/tkMacCursor.c b/mac/tkMacCursor.c deleted file mode 100644 index 9318be9..0000000 --- a/mac/tkMacCursor.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - * tkMacCursor.c -- - * - * This file contains Macintosh specific cursor related routines. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacCursor.c,v 1.7 2002/08/05 04:30:40 dgp Exp $ - */ - -#include "tkPort.h" -#include "tkInt.h" -#include "tkMacInt.h" - -#include <Resources.h> -#include <ToolUtils.h> -#include <Strings.h> - -/* - * There are three different ways to set the cursor on the Mac. - */ -#define ARROW 0 /* The arrow cursor. */ -#define COLOR 1 /* Cursors of type crsr. */ -#define NORMAL 2 /* Cursors of type CURS. */ - -/* - * The following data structure contains the system specific data - * necessary to control Windows cursors. - */ - -typedef struct { - TkCursor info; /* Generic cursor info used by tkCursor.c */ - Handle macCursor; /* Resource containing Macintosh cursor. */ - int type; /* Type of Mac cursor: arrow, crsr, CURS */ -} TkMacCursor; - -/* - * The table below is used to map from the name of a predefined cursor - * to its resource identifier. - */ - -static struct CursorName { - char *name; - int id; -} cursorNames[] = { - {"ibeam", 1}, - {"text", 1}, - {"xterm", 1}, - {"cross", 2}, - {"crosshair", 2}, - {"cross-hair", 2}, - {"plus", 3}, - {"watch", 4}, - {"arrow", 5}, - {NULL, 0} -}; - -/* - * Declarations of static variables used in this file. - */ - -static TkMacCursor * gCurrentCursor = NULL; /* A pointer to the current - * cursor. */ -static int gResizeOverride = false; /* A boolean indicating whether - * we should use the resize - * cursor during installations. */ -static int gTkOwnsCursor = true; /* A boolean indicating whether - Tk owns the cursor. If not (for - instance, in the case where a Tk - window is embedded in another app's - window, and the cursor is out of - the tk window, we will not attempt - to adjust the cursor */ - -/* - * Declarations of procedures local to this file - */ - -static void FindCursorByName _ANSI_ARGS_ ((TkMacCursor *macCursorPtr, - CONST char *string)); - -/* - *---------------------------------------------------------------------- - * - * FindCursorByName -- - * - * Retrieve a system cursor by name, and fill the macCursorPtr - * structure. If the cursor cannot be found, the macCursor field - * will be NULL. The function first attempts to load a color - * cursor. If that fails it will attempt to load a black & white - * cursor. - * - * Results: - * Fills the macCursorPtr record. - * - * Side effects: - * None - * - *---------------------------------------------------------------------- - */ - -void -FindCursorByName( - TkMacCursor *macCursorPtr, - CONST char *string) -{ - Handle resource; - Str255 curName; - int destWrote, inCurLen; - - inCurLen = strlen(string); - if (inCurLen > 255) { - return; - } - - /* - * macRoman is the encoding that the resource fork uses. - */ - - Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), string, - inCurLen, 0, NULL, - (char *) &curName[1], - 255, NULL, &destWrote, NULL); /* Internalize native */ - curName[0] = destWrote; - - resource = GetNamedResource('crsr', curName); - - if (resource != NULL) { - short id; - Str255 theName; - ResType theType; - - HLock(resource); - GetResInfo(resource, &id, &theType, theName); - HUnlock(resource); - macCursorPtr->macCursor = (Handle) GetCCursor(id); - macCursorPtr->type = COLOR; - } - - if (resource == NULL) { - macCursorPtr->macCursor = GetNamedResource('CURS', curName); - macCursorPtr->type = NORMAL; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkGetCursorByName -- - * - * Retrieve a system cursor by name. - * - * Results: - * Returns a new cursor, or NULL on errors. - * - * Side effects: - * Allocates a new cursor. - * - *---------------------------------------------------------------------- - */ - -TkCursor * -TkGetCursorByName( - Tcl_Interp *interp, /* Interpreter to use for error reporting. */ - Tk_Window tkwin, /* Window in which cursor will be used. */ - Tk_Uid string) /* Description of cursor. See manual entry - * for details on legal syntax. */ -{ - struct CursorName *namePtr; - TkMacCursor *macCursorPtr; - - macCursorPtr = (TkMacCursor *) ckalloc(sizeof(TkMacCursor)); - macCursorPtr->info.cursor = (Tk_Cursor) macCursorPtr; - - /* - * To find a cursor we must first determine if it is one of the - * builtin cursors or the standard arrow cursor. Otherwise, we - * attempt to load the cursor as a named Mac resource. - */ - - for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) { - if (strcmp(namePtr->name, string) == 0) { - break; - } - } - - - if (namePtr->name != NULL) { - if (namePtr->id == 5) { - macCursorPtr->macCursor = (Handle) -1; - macCursorPtr->type = ARROW; - } else { - macCursorPtr->macCursor = (Handle) GetCursor(namePtr->id); - macCursorPtr->type = NORMAL; - } - } else { - FindCursorByName(macCursorPtr, string); - - if (macCursorPtr->macCursor == NULL) { - CONST char **argv; - int argc, err; - - /* - * The user may be trying to specify an XCursor with fore - * & back colors. We don't want this to be an error, so pick - * off the first word, and try again. - */ - - err = Tcl_SplitList(interp, string, &argc, &argv); - if (err == TCL_OK ) { - if (argc > 1) { - FindCursorByName(macCursorPtr, argv[0]); - } - - ckfree((char *) argv); - } - } - } - - if (macCursorPtr->macCursor == NULL) { - ckfree((char *)macCursorPtr); - Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"", - (char *) NULL); - return NULL; - } else { - return (TkCursor *) macCursorPtr; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkCreateCursorFromData -- - * - * Creates a cursor from the source and mask bits. - * - * Results: - * Returns a new cursor, or NULL on errors. - * - * Side effects: - * Allocates a new cursor. - * - *---------------------------------------------------------------------- - */ - -TkCursor * -TkCreateCursorFromData( - Tk_Window tkwin, /* Window in which cursor will be used. */ - CONST char *source, /* Bitmap data for cursor shape. */ - CONST char *mask, /* Bitmap data for cursor mask. */ - int width, int height, /* Dimensions of cursor. */ - int xHot, int yHot, /* Location of hot-spot in cursor. */ - XColor fgColor, /* Foreground color for cursor. */ - XColor bgColor) /* Background color for cursor. */ -{ - return NULL; -} - -/* - *---------------------------------------------------------------------- - * - * TkpFreeCursor -- - * - * This procedure is called to release a cursor allocated by - * TkGetCursorByName. - * - * Results: - * None. - * - * Side effects: - * The cursor data structure is deallocated. - * - *---------------------------------------------------------------------- - */ - -void -TkpFreeCursor( - TkCursor *cursorPtr) -{ - TkMacCursor *macCursorPtr = (TkMacCursor *) cursorPtr; - - switch (macCursorPtr->type) { - case COLOR: - DisposeCCursor((CCrsrHandle) macCursorPtr->macCursor); - break; - case NORMAL: - ReleaseResource(macCursorPtr->macCursor); - break; - } - - if (macCursorPtr == gCurrentCursor) { - gCurrentCursor = NULL; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacInstallCursor -- - * - * Installs either the current cursor as defined by TkpSetCursor - * or a resize cursor as the cursor the Macintosh should currently - * display. - * - * Results: - * None. - * - * Side effects: - * Changes the Macintosh mouse cursor. - * - *---------------------------------------------------------------------- - */ - -void -TkMacInstallCursor( - int resizeOverride) -{ - TkMacCursor *macCursorPtr = gCurrentCursor; - CCrsrHandle ccursor; - CursHandle cursor; - - gResizeOverride = resizeOverride; - - if (resizeOverride) { - cursor = (CursHandle) GetNamedResource('CURS', "\presize"); - SetCursor(*cursor); - } else if (macCursorPtr == NULL || macCursorPtr->type == ARROW) { - SetCursor(&tcl_macQdPtr->arrow); - } else { - switch (macCursorPtr->type) { - case COLOR: - ccursor = (CCrsrHandle) macCursorPtr->macCursor; - SetCCursor(ccursor); - break; - case NORMAL: - cursor = (CursHandle) macCursorPtr->macCursor; - SetCursor(*cursor); - break; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpSetCursor -- - * - * Set the current cursor and install it. - * - * Results: - * None. - * - * Side effects: - * Changes the current cursor. - * - *---------------------------------------------------------------------- - */ - -void -TkpSetCursor( - TkpCursor cursor) -{ - if (!gTkOwnsCursor) { - return; - } - if (cursor == None) { - gCurrentCursor = NULL; - } else { - gCurrentCursor = (TkMacCursor *) cursor; - } - - if (tkMacAppInFront) { - TkMacInstallCursor(gResizeOverride); - } -} - -/* - *---------------------------------------------------------------------- - * - * Tk_MacTkOwnsCursor -- - * - * Sets whether Tk has the right to adjust the cursor. - * - * Results: - * None. - * - * Side effects: - * May keep Tk from changing the cursor. - * - *---------------------------------------------------------------------- - */ - -void -Tk_MacTkOwnsCursor( - int tkOwnsIt) -{ - gTkOwnsCursor = tkOwnsIt; -} diff --git a/mac/tkMacCursors.r b/mac/tkMacCursors.r deleted file mode 100644 index 0d199e5..0000000 --- a/mac/tkMacCursors.r +++ /dev/null @@ -1,130 +0,0 @@ -/* - * tkMacCursors.r -- - * - * This file defines a set of Macintosh cursor resources that - * are only available on the Macintosh platform. - * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacCursors.r,v 1.2 1998/09/14 18:23:34 stanton Exp $ - */ - -/* - * These are resource definitions for Macintosh cursors. - * The are identified and loaded by the "name" of the - * cursor. However, the ids must be unique. - */ - -data 'CURS' (1000, "hand") { - $"0180 1A70 2648 264A 124D 1249 6809 9801" - $"8802 4002 2002 2004 1004 0808 0408 0408" - $"0180 1BF0 3FF8 3FFA 1FFF 1FFF 6FFF FFFF" - $"FFFE 7FFE 3FFE 3FFC 1FFC 0FF8 07F8 07F8" - $"0009 0008" -}; - -data 'CURS' (1002, "bucket") { - $"0000 0000 0600 0980 0940 0B30 0D18 090C" - $"129C 212C 104C 088C 050C 0208 0000 0000" - $"0000 0000 0600 0980 09C0 0BF0 0FF8 0FFC" - $"1FFC 3FEC 1FCC 0F8C 070C 0208 0000 0000" - $"000D 000C" -}; - -data 'CURS' (1003, "cancel") { - $"0000 0000 0000 0000 3180 4A40 4A40 3F80" - $"0A00 3F80 4A40 4A46 3186 0000 0000 0000" - $"0000 0000 0000 3180 7BC0 FFE0 FFE0 7FC0" - $"3F80 7FC0 FFE6 FFEF 7BCF 3186 0000 0000" - $"0008 0005" -}; - -data 'CURS' (1004, "Resize") { - $"FFFF 8001 BF01 A181 A1F9 A18D A18D BF8D" - $"9F8D 880D 880D 880D 8FFD 87FD 8001 FFFF" - $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" - $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" - $"0008 0008" -}; - -data 'CURS' (1005, "eyedrop") { - $"000E 001F 001F 00FF 007E 00B8 0118 0228" - $"0440 0880 1100 2200 4400 4800 B000 4000" - $"000E 001F 001F 00FF 007E 00F8 01F8 03E8" - $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000" - $"000F 0000" -}; - -data 'CURS' (1006, "eyedrop-full") { - $"000E 001F 001F 00FF 007E 00B8 0118 0328" - $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000" - $"000E 001F 001F 00FF 007E 00F8 01F8 03E8" - $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000" - $"000F 0000" -}; - -data 'CURS' (1007, "zoom-in") { - $"0780 1860 2790 5868 5028 A014 AFD4 AFD4" - $"A014 5028 5868 2798 187C 078E 0007 0003" - $"0780 1FE0 3FF0 7878 7038 E01C EFDC EFDC" - $"E01C 7038 7878 3FF8 1FFC 078E 0007 0003" - $"0007 0007" -}; - -data 'CURS' (1008, "zoom-out") { - $"0780 1860 2790 5868 5328 A314 AFD4 AFD4" - $"A314 5328 5868 2798 187C 078E 0007 0003" - $"0780 1FE0 3FF0 7878 7338 E31C EFDC EFDC" - $"E31C 7338 7878 3FF8 1FFC 078E 0007 0003" - $"0007 0007" -}; - -/* - * The following are resource definitions for color - * cursors on the Macintosh. If a color cursor and - * a black & white cursor are both defined with the - * same name preference will be given to the color - * cursors. - */ - -data 'crsr' (1000, "hand") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0180 1A70 2648 264A 124D 1249" - $"6809 9801 8802 4002 2002 2004 1004 0808" - $"0408 0408 0180 1BF0 3FF8 3FFA 1FFF 1FFF" - $"6FFF FFFF FFFE 7FFE 3FFE 3FFC 1FFC 0FF8" - $"07F8 07F8 0008 0008 0000 0000 0000 0000" - $"0000 0000 8004 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0002 0001 0002 0000 0000 0000 00D2 0000" - $"0000 0003 C000 03CD 7F00 0D7D 75C0 0D7D" - $"75CC 035D 75F7 035D 75D7 3CD5 55D7 D7D5" - $"5557 D5D5 555C 3555 555C 0D55 555C 0D55" - $"5570 0355 5570 00D5 55C0 0035 55C0 0035" - $"55C0 0000 0000 0000 0002 0000 FFFF FFFF" - $"FFFF 0001 FFFF CCCC 9999 0003 0000 0000" - $"0000" -}; - -data 'crsr' (1001, "fist") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0DB0 124C" - $"100A 0802 1802 2002 2002 2004 1004 0808" - $"0408 0408 0000 0000 0000 0000 0DB0 1FFC" - $"1FFE 0FFE 1FFE 3FFE 3FFE 3FFC 1FFC 0FF8" - $"07F8 07F8 0008 0008 0000 0000 0000 0000" - $"0000 0000 8004 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0002 0001 0002 0000 0000 0000 00D2 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 00F3 CF00 035D 75F0 0355 55DC 00D5" - $"555C 03D5 555C 0D55 555C 0D55 555C 0D55" - $"5570 0355 5570 00D5 55C0 0035 55C0 0035" - $"55C0 0000 0000 0000 0002 0000 FFFF FFFF" - $"FFFF 0001 FFFF CCCC 9999 0003 0000 0000" - $"0000" -}; - diff --git a/mac/tkMacDefault.h b/mac/tkMacDefault.h deleted file mode 100644 index 64901d4..0000000 --- a/mac/tkMacDefault.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - * tkMacDefault.h -- - * - * This file defines the defaults for all options for all of - * the Tk widgets. - * - * Copyright (c) 1991-1994 The Regents of the University of California. - * Copyright (c) 1994-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacDefault.h,v 1.16 2002/06/21 23:09:55 hobbs Exp $ - */ - -#ifndef _TKMACDEFAULT -#define _TKMACDEFAULT - -/* - * The definitions below provide symbolic names for the default colors. - * NORMAL_BG - Normal background color. - * ACTIVE_BG - Background color when widget is active. - * SELECT_BG - Background color for selected text. - * SELECT_FG - Foreground color for selected text. - * TROUGH - Background color for troughs in scales and scrollbars. - * INDICATOR - Color for indicator when button is selected. - * DISABLED - Foreground color when widget is disabled. - */ - -#define BLACK "Black" -#define WHITE "White" - -#define NORMAL_BG "systemWindowBody" -#define ACTIVE_BG "#ececec" -#define SELECT_BG "systemHighlight" -#define SELECT_FG "systemHighlightText" -#define TROUGH "#c3c3c3" -#define INDICATOR "#b03060" -#define DISABLED "#a3a3a3" - -/* - * Defaults for labels, buttons, checkbuttons, and radiobuttons: - */ - -#define DEF_BUTTON_ANCHOR "center" -#define DEF_BUTTON_ACTIVE_BG_COLOR "systemButtonText" -#define DEF_BUTTON_ACTIVE_BG_MONO BLACK -#define DEF_BUTTON_ACTIVE_FG_COLOR "systemButtonFace" -#define DEF_CHKRAD_ACTIVE_FG_COLOR DEF_BUTTON_ACTIVE_FG_COLOR -#define DEF_BUTTON_ACTIVE_FG_MONO WHITE -#define DEF_BUTTON_BG_COLOR "systemButtonFace" -#define DEF_BUTTON_BG_MONO WHITE -#define DEF_BUTTON_BITMAP "" -#define DEF_BUTTON_BORDER_WIDTH "2" -#define DEF_BUTTON_CURSOR "" -#define DEF_BUTTON_COMMAND "" -#define DEF_BUTTON_COMPOUND "none" -#define DEF_BUTTON_DEFAULT "disabled" -#define DEF_BUTTON_DISABLED_FG_COLOR DISABLED -#define DEF_BUTTON_DISABLED_FG_MONO "" -#define DEF_BUTTON_FG "systemButtonText" -#define DEF_CHKRAD_FG DEF_BUTTON_FG -#define DEF_BUTTON_FONT "system" -#define DEF_BUTTON_HEIGHT "0" -#define DEF_BUTTON_HIGHLIGHT_BG_COLOR DEF_BUTTON_BG_COLOR -#define DEF_BUTTON_HIGHLIGHT_BG_MONO DEF_BUTTON_BG_MONO -#define DEF_BUTTON_HIGHLIGHT "systemButtonFrame" -#define DEF_LABEL_HIGHLIGHT_WIDTH "0" -#define DEF_BUTTON_HIGHLIGHT_WIDTH "4" -#define DEF_BUTTON_IMAGE (char *) NULL -#define DEF_BUTTON_INDICATOR "1" -#define DEF_BUTTON_JUSTIFY "center" -#define DEF_BUTTON_OFF_VALUE "0" -#define DEF_BUTTON_ON_VALUE "1" -#define DEF_BUTTON_OVER_RELIEF "" -#define DEF_BUTTON_PADX "7" -#define DEF_LABCHKRAD_PADX "1" -#define DEF_BUTTON_PADY "3" -#define DEF_LABCHKRAD_PADY "1" -#define DEF_BUTTON_RELIEF "flat" -#define DEF_LABCHKRAD_RELIEF "flat" -#define DEF_BUTTON_REPEAT_DELAY "0" -#define DEF_BUTTON_REPEAT_INTERVAL "0" -#define DEF_BUTTON_SELECT_COLOR INDICATOR -#define DEF_BUTTON_SELECT_MONO BLACK -#define DEF_BUTTON_SELECT_IMAGE (char *) NULL -#define DEF_BUTTON_STATE "normal" -#define DEF_LABEL_TAKE_FOCUS "0" -#define DEF_BUTTON_TAKE_FOCUS (char *) NULL -#define DEF_BUTTON_TEXT "" -#define DEF_BUTTON_TEXT_VARIABLE "" -#define DEF_BUTTON_UNDERLINE "-1" -#define DEF_BUTTON_VALUE "" -#define DEF_BUTTON_WIDTH "0" -#define DEF_BUTTON_WRAP_LENGTH "0" -#define DEF_RADIOBUTTON_VARIABLE "selectedButton" -#define DEF_CHECKBUTTON_VARIABLE "" - -/* - * Defaults for canvases: - */ - -#define DEF_CANVAS_BG_COLOR NORMAL_BG -#define DEF_CANVAS_BG_MONO WHITE -#define DEF_CANVAS_BORDER_WIDTH "0" -#define DEF_CANVAS_CLOSE_ENOUGH "1" -#define DEF_CANVAS_CONFINE "1" -#define DEF_CANVAS_CURSOR "" -#define DEF_CANVAS_HEIGHT "7c" -#define DEF_CANVAS_HIGHLIGHT_BG NORMAL_BG -#define DEF_CANVAS_HIGHLIGHT BLACK -#define DEF_CANVAS_HIGHLIGHT_WIDTH "3" -#define DEF_CANVAS_INSERT_BG BLACK -#define DEF_CANVAS_INSERT_BD_COLOR "0" -#define DEF_CANVAS_INSERT_BD_MONO "0" -#define DEF_CANVAS_INSERT_OFF_TIME "300" -#define DEF_CANVAS_INSERT_ON_TIME "600" -#define DEF_CANVAS_INSERT_WIDTH "2" -#define DEF_CANVAS_RELIEF "flat" -#define DEF_CANVAS_SCROLL_REGION "" -#define DEF_CANVAS_SELECT_COLOR SELECT_BG -#define DEF_CANVAS_SELECT_MONO BLACK -#define DEF_CANVAS_SELECT_BD_COLOR "1" -#define DEF_CANVAS_SELECT_BD_MONO "0" -#define DEF_CANVAS_SELECT_FG_COLOR BLACK -#define DEF_CANVAS_SELECT_FG_MONO WHITE -#define DEF_CANVAS_TAKE_FOCUS (char *) NULL -#define DEF_CANVAS_WIDTH "10c" -#define DEF_CANVAS_X_SCROLL_CMD "" -#define DEF_CANVAS_X_SCROLL_INCREMENT "0" -#define DEF_CANVAS_Y_SCROLL_CMD "" -#define DEF_CANVAS_Y_SCROLL_INCREMENT "0" - -/* - * Defaults for entries: - */ - -#define DEF_ENTRY_BG_COLOR NORMAL_BG -#define DEF_ENTRY_BG_MONO WHITE -/* #define DEF_ENTRY_BORDER_WIDTH "2" */ -#define DEF_ENTRY_BORDER_WIDTH "1" -#define DEF_ENTRY_CURSOR "xterm" -#define DEF_ENTRY_DISABLED_BG_COLOR NORMAL_BG -#define DEF_ENTRY_DISABLED_BG_MONO WHITE -#define DEF_ENTRY_DISABLED_FG DISABLED -#define DEF_ENTRY_EXPORT_SELECTION "1" -#define DEF_ENTRY_FONT "Helvetica 12" -#define DEF_ENTRY_FG BLACK -#define DEF_ENTRY_HIGHLIGHT_BG NORMAL_BG -#define DEF_ENTRY_HIGHLIGHT BLACK -/* #define DEF_ENTRY_HIGHLIGHT_WIDTH "3" */ -#define DEF_ENTRY_HIGHLIGHT_WIDTH "0" -#define DEF_ENTRY_INSERT_BG BLACK -#define DEF_ENTRY_INSERT_BD_COLOR "0" -#define DEF_ENTRY_INSERT_BD_MONO "0" -#define DEF_ENTRY_INSERT_OFF_TIME "300" -#define DEF_ENTRY_INSERT_ON_TIME "600" -/* #define DEF_ENTRY_INSERT_WIDTH "2" */ -#define DEF_ENTRY_INSERT_WIDTH "1" -#define DEF_ENTRY_JUSTIFY "left" -#define DEF_ENTRY_READONLY_BG_COLOR NORMAL_BG -#define DEF_ENTRY_READONLY_BG_MONO WHITE -/* #define DEF_ENTRY_RELIEF "sunken" */ -#define DEF_ENTRY_RELIEF "solid" -#define DEF_ENTRY_SCROLL_COMMAND "" -#define DEF_ENTRY_SELECT_COLOR SELECT_BG -#define DEF_ENTRY_SELECT_MONO BLACK -#define DEF_ENTRY_SELECT_BD_COLOR "1" -#define DEF_ENTRY_SELECT_BD_MONO "0" -#define DEF_ENTRY_SELECT_FG_COLOR SELECT_FG -#define DEF_ENTRY_SELECT_FG_MONO WHITE -#define DEF_ENTRY_SHOW (char *) NULL -#define DEF_ENTRY_STATE "normal" -#define DEF_ENTRY_TAKE_FOCUS (char *) NULL -#define DEF_ENTRY_TEXT_VARIABLE "" -#define DEF_ENTRY_WIDTH "20" - -/* - * Defaults for frames: - */ - -#define DEF_FRAME_BG_COLOR NORMAL_BG -#define DEF_FRAME_BG_MONO WHITE -#define DEF_FRAME_BORDER_WIDTH "0" -#define DEF_FRAME_CLASS "Frame" -#define DEF_FRAME_COLORMAP "" -#define DEF_FRAME_CONTAINER "0" -#define DEF_FRAME_CURSOR "" -#define DEF_FRAME_HEIGHT "0" -#define DEF_FRAME_HIGHLIGHT_BG NORMAL_BG -#define DEF_FRAME_HIGHLIGHT BLACK -#define DEF_FRAME_HIGHLIGHT_WIDTH "0" -#define DEF_FRAME_PADX "0" -#define DEF_FRAME_PADY "0" -#define DEF_FRAME_RELIEF "flat" -#define DEF_FRAME_TAKE_FOCUS "0" -#define DEF_FRAME_VISUAL "" -#define DEF_FRAME_WIDTH "0" - -/* - * Defaults for labelframes: - */ - -#define DEF_LABELFRAME_BORDER_WIDTH "2" -#define DEF_LABELFRAME_CLASS "Labelframe" -#define DEF_LABELFRAME_RELIEF "groove" -#define DEF_LABELFRAME_FG "systemButtonText" -#define DEF_LABELFRAME_FONT "system" -#define DEF_LABELFRAME_TEXT "" -#define DEF_LABELFRAME_LABELANCHOR "nw" - -/* - * Defaults for listboxes: - */ - -#define DEF_LISTBOX_ACTIVE_STYLE "underline" -#define DEF_LISTBOX_BG_COLOR NORMAL_BG -#define DEF_LISTBOX_BG_MONO WHITE -#define DEF_LISTBOX_BORDER_WIDTH "1" -#define DEF_LISTBOX_CURSOR "" -#define DEF_LISTBOX_DISABLED_FG DISABLED -#define DEF_LISTBOX_EXPORT_SELECTION "1" -#define DEF_LISTBOX_FONT "application" -#define DEF_LISTBOX_FG BLACK -#define DEF_LISTBOX_HEIGHT "10" -#define DEF_LISTBOX_HIGHLIGHT_BG NORMAL_BG -#define DEF_LISTBOX_HIGHLIGHT BLACK -#define DEF_LISTBOX_HIGHLIGHT_WIDTH "0" -#define DEF_LISTBOX_RELIEF "solid" -#define DEF_LISTBOX_SCROLL_COMMAND "" -#define DEF_LISTBOX_LIST_VARIABLE "" -#define DEF_LISTBOX_SELECT_COLOR SELECT_BG -#define DEF_LISTBOX_SELECT_MONO BLACK -#define DEF_LISTBOX_SELECT_BD "0" -#define DEF_LISTBOX_SELECT_FG_COLOR SELECT_FG -#define DEF_LISTBOX_SELECT_FG_MONO WHITE -#define DEF_LISTBOX_SELECT_MODE "browse" -#define DEF_LISTBOX_SET_GRID "0" -#define DEF_LISTBOX_STATE "normal" -#define DEF_LISTBOX_TAKE_FOCUS (char *) NULL -#define DEF_LISTBOX_WIDTH "20" - -/* - * Defaults for individual entries of menus: - */ - -#define DEF_MENU_ENTRY_ACTIVE_BG (char *) NULL -#define DEF_MENU_ENTRY_ACTIVE_FG (char *) NULL -#define DEF_MENU_ENTRY_ACCELERATOR (char *) NULL -#define DEF_MENU_ENTRY_BG (char *) NULL -#define DEF_MENU_ENTRY_BITMAP None -#define DEF_MENU_ENTRY_COLUMN_BREAK "0" -#define DEF_MENU_ENTRY_COMMAND (char *) NULL -#define DEF_MENU_ENTRY_COMPOUND "none" -#define DEF_MENU_ENTRY_FG (char *) NULL -#define DEF_MENU_ENTRY_FONT (char *) NULL -#define DEF_MENU_ENTRY_HIDE_MARGIN "0" -#define DEF_MENU_ENTRY_IMAGE (char *) NULL -#define DEF_MENU_ENTRY_INDICATOR "1" -#define DEF_MENU_ENTRY_LABEL (char *) NULL -#define DEF_MENU_ENTRY_MENU (char *) NULL -#define DEF_MENU_ENTRY_OFF_VALUE "0" -#define DEF_MENU_ENTRY_ON_VALUE "1" -#define DEF_MENU_ENTRY_SELECT_IMAGE (char *) NULL -#define DEF_MENU_ENTRY_STATE "normal" -#define DEF_MENU_ENTRY_VALUE (char *) NULL -#define DEF_MENU_ENTRY_CHECK_VARIABLE (char *) NULL -#define DEF_MENU_ENTRY_RADIO_VARIABLE "selectedButton" -#define DEF_MENU_ENTRY_SELECT (char *) NULL -#define DEF_MENU_ENTRY_UNDERLINE "-1" - -/* - * Defaults for menus overall: - */ - -#define DEF_MENU_ACTIVE_BG_COLOR "SystemMenuActive" -#define DEF_MENU_ACTIVE_BG_MONO BLACK -#define DEF_MENU_ACTIVE_BORDER_WIDTH "0" -#define DEF_MENU_ACTIVE_FG_COLOR "SystemMenuActiveText" -#define DEF_MENU_ACTIVE_FG_MONO WHITE -#define DEF_MENU_BG_COLOR "SystemMenu" -#define DEF_MENU_BG_MONO WHITE -#define DEF_MENU_BORDER_WIDTH "0" -#define DEF_MENU_CURSOR "arrow" -#define DEF_MENU_DISABLED_FG_COLOR "SystemMenuDisabled" -#define DEF_MENU_DISABLED_FG_MONO "" -#define DEF_MENU_FONT "system" -#define DEF_MENU_FG "SystemMenuText" -#define DEF_MENU_POST_COMMAND "" -#define DEF_MENU_RELIEF "flat" -#define DEF_MENU_SELECT_COLOR "SystemMenuActive" -#define DEF_MENU_SELECT_MONO BLACK -#define DEF_MENU_TAKE_FOCUS "0" -#define DEF_MENU_TEAROFF "1" -#define DEF_MENU_TEAROFF_CMD (char *) NULL -#define DEF_MENU_TITLE "" -#define DEF_MENU_TYPE "normal" - -/* - * Defaults for menubuttons: - */ - -#define DEF_MENUBUTTON_ANCHOR "center" -#define DEF_MENUBUTTON_ACTIVE_BG_COLOR ACTIVE_BG -#define DEF_MENUBUTTON_ACTIVE_BG_MONO BLACK -#define DEF_MENUBUTTON_ACTIVE_FG_COLOR BLACK -#define DEF_MENUBUTTON_ACTIVE_FG_MONO WHITE -#define DEF_MENUBUTTON_BG_COLOR NORMAL_BG -#define DEF_MENUBUTTON_BG_MONO WHITE -#define DEF_MENUBUTTON_BITMAP "" -#define DEF_MENUBUTTON_BORDER_WIDTH "2" -#define DEF_MENUBUTTON_CURSOR "" -#define DEF_MENUBUTTON_DIRECTION "below" -#define DEF_MENUBUTTON_DISABLED_FG_COLOR DISABLED -#define DEF_MENUBUTTON_DISABLED_FG_MONO "" -#define DEF_MENUBUTTON_FONT "system" -#define DEF_MENUBUTTON_FG BLACK -#define DEF_MENUBUTTON_HEIGHT "0" -#define DEF_MENUBUTTON_HIGHLIGHT_BG_COLOR DEF_MENUBUTTON_BG_COLOR -#define DEF_MENUBUTTON_HIGHLIGHT_BG_MONO DEF_MENUBUTTON_BG_MONO -#define DEF_MENUBUTTON_HIGHLIGHT BLACK -#define DEF_MENUBUTTON_HIGHLIGHT_WIDTH "0" -#define DEF_MENUBUTTON_IMAGE (char *) NULL -#define DEF_MENUBUTTON_INDICATOR "0" -/* #define DEF_MENUBUTTON_JUSTIFY "center" */ -#define DEF_MENUBUTTON_JUSTIFY "left" -#define DEF_MENUBUTTON_MENU "" -#define DEF_MENUBUTTON_PADX "4p" -#define DEF_MENUBUTTON_PADY "3p" -#define DEF_MENUBUTTON_RELIEF "flat" -#define DEF_MENUBUTTON_STATE "normal" -#define DEF_MENUBUTTON_TAKE_FOCUS "0" -#define DEF_MENUBUTTON_TEXT "" -#define DEF_MENUBUTTON_TEXT_VARIABLE "" -#define DEF_MENUBUTTON_UNDERLINE "-1" -#define DEF_MENUBUTTON_WIDTH "0" -#define DEF_MENUBUTTON_WRAP_LENGTH "0" - -/* - * Defaults for messages: - */ - -#define DEF_MESSAGE_ANCHOR "center" -#define DEF_MESSAGE_ASPECT "150" -#define DEF_MESSAGE_BG_COLOR NORMAL_BG -#define DEF_MESSAGE_BG_MONO WHITE -#define DEF_MESSAGE_BORDER_WIDTH "2" -#define DEF_MESSAGE_CURSOR "" -#define DEF_MESSAGE_FG BLACK -#define DEF_MESSAGE_FONT "system" -#define DEF_MESSAGE_HIGHLIGHT_BG NORMAL_BG -#define DEF_MESSAGE_HIGHLIGHT BLACK -#define DEF_MESSAGE_HIGHLIGHT_WIDTH "0" -#define DEF_MESSAGE_JUSTIFY "left" -#define DEF_MESSAGE_PADX "-1" -#define DEF_MESSAGE_PADY "-1" -#define DEF_MESSAGE_RELIEF "flat" -#define DEF_MESSAGE_TAKE_FOCUS "0" -#define DEF_MESSAGE_TEXT "" -#define DEF_MESSAGE_TEXT_VARIABLE "" -#define DEF_MESSAGE_WIDTH "0" - -/* - * Defaults for panedwindows - */ - -#define DEF_PANEDWINDOW_BG_COLOR NORMAL_BG -#define DEF_PANEDWINDOW_BG_MONO WHITE -#define DEF_PANEDWINDOW_BORDERWIDTH "2" -#define DEF_PANEDWINDOW_CURSOR "" -#define DEF_PANEDWINDOW_HANDLEPAD "8" -#define DEF_PANEDWINDOW_HANDLESIZE "8" -#define DEF_PANEDWINDOW_HEIGHT "" -#define DEF_PANEDWINDOW_OPAQUERESIZE "0" -#define DEF_PANEDWINDOW_ORIENT "horizontal" -#define DEF_PANEDWINDOW_RELIEF "flat" -#define DEF_PANEDWINDOW_SASHCURSOR "" -#define DEF_PANEDWINDOW_SASHPAD "2" -#define DEF_PANEDWINDOW_SASHRELIEF "raised" -#define DEF_PANEDWINDOW_SASHWIDTH "2" -#define DEF_PANEDWINDOW_SHOWHANDLE "0" -#define DEF_PANEDWINDOW_WIDTH "" - -/* - * Defaults for panedwindow panes - */ - -#define DEF_PANEDWINDOW_PANE_AFTER "" -#define DEF_PANEDWINDOW_PANE_BEFORE "" -#define DEF_PANEDWINDOW_PANE_HEIGHT "" -#define DEF_PANEDWINDOW_PANE_MINSIZE "0" -#define DEF_PANEDWINDOW_PANE_PADX "0" -#define DEF_PANEDWINDOW_PANE_PADY "0" -#define DEF_PANEDWINDOW_PANE_STICKY "nsew" -#define DEF_PANEDWINDOW_PANE_WIDTH "" - -/* - * Defaults for scales: - */ - -#define DEF_SCALE_ACTIVE_BG_COLOR ACTIVE_BG -#define DEF_SCALE_ACTIVE_BG_MONO BLACK -#define DEF_SCALE_BG_COLOR NORMAL_BG -#define DEF_SCALE_BG_MONO WHITE -#define DEF_SCALE_BIG_INCREMENT "0" -#define DEF_SCALE_BORDER_WIDTH "2" -#define DEF_SCALE_COMMAND "" -#define DEF_SCALE_CURSOR "" -#define DEF_SCALE_DIGITS "0" -#define DEF_SCALE_FONT "system" -#define DEF_SCALE_FG_COLOR BLACK -#define DEF_SCALE_FG_MONO BLACK -#define DEF_SCALE_FROM "0" -#define DEF_SCALE_HIGHLIGHT_BG_COLOR DEF_SCALE_BG_COLOR -#define DEF_SCALE_HIGHLIGHT_BG_MONO DEF_SCALE_BG_MONO -#define DEF_SCALE_HIGHLIGHT BLACK -#define DEF_SCALE_HIGHLIGHT_WIDTH "0" -#define DEF_SCALE_LABEL "" -#define DEF_SCALE_LENGTH "100" -#define DEF_SCALE_ORIENT "vertical" -#define DEF_SCALE_RELIEF "flat" -#define DEF_SCALE_REPEAT_DELAY "300" -#define DEF_SCALE_REPEAT_INTERVAL "100" -#define DEF_SCALE_RESOLUTION "1" -#define DEF_SCALE_TROUGH_COLOR TROUGH -#define DEF_SCALE_TROUGH_MONO WHITE -#define DEF_SCALE_SHOW_VALUE "1" -#define DEF_SCALE_SLIDER_LENGTH "30" -#define DEF_SCALE_SLIDER_RELIEF "raised" -#define DEF_SCALE_STATE "normal" -#define DEF_SCALE_TAKE_FOCUS (char *) NULL -#define DEF_SCALE_TICK_INTERVAL "0" -#define DEF_SCALE_TO "100" -#define DEF_SCALE_VARIABLE "" -#define DEF_SCALE_WIDTH "15" - -/* - * Defaults for scrollbars: - */ - -#define DEF_SCROLLBAR_ACTIVE_BG_COLOR ACTIVE_BG -#define DEF_SCROLLBAR_ACTIVE_BG_MONO BLACK -#define DEF_SCROLLBAR_ACTIVE_RELIEF "raised" -#define DEF_SCROLLBAR_BG_COLOR NORMAL_BG -#define DEF_SCROLLBAR_BG_MONO WHITE -/* #define DEF_SCROLLBAR_BORDER_WIDTH "2" */ -#define DEF_SCROLLBAR_BORDER_WIDTH "0" -#define DEF_SCROLLBAR_COMMAND "" -#define DEF_SCROLLBAR_CURSOR "" -#define DEF_SCROLLBAR_EL_BORDER_WIDTH "-1" -#define DEF_SCROLLBAR_HIGHLIGHT_BG NORMAL_BG -#define DEF_SCROLLBAR_HIGHLIGHT BLACK -/* #define DEF_SCROLLBAR_HIGHLIGHT_WIDTH "2" */ -#define DEF_SCROLLBAR_HIGHLIGHT_WIDTH "0" -#define DEF_SCROLLBAR_JUMP "0" -#define DEF_SCROLLBAR_ORIENT "vertical" -/*#define DEF_SCROLLBAR_RELIEF "sunken" */ -#define DEF_SCROLLBAR_RELIEF "flat" -#define DEF_SCROLLBAR_REPEAT_DELAY "300" -#define DEF_SCROLLBAR_REPEAT_INTERVAL "100" -#define DEF_SCROLLBAR_TAKE_FOCUS (char *) NULL -#define DEF_SCROLLBAR_TROUGH_COLOR TROUGH -#define DEF_SCROLLBAR_TROUGH_MONO WHITE -/*#define DEF_SCROLLBAR_WIDTH "15" */ -#define DEF_SCROLLBAR_WIDTH "16" - -/* - * Defaults for texts: - */ - -#define DEF_TEXT_AUTO_SEPARATORS "1" -#define DEF_TEXT_BG_COLOR NORMAL_BG -#define DEF_TEXT_BG_MONO WHITE -#define DEF_TEXT_BORDER_WIDTH "0" -#define DEF_TEXT_CURSOR "xterm" -#define DEF_TEXT_FG BLACK -#define DEF_TEXT_EXPORT_SELECTION "1" -#define DEF_TEXT_FONT "Courier 12" -#define DEF_TEXT_HEIGHT "24" -#define DEF_TEXT_HIGHLIGHT_BG NORMAL_BG -#define DEF_TEXT_HIGHLIGHT BLACK -#define DEF_TEXT_HIGHLIGHT_WIDTH "3" -#define DEF_TEXT_INSERT_BG BLACK -#define DEF_TEXT_INSERT_BD_COLOR "0" -#define DEF_TEXT_INSERT_BD_MONO "0" -#define DEF_TEXT_INSERT_OFF_TIME "300" -#define DEF_TEXT_INSERT_ON_TIME "600" -#define DEF_TEXT_INSERT_WIDTH "1" -#define DEF_TEXT_MAX_UNDO "0" -#define DEF_TEXT_PADX "1" -#define DEF_TEXT_PADY "1" -#define DEF_TEXT_RELIEF "flat" -#define DEF_TEXT_SELECT_COLOR SELECT_BG -#define DEF_TEXT_SELECT_MONO BLACK -#define DEF_TEXT_SELECT_BD_COLOR "1" -#define DEF_TEXT_SELECT_BD_MONO "0" -#define DEF_TEXT_SELECT_FG_COLOR SELECT_FG -#define DEF_TEXT_SELECT_FG_MONO WHITE -#define DEF_TEXT_SELECT_RELIEF "solid" -#define DEF_TEXT_SET_GRID "0" -#define DEF_TEXT_SPACING1 "0" -#define DEF_TEXT_SPACING2 "0" -#define DEF_TEXT_SPACING3 "0" -#define DEF_TEXT_STATE "normal" -#define DEF_TEXT_TABS "" -#define DEF_TEXT_TAKE_FOCUS (char *) NULL -#define DEF_TEXT_UNDO "0" -#define DEF_TEXT_WIDTH "80" -#define DEF_TEXT_WRAP "char" -#define DEF_TEXT_XSCROLL_COMMAND "" -#define DEF_TEXT_YSCROLL_COMMAND "" - -/* - * Defaults for canvas text: - */ - -#define DEF_CANVTEXT_FONT "Helvetica 12" - -/* - * Defaults for toplevels (most of the defaults for frames also apply - * to toplevels): - */ - -#define DEF_TOPLEVEL_CLASS "Toplevel" -#define DEF_TOPLEVEL_MENU "" -#define DEF_TOPLEVEL_SCREEN "" -#define DEF_TOPLEVEL_USE "" - -#endif /* _TKMACDEFAULT */ diff --git a/mac/tkMacDialog.c b/mac/tkMacDialog.c deleted file mode 100644 index 8719782..0000000 --- a/mac/tkMacDialog.c +++ /dev/null @@ -1,1420 +0,0 @@ -/* - * tkMacDialog.c -- - * - * Contains the Mac implementation of the common dialog boxes. - * - * Copyright (c) 1996-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacDialog.c,v 1.9 2002/04/08 09:04:38 das Exp $ - */ - -#include <Gestalt.h> -#include <Aliases.h> -#include <Errors.h> -#include <Strings.h> -#include <MoreFiles.h> -#include <MoreFilesExtras.h> -#include <StandardFile.h> -#include <ColorPicker.h> -#include <Lowmem.h> -#include <Navigation.h> -#include "tkPort.h" -#include "tkInt.h" -#include "tclMacInt.h" -#include "tkMacInt.h" -#include "tkFileFilter.h" - -#ifndef StrLength -#define StrLength(s) (*((unsigned char *) (s))) -#endif -#ifndef StrBody -#define StrBody(s) ((char *) (s) + 1) -#endif - -/* - * The following are ID's for resources that are defined in tkMacResource.r - */ -#define OPEN_BOX 130 -#define OPEN_POPUP 131 -#define OPEN_MENU 132 -#define OPEN_POPUP_ITEM 10 - -#define SAVE_FILE 0 -#define OPEN_FILE 1 -#define CHOOSE_FOLDER 2 - -#define MATCHED 0 -#define UNMATCHED 1 - -/* - * The following structure is used in the GetFileName() function. It stored - * information about the file dialog and the file filters. - */ -typedef struct _OpenFileData { - FileFilterList fl; /* List of file filters. */ - SInt16 curType; /* The filetype currently being - * listed. */ - short popupItem; /* Item number of the popup in the - * dialog. */ - int usePopup; /* True if we show the popup menu (this - * is an open operation and the - * -filetypes option is set). */ -} OpenFileData; - - -static pascal Boolean FileFilterProc _ANSI_ARGS_((CInfoPBPtr pb, - void *myData)); -static int GetFileName _ANSI_ARGS_ ((ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[], int isOpen)); -static int NavGetFileName _ANSI_ARGS_ ((ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[], int isOpen)); -static Boolean MatchOneType _ANSI_ARGS_((StringPtr fileNamePtr, OSType fileType, - OpenFileData *myofdPtr, FileFilter *filterPtr)); -static pascal short OpenHookProc _ANSI_ARGS_((short item, - DialogPtr theDialog, OpenFileData * myofdPtr)); -static int ParseFileDlgArgs _ANSI_ARGS_ ((Tcl_Interp * interp, - OpenFileData * myofdPtr, int argc, char ** argv, - int isOpen)); -static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info, - NavCallBackUserData callBackUD, - NavFilterModes filterMode ); -pascal void OpenEventProc(NavEventCallbackMessage callBackSelector, - NavCBRecPtr callBackParms, - NavCallBackUserData callBackUD ); -static void InitFileDialogs(); -static int StdGetFile(Tcl_Interp *interp, OpenFileData *ofd, - unsigned char *initialFile, int isOpen); -static int NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd, - AEDesc *initialDesc, unsigned char *initialFile, - StringPtr title, StringPtr message, int multiple, int isOpen); -static int HandleInitialDirectory (Tcl_Interp *interp, char *initialDir, FSSpec *dirSpec, - AEDesc *dirDescPtr); -/* - * Filter and hook functions used by the tk_getOpenFile and tk_getSaveFile - * commands. - */ - -int fileDlgInited = 0; -int useNavServices = 0; -NavObjectFilterUPP openFileFilterUPP; -NavEventUPP openFileEventUPP; - -static FileFilterYDUPP openFilter = NULL; -static DlgHookYDUPP openHook = NULL; -static DlgHookYDUPP saveHook = NULL; - - -/* - *---------------------------------------------------------------------- - * - * Tk_ChooseColorObjCmd -- - * - * This procedure implements the color dialog box for the Mac - * platform. See the user documentation for details on what it - * does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -int -Tk_ChooseColorObjCmd( - ClientData clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *CONST objv[]) /* Argument objects. */ -{ - Tk_Window parent; - char *title; - int i, picked, srcRead, dstWrote; - long response; - OSErr err; - static inited = 0; - static RGBColor in; - static CONST char *optionStrings[] = { - "-initialcolor", "-parent", "-title", NULL - }; - enum options { - COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE - }; - - if (inited == 0) { - /* - * 'in' stores the last color picked. The next time the color dialog - * pops up, the last color will remain in the dialog. - */ - - in.red = 0xffff; - in.green = 0xffff; - in.blue = 0xffff; - inited = 1; - } - - parent = (Tk_Window) clientData; - title = "Choose a color:"; - picked = 0; - - for (i = 1; i < objc; i += 2) { - int index; - char *option, *value; - - if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option", - TCL_EXACT, &index) != TCL_OK) { - return TCL_ERROR; - } - if (i + 1 == objc) { - option = Tcl_GetStringFromObj(objv[i], NULL); - Tcl_AppendResult(interp, "value for \"", option, "\" missing", - (char *) NULL); - return TCL_ERROR; - } - value = Tcl_GetStringFromObj(objv[i + 1], NULL); - - switch ((enum options) index) { - case COLOR_INITIAL: { - XColor *colorPtr; - - colorPtr = Tk_GetColor(interp, parent, value); - if (colorPtr == NULL) { - return TCL_ERROR; - } - in.red = colorPtr->red; - in.green = colorPtr->green; - in.blue = colorPtr->blue; - Tk_FreeColor(colorPtr); - break; - } - case COLOR_PARENT: { - parent = Tk_NameToWindow(interp, value, parent); - if (parent == NULL) { - return TCL_ERROR; - } - break; - } - case COLOR_TITLE: { - title = value; - break; - } - } - } - - /* - * Use the gestalt manager to determine how to bring - * up the color picker. If versin 2.0 isn't available - * we can assume version 1.0 is available as it comes with - * Color Quickdraw which Tk requires to run at all. - */ - - err = Gestalt(gestaltColorPicker, &response); - if ((err == noErr) && (response == 0x0200L)) { - ColorPickerInfo cpinfo; - - /* - * Version 2.0 of the color picker is available. Let's use it - */ - - cpinfo.theColor.profile = 0L; - cpinfo.theColor.color.rgb.red = in.red; - cpinfo.theColor.color.rgb.green = in.green; - cpinfo.theColor.color.rgb.blue = in.blue; - cpinfo.dstProfile = 0L; - cpinfo.flags = kColorPickerCanModifyPalette | kColorPickerCanAnimatePalette; - cpinfo.placeWhere = kDeepestColorScreen; - cpinfo.pickerType = 0L; - cpinfo.eventProc = NULL; - cpinfo.colorProc = NULL; - cpinfo.colorProcData = NULL; - - Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL, - StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL); - StrLength(cpinfo.prompt) = (unsigned char) dstWrote; - - if ((PickColor(&cpinfo) == noErr) && (cpinfo.newColorChosen != 0)) { - in.red = cpinfo.theColor.color.rgb.red; - in.green = cpinfo.theColor.color.rgb.green; - in.blue = cpinfo.theColor.color.rgb.blue; - picked = 1; - } - } else { - RGBColor out; - Str255 prompt; - Point point = {-1, -1}; - - /* - * Use version 1.0 of the color picker - */ - - Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL, StrBody(prompt), - 255, &srcRead, &dstWrote, NULL); - StrLength(prompt) = (unsigned char) dstWrote; - - if (GetColor(point, prompt, &in, &out)) { - in = out; - picked = 1; - } - } - - if (picked != 0) { - char result[32]; - - sprintf(result, "#%02x%02x%02x", in.red >> 8, in.green >> 8, - in.blue >> 8); - Tcl_AppendResult(interp, result, NULL); - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_GetOpenFileObjCmd -- - * - * This procedure implements the "open file" dialog box for the - * Mac platform. See the user documentation for details on what - * it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See user documentation. - *---------------------------------------------------------------------- - */ - -int -Tk_GetOpenFileObjCmd( - ClientData clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *CONST objv[]) /* Argument objects. */ -{ - int i, result, multiple; - OpenFileData ofd; - Tk_Window parent; - Str255 message, title; - AEDesc initialDesc = {typeNull, NULL}; - FSSpec dirSpec; - static CONST char *openOptionStrings[] = { - "-defaultextension", "-filetypes", - "-initialdir", "-initialfile", - "-message", "-multiple", - "-parent", "-title", NULL - }; - enum openOptions { - OPEN_DEFAULT, OPEN_TYPES, - OPEN_INITDIR, OPEN_INITFILE, - OPEN_MESSAGE, OPEN_MULTIPLE, - OPEN_PARENT, OPEN_TITLE - }; - - if (!fileDlgInited) { - InitFileDialogs(); - } - - result = TCL_ERROR; - parent = (Tk_Window) clientData; - multiple = false; - title[0] = 0; - message[0] = 0; - - TkInitFileFilters(&ofd.fl); - - ofd.curType = 0; - ofd.popupItem = OPEN_POPUP_ITEM; - ofd.usePopup = 1; - - for (i = 1; i < objc; i += 2) { - char *choice; - int index, choiceLen; - char *string; - int srcRead, dstWrote; - - if (Tcl_GetIndexFromObj(interp, objv[i], openOptionStrings, "option", - TCL_EXACT, &index) != TCL_OK) { - result = TCL_ERROR; - goto end; - } - if (i + 1 == objc) { - string = Tcl_GetStringFromObj(objv[i], NULL); - Tcl_AppendResult(interp, "value for \"", string, "\" missing", - (char *) NULL); - result = TCL_ERROR; - goto end; - } - - switch (index) { - case OPEN_DEFAULT: - break; - case OPEN_TYPES: - choice = Tcl_GetStringFromObj(objv[i + 1], NULL); - if (TkGetFileFilters(interp, &ofd.fl, choice, 0) - != TCL_OK) { - result = TCL_ERROR; - goto end; - } - break; - case OPEN_INITDIR: - choice = Tcl_GetStringFromObj(objv[i + 1], NULL); - if (HandleInitialDirectory(interp, choice, &dirSpec, - &initialDesc) != TCL_OK) { - result = TCL_ERROR; - goto end; - } - break; - case OPEN_INITFILE: - break; - case OPEN_MESSAGE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(message), 255, - &srcRead, &dstWrote, NULL); - message[0] = dstWrote; - break; - case OPEN_MULTIPLE: - if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &multiple) != TCL_OK) { - result = TCL_ERROR; - goto end; - } - break; - case OPEN_PARENT: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - parent = Tk_NameToWindow(interp, choice, parent); - if (parent == NULL) { - result = TCL_ERROR; - goto end; - } - break; - case OPEN_TITLE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(title), 255, - &srcRead, &dstWrote, NULL); - title[0] = dstWrote; - break; - } - } - - if (useNavServices) { - AEDesc *initialPtr = NULL; - - if (initialDesc.descriptorType == typeFSS) { - initialPtr = &initialDesc; - } - result = NavServicesGetFile(interp, &ofd, initialPtr, NULL, - title, message, multiple, OPEN_FILE); - } else { - result = StdGetFile(interp, &ofd, NULL, OPEN_FILE); - } - - end: - TkFreeFileFilters(&ofd.fl); - AEDisposeDesc(&initialDesc); - - return result; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_GetSaveFileObjCmd -- - * - * Same as Tk_GetOpenFileCmd but opens a "save file" dialog box - * instead - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See user documentation. - *---------------------------------------------------------------------- - */ - -int -Tk_GetSaveFileObjCmd( - ClientData clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *CONST objv[]) /* Argument objects. */ -{ - int i, result; - Str255 initialFile; - Tk_Window parent; - AEDesc initialDesc = {typeNull, NULL}; - FSSpec dirSpec; - Str255 title, message; - OpenFileData ofd; - static CONST char *saveOptionStrings[] = { - "-defaultextension", "-filetypes", "-initialdir", "-initialfile", - "-message", "-parent", "-title", NULL - }; - enum saveOptions { - SAVE_DEFAULT, SAVE_TYPES, SAVE_INITDIR, SAVE_INITFILE, - SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE - }; - - if (!fileDlgInited) { - InitFileDialogs(); - } - - result = TCL_ERROR; - parent = (Tk_Window) clientData; - StrLength(initialFile) = 0; - title[0] = 0; - message[0] = 0; - - - for (i = 1; i < objc; i += 2) { - char *choice; - int index, choiceLen; - char *string; - Tcl_DString ds; - int srcRead, dstWrote; - - if (Tcl_GetIndexFromObj(interp, objv[i], saveOptionStrings, "option", - TCL_EXACT, &index) != TCL_OK) { - return TCL_ERROR; - } - if (i + 1 == objc) { - string = Tcl_GetStringFromObj(objv[i], NULL); - Tcl_AppendResult(interp, "value for \"", string, "\" missing", - (char *) NULL); - return TCL_ERROR; - } - switch (index) { - case SAVE_DEFAULT: - break; - case SAVE_TYPES: - break; - case SAVE_INITDIR: - choice = Tcl_GetStringFromObj(objv[i + 1], NULL); - if (HandleInitialDirectory(interp, choice, &dirSpec, - &initialDesc) != TCL_OK) { - result = TCL_ERROR; - goto end; - } - break; - case SAVE_INITFILE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - if (Tcl_TranslateFileName(interp, choice, &ds) == NULL) { - result = TCL_ERROR; - goto end; - } - Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&ds), - Tcl_DStringLength(&ds), 0, NULL, - StrBody(initialFile), 255, &srcRead, &dstWrote, NULL); - StrLength(initialFile) = (unsigned char) dstWrote; - Tcl_DStringFree(&ds); - break; - case SAVE_MESSAGE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(message), 255, - &srcRead, &dstWrote, NULL); - StrLength(message) = (unsigned char) dstWrote; - break; - case SAVE_PARENT: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - parent = Tk_NameToWindow(interp, choice, parent); - if (parent == NULL) { - result = TCL_ERROR; - goto end; - } - break; - case SAVE_TITLE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(title), 255, - &srcRead, &dstWrote, NULL); - StrLength(title) = (unsigned char) dstWrote; - break; - } - } - - TkInitFileFilters(&ofd.fl); - ofd.usePopup = 0; - - if (useNavServices) { - AEDesc *initialPtr = NULL; - - if (initialDesc.descriptorType == typeFSS) { - initialPtr = &initialDesc; - } - result = NavServicesGetFile(interp, &ofd, initialPtr, initialFile, - title, message, false, SAVE_FILE); - } else { - result = StdGetFile(interp, NULL, initialFile, SAVE_FILE); - } - - end: - - AEDisposeDesc(&initialDesc); - - return result; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_ChooseDirectoryObjCmd -- - * - * This procedure implements the "tk_chooseDirectory" dialog box - * for the Windows platform. See the user documentation for details - * on what it does. - * - * Results: - * See user documentation. - * - * Side effects: - * A modal dialog window is created. Tcl_SetServiceMode() is - * called to allow background events to be processed - * - *---------------------------------------------------------------------- - */ - -int -Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Main window associated with interpreter. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - int i, result; - Tk_Window parent; - AEDesc initialDesc = {typeNull, NULL}; - FSSpec dirSpec; - Str255 message, title; - int srcRead, dstWrote; - OpenFileData ofd; - static CONST char *chooseOptionStrings[] = { - "-initialdir", "-message", "-mustexist", "-parent", "-title", NULL - }; - enum chooseOptions { - CHOOSE_INITDIR, CHOOSE_MESSAGE, CHOOSE_MUSTEXIST, - CHOOSE_PARENT, CHOOSE_TITLE - }; - - - if (!NavServicesAvailable()) { - return TCL_ERROR; - } - - if (!fileDlgInited) { - InitFileDialogs(); - } - result = TCL_ERROR; - parent = (Tk_Window) clientData; - title[0] = 0; - message[0] = 0; - - for (i = 1; i < objc; i += 2) { - char *choice; - int index, choiceLen; - char *string; - - if (Tcl_GetIndexFromObj(interp, objv[i], chooseOptionStrings, "option", - TCL_EXACT, &index) != TCL_OK) { - return TCL_ERROR; - } - if (i + 1 == objc) { - string = Tcl_GetStringFromObj(objv[i], NULL); - Tcl_AppendResult(interp, "value for \"", string, "\" missing", - (char *) NULL); - return TCL_ERROR; - } - switch (index) { - case CHOOSE_INITDIR: - choice = Tcl_GetStringFromObj(objv[i + 1], NULL); - if (HandleInitialDirectory(interp, choice, &dirSpec, - &initialDesc) != TCL_OK) { - result = TCL_ERROR; - goto end; - } - break; - case CHOOSE_MESSAGE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(message), 255, - &srcRead, &dstWrote, NULL); - StrLength(message) = (unsigned char) dstWrote; - break; - case CHOOSE_PARENT: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - parent = Tk_NameToWindow(interp, choice, parent); - if (parent == NULL) { - result = TCL_ERROR; - goto end; - } - break; - case CHOOSE_TITLE: - choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen); - Tcl_UtfToExternal(NULL, NULL, choice, choiceLen, - 0, NULL, StrBody(title), 255, - &srcRead, &dstWrote, NULL); - StrLength(title) = (unsigned char) dstWrote; - break; - } - } - - TkInitFileFilters(&ofd.fl); - ofd.usePopup = 0; - - if (useNavServices) { - AEDesc *initialPtr = NULL; - - if (initialDesc.descriptorType == typeFSS) { - initialPtr = &initialDesc; - } - result = NavServicesGetFile(interp, &ofd, initialPtr, NULL, - title, message, false, CHOOSE_FOLDER); - } else { - result = TCL_ERROR; - } - - end: - AEDisposeDesc(&initialDesc); - - return result; -} - -int -HandleInitialDirectory ( - Tcl_Interp *interp, - char *initialDir, - FSSpec *dirSpec, - AEDesc *dirDescPtr) -{ - Tcl_DString ds; - long dirID; - OSErr err; - Boolean isDirectory; - Str255 dir; - int srcRead, dstWrote; - - if (Tcl_TranslateFileName(interp, initialDir, &ds) == NULL) { - return TCL_ERROR; - } - Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&ds), - Tcl_DStringLength(&ds), 0, NULL, StrBody(dir), 255, - &srcRead, &dstWrote, NULL); - StrLength(dir) = (unsigned char) dstWrote; - Tcl_DStringFree(&ds); - - err = FSpLocationFromPath(StrLength(dir), StrBody(dir), dirSpec); - if (err != noErr) { - Tcl_AppendResult(interp, "bad directory \"", initialDir, "\"", NULL); - return TCL_ERROR; - } - err = FSpGetDirectoryIDTcl(dirSpec, &dirID, &isDirectory); - if ((err != noErr) || !isDirectory) { - Tcl_AppendResult(interp, "bad directory \"", initialDir, "\"", NULL); - return TCL_ERROR; - } - - if (useNavServices) { - AECreateDesc( typeFSS, dirSpec, sizeof(*dirSpec), dirDescPtr); - } else { - /* - * Make sure you negate -dirSpec.vRefNum because the - * standard file package wants it that way ! - */ - - LMSetSFSaveDisk(-dirSpec->vRefNum); - LMSetCurDirStore(dirID); - } - return TCL_OK; -} - -static void -InitFileDialogs() -{ - fileDlgInited = 1; - - if (NavServicesAvailable()) { - openFileFilterUPP = NewNavObjectFilterProc(OpenFileFilterProc); - openFileEventUPP = NewNavEventProc(OpenEventProc); - useNavServices = 1; - } else { - openFilter = NewFileFilterYDProc(FileFilterProc); - openHook = NewDlgHookYDProc(OpenHookProc); - saveHook = NewDlgHookYDProc(OpenHookProc); - useNavServices = 0; - } - - -} - - -/* - *---------------------------------------------------------------------- - * - * GetFileName -- - * - * Calls the Mac file dialog functions for the user to choose a - * file to or save. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * If the user selects a file, the native pathname of the file - * is returned in the interp's result. Otherwise an empty string - * is returned in the interp's result. - * - *---------------------------------------------------------------------- - */ - -static int -GetFileName( - ClientData clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *CONST objv[], /* Argument objects. */ - int isOpen) /* true if we should call GetOpenFileName(), - * false if we should call GetSaveFileName() */ -{ - return TCL_OK; -} - -static int -NavServicesGetFile( - Tcl_Interp *interp, - OpenFileData *ofdPtr, - AEDesc *initialDesc, - unsigned char *initialFile, - StringPtr title, - StringPtr message, - int multiple, - int isOpen) -{ - NavReplyRecord theReply; - NavDialogOptions diagOptions; - OSErr err; - Tcl_Obj *theResult; - int result; - - - diagOptions.location.h = -1; - diagOptions.location.v = -1; - diagOptions.dialogOptionFlags = kNavDontAutoTranslate - + kNavDontAddTranslateItems; - - if (multiple) { - diagOptions.dialogOptionFlags += kNavAllowMultipleFiles; - } - - if (ofdPtr != NULL && ofdPtr->usePopup) { - FileFilter *filterPtr; - - filterPtr = ofdPtr->fl.filters; - if (filterPtr == NULL) { - ofdPtr->usePopup = 0; - } - } - - if (ofdPtr != NULL && ofdPtr->usePopup) { - NavMenuItemSpecHandle popupExtensionHandle = NULL; - NavMenuItemSpec *popupItems; - FileFilter *filterPtr; - short index = 0; - - ofdPtr->curType = 0; - - popupExtensionHandle = (NavMenuItemSpecHandle) NewHandle(ofdPtr->fl.numFilters - * sizeof(NavMenuItemSpec)); - HLock((Handle) popupExtensionHandle); - popupItems = *popupExtensionHandle; - - for (filterPtr = ofdPtr->fl.filters; filterPtr != NULL; - filterPtr = filterPtr->next, popupItems++, index++) { - int len; - - len = strlen(filterPtr->name); - BlockMove(filterPtr->name, popupItems->menuItemName + 1, len); - popupItems->menuItemName[0] = len; - popupItems->menuCreator = 'WIsH'; - popupItems->menuType = index; - } - HUnlock((Handle) popupExtensionHandle); - diagOptions.popupExtension = popupExtensionHandle; - } else { - diagOptions.dialogOptionFlags += kNavNoTypePopup; - diagOptions.popupExtension = NULL; - } - - if ((initialFile != NULL) && (initialFile[0] != 0)) { - char *lastColon; - int len; - - len = initialFile[0]; - - p2cstr(initialFile); - lastColon = strrchr((char *)initialFile, ':'); - if (lastColon != NULL) { - len -= lastColon - ((char *) (initialFile + 1)); - BlockMove(lastColon + 1, diagOptions.savedFileName + 1, len); - diagOptions.savedFileName[0] = len; - } else { - BlockMove(initialFile, diagOptions.savedFileName + 1, len); - diagOptions.savedFileName[0] = len; - } - } else { - diagOptions.savedFileName[0] = 0; - } - - strcpy((char *) (diagOptions.clientName + 1),"Wish"); - diagOptions.clientName[0] = strlen("Wish"); - - if (title == NULL) { - diagOptions.windowTitle[0] = 0; - } else { - BlockMove(title, diagOptions.windowTitle, title[0] + 1); - diagOptions.windowTitle[0] = title[0]; - } - - if (message == NULL) { - diagOptions.message[0] = 0; - } else { - BlockMove(message, diagOptions.message, message[0] + 1); - diagOptions.message[0] = message[0]; - } - - diagOptions.actionButtonLabel[0] = 0; - diagOptions.cancelButtonLabel[0] = 0; - diagOptions.preferenceKey = 0; - - /* Now process the selection list. We have to use the popupExtension - * to fill the menu. - */ - - - if (isOpen == OPEN_FILE) { - err = NavGetFile(initialDesc, &theReply, &diagOptions, openFileEventUPP, - NULL, openFileFilterUPP, NULL, ofdPtr); - } else if (isOpen == SAVE_FILE) { - err = NavPutFile (initialDesc, &theReply, &diagOptions, openFileEventUPP, - 'TEXT', 'WIsH', NULL); - } else if (isOpen == CHOOSE_FOLDER) { - err = NavChooseFolder (initialDesc, &theReply, &diagOptions, - openFileEventUPP, NULL, NULL); - } - - - /* - * Most commands assume that the file dialogs return a single - * item, not a list. So only build a list if multiple is true... - */ - - if (multiple) { - theResult = Tcl_NewListObj(0, NULL); - } else { - theResult = Tcl_NewObj(); - } - - if ( theReply.validRecord && err == noErr ) { - AEDesc resultDesc; - long count; - Tcl_DString fileName; - Handle pathHandle; - int length; - - if ( err == noErr ) { - err = AECountItems(&(theReply.selection), &count); - if (err == noErr) { - long i; - for (i = 1; i <= count; i++ ) { - err = AEGetNthDesc(&(theReply.selection), - i, typeFSS, NULL, &resultDesc); - if (err == noErr) { - HLock(resultDesc.dataHandle); - pathHandle = NULL; - FSpPathFromLocation((FSSpec *) *resultDesc.dataHandle, - &length, &pathHandle); - HLock(pathHandle); - Tcl_ExternalToUtfDString(NULL, (char *) *pathHandle, -1, &fileName); - if (multiple) { - Tcl_ListObjAppendElement(interp, theResult, - Tcl_NewStringObj(Tcl_DStringValue(&fileName), - Tcl_DStringLength(&fileName))); - } else { - Tcl_SetStringObj(theResult, Tcl_DStringValue(&fileName), - Tcl_DStringLength(&fileName)); - } - - Tcl_DStringFree(&fileName); - HUnlock(pathHandle); - DisposeHandle(pathHandle); - HUnlock(resultDesc.dataHandle); - AEDisposeDesc( &resultDesc ); - } - } - } - } - err = NavDisposeReply( &theReply ); - Tcl_SetObjResult(interp, theResult); - result = TCL_OK; - } else if (err == userCanceledErr) { - result = TCL_OK; - } else { - result = TCL_ERROR; - } - - if (diagOptions.popupExtension != NULL) { - DisposeHandle((Handle) diagOptions.popupExtension); - } - - return result; -} - -static pascal Boolean -OpenFileFilterProc( - AEDesc* theItem, void* info, - NavCallBackUserData callBackUD, - NavFilterModes filterMode ) -{ - OpenFileData *ofdPtr = (OpenFileData *) callBackUD; - if (!ofdPtr->usePopup) { - return true; - } else { - if (ofdPtr->fl.numFilters == 0) { - return true; - } else { - - if ( theItem->descriptorType == typeFSS ) { - NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*)info; - int result; - - if ( !theInfo->isFolder ) { - OSType fileType; - StringPtr fileNamePtr; - int i; - FileFilter *filterPtr; - - fileType = theInfo->fileAndFolder.fileInfo.finderInfo.fdType; - HLock(theItem->dataHandle); - fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name); - - if (ofdPtr->usePopup) { - i = ofdPtr->curType; - for (filterPtr=ofdPtr->fl.filters; filterPtr && i>0; i--) { - filterPtr = filterPtr->next; - } - if (filterPtr) { - result = MatchOneType(fileNamePtr, fileType, - ofdPtr, filterPtr); - } else { - result = false; - } - } else { - /* - * We are not using the popup menu. In this case, the file is - * considered matched if it matches any of the file filters. - */ - result = UNMATCHED; - for (filterPtr=ofdPtr->fl.filters; filterPtr; - filterPtr=filterPtr->next) { - if (MatchOneType(fileNamePtr, fileType, - ofdPtr, filterPtr) == MATCHED) { - result = MATCHED; - break; - } - } - } - - HUnlock(theItem->dataHandle); - return (result == MATCHED); - } else { - return true; - } - } - } - - return true; - } -} - -pascal void -OpenEventProc( - NavEventCallbackMessage callBackSelector, - NavCBRecPtr callBackParams, - NavCallBackUserData callBackUD ) -{ - NavMenuItemSpec *chosenItem; - OpenFileData *ofd = (OpenFileData *) callBackUD; - - if (callBackSelector == kNavCBPopupMenuSelect) { - chosenItem = (NavMenuItemSpec *) callBackParams->eventData.eventDataParms.param; - ofd->curType = chosenItem->menuType; - } else if (callBackSelector == kNavCBEvent) { - if (callBackParams->eventData.eventDataParms.event->what == updateEvt) { - if (TkMacConvertEvent( callBackParams->eventData.eventDataParms.event)) { - while (Tcl_DoOneEvent(TCL_IDLE_EVENTS|TCL_DONT_WAIT|TCL_WINDOW_EVENTS)) { - /* Empty Body */ - } - } - } - } -} - -static int -StdGetFile( - Tcl_Interp *interp, - OpenFileData *ofd, - unsigned char *initialFile, - int isOpen) -{ - int i; - StandardFileReply reply; - Point mypoint; - MenuHandle menu = NULL; - - - /* - * Set the items in the file types popup. - */ - - /* - * Delete all the entries inside the popup menu, in case there's any - * left overs from previous invocation of this command - */ - - if (ofd != NULL && ofd->usePopup) { - FileFilter *filterPtr; - - menu = GetMenu(OPEN_MENU); - for (i = CountMItems(menu); i > 0; i--) { - /* - * The item indices are one based. Also, if we delete from - * the beginning, the items may be re-numbered. So we - * delete from the end - */ - - DeleteMenuItem(menu, i); - } - - filterPtr = ofd->fl.filters; - if (filterPtr == NULL) { - ofd->usePopup = 0; - } else { - for ( ; filterPtr != NULL; filterPtr = filterPtr->next) { - Str255 str; - - StrLength(str) = (unsigned char) strlen(filterPtr->name); - strcpy(StrBody(str), filterPtr->name); - AppendMenu(menu, str); - } - } - } - - /* - * Call the toolbox file dialog function. - */ - - SetPt(&mypoint, -1, -1); - TkpSetCursor(NULL); - if (isOpen == OPEN_FILE) { - if (ofd != NULL && ofd->usePopup) { - CustomGetFile(openFilter, (short) -1, NULL, &reply, OPEN_BOX, - mypoint, openHook, NULL, NULL, NULL, (void*) ofd); - } else { - StandardGetFile(NULL, -1, NULL, &reply); - } - } else if (isOpen == SAVE_FILE) { - static Str255 prompt = "\pSave as"; - - if (ofd != NULL && ofd->usePopup) { - /* - * Currently this never gets called because we don't use - * popup for the save dialog. - */ - CustomPutFile(prompt, initialFile, &reply, OPEN_BOX, - mypoint, saveHook, NULL, NULL, NULL, (void *) ofd); - } else { - StandardPutFile(prompt, initialFile, &reply); - } - } - - /* - * Now parse the reply, and populate the Tcl result. - */ - - if (reply.sfGood) { - int length; - Handle pathHandle; - - pathHandle = NULL; - FSpPathFromLocation(&reply.sfFile, &length, &pathHandle); - if (pathHandle != NULL) { - Tcl_DString ds; - - HLock(pathHandle); - Tcl_ExternalToUtfDString(NULL, (char *) *pathHandle, -1, &ds); - Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL); - Tcl_DStringFree(&ds); - HUnlock(pathHandle); - DisposeHandle(pathHandle); - } - } - - if (menu != NULL) { - DisposeMenu(menu); - } - - return TCL_OK; -} -/* - *---------------------------------------------------------------------- - * - * OpenHookProc -- - * - * Gets called for various events that occur in the file dialog box. - * Initializes the popup menu or rebuild the file list depending on - * the type of the event. - * - * Results: - * A standard result understood by the Mac file dialog event dispatcher. - * - * Side effects: - * The contents in the file dialog may be changed depending on - * the type of the event. - *---------------------------------------------------------------------- - */ - -static pascal short -OpenHookProc( - short item, /* Event description. */ - DialogPtr theDialog, /* The dialog where the event occurs. */ - OpenFileData *ofdPtr) /* Information about the file dialog. */ -{ - short ignore; - Rect rect; - Handle handle; - int newType; - - switch (item) { - case sfHookFirstCall: - if (ofdPtr->usePopup) { - /* - * Set the popup list to display the selected type. - */ - GetDialogItem(theDialog, ofdPtr->popupItem, &ignore, &handle, - &rect); - SetControlValue((ControlRef) handle, ofdPtr->curType + 1); - } - return sfHookNullEvent; - - case OPEN_POPUP_ITEM: - if (ofdPtr->usePopup) { - GetDialogItem(theDialog, ofdPtr->popupItem, - &ignore, &handle, &rect); - newType = GetControlValue((ControlRef) handle) - 1; - if (ofdPtr->curType != newType) { - if (newType<0 || newType>ofdPtr->fl.numFilters) { - /* - * Sanity check. Looks like the user selected an - * non-existent menu item?? Don't do anything. - */ - } else { - ofdPtr->curType = newType; - } - return sfHookRebuildList; - } - } - break; - } - - return item; -} - -/* - *---------------------------------------------------------------------- - * - * FileFilterProc -- - * - * Filters files according to file types. Get called whenever the - * file list needs to be updated inside the dialog box. - * - * Results: - * Returns MATCHED if the file should be shown in the listbox, returns - * UNMATCHED otherwise. - * - * Side effects: - * If MATCHED is returned, the file is shown in the listbox. - * - *---------------------------------------------------------------------- - */ - -static pascal Boolean -FileFilterProc( - CInfoPBPtr pb, /* Information about the file */ - void *myData) /* Client data for this file dialog */ -{ - int i; - OpenFileData * ofdPtr = (OpenFileData*)myData; - FileFilter * filterPtr; - - if (ofdPtr->fl.numFilters == 0) { - /* - * No types have been specified. List all files by default - */ - return MATCHED; - } - - if (pb->dirInfo.ioFlAttrib & 0x10) { - /* - * This is a directory: always show it - */ - return MATCHED; - } - - if (ofdPtr->usePopup) { - i = ofdPtr->curType; - for (filterPtr=ofdPtr->fl.filters; filterPtr && i>0; i--) { - filterPtr = filterPtr->next; - } - if (filterPtr) { - return MatchOneType(pb->hFileInfo.ioNamePtr, pb->hFileInfo.ioFlFndrInfo.fdType, - ofdPtr, filterPtr); - } else { - return UNMATCHED; - } - } else { - /* - * We are not using the popup menu. In this case, the file is - * considered matched if it matches any of the file filters. - */ - - for (filterPtr=ofdPtr->fl.filters; filterPtr; - filterPtr=filterPtr->next) { - if (MatchOneType(pb->hFileInfo.ioNamePtr, pb->hFileInfo.ioFlFndrInfo.fdType, - ofdPtr, filterPtr) == MATCHED) { - return MATCHED; - } - } - return UNMATCHED; - } -} - -/* - *---------------------------------------------------------------------- - * - * MatchOneType -- - * - * Match a file with one file type in the list of file types. - * - * Results: - * Returns MATCHED if the file matches with the file type; returns - * UNMATCHED otherwise. - * - * Side effects: - * None - * - *---------------------------------------------------------------------- - */ - -static Boolean -MatchOneType( - StringPtr fileNamePtr, /* Name of the file */ - OSType fileType, /* Type of the file */ - OpenFileData * ofdPtr, /* Information about this file dialog */ - FileFilter * filterPtr) /* Match the file described by pb against - * this filter */ -{ - FileFilterClause * clausePtr; - - /* - * A file matches with a file type if it matches with at least one - * clause of the type. - * - * If the clause has both glob patterns and ostypes, the file must - * match with at least one pattern AND at least one ostype. - * - * If the clause has glob patterns only, the file must match with at least - * one pattern. - * - * If the clause has mac types only, the file must match with at least - * one mac type. - * - * If the clause has neither glob patterns nor mac types, it's - * considered an error. - */ - - for (clausePtr=filterPtr->clauses; clausePtr; clausePtr=clausePtr->next) { - int macMatched = 0; - int globMatched = 0; - GlobPattern * globPtr; - MacFileType * mfPtr; - - if (clausePtr->patterns == NULL) { - globMatched = 1; - } - if (clausePtr->macTypes == NULL) { - macMatched = 1; - } - - for (globPtr=clausePtr->patterns; globPtr; globPtr=globPtr->next) { - char filename[256]; - int len; - char * p, *q, *ext; - - if (fileNamePtr == NULL) { - continue; - } - p = (char*)(fileNamePtr); - len = p[0]; - strncpy(filename, p+1, len); - filename[len] = '\0'; - ext = globPtr->pattern; - - if (ext[0] == '\0') { - /* - * We don't want any extensions: OK if the filename doesn't - * have "." in it - */ - for (q=filename; *q; q++) { - if (*q == '.') { - goto glob_unmatched; - } - } - goto glob_matched; - } - - if (Tcl_StringMatch(filename, ext)) { - goto glob_matched; - } else { - goto glob_unmatched; - } - - glob_unmatched: - continue; - - glob_matched: - globMatched = 1; - break; - } - - for (mfPtr=clausePtr->macTypes; mfPtr; mfPtr=mfPtr->next) { - if (fileType == mfPtr->type) { - macMatched = 1; - break; - } - } - - if (globMatched && macMatched) { - return MATCHED; - } - } - - return UNMATCHED; -} - - diff --git a/mac/tkMacDraw.c b/mac/tkMacDraw.c deleted file mode 100644 index d534140..0000000 --- a/mac/tkMacDraw.c +++ /dev/null @@ -1,1223 +0,0 @@ -/* - * tkMacDraw.c -- - * - * This file contains functions that preform drawing to - * Xlib windows. Most of the functions simple emulate - * Xlib functions. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacDraw.c,v 1.9.2.1 2005/07/28 04:57:38 hobbs Exp $ - */ - -#include "tkInt.h" -#include "X.h" -#include "Xlib.h" -#include <stdio.h> -#include <tcl.h> - -#include <Windows.h> -#include <Fonts.h> -#include <QDOffscreen.h> -#include "tkMacInt.h" -#include "tkPort.h" - -#ifndef PI -# define PI 3.14159265358979323846 -#endif - -/* - * Temporary regions that can be reused. - */ -static RgnHandle tmpRgn = NULL; -static RgnHandle tmpRgn2 = NULL; - -static PixPatHandle gPenPat = NULL; - -/* - * Prototypes for functions used only in this file. - */ -static unsigned char InvertByte _ANSI_ARGS_((unsigned char data)); - -/* - *---------------------------------------------------------------------- - * - * XCopyArea -- - * - * Copies data from one drawable to another using block transfer - * routines. - * - * Results: - * None. - * - * Side effects: - * Data is moved from a window or bitmap to a second window or - * bitmap. - * - *---------------------------------------------------------------------- - */ - -void -XCopyArea( - Display* display, /* Display. */ - Drawable src, /* Source drawable. */ - Drawable dest, /* Destination drawable. */ - GC gc, /* GC to use. */ - int src_x, /* X & Y, width & height */ - int src_y, /* define the source rectangle */ - unsigned int width, /* the will be copied. */ - unsigned int height, - int dest_x, /* Dest X & Y on dest rect. */ - int dest_y) -{ - Rect srcRect, destRect; - BitMapPtr srcBit, destBit; - MacDrawable *srcDraw = (MacDrawable *) src; - MacDrawable *destDraw = (MacDrawable *) dest; - GWorldPtr srcPort, destPort; - CGrafPtr saveWorld; - GDHandle saveDevice; - short tmode; - RGBColor origForeColor, origBackColor, whiteColor, blackColor; - - destPort = TkMacGetDrawablePort(dest); - srcPort = TkMacGetDrawablePort(src); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - GetForeColor(&origForeColor); - GetBackColor(&origBackColor); - whiteColor.red = 0; - whiteColor.blue = 0; - whiteColor.green = 0; - RGBForeColor(&whiteColor); - blackColor.red = 0xFFFF; - blackColor.blue = 0xFFFF; - blackColor.green = 0xFFFF; - RGBBackColor(&blackColor); - - - TkMacSetUpClippingRgn(dest); - - /* - * We will change the clip rgn in this routine, so we need to - * be able to restore it when we exit. - */ - - if (tmpRgn2 == NULL) { - tmpRgn2 = NewRgn(); - } - GetClip(tmpRgn2); - - if (((TkpClipMask*)gc->clip_mask)->type == TKP_CLIP_REGION) { - RgnHandle clipRgn = (RgnHandle) - ((TkpClipMask*)gc->clip_mask)->value.region; - - int xOffset, yOffset; - - if (tmpRgn == NULL) { - tmpRgn = NewRgn(); - } - - xOffset = destDraw->xOff + gc->clip_x_origin; - yOffset = destDraw->yOff + gc->clip_y_origin; - - OffsetRgn(clipRgn, xOffset, yOffset); - - GetClip(tmpRgn); - SectRgn(tmpRgn, clipRgn, tmpRgn); - - SetClip(tmpRgn); - - OffsetRgn(clipRgn, -xOffset, -yOffset); - } - - srcBit = &((GrafPtr) srcPort)->portBits; - destBit = &((GrafPtr) destPort)->portBits; - SetRect(&srcRect, (short) (srcDraw->xOff + src_x), - (short) (srcDraw->yOff + src_y), - (short) (srcDraw->xOff + src_x + width), - (short) (srcDraw->yOff + src_y + height)); - SetRect(&destRect, (short) (destDraw->xOff + dest_x), - (short) (destDraw->yOff + dest_y), - (short) (destDraw->xOff + dest_x + width), - (short) (destDraw->yOff + dest_y + height)); - tmode = srcCopy; - - CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL); - RGBForeColor(&origForeColor); - RGBBackColor(&origBackColor); - SetClip(tmpRgn2); - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XCopyPlane -- - * - * Copies a bitmap from a source drawable to a destination - * drawable. The plane argument specifies which bit plane of - * the source contains the bitmap. Note that this implementation - * ignores the gc->function. - * - * Results: - * None. - * - * Side effects: - * Changes the destination drawable. - * - *---------------------------------------------------------------------- - */ - -void -XCopyPlane( - Display* display, /* Display. */ - Drawable src, /* Source drawable. */ - Drawable dest, /* Destination drawable. */ - GC gc, /* The GC to use. */ - int src_x, /* X, Y, width & height */ - int src_y, /* define the source rect. */ - unsigned int width, - unsigned int height, - int dest_x, /* X & Y on dest where we will copy. */ - int dest_y, - unsigned long plane) /* Which plane to copy. */ -{ - Rect srcRect, destRect; - BitMapPtr srcBit, destBit, maskBit; - MacDrawable *srcDraw = (MacDrawable *) src; - MacDrawable *destDraw = (MacDrawable *) dest; - GWorldPtr srcPort, destPort, maskPort; - CGrafPtr saveWorld; - GDHandle saveDevice; - RGBColor macColor; - TkpClipMask *clipPtr = (TkpClipMask*)gc->clip_mask; - short tmode; - - destPort = TkMacGetDrawablePort(dest); - srcPort = TkMacGetDrawablePort(src); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(dest); - - srcBit = &((GrafPtr) srcPort)->portBits; - destBit = &((GrafPtr) destPort)->portBits; - SetRect(&srcRect, (short) (srcDraw->xOff + src_x), - (short) (srcDraw->yOff + src_y), - (short) (srcDraw->xOff + src_x + width), - (short) (srcDraw->yOff + src_y + height)); - SetRect(&destRect, (short) (destDraw->xOff + dest_x), - (short) (destDraw->yOff + dest_y), - (short) (destDraw->xOff + dest_x + width), - (short) (destDraw->yOff + dest_y + height)); - tmode = srcOr; - tmode = srcCopy + transparent; - - if (TkSetMacColor(gc->foreground, &macColor) == true) { - RGBForeColor(&macColor); - } - - if (clipPtr == NULL || clipPtr->type == TKP_CLIP_REGION) { - - /* - * Case 1: opaque bitmaps. - */ - - TkSetMacColor(gc->background, &macColor); - RGBBackColor(&macColor); - tmode = srcCopy; - CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL); - } else if (clipPtr->type == TKP_CLIP_PIXMAP) { - if (clipPtr->value.pixmap == src) { - /* - * Case 2: transparent bitmaps. If it's color we ignore - * the forecolor. - */ - if ((**(srcPort->portPixMap)).pixelSize == 1) { - tmode = srcOr; - } else { - tmode = transparent; - } - CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL); - } else { - /* - * Case 3: two arbitrary bitmaps. - */ - tmode = srcCopy; - maskPort = TkMacGetDrawablePort(clipPtr->value.pixmap); - maskBit = &((GrafPtr) maskPort)->portBits; - CopyDeepMask(srcBit, maskBit, destBit, &srcRect, &srcRect, &destRect, tmode, NULL); - } - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * TkPutImage -- - * - * Copies a subimage from an in-memory image to a rectangle of - * of the specified drawable. - * - * Results: - * None. - * - * Side effects: - * Draws the image on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -TkPutImage( - unsigned long *colors, /* Unused on Macintosh. */ - int ncolors, /* Unused on Macintosh. */ - Display* display, /* Display. */ - Drawable d, /* Drawable to place image on. */ - GC gc, /* GC to use. */ - XImage* image, /* Image to place. */ - int src_x, /* Source X & Y. */ - int src_y, - int dest_x, /* Destination X & Y. */ - int dest_y, - unsigned int width, /* Same width & height for both */ - unsigned int height) /* distination and source. */ -{ - MacDrawable *destDraw = (MacDrawable *) d; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - int i, j; - BitMap bitmap; - char *newData = NULL; - Rect destRect, srcRect; - - destPort = TkMacGetDrawablePort(d); - SetRect(&destRect, dest_x, dest_y, dest_x + width, dest_y + height); - SetRect(&srcRect, src_x, src_y, src_x + width, src_y + height); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - if (image->depth == 1) { - - /* - * This code assumes a pixel depth of 1 - */ - - bitmap.bounds.top = bitmap.bounds.left = 0; - bitmap.bounds.right = (short) image->width; - bitmap.bounds.bottom = (short) image->height; - if ((image->bytes_per_line % 2) == 1) { - char *newPtr, *oldPtr; - newData = (char *) ckalloc(image->height * - (image->bytes_per_line + 1)); - newPtr = newData; - oldPtr = image->data; - for (i = 0; i < image->height; i++) { - for (j = 0; j < image->bytes_per_line; j++) { - *newPtr = InvertByte((unsigned char) *oldPtr); - newPtr++, oldPtr++; - } - *newPtr = 0; - newPtr++; - } - bitmap.baseAddr = newData; - bitmap.rowBytes = image->bytes_per_line + 1; - } else { - newData = (char *) ckalloc(image->height * image->bytes_per_line); - for (i = 0; i < image->height * image->bytes_per_line; i++) { - newData[i] = InvertByte((unsigned char) image->data[i]); - } - bitmap.baseAddr = newData; - bitmap.rowBytes = image->bytes_per_line; - } - - CopyBits(&bitmap, &((GrafPtr) destPort)->portBits, - &srcRect, &destRect, srcCopy, NULL); - - } else { - /* Color image */ - PixMap pixmap; - - pixmap.bounds.left = 0; - pixmap.bounds.top = 0; - pixmap.bounds.right = (short) image->width; - pixmap.bounds.bottom = (short) image->height; - pixmap.pixelType = RGBDirect; - pixmap.pmVersion = 4; /* 32bit clean */ - pixmap.packType = 0; - pixmap.packSize = 0; - pixmap.hRes = 0x00480000; - pixmap.vRes = 0x00480000; - pixmap.pixelSize = 32; - pixmap.cmpCount = 3; - pixmap.cmpSize = 8; - pixmap.planeBytes = 0; - pixmap.pmTable = NULL; - pixmap.pmReserved = 0; - pixmap.baseAddr = image->data; - if (image->bytes_per_line >= 0x4000) { - panic("TkImage too wide!"); - } - pixmap.rowBytes = image->bytes_per_line | 0x8000; - - CopyBits((BitMap *) &pixmap, &((GrafPtr) destPort)->portBits, - &srcRect, &destRect, srcCopy, NULL); - } - - if (newData != NULL) { - ckfree(newData); - } - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XFillRectangles -- - * - * Fill multiple rectangular areas in the given drawable. - * - * Results: - * None. - * - * Side effects: - * Draws onto the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XFillRectangles( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - XRectangle *rectangles, /* Rectangle array. */ - int n_rectangels) /* Number of rectangles. */ -{ - MacDrawable *macWin = (MacDrawable *) d; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - Rect theRect; - int i; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - for (i=0; i<n_rectangels; i++) { - theRect.left = (short) (macWin->xOff + rectangles[i].x); - theRect.top = (short) (macWin->yOff + rectangles[i].y); - theRect.right = (short) (theRect.left + rectangles[i].width); - theRect.bottom = (short) (theRect.top + rectangles[i].height); - FillCRect(&theRect, gPenPat); - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XDrawLines -- - * - * Draw connected lines. - * - * Results: - * None. - * - * Side effects: - * Renders a series of connected lines. - * - *---------------------------------------------------------------------- - */ - -void -XDrawLines( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - XPoint* points, /* Array of points. */ - int npoints, /* Number of points. */ - int mode) /* Line drawing mode. */ -{ - MacDrawable *macWin = (MacDrawable *) d; - CGrafPtr saveWorld; - GWorldPtr destPort; - GDHandle saveDevice; - int i; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - if (npoints < 2) { - return; /* TODO: generate BadValue error. */ - } - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - ShowPen(); - - PenPixPat(gPenPat); - MoveTo((short) (macWin->xOff + points[0].x), - (short) (macWin->yOff + points[0].y)); - for (i = 1; i < npoints; i++) { - if (mode == CoordModeOrigin) { - LineTo((short) (macWin->xOff + points[i].x), - (short) (macWin->yOff + points[i].y)); - } else { - Line((short) (macWin->xOff + points[i].x), - (short) (macWin->yOff + points[i].y)); - } - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XDrawSegments -- - * - * Draw unconnected lines. - * - * Results: - * None. - * - * Side effects: - * Renders a series of connected lines. - * - *---------------------------------------------------------------------- - */ - -void XDrawSegments( - Display *display, - Drawable d, - GC gc, - XSegment *segments, - int nsegments) -{ - MacDrawable *macWin = (MacDrawable *) d; - CGrafPtr saveWorld; - GWorldPtr destPort; - GDHandle saveDevice; - int i; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - ShowPen(); - - PenPixPat(gPenPat); - for (i = 0; i < nsegments; i++) { - MoveTo((short) (macWin->xOff + segments[i].x1), - (short) (macWin->yOff + segments[i].y1)); - LineTo((short) (macWin->xOff + segments[i].x2), - (short) (macWin->yOff + segments[i].y2)); - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XFillPolygon -- - * - * Draws a filled polygon. - * - * Results: - * None. - * - * Side effects: - * Draws a filled polygon on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XFillPolygon( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - XPoint* points, /* Array of points. */ - int npoints, /* Number of points. */ - int shape, /* Shape to draw. */ - int mode) /* Drawing mode. */ -{ - MacDrawable *macWin = (MacDrawable *) d; - PolyHandle polygon; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - int i; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - PenNormal(); - polygon = OpenPoly(); - - MoveTo((short) (macWin->xOff + points[0].x), - (short) (macWin->yOff + points[0].y)); - for (i = 1; i < npoints; i++) { - if (mode == CoordModePrevious) { - Line((short) (macWin->xOff + points[i].x), - (short) (macWin->yOff + points[i].y)); - } else { - LineTo((short) (macWin->xOff + points[i].x), - (short) (macWin->yOff + points[i].y)); - } - } - - ClosePoly(); - - FillCPoly(polygon, gPenPat); - - KillPoly(polygon); - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XDrawRectangle -- - * - * Draws a rectangle. - * - * Results: - * None. - * - * Side effects: - * Draws a rectangle on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XDrawRectangle( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - int x, /* Upper left corner. */ - int y, - unsigned int width, /* Width & height of rect. */ - unsigned int height) -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - theRect.left = (short) (macWin->xOff + x); - theRect.top = (short) (macWin->yOff + y); - theRect.right = (short) (theRect.left + width); - theRect.bottom = (short) (theRect.top + height); - - ShowPen(); - PenPixPat(gPenPat); - FrameRect(&theRect); - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XDrawArc -- - * - * Draw an arc. - * - * Results: - * None. - * - * Side effects: - * Draws an arc on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XDrawArc( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - int x, /* Upper left of */ - int y, /* bounding rect. */ - unsigned int width, /* Width & height. */ - unsigned int height, - int angle1, /* Staring angle of arc. */ - int angle2) /* Ending angle of arc. */ -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - short start, extent; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - theRect.left = (short) (macWin->xOff + x); - theRect.top = (short) (macWin->yOff + y); - theRect.right = (short) (theRect.left + width); - theRect.bottom = (short) (theRect.top + height); - start = (short) (90 - (angle1 / 64)); - extent = (short) (-(angle2 / 64)); - - ShowPen(); - PenPixPat(gPenPat); - FrameArc(&theRect, start, extent); - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * XFillArc -- - * - * Draw a filled arc. - * - * Results: - * None. - * - * Side effects: - * Draws a filled arc on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XFillArc( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - int x, /* Upper left of */ - int y, /* bounding rect. */ - unsigned int width, /* Width & height. */ - unsigned int height, - int angle1, /* Staring angle of arc. */ - int angle2) /* Ending angle of arc. */ -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - short start, extent; - PolyHandle polygon; - double sin1, cos1, sin2, cos2, angle; - double boxWidth, boxHeight; - double vertex[2], center1[2], center2[2]; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - theRect.left = (short) (macWin->xOff + x); - theRect.top = (short) (macWin->yOff + y); - theRect.right = (short) (theRect.left + width); - theRect.bottom = (short) (theRect.top + height); - start = (short) (90 - (angle1 / 64)); - extent = (short) (- (angle2 / 64)); - - if (gc->arc_mode == ArcChord) { - boxWidth = theRect.right - theRect.left; - boxHeight = theRect.bottom - theRect.top; - angle = -(angle1/64.0)*PI/180.0; - sin1 = sin(angle); - cos1 = cos(angle); - angle -= (angle2/64.0)*PI/180.0; - sin2 = sin(angle); - cos2 = cos(angle); - vertex[0] = (theRect.left + theRect.right)/2.0; - vertex[1] = (theRect.top + theRect.bottom)/2.0; - center1[0] = vertex[0] + cos1*boxWidth/2.0; - center1[1] = vertex[1] + sin1*boxHeight/2.0; - center2[0] = vertex[0] + cos2*boxWidth/2.0; - center2[1] = vertex[1] + sin2*boxHeight/2.0; - - polygon = OpenPoly(); - MoveTo((short) ((theRect.left + theRect.right)/2), - (short) ((theRect.top + theRect.bottom)/2)); - - LineTo((short) (center1[0] + 0.5), (short) (center1[1] + 0.5)); - LineTo((short) (center2[0] + 0.5), (short) (center2[1] + 0.5)); - ClosePoly(); - - ShowPen(); - FillCArc(&theRect, start, extent, gPenPat); - FillCPoly(polygon, gPenPat); - - KillPoly(polygon); - } else { - ShowPen(); - FillCArc(&theRect, start, extent, gPenPat); - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * TkScrollWindow -- - * - * Scroll a rectangle of the specified window and accumulate - * a damage region. - * - * Results: - * Returns 0 if the scroll genereated no additional damage. - * Otherwise, sets the region that needs to be repainted after - * scrolling and returns 1. - * - * Side effects: - * Scrolls the bits in the window. - * - *---------------------------------------------------------------------- - */ - -int -TkScrollWindow( - Tk_Window tkwin, /* The window to be scrolled. */ - GC gc, /* GC for window to be scrolled. */ - int x, /* Position rectangle to be scrolled. */ - int y, - int width, - int height, - int dx, /* Distance rectangle should be moved. */ - int dy, - TkRegion damageRgn) /* Region to accumulate damage in. */ -{ - MacDrawable *destDraw = (MacDrawable *) Tk_WindowId(tkwin); - RgnHandle rgn = (RgnHandle) damageRgn; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - Rect srcRect, scrollRect; - - destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin)); - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(Tk_WindowId(tkwin)); - - /* - * Due to the implementation below the behavior may be differnt - * than X in certain cases that should never occur in Tk. The - * scrollRect is the source rect extended by the offset (the union - * of the source rect and the offset rect). Everything - * in the extended scrollRect is scrolled. On X, it's possible - * to "skip" over an area if the offset makes the source and - * destination rects disjoint and non-aligned. - */ - - SetRect(&srcRect, (short) (destDraw->xOff + x), - (short) (destDraw->yOff + y), - (short) (destDraw->xOff + x + width), - (short) (destDraw->yOff + y + height)); - scrollRect = srcRect; - if (dx < 0) { - scrollRect.left += dx; - } else { - scrollRect.right += dx; - } - if (dy < 0) { - scrollRect.top += dy; - } else { - scrollRect.bottom += dy; - } - - /* - * Adjust clip region so that we don't copy any windows - * that may overlap us. - */ - RectRgn(rgn, &srcRect); - DiffRgn(rgn, destPort->visRgn, rgn); - OffsetRgn(rgn, dx, dy); - DiffRgn(destPort->clipRgn, rgn, destPort->clipRgn); - SetEmptyRgn(rgn); - - /* - * When a menu is up, the Mac does not expect drawing to occur and - * does not clip out the menu. We have to do it ourselves. This - * is pretty gross. - */ - - if (tkUseMenuCascadeRgn == 1) { - Point scratch = {0, 0}; - MacDrawable *macDraw = (MacDrawable *) Tk_WindowId(tkwin); - - LocalToGlobal(&scratch); - CopyRgn(tkMenuCascadeRgn, rgn); - OffsetRgn(rgn, -scratch.h, -scratch.v); - DiffRgn(destPort->clipRgn, rgn, destPort->clipRgn); - SetEmptyRgn(rgn); - macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU; - } - - ScrollRect(&scrollRect, dx, dy, rgn); - - SetGWorld(saveWorld, saveDevice); - - /* - * Fortunantly, the region returned by ScrollRect is symanticlly - * the same as what we need to return in this function. If the - * region is empty we return zero to denote that no damage was - * created. - */ - if (EmptyRgn(rgn)) { - return 0; - } else { - return 1; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacSetUpGraphicsPort -- - * - * Set up the graphics port from the given GC. - * - * Results: - * None. - * - * Side effects: - * The current port is adjusted. - * - *---------------------------------------------------------------------- - */ - -void -TkMacSetUpGraphicsPort( - GC gc) /* GC to apply to current port. */ -{ - RGBColor macColor; - - if (gPenPat == NULL) { - gPenPat = NewPixPat(); - } - - if (TkSetMacColor(gc->foreground, &macColor) == true) { - /* TODO: cache RGBPats for preformace - measure gains... */ - MakeRGBPat(gPenPat, &macColor); - } - - PenNormal(); - if(gc->function == GXxor) { - PenMode(patXor); - } - if (gc->line_width > 1) { - PenSize(gc->line_width, gc->line_width); - } - if (gc->line_style != LineSolid) { - unsigned char *p = (unsigned char *) &(gc->dashes); - /* - * Here the dash pattern should be set in the drawing, - * environment, but I don't know how to do that for the Mac. - * - * p[] is an array of unsigned chars containing the dash list. - * A '\0' indicates the end of this list. - * - * Someone knows how to implement this? If you have a more - * complete implementation of SetUpGraphicsPort() for - * the Mac (or for Windows), please let me know. - * - * Jan Nijtmans - * CMG Arnhem, B.V. - * email: j.nijtmans@chello.nl (private) - * jan.nijtmans@cmg.nl (work) - * url: http://purl.oclc.org/net/nijtmans/ - */ - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacSetUpClippingRgn -- - * - * Set up the clipping region so that drawing only occurs on the - * specified X subwindow. - * - * Results: - * None. - * - * Side effects: - * The clipping region in the current port is changed. - * - *---------------------------------------------------------------------- - */ - -void -TkMacSetUpClippingRgn( - Drawable drawable) /* Drawable to update. */ -{ - MacDrawable *macDraw = (MacDrawable *) drawable; - - if (macDraw->winPtr != NULL) { - if (macDraw->flags & TK_CLIP_INVALID) { - TkMacUpdateClipRgn(macDraw->winPtr); - } - - /* - * When a menu is up, the Mac does not expect drawing to occur and - * does not clip out the menu. We have to do it ourselves. This - * is pretty gross. - */ - - if (macDraw->clipRgn != NULL) { - if (tkUseMenuCascadeRgn == 1) { - Point scratch = {0, 0}; - GDHandle saveDevice; - GWorldPtr saveWorld; - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(TkMacGetDrawablePort(drawable), NULL); - LocalToGlobal(&scratch); - SetGWorld(saveWorld, saveDevice); - if (tmpRgn == NULL) { - tmpRgn = NewRgn(); - } - CopyRgn(tkMenuCascadeRgn, tmpRgn); - OffsetRgn(tmpRgn, -scratch.h, -scratch.v); - DiffRgn(macDraw->clipRgn, tmpRgn, tmpRgn); - SetClip(tmpRgn); - macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU; - } else { - SetClip(macDraw->clipRgn); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacMakeStippleMap -- - * - * Given a drawable and a stipple pattern this function draws the - * pattern repeatedly over the drawable. The drawable can then - * be used as a mask for bit-bliting a stipple pattern over an - * object. - * - * Results: - * A BitMap data structure. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -BitMapPtr -TkMacMakeStippleMap( - Drawable drawable, /* Window to apply stipple. */ - Drawable stipple) /* The stipple pattern. */ -{ - MacDrawable *destDraw = (MacDrawable *) drawable; - GWorldPtr destPort; - BitMapPtr bitmapPtr; - int width, height, stippleHeight, stippleWidth; - int i, j; - char * data; - Rect bounds; - - destPort = TkMacGetDrawablePort(drawable); - width = destPort->portRect.right - destPort->portRect.left; - height = destPort->portRect.bottom - destPort->portRect.top; - - bitmapPtr = (BitMap *) ckalloc(sizeof(BitMap)); - data = (char *) ckalloc(height * ((width / 8) + 1)); - bitmapPtr->bounds.top = bitmapPtr->bounds.left = 0; - bitmapPtr->bounds.right = (short) width; - bitmapPtr->bounds.bottom = (short) height; - bitmapPtr->baseAddr = data; - bitmapPtr->rowBytes = (width / 8) + 1; - - destPort = TkMacGetDrawablePort(stipple); - stippleWidth = destPort->portRect.right - destPort->portRect.left; - stippleHeight = destPort->portRect.bottom - destPort->portRect.top; - - for (i = 0; i < height; i += stippleHeight) { - for (j = 0; j < width; j += stippleWidth) { - bounds.left = j; - bounds.top = i; - bounds.right = j + stippleWidth; - bounds.bottom = i + stippleHeight; - - CopyBits(&((GrafPtr) destPort)->portBits, bitmapPtr, - &((GrafPtr) destPort)->portRect, &bounds, srcCopy, NULL); - } - } - return bitmapPtr; -} - -/* - *---------------------------------------------------------------------- - * - * InvertByte -- - * - * This function reverses the bits in the passed in Byte of data. - * - * Results: - * The incoming byte in reverse bit order. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static unsigned char -InvertByte( - unsigned char data) /* Byte of data. */ -{ - unsigned char i; - unsigned char mask = 1, result = 0; - - for (i = (1 << 7); i != 0; i /= 2) { - if (data & mask) { - result |= i; - } - mask = mask << 1; - } - return result; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDrawHighlightBorder -- - * - * This procedure draws a rectangular ring around the outside of - * a widget to indicate that it has received the input focus. - * - * On the Macintosh, this puts a 1 pixel border in the bgGC color - * between the widget and the focus ring, except in the case where - * highlightWidth is 1, in which case the border is left out. - * - * For proper Mac L&F, use highlightWidth of 3. - * - * Results: - * None. - * - * Side effects: - * A rectangle "width" pixels wide is drawn in "drawable", - * corresponding to the outer area of "tkwin". - * - *---------------------------------------------------------------------- - */ - -void -TkpDrawHighlightBorder ( - Tk_Window tkwin, - GC fgGC, - GC bgGC, - int highlightWidth, - Drawable drawable) -{ - if (highlightWidth == 1) { - TkDrawInsetFocusHighlight (tkwin, fgGC, highlightWidth, drawable, 0); - } else { - TkDrawInsetFocusHighlight (tkwin, bgGC, highlightWidth, drawable, 0); - if (fgGC != bgGC) { - TkDrawInsetFocusHighlight (tkwin, fgGC, highlightWidth - 1, drawable, 0); - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpDrawFrame -- - * - * This procedure draws the rectangular frame area. - * - * Results: - * None. - * - * Side effects: - * Draws inside the tkwin area. - * - *---------------------------------------------------------------------- - */ - -void -TkpDrawFrame (Tk_Window tkwin, Tk_3DBorder border, - int highlightWidth, int borderWidth, int relief) -{ - Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), - border, highlightWidth, highlightWidth, - Tk_Width(tkwin) - 2 * highlightWidth, - Tk_Height(tkwin) - 2 * highlightWidth, - borderWidth, relief); -} diff --git a/mac/tkMacEmbed.c b/mac/tkMacEmbed.c deleted file mode 100644 index 06ceaa4..0000000 --- a/mac/tkMacEmbed.c +++ /dev/null @@ -1,1207 +0,0 @@ -/* - * tkMacEmbed.c -- - * - * This file contains platform-specific procedures for theMac to provide - * basic operations needed for application embedding (where one - * application can use as its main window an internal window from - * some other application). - * Currently only Toplevel embedding within the same Tk application is - * allowed on the Macintosh. - * - * Copyright (c) 1996-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacEmbed.c,v 1.6 2002/10/09 11:56:39 das Exp $ - */ - -#include "tkInt.h" -#include "tkPort.h" -#include "X.h" -#include "Xlib.h" -#include <stdio.h> - -#include <Windows.h> -#include <QDOffscreen.h> -#include "tkMacInt.h" - -/* - * One of the following structures exists for each container in this - * application. It keeps track of the container window and its - * associated embedded window. - */ - -typedef struct Container { - Window parent; /* The Mac Drawable for the parent of - * the pair (the container). */ - TkWindow *parentPtr; /* Tk's information about the container, - * or NULL if the container isn't - * in this process. */ - Window embedded; /* The MacDrawable for the embedded - * window. Starts off as None, but - * gets filled in when the window is - * eventually created. */ - TkWindow *embeddedPtr; /* Tk's information about the embedded - * window, or NULL if the - * embedded application isn't in - * this process. */ - struct Container *nextPtr; /* Next in list of all containers in - * this process. */ -} Container; - -static Container *firstContainerPtr = NULL; - /* First in list of all containers - * managed by this process. */ -/* - * Globals defined in this file - */ - -TkMacEmbedHandler *gMacEmbedHandler = NULL; - -/* - * Prototypes for static procedures defined in this file: - */ - -static void ContainerEventProc _ANSI_ARGS_(( - ClientData clientData, XEvent *eventPtr)); -static void EmbeddedEventProc _ANSI_ARGS_(( - ClientData clientData, XEvent *eventPtr)); -static void EmbedActivateProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static void EmbedFocusProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static void EmbedGeometryRequest _ANSI_ARGS_(( - Container * containerPtr, int width, int height)); -static void EmbedSendConfigure _ANSI_ARGS_(( - Container *containerPtr)); -static void EmbedStructureProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static void EmbedWindowDeleted _ANSI_ARGS_((TkWindow *winPtr)); - - -/* - *---------------------------------------------------------------------- - * - * Tk_MacSetEmbedHandler -- - * - * Registers a handler for an in process form of embedding, like - * Netscape plugins, where Tk is loaded into the process, but does - * not control the main window - * - * Results: - * None - * - * Side effects: - * The embed handler is set. - * - *---------------------------------------------------------------------- - */ -void -Tk_MacSetEmbedHandler( - Tk_MacEmbedRegisterWinProc *registerWinProc, - Tk_MacEmbedGetGrafPortProc *getPortProc, - Tk_MacEmbedMakeContainerExistProc *containerExistProc, - Tk_MacEmbedGetClipProc *getClipProc, - Tk_MacEmbedGetOffsetInParentProc *getOffsetProc) -{ - if (gMacEmbedHandler == NULL) { - gMacEmbedHandler = (TkMacEmbedHandler *) ckalloc(sizeof(TkMacEmbedHandler)); - } - gMacEmbedHandler->registerWinProc = registerWinProc; - gMacEmbedHandler->getPortProc = getPortProc; - gMacEmbedHandler->containerExistProc = containerExistProc; - gMacEmbedHandler->getClipProc = getClipProc; - gMacEmbedHandler->getOffsetProc = getOffsetProc; -} - - -/* - *---------------------------------------------------------------------- - * - * TkpMakeWindow -- - * - * Creates an X Window (Mac subwindow). - * - * Results: - * The window id is returned. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Window -TkpMakeWindow( - TkWindow *winPtr, - Window parent) -{ - MacDrawable *macWin; - XEvent event; - - /* - * If this window is marked as embedded then - * the window structure should have already been - * created in the TkpUseWindow function. - */ - - if (Tk_IsEmbedded(winPtr)) { - return (Window) winPtr->privatePtr; - } - - /* - * Allocate sub window - */ - - macWin = (MacDrawable *) ckalloc(sizeof(MacDrawable)); - if (macWin == NULL) { - winPtr->privatePtr = NULL; - return None; - } - macWin->winPtr = winPtr; - winPtr->privatePtr = macWin; - macWin->clipRgn = NewRgn(); - macWin->aboveClipRgn = NewRgn(); - macWin->referenceCount = 0; - macWin->flags = TK_CLIP_INVALID; - - if (Tk_IsTopLevel(macWin->winPtr)) { - - /* - *This will be set when we are mapped. - */ - - macWin->portPtr = (GWorldPtr) NULL; - macWin->toplevel = macWin; - macWin->xOff = 0; - macWin->yOff = 0; - } else { - macWin->portPtr = NULL; - macWin->xOff = winPtr->parentPtr->privatePtr->xOff + - winPtr->parentPtr->changes.border_width + - winPtr->changes.x; - macWin->yOff = winPtr->parentPtr->privatePtr->yOff + - winPtr->parentPtr->changes.border_width + - winPtr->changes.y; - macWin->toplevel = winPtr->parentPtr->privatePtr->toplevel; - } - - macWin->toplevel->referenceCount++; - - /* - * TODO: need general solution for visibility events. - */ - event.xany.serial = Tk_Display(winPtr)->request; - event.xany.send_event = False; - event.xany.display = Tk_Display(winPtr); - - event.xvisibility.type = VisibilityNotify; - event.xvisibility.window = (Window) macWin;; - event.xvisibility.state = VisibilityUnobscured; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - - return (Window) macWin; -} - -/* - *---------------------------------------------------------------------- - * - * TkpUseWindow -- - * - * This procedure causes a Tk window to use a given X window as - * its parent window, rather than the root window for the screen. - * It is invoked by an embedded application to specify the window - * in which it is embedded. - * - * Results: - * The return value is normally TCL_OK. If an error occurs (such - * as string not being a valid window spec), then the return value - * is TCL_ERROR and an error message is left in the interp's result if - * interp is non-NULL. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpUseWindow( - Tcl_Interp *interp, /* If not NULL, used for error reporting - * if string is bogus. */ - Tk_Window tkwin, /* Tk window that does not yet have an - * associated X window. */ - CONST char *string) /* String identifying an X window to use - * for tkwin; must be an integer value. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - TkWindow *usePtr; - MacDrawable *parent, *macWin; - Container *containerPtr; - XEvent event; - int result; - - if (winPtr->window != None) { - panic("TkpUseWindow: X window already assigned"); - } - - /* - * Decode the container pointer, and look for it among the - *list of available containers. - * - * N.B. For now, we are limiting the containers to be in the same Tk - * application as tkwin, since otherwise they would not be in our list - * of containers. - * - */ - - if (Tcl_GetInt(interp, string, &result) != TCL_OK) { - return TCL_ERROR; - } - - usePtr = (TkWindow *) Tk_IdToWindow(winPtr->display, (Window) result); - - if (usePtr == NULL) { - Tcl_AppendResult(interp, "Tk window does not correspond to id \"", - string, "\"", (char *) NULL); - return TCL_ERROR; - } else { - if (!(usePtr->flags & TK_CONTAINER)) { - Tcl_AppendResult(interp, "window \"", usePtr->pathName, - "\" doesn't have -container option set", (char *) NULL); - return TCL_ERROR; - } - } - - parent = (MacDrawable *) result; - - /* - * Save information about the container and the embedded window - * in a Container structure. Currently, there must already be an existing - * Container structure, since we only allow the case where both container - * and embedded app. are in the same process. - */ - - for (containerPtr = firstContainerPtr; containerPtr != NULL; - containerPtr = containerPtr->nextPtr) { - if (containerPtr->parent == (Window) parent) { - winPtr->flags |= TK_BOTH_HALVES; - containerPtr->parentPtr->flags |= TK_BOTH_HALVES; - break; - } - } - - /* - * Make the embedded window. - */ - - macWin = (MacDrawable *) ckalloc(sizeof(MacDrawable)); - if (macWin == NULL) { - winPtr->privatePtr = NULL; - return TCL_ERROR; - } - - macWin->winPtr = winPtr; - winPtr->privatePtr = macWin; - - /* - * The portPtr will be NULL for a Tk in Tk embedded window. - * It is none of our business what it is for a Tk not in Tk embedded window, - * but we will initialize it to NULL, and let the registerWinProc - * set it. In any case, you must always use TkMacGetDrawablePort - * to get the portPtr. It will correctly find the container's port. - */ - - macWin->portPtr = (GWorldPtr) NULL; - - macWin->clipRgn = NewRgn(); - macWin->aboveClipRgn = NewRgn(); - macWin->referenceCount = 0; - macWin->flags = TK_CLIP_INVALID; - macWin->toplevel = macWin; - macWin->toplevel->referenceCount++; - - winPtr->flags |= TK_EMBEDDED; - - - /* - * Make a copy of the TK_EMBEDDED flag, since sometimes - * we need this to get the port after the TkWindow structure - * has been freed. - */ - - macWin->flags |= TK_EMBEDDED; - - /* - * Now check whether it is embedded in another Tk widget. If not (the first - * case below) we see if there is an in-process embedding handler registered, - * and if so, let that fill in the rest of the macWin. - */ - - if (containerPtr == NULL) { - /* - * If someone has registered an in process embedding handler, then - * see if it can handle this window... - */ - - if (gMacEmbedHandler == NULL || - gMacEmbedHandler->registerWinProc(result, (Tk_Window) winPtr) != TCL_OK) { - Tcl_AppendResult(interp, "The window ID ", string, - " does not correspond to a valid Tk Window.", - (char *) NULL); - return TCL_ERROR; - } else { - containerPtr = (Container *) ckalloc(sizeof(Container)); - - containerPtr->parentPtr = NULL; - containerPtr->embedded = (Window) macWin; - containerPtr->embeddedPtr = macWin->winPtr; - containerPtr->nextPtr = firstContainerPtr; - firstContainerPtr = containerPtr; - - } - } else { - - /* - * The window is embedded in another Tk window. - */ - - macWin->xOff = parent->winPtr->privatePtr->xOff + - parent->winPtr->changes.border_width + - winPtr->changes.x; - macWin->yOff = parent->winPtr->privatePtr->yOff + - parent->winPtr->changes.border_width + - winPtr->changes.y; - - - /* - * Finish filling up the container structure with the embedded window's - * information. - */ - - containerPtr->embedded = (Window) macWin; - containerPtr->embeddedPtr = macWin->winPtr; - - /* - * Create an event handler to clean up the Container structure when - * tkwin is eventually deleted. - */ - - Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbeddedEventProc, - (ClientData) winPtr); - - } - - /* - * TODO: need general solution for visibility events. - */ - - event.xany.serial = Tk_Display(winPtr)->request; - event.xany.send_event = False; - event.xany.display = Tk_Display(winPtr); - - event.xvisibility.type = VisibilityNotify; - event.xvisibility.window = (Window) macWin;; - event.xvisibility.state = VisibilityUnobscured; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - - - /* - * TODO: need general solution for visibility events. - */ - - event.xany.serial = Tk_Display(winPtr)->request; - event.xany.send_event = False; - event.xany.display = Tk_Display(winPtr); - - event.xvisibility.type = VisibilityNotify; - event.xvisibility.window = (Window) macWin;; - event.xvisibility.state = VisibilityUnobscured; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * TkpMakeContainer -- - * - * This procedure is called to indicate that a particular window - * will be a container for an embedded application. This changes - * certain aspects of the window's behavior, such as whether it - * will receive events anymore. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkpMakeContainer( - Tk_Window tkwin) /* Token for a window that is about to - * become a container. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - Container *containerPtr; - - /* - * Register the window as a container so that, for example, we can - * make sure the argument to -use is valid. - */ - - - Tk_MakeWindowExist(tkwin); - containerPtr = (Container *) ckalloc(sizeof(Container)); - containerPtr->parent = Tk_WindowId(tkwin); - containerPtr->parentPtr = winPtr; - containerPtr->embedded = None; - containerPtr->embeddedPtr = NULL; - containerPtr->nextPtr = firstContainerPtr; - firstContainerPtr = containerPtr; - winPtr->flags |= TK_CONTAINER; - - /* - * Request SubstructureNotify events so that we can find out when - * the embedded application creates its window or attempts to - * resize it. Also watch Configure events on the container so that - * we can resize the child to match. Also, pass activate events from - * the container down to the embedded toplevel. - */ - - Tk_CreateEventHandler(tkwin, - SubstructureNotifyMask|SubstructureRedirectMask, - ContainerEventProc, (ClientData) winPtr); - Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbedStructureProc, - (ClientData) containerPtr); - Tk_CreateEventHandler(tkwin, ActivateMask, EmbedActivateProc, - (ClientData) containerPtr); - Tk_CreateEventHandler(tkwin, FocusChangeMask, EmbedFocusProc, - (ClientData) containerPtr); - -} - -/* - *---------------------------------------------------------------------- - * - * TkMacContainerId -- - * - * Given an embedded window, this procedure returns the MacDrawable - * identifier for the associated container window. - * - * Results: - * The return value is the MacDrawable for winPtr's - * container window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -MacDrawable * -TkMacContainerId(winPtr) - TkWindow *winPtr; /* Tk's structure for an embedded window. */ -{ - Container *containerPtr; - - for (containerPtr = firstContainerPtr; containerPtr != NULL; - containerPtr = containerPtr->nextPtr) { - if (containerPtr->embeddedPtr == winPtr) { - return (MacDrawable *) containerPtr->parent; - } - } - panic("TkMacContainerId couldn't find window"); - return None; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGetHostToplevel -- - * - * Given the TkWindow, return the MacDrawable for the outermost - * toplevel containing it. This will be a real Macintosh window. - * - * Results: - * Returns a MacDrawable corresponding to a Macintosh Toplevel - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -MacDrawable * -TkMacGetHostToplevel( - TkWindow *winPtr) /* Tk's structure for a window. */ -{ - TkWindow *contWinPtr, *topWinPtr; - - topWinPtr = winPtr->privatePtr->toplevel->winPtr; - if (!Tk_IsEmbedded(topWinPtr)) { - return winPtr->privatePtr->toplevel; - } else { - contWinPtr = TkpGetOtherWindow(topWinPtr); - - /* - * NOTE: Here we should handle out of process embedding. - */ - - if (contWinPtr != NULL) { - return TkMacGetHostToplevel(contWinPtr); - } else { - return None; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpClaimFocus -- - * - * This procedure is invoked when someone asks for the input focus - * to be put on a window in an embedded application, but the - * application doesn't currently have the focus. It requests the - * input focus from the container application. - * - * Results: - * None. - * - * Side effects: - * The input focus may change. - * - *---------------------------------------------------------------------- - */ - -void -TkpClaimFocus( - TkWindow *topLevelPtr, /* Top-level window containing desired - * focus window; should be embedded. */ - int force) /* One means that the container should - * claim the focus if it doesn't - * currently have it. */ -{ - XEvent event; - Container *containerPtr; - - if (!(topLevelPtr->flags & TK_EMBEDDED)) { - return; - } - - for (containerPtr = firstContainerPtr; - containerPtr->embeddedPtr != topLevelPtr; - containerPtr = containerPtr->nextPtr) { - /* Empty loop body. */ - } - - - event.xfocus.type = FocusIn; - event.xfocus.serial = LastKnownRequestProcessed(topLevelPtr->display); - event.xfocus.send_event = 1; - event.xfocus.display = topLevelPtr->display; - event.xfocus.window = containerPtr->parent; - event.xfocus.mode = EMBEDDED_APP_WANTS_FOCUS; - event.xfocus.detail = force; - Tk_QueueWindowEvent(&event,TCL_QUEUE_TAIL); -} - -/* - *---------------------------------------------------------------------- - * - * TkpTestembedCmd -- - * - * This procedure implements the "testembed" command. It returns - * some or all of the information in the list pointed to by - * firstContainerPtr. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpTestembedCmd( - ClientData clientData, /* Main window for application. */ - Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - CONST char **argv) /* Argument strings. */ -{ - int all; - Container *containerPtr; - Tcl_DString dString; - char buffer[50]; - - if ((argc > 1) && (strcmp(argv[1], "all") == 0)) { - all = 1; - } else { - all = 0; - } - Tcl_DStringInit(&dString); - for (containerPtr = firstContainerPtr; containerPtr != NULL; - containerPtr = containerPtr->nextPtr) { - Tcl_DStringStartSublist(&dString); - if (containerPtr->parent == None) { - Tcl_DStringAppendElement(&dString, ""); - } else { - if (all) { - sprintf(buffer, "0x%x", (int) containerPtr->parent); - Tcl_DStringAppendElement(&dString, buffer); - } else { - Tcl_DStringAppendElement(&dString, "XXX"); - } - } - if (containerPtr->parentPtr == NULL) { - Tcl_DStringAppendElement(&dString, ""); - } else { - Tcl_DStringAppendElement(&dString, - containerPtr->parentPtr->pathName); - } - if (containerPtr->embedded == None) { - Tcl_DStringAppendElement(&dString, ""); - } else { - if (all) { - sprintf(buffer, "0x%x", (int) containerPtr->embedded); - Tcl_DStringAppendElement(&dString, buffer); - } else { - Tcl_DStringAppendElement(&dString, "XXX"); - } - } - if (containerPtr->embeddedPtr == NULL) { - Tcl_DStringAppendElement(&dString, ""); - } else { - Tcl_DStringAppendElement(&dString, - containerPtr->embeddedPtr->pathName); - } - Tcl_DStringEndSublist(&dString); - } - Tcl_DStringResult(interp, &dString); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * TkpRedirectKeyEvent -- - * - * This procedure is invoked when a key press or release event - * arrives for an application that does not believe it owns the - * input focus. This can happen because of embedding; for example, - * X can send an event to an embedded application when the real - * focus window is in the container application and is an ancestor - * of the container. This procedure's job is to forward the event - * back to the application where it really belongs. - * - * Results: - * None. - * - * Side effects: - * The event may get sent to a different application. - * - *---------------------------------------------------------------------- - */ - -void -TkpRedirectKeyEvent( - TkWindow *winPtr, /* Window to which the event was originally - * reported. */ - XEvent *eventPtr) /* X event to redirect (should be KeyPress - * or KeyRelease). */ -{ -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetOtherWindow -- - * - * If both the container and embedded window are in the same - * process, this procedure will return either one, given the other. - * - * Results: - * If winPtr is a container, the return value is the token for the - * embedded window, and vice versa. If the "other" window isn't in - * this process, NULL is returned. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkWindow * -TkpGetOtherWindow( - TkWindow *winPtr) /* Tk's structure for a container or - * embedded window. */ -{ - Container *containerPtr; - - /* - * TkpGetOtherWindow returns NULL if both windows are not - * in the same process... - */ - - if (!(winPtr->flags & TK_BOTH_HALVES)) { - return NULL; - } - - for (containerPtr = firstContainerPtr; containerPtr != NULL; - containerPtr = containerPtr->nextPtr) { - if (containerPtr->embeddedPtr == winPtr) { - return containerPtr->parentPtr; - } else if (containerPtr->parentPtr == winPtr) { - return containerPtr->embeddedPtr; - } - } - return NULL; -} -/* - *---------------------------------------------------------------------- - * - * EmbeddedEventProc -- - * - * This procedure is invoked by the Tk event dispatcher when various - * useful events are received for a window that is embedded in - * another application. - * - * Results: - * None. - * - * Side effects: - * Our internal state gets cleaned up when an embedded window is - * destroyed. - * - *---------------------------------------------------------------------- - */ - -static void -EmbeddedEventProc(clientData, eventPtr) - ClientData clientData; /* Token for container window. */ - XEvent *eventPtr; /* ResizeRequest event. */ -{ - TkWindow *winPtr = (TkWindow *) clientData; - - if (eventPtr->type == DestroyNotify) { - EmbedWindowDeleted(winPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * ContainerEventProc -- - * - * This procedure is invoked by the Tk event dispatcher when various - * useful events are received for the children of a container - * window. It forwards relevant information, such as geometry - * requests, from the events into the container's application. - * - * NOTE: on the Mac, only the DestroyNotify branch is ever taken. - * We don't synthesize the other events. - * - * Results: - * None. - * - * Side effects: - * Depends on the event. For example, when ConfigureRequest events - * occur, geometry information gets set for the container window. - * - *---------------------------------------------------------------------- - */ - -static void -ContainerEventProc(clientData, eventPtr) - ClientData clientData; /* Token for container window. */ - XEvent *eventPtr; /* ResizeRequest event. */ -{ - TkWindow *winPtr = (TkWindow *) clientData; - Container *containerPtr; - Tk_ErrorHandler errHandler; - - /* - * Ignore any X protocol errors that happen in this procedure - * (almost any operation could fail, for example, if the embedded - * application has deleted its window). - */ - - errHandler = Tk_CreateErrorHandler(eventPtr->xfocus.display, -1, - -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL); - - /* - * Find the Container structure associated with the parent window. - */ - - for (containerPtr = firstContainerPtr; - containerPtr->parent != eventPtr->xmaprequest.parent; - containerPtr = containerPtr->nextPtr) { - if (containerPtr == NULL) { - panic("ContainerEventProc couldn't find Container record"); - } - } - - if (eventPtr->type == CreateNotify) { - /* - * A new child window has been created in the container. Record - * its id in the Container structure (if more than one child is - * created, just remember the last one and ignore the earlier - * ones). - */ - - containerPtr->embedded = eventPtr->xcreatewindow.window; - } else if (eventPtr->type == ConfigureRequest) { - if ((eventPtr->xconfigurerequest.x != 0) - || (eventPtr->xconfigurerequest.y != 0)) { - /* - * The embedded application is trying to move itself, which - * isn't legal. At this point, the window hasn't actually - * moved, but we need to send it a ConfigureNotify event to - * let it know that its request has been denied. If the - * embedded application was also trying to resize itself, a - * ConfigureNotify will be sent by the geometry management - * code below, so we don't need to do anything. Otherwise, - * generate a synthetic event. - */ - - if ((eventPtr->xconfigurerequest.width == winPtr->changes.width) - && (eventPtr->xconfigurerequest.height - == winPtr->changes.height)) { - EmbedSendConfigure(containerPtr); - } - } - EmbedGeometryRequest(containerPtr, - eventPtr->xconfigurerequest.width, - eventPtr->xconfigurerequest.height); - } else if (eventPtr->type == MapRequest) { - /* - * The embedded application's map request was ignored and simply - * passed on to us, so we have to map the window for it to appear - * on the screen. - */ - - XMapWindow(eventPtr->xmaprequest.display, - eventPtr->xmaprequest.window); - } else if (eventPtr->type == DestroyNotify) { - /* - * The embedded application is gone. Destroy the container window. - */ - - Tk_DestroyWindow((Tk_Window) winPtr); - } - Tk_DeleteErrorHandler(errHandler); -} - -/* - *---------------------------------------------------------------------- - * - * EmbedStructureProc -- - * - * This procedure is invoked by the Tk event dispatcher when - * a container window owned by this application gets resized - * (and also at several other times that we don't care about). - * This procedure reflects the size change in the embedded - * window that corresponds to the container. - * - * Results: - * None. - * - * Side effects: - * The embedded window gets resized to match the container. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedStructureProc(clientData, eventPtr) - ClientData clientData; /* Token for container window. */ - XEvent *eventPtr; /* ResizeRequest event. */ -{ - Container *containerPtr = (Container *) clientData; - Tk_ErrorHandler errHandler; - - if (eventPtr->type == ConfigureNotify) { - if (containerPtr->embedded != None) { - /* - * Ignore errors, since the embedded application could have - * deleted its window. - */ - - errHandler = Tk_CreateErrorHandler(eventPtr->xfocus.display, -1, - -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL); - Tk_MoveResizeWindow((Tk_Window) containerPtr->embeddedPtr, 0, 0, - (unsigned int) Tk_Width( - (Tk_Window) containerPtr->parentPtr), - (unsigned int) Tk_Height( - (Tk_Window) containerPtr->parentPtr)); - Tk_DeleteErrorHandler(errHandler); - } - } else if (eventPtr->type == DestroyNotify) { - EmbedWindowDeleted(containerPtr->parentPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * EmbedActivateProc -- - * - * This procedure is invoked by the Tk event dispatcher when - * Activate and Deactivate events occur for a container window owned - * by this application. It is responsible for forwarding an activate - * event down into the embedded toplevel. - * - * Results: - * None. - * - * Side effects: - * The X focus may change. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedActivateProc(clientData, eventPtr) - ClientData clientData; /* Token for container window. */ - XEvent *eventPtr; /* ResizeRequest event. */ -{ - Container *containerPtr = (Container *) clientData; - - if (containerPtr->embeddedPtr != NULL) { - if (eventPtr->type == ActivateNotify) { - TkGenerateActivateEvents(containerPtr->embeddedPtr,1); - } else if (eventPtr->type == DeactivateNotify) { - TkGenerateActivateEvents(containerPtr->embeddedPtr,0); - } - } -} - -/* - *---------------------------------------------------------------------- - * - * EmbedFocusProc -- - * - * This procedure is invoked by the Tk event dispatcher when - * FocusIn and FocusOut events occur for a container window owned - * by this application. It is responsible for moving the focus - * back and forth between a container application and an embedded - * application. - * - * Results: - * None. - * - * Side effects: - * The X focus may change. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedFocusProc(clientData, eventPtr) - ClientData clientData; /* Token for container window. */ - XEvent *eventPtr; /* ResizeRequest event. */ -{ - Container *containerPtr = (Container *) clientData; - Display *display; - XEvent event; - - if (containerPtr->embeddedPtr != NULL) { - display = Tk_Display(containerPtr->parentPtr); - event.xfocus.serial = LastKnownRequestProcessed(display); - event.xfocus.send_event = false; - event.xfocus.display = display; - event.xfocus.mode = NotifyNormal; - event.xfocus.window = containerPtr->embedded; - - if (eventPtr->type == FocusIn) { - /* - * The focus just arrived at the container. Change the X focus - * to move it to the embedded application, if there is one. - * Ignore X errors that occur during this operation (it's - * possible that the new focus window isn't mapped). - */ - - event.xfocus.detail = NotifyNonlinear; - event.xfocus.type = FocusIn; - - } else if (eventPtr->type == FocusOut) { - /* When the container gets a FocusOut event, it has to tell the embedded app - * that it has lost the focus. - */ - - event.xfocus.type = FocusOut; - event.xfocus.detail = NotifyNonlinear; - } - - Tk_QueueWindowEvent(&event, TCL_QUEUE_MARK); - } -} - -/* - *---------------------------------------------------------------------- - * - * EmbedGeometryRequest -- - * - * This procedure is invoked when an embedded application requests - * a particular size. It processes the request (which may or may - * not actually honor the request) and reflects the results back - * to the embedded application. - * - * NOTE: On the Mac, this is a stub, since we don't synthesize - * ConfigureRequest events. - * - * Results: - * None. - * - * Side effects: - * If we deny the child's size change request, a Configure event - * is synthesized to let the child know how big it ought to be. - * Events get processed while we're waiting for the geometry - * managers to do their thing. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedGeometryRequest(containerPtr, width, height) - Container *containerPtr; /* Information about the embedding. */ - int width, height; /* Size that the child has requested. */ -{ - TkWindow *winPtr = containerPtr->parentPtr; - - /* - * Forward the requested size into our geometry management hierarchy - * via the container window. We need to send a Configure event back - * to the embedded application if we decide not to honor its - * request; to make this happen, process all idle event handlers - * synchronously here (so that the geometry managers have had a - * chance to do whatever they want to do), and if the window's size - * didn't change then generate a configure event. - */ - - Tk_GeometryRequest((Tk_Window) winPtr, width, height); - while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)) { - /* Empty loop body. */ - } - if ((winPtr->changes.width != width) - || (winPtr->changes.height != height)) { - EmbedSendConfigure(containerPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * EmbedSendConfigure -- - * - * This is currently a stub. It is called to notify an - * embedded application of its current size and location. This - * procedure is called when the embedded application made a - * geometry request that we did not grant, so that the embedded - * application knows that its geometry didn't change after all. - * It is a response to ConfigureRequest events, which we do not - * currently synthesize on the Mac - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedSendConfigure(containerPtr) - Container *containerPtr; /* Information about the embedding. */ -{ -} - -/* - *---------------------------------------------------------------------- - * - * EmbedWindowDeleted -- - * - * This procedure is invoked when a window involved in embedding - * (as either the container or the embedded application) is - * destroyed. It cleans up the Container structure for the window. - * - * Results: - * None. - * - * Side effects: - * A Container structure may be freed. - * - *---------------------------------------------------------------------- - */ - -static void -EmbedWindowDeleted(winPtr) - TkWindow *winPtr; /* Tk's information about window that - * was deleted. */ -{ - Container *containerPtr, *prevPtr; - - /* - * Find the Container structure for this window. Delete the - * information about the embedded application and free the container's - * record. - */ - - prevPtr = NULL; - containerPtr = firstContainerPtr; - while (1) { - if (containerPtr->embeddedPtr == winPtr) { - - /* - * We also have to destroy our parent, to clean up the container. - * Fabricate an event to do this. - */ - - if (containerPtr->parentPtr != NULL && - containerPtr->parentPtr->flags & TK_BOTH_HALVES) { - XEvent event; - - event.xany.serial = - Tk_Display(containerPtr->parentPtr)->request; - event.xany.send_event = False; - event.xany.display = Tk_Display(containerPtr->parentPtr); - - event.xany.type = DestroyNotify; - event.xany.window = containerPtr->parent; - event.xdestroywindow.event = containerPtr->parent; - Tk_QueueWindowEvent(&event, TCL_QUEUE_HEAD); - - } - - containerPtr->embedded = None; - containerPtr->embeddedPtr = NULL; - - break; - } - if (containerPtr->parentPtr == winPtr) { - containerPtr->parentPtr = NULL; - break; - } - prevPtr = containerPtr; - containerPtr = containerPtr->nextPtr; - } - if ((containerPtr->embeddedPtr == NULL) - && (containerPtr->parentPtr == NULL)) { - if (prevPtr == NULL) { - firstContainerPtr = containerPtr->nextPtr; - } else { - prevPtr->nextPtr = containerPtr->nextPtr; - } - ckfree((char *) containerPtr); - } -} - diff --git a/mac/tkMacFont.c b/mac/tkMacFont.c deleted file mode 100644 index 61159a8..0000000 --- a/mac/tkMacFont.c +++ /dev/null @@ -1,2152 +0,0 @@ -/* - * tkMacFont.c -- - * - * Contains the Macintosh implementation of the platform-independant - * font package interface. - * - * Copyright (c) 1990-1994 The Regents of the University of California. - * Copyright (c) 1994-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacFont.c,v 1.8 2002/10/09 11:56:43 das Exp $ - */ - -#include <Windows.h> -#include <Strings.h> -#include <Fonts.h> -#include <Script.h> -#include <Resources.h> -#include <TextUtils.h> - -#include "tkMacInt.h" -#include "tkFont.h" - -/* - * For doing things with Mac strings and Fixed numbers. This probably should move - * the mac header file. - */ - -#ifndef StrLength -#define StrLength(s) (*((unsigned char *) (s))) -#endif -#ifndef StrBody -#define StrBody(s) ((char *) (s) + 1) -#endif -#define pstrcmp(s1, s2) RelString((s1), (s2), 1, 1) -#define pstrcasecmp(s1, s2) RelString((s1), (s2), 0, 1) - -#ifndef Fixed2Int -#define Fixed2Int(f) ((f) >> 16) -#define Int2Fixed(i) ((i) << 16) -#endif - -/* - * The preferred font encodings. - */ - -static CONST char *encodingList[] = { - "macRoman", "macJapan", NULL -}; - -/* - * The following structures are used to map the script/language codes of a - * font to the name that should be passed to Tcl_GetTextEncoding() to obtain - * the encoding for that font. The set of numeric constants is fixed and - * defined by Apple. - */ - -static TkStateMap scriptMap[] = { - {smRoman, "macRoman"}, - {smJapanese, "macJapan"}, - {smTradChinese, "macChinese"}, - {smKorean, "macKorean"}, - {smArabic, "macArabic"}, - {smHebrew, "macHebrew"}, - {smGreek, "macGreek"}, - {smCyrillic, "macCyrillic"}, - {smRSymbol, "macRSymbol"}, - {smDevanagari, "macDevanagari"}, - {smGurmukhi, "macGurmukhi"}, - {smGujarati, "macGujarati"}, - {smOriya, "macOriya"}, - {smBengali, "macBengali"}, - {smTamil, "macTamil"}, - {smTelugu, "macTelugu"}, - {smKannada, "macKannada"}, - {smMalayalam, "macMalayalam"}, - {smSinhalese, "macSinhalese"}, - {smBurmese, "macBurmese"}, - {smKhmer, "macKhmer"}, - {smThai, "macThailand"}, - {smLaotian, "macLaos"}, - {smGeorgian, "macGeorgia"}, - {smArmenian, "macArmenia"}, - {smSimpChinese, "macSimpChinese"}, - {smTibetan, "macTIbet"}, - {smMongolian, "macMongolia"}, - {smGeez, "macEthiopia"}, - {smEastEurRoman, "macCentEuro"}, - {smVietnamese, "macVietnam"}, - {smExtArabic, "macSindhi"}, - {NULL, NULL} -}; - -static TkStateMap romanMap[] = { - {langCroatian, "macCroatian"}, - {langSlovenian, "macCroatian"}, - {langIcelandic, "macIceland"}, - {langRomanian, "macRomania"}, - {langTurkish, "macTurkish"}, - {langGreek, "macGreek"}, - {NULL, NULL} -}; - -static TkStateMap cyrillicMap[] = { - {langUkrainian, "macUkraine"}, - {langBulgarian, "macBulgaria"}, - {NULL, NULL} -}; - -/* - * The following structure represents a font family. It is assumed that - * all screen fonts constructed from the same "font family" share certain - * properties; all screen fonts with the same "font family" point to a - * shared instance of this structure. The most important shared property - * is the character existence metrics, used to determine if a screen font - * can display a given Unicode character. - * - * Under Macintosh, a "font family" is uniquely identified by its face number. - */ - - -#define FONTMAP_SHIFT 10 - -#define FONTMAP_PAGES (1 << (sizeof(Tcl_UniChar) * 8 - FONTMAP_SHIFT)) -#define FONTMAP_BITSPERPAGE (1 << FONTMAP_SHIFT) - -typedef struct FontFamily { - struct FontFamily *nextPtr; /* Next in list of all known font families. */ - int refCount; /* How many SubFonts are referring to this - * FontFamily. When the refCount drops to - * zero, this FontFamily may be freed. */ - /* - * Key. - */ - - short faceNum; /* Unique face number key for this FontFamily. */ - - /* - * Derived properties. - */ - - Tcl_Encoding encoding; /* Encoding for this font family. */ - int isSymbolFont; /* Non-zero if this is a symbol family. */ - int isMultiByteFont; /* Non-zero if this is a multi-byte family. */ - char typeTable[256]; /* Table that identfies all lead bytes for a - * multi-byte family, used when measuring chars. - * If a byte is a lead byte, the value at the - * corresponding position in the typeTable is 1, - * otherwise 0. If this is a single-byte font, - * all entries are 0. */ - char *fontMap[FONTMAP_PAGES]; - /* Two-level sparse table used to determine - * quickly if the specified character exists. - * As characters are encountered, more pages - * in this table are dynamically added. The - * contents of each page is a bitmask - * consisting of FONTMAP_BITSPERPAGE bits, - * representing whether this font can be used - * to display the given character at the - * corresponding bit position. The high bits - * of the character are used to pick which - * page of the table is used. */ -} FontFamily; - -/* - * The following structure encapsulates an individual screen font. A font - * object is made up of however many SubFonts are necessary to display a - * stream of multilingual characters. - */ - -typedef struct SubFont { - char **fontMap; /* Pointer to font map from the FontFamily, - * cached here to save a dereference. */ - FontFamily *familyPtr; /* The FontFamily for this SubFont. */ -} SubFont; - -/* - * The following structure represents Macintosh's implementation of a font - * object. - */ - -#define SUBFONT_SPACE 3 - -typedef struct MacFont { - TkFont font; /* Stuff used by generic font package. Must - * be first in structure. */ - SubFont staticSubFonts[SUBFONT_SPACE]; - /* Builtin space for a limited number of - * SubFonts. */ - int numSubFonts; /* Length of following array. */ - SubFont *subFontArray; /* Array of SubFonts that have been loaded - * in order to draw/measure all the characters - * encountered by this font so far. All fonts - * start off with one SubFont initialized by - * AllocFont() from the original set of font - * attributes. Usually points to - * staticSubFonts, but may point to malloced - * space if there are lots of SubFonts. */ - - short size; /* Font size in pixels, constructed from - * font attributes. */ - short style; /* Style bits, constructed from font - * attributes. */ -} MacFont; - -/* - * The following structure is used to map between the UTF-8 name for a font and - * the name that the Macintosh uses to refer to the font, in order to determine - * if a font exists. The Macintosh names for fonts are stored in the encoding - * of the font itself. - */ - -typedef struct FontNameMap { - Tk_Uid utfName; /* The name of the font in UTF-8. */ - StringPtr nativeName; /* The name of the font in the font's encoding. */ - short faceNum; /* Unique face number for this font. */ -} FontNameMap; - -/* - * The list of font families that are currently loaded. As screen fonts - * are loaded, this list grows to hold information about what characters - * exist in each font family. - */ - -static FontFamily *fontFamilyList = NULL; - -/* - * Information cached about the system at startup time. - */ - -static FontNameMap *gFontNameMap = NULL; -static GWorldPtr gWorld = NULL; - -/* - * Procedures used only in this file. - */ - -static FontFamily * AllocFontFamily(CONST MacFont *fontPtr, int family); -static SubFont * CanUseFallback(MacFont *fontPtr, - CONST char *fallbackName, int ch); -static SubFont * CanUseFallbackWithAliases(MacFont *fontPtr, - CONST char *faceName, int ch, Tcl_DString *nameTriedPtr); -static SubFont * FindSubFontForChar(MacFont *fontPtr, int ch); -static void FontMapInsert(SubFont *subFontPtr, int ch); -static void FontMapLoadPage(SubFont *subFontPtr, int row); -static int FontMapLookup(SubFont *subFontPtr, int ch); -static void FreeFontFamily(FontFamily *familyPtr); -static void InitFont(Tk_Window tkwin, int family, int size, - int style, MacFont *fontPtr); -static void InitSubFont(CONST MacFont *fontPtr, int family, - SubFont *subFontPtr); -static void MultiFontDrawText(MacFont *fontPtr, - CONST char *source, int numBytes, int x, int y); -static void ReleaseFont(MacFont *fontPtr); -static void ReleaseSubFont(SubFont *subFontPtr); -static int SeenName(CONST char *name, Tcl_DString *dsPtr); - -static CONST char * BreakLine(FontFamily *familyPtr, int flags, - CONST char *source, int numBytes, int *widthPtr); -static int GetFamilyNum(CONST char *faceName, short *familyPtr); -static int GetFamilyOrAliasNum(CONST char *faceName, - short *familyPtr); -static Tcl_Encoding GetFontEncoding(int faceNum, int allowSymbol, - int *isSymbolPtr); -static Tk_Uid GetUtfFaceName(StringPtr faceNameStr); - - -/* - *------------------------------------------------------------------------- - * - * TkpFontPkgInit -- - * - * This procedure is called when an application is created. It - * initializes all the structures that are used by the - * platform-dependant code on a per application basis. - * - * Results: - * None. - * - * Side effects: - * See comments below. - * - *------------------------------------------------------------------------- - */ - -void -TkpFontPkgInit(mainPtr) - TkMainInfo *mainPtr; /* The application being created. */ -{ - MenuHandle fontMenu; - FontNameMap *tmpFontNameMap, *newFontNameMap, *mapPtr; - int i, j, numFonts, fontMapOffset, isSymbol; - Str255 nativeName; - Tcl_DString ds; - Tcl_Encoding encoding; - Tcl_Encoding *encodings; - - if (gWorld == NULL) { - /* - * Do the following one time only. - */ - - Rect rect = {0, 0, 1, 1}; - - SetFractEnable(0); - - /* - * Used for saving and restoring state while drawing and measuring. - */ - - if (NewGWorld(&gWorld, 0, &rect, NULL, NULL, 0) != noErr) { - panic("TkpFontPkgInit: NewGWorld failed"); - } - - /* - * The name of each font is stored in the encoding of that font. - * How would we translate a name from UTF-8 into the native encoding - * of the font unless we knew the encoding of that font? We can't. - * So, precompute the UTF-8 and native names of all fonts on the - * system. The when the user asks for font by its UTF-8 name, we - * lookup the name in that table and really ask for the font by its - * native name. Any unknown UTF-8 names will be mapped to the system - * font. - */ - - fontMenu = NewMenu('FT', "\px"); - AppendResMenu(fontMenu, 'FONT'); - - numFonts = CountMItems(fontMenu); - tmpFontNameMap = (FontNameMap *) ckalloc(sizeof(FontNameMap) * numFonts); - encodings = (Tcl_Encoding *) ckalloc(sizeof(Tcl_Encoding) * numFonts); - - mapPtr = tmpFontNameMap; - for (i = 0; i < numFonts; i++) { - GetMenuItemText(fontMenu, i + 1, nativeName); - GetFNum(nativeName, &mapPtr->faceNum); - encodings[i] = GetFontEncoding(mapPtr->faceNum, 0, &isSymbol); - Tcl_ExternalToUtfDString(encodings[i], StrBody(nativeName), - StrLength(nativeName), &ds); - mapPtr->utfName = Tk_GetUid(Tcl_DStringValue(&ds)); - mapPtr->nativeName = (StringPtr) ckalloc(StrLength(nativeName) + 1); - memcpy(mapPtr->nativeName, nativeName, StrLength(nativeName) + 1); - Tcl_DStringFree(&ds); - mapPtr++; - } - DisposeMenu(fontMenu); - - /* - * Reorder FontNameMap so fonts with the preferred encodings are at - * the front of the list. The relative order of fonts that all have - * the same encoding is preserved. Fonts with unknown encodings get - * stuck at the end. - */ - - newFontNameMap = (FontNameMap *) ckalloc(sizeof(FontNameMap) * (numFonts + 1)); - fontMapOffset = 0; - for (i = 0; encodingList[i] != NULL; i++) { - encoding = Tcl_GetEncoding(NULL, encodingList[i]); - if (encoding == NULL) { - continue; - } - for (j = 0; j < numFonts; j++) { - if (encodings[j] == encoding) { - newFontNameMap[fontMapOffset] = tmpFontNameMap[j]; - fontMapOffset++; - Tcl_FreeEncoding(encodings[j]); - tmpFontNameMap[j].utfName = NULL; - } - } - Tcl_FreeEncoding(encoding); - } - for (i = 0; i < numFonts; i++) { - if (tmpFontNameMap[i].utfName != NULL) { - newFontNameMap[fontMapOffset] = tmpFontNameMap[i]; - fontMapOffset++; - Tcl_FreeEncoding(encodings[i]); - } - } - if (fontMapOffset != numFonts) { - panic("TkpFontPkgInit: unexpected number of fonts"); - } - - mapPtr = &newFontNameMap[numFonts]; - mapPtr->utfName = NULL; - mapPtr->nativeName = NULL; - mapPtr->faceNum = 0; - - ckfree((char *) tmpFontNameMap); - ckfree((char *) encodings); - - gFontNameMap = newFontNameMap; - } -} - -/* - *--------------------------------------------------------------------------- - * - * TkpGetNativeFont -- - * - * Map a platform-specific native font name to a TkFont. - * - * Results: - * The return value is a pointer to a TkFont that represents the - * native font. If a native font by the given name could not be - * found, the return value is NULL. - * - * Every call to this procedure returns a new TkFont structure, - * even if the name has already been seen before. The caller should - * call TkpDeleteFont() when the font is no longer needed. - * - * The caller is responsible for initializing the memory associated - * with the generic TkFont when this function returns and releasing - * the contents of the generics TkFont before calling TkpDeleteFont(). - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -TkFont * -TkpGetNativeFont( - Tk_Window tkwin, /* For display where font will be used. */ - CONST char *name) /* Platform-specific font name. */ -{ - short family; - MacFont *fontPtr; - - if (strcmp(name, "system") == 0) { - family = GetSysFont(); - } else if (strcmp(name, "application") == 0) { - family = GetAppFont(); - } else { - return NULL; - } - - fontPtr = (MacFont *) ckalloc(sizeof(MacFont)); - InitFont(tkwin, family, 0, 0, fontPtr); - - return (TkFont *) fontPtr; -} - -/* - *--------------------------------------------------------------------------- - * - * TkpGetFontFromAttributes -- - * - * Given a desired set of attributes for a font, find a font with - * the closest matching attributes. - * - * Results: - * The return value is a pointer to a TkFont that represents the - * font with the desired attributes. If a font with the desired - * attributes could not be constructed, some other font will be - * substituted automatically. - * - * Every call to this procedure returns a new TkFont structure, - * even if the specified attributes have already been seen before. - * The caller should call TkpDeleteFont() to free the platform- - * specific data when the font is no longer needed. - * - * The caller is responsible for initializing the memory associated - * with the generic TkFont when this function returns and releasing - * the contents of the generic TkFont before calling TkpDeleteFont(). - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ -TkFont * -TkpGetFontFromAttributes( - TkFont *tkFontPtr, /* If non-NULL, store the information in - * this existing TkFont structure, rather than - * allocating a new structure to hold the - * font; the existing contents of the font - * will be released. If NULL, a new TkFont - * structure is allocated. */ - Tk_Window tkwin, /* For display where font will be used. */ - CONST TkFontAttributes *faPtr) - /* Set of attributes to match. */ -{ - short faceNum, style; - int i, j; - CONST char *faceName; - char *fallback; - char ***fallbacks; - MacFont *fontPtr; - - /* - * Algorithm to get the closest font to the one requested. - * - * try fontname - * try all aliases for fontname - * foreach fallback for fontname - * try the fallback - * try all aliases for the fallback - */ - - faceNum = 0; - faceName = faPtr->family; - if (faceName != NULL) { - if (GetFamilyOrAliasNum(faceName, &faceNum) != 0) { - goto found; - } - fallbacks = TkFontGetFallbacks(); - for (i = 0; fallbacks[i] != NULL; i++) { - for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) { - if (strcasecmp(faceName, fallback) == 0) { - for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) { - if (GetFamilyOrAliasNum(fallback, &faceNum)) { - goto found; - } - } - } - break; - } - } - } - - found: - style = 0; - if (faPtr->weight != TK_FW_NORMAL) { - style |= bold; - } - if (faPtr->slant != TK_FS_ROMAN) { - style |= italic; - } - if (faPtr->underline) { - style |= underline; - } - if (tkFontPtr == NULL) { - fontPtr = (MacFont *) ckalloc(sizeof(MacFont)); - } else { - fontPtr = (MacFont *) tkFontPtr; - ReleaseFont(fontPtr); - } - InitFont(tkwin, faceNum, faPtr->size, style, fontPtr); - - return (TkFont *) fontPtr; -} - -/* - *--------------------------------------------------------------------------- - * - * TkpDeleteFont -- - * - * Called to release a font allocated by TkpGetNativeFont() or - * TkpGetFontFromAttributes(). The caller should have already - * released the fields of the TkFont that are used exclusively by - * the generic TkFont code. - * - * Results: - * None. - * - * Side effects: - * TkFont is deallocated. - * - *--------------------------------------------------------------------------- - */ - -void -TkpDeleteFont( - TkFont *tkFontPtr) /* Token of font to be deleted. */ -{ - MacFont *fontPtr; - - fontPtr = (MacFont *) tkFontPtr; - ReleaseFont(fontPtr); -} - -/* - *--------------------------------------------------------------------------- - * - * TkpGetFontFamilies -- - * - * Return information about the font families that are available - * on the display of the given window. - * - * Results: - * Modifies interp's result object to hold a list of all the available - * font families. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -void -TkpGetFontFamilies( - Tcl_Interp *interp, /* Interp to hold result. */ - Tk_Window tkwin) /* For display to query. */ -{ - FontNameMap *mapPtr; - Tcl_Obj *resultPtr, *strPtr; - - resultPtr = Tcl_GetObjResult(interp); - for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { - strPtr = Tcl_NewStringObj(mapPtr->utfName, -1); - Tcl_ListObjAppendElement(NULL, resultPtr, strPtr); - } -} - -/* - *------------------------------------------------------------------------- - * - * TkpGetSubFonts -- - * - * A function used by the testing package for querying the actual - * screen fonts that make up a font object. - * - * Results: - * Modifies interp's result object to hold a list containing the - * names of the screen fonts that make up the given font object. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------- - */ - -void -TkpGetSubFonts(interp, tkfont) - Tcl_Interp *interp; /* Interp to hold result. */ - Tk_Font tkfont; /* Font object to query. */ -{ - int i; - Tcl_Obj *resultPtr, *strPtr; - MacFont *fontPtr; - FontFamily *familyPtr; - Str255 nativeName; - - resultPtr = Tcl_GetObjResult(interp); - fontPtr = (MacFont *) tkfont; - for (i = 0; i < fontPtr->numSubFonts; i++) { - familyPtr = fontPtr->subFontArray[i].familyPtr; - GetFontName(familyPtr->faceNum, nativeName); - strPtr = Tcl_NewStringObj(GetUtfFaceName(nativeName), -1); - Tcl_ListObjAppendElement(NULL, resultPtr, strPtr); - } -} - -/* - *--------------------------------------------------------------------------- - * - * Tk_MeasureChars -- - * - * Determine the number of characters from the string that will fit - * in the given horizontal span. The measurement is done under the - * assumption that Tk_DrawChars() will be used to actually display - * the characters. - * - * Results: - * The return value is the number of bytes from source that - * fit into the span that extends from 0 to maxLength. *lengthPtr is - * filled with the x-coordinate of the right edge of the last - * character that did fit. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -int -Tk_MeasureChars( - Tk_Font tkfont, /* Font in which characters will be drawn. */ - CONST char *source, /* UTF-8 string to be displayed. Need not be - * '\0' terminated. */ - int numBytes, /* Maximum number of bytes to consider - * from source string. */ - int maxLength, /* If >= 0, maxLength specifies the longest - * permissible line length; don't consider any - * character that would cross this - * x-position. If < 0, then line length is - * unbounded and the flags argument is - * ignored. */ - int flags, /* Various flag bits OR-ed together: - * TK_PARTIAL_OK means include the last char - * which only partially fit on this line. - * TK_WHOLE_WORDS means stop on a word - * boundary, if possible. - * TK_AT_LEAST_ONE means return at least one - * character even if no characters fit. */ - int *lengthPtr) /* Filled with x-location just after the - * terminating character. */ -{ - MacFont *fontPtr; - FontFamily *lastFamilyPtr; - CGrafPtr saveWorld; - GDHandle saveDevice; - int curX, curByte; - - /* - * According to "Inside Macintosh: Text", the Macintosh may - * automatically substitute - * ligatures or context-sensitive presentation forms when - * measuring/displaying text within a font run. We cannot safely - * measure individual characters and add up the widths w/o errors. - * However, if we convert a range of text from UTF-8 to, say, - * Shift-JIS, and get the offset into the Shift-JIS string as to - * where a word or line break would occur, then can we map that - * number back to UTF-8? - */ - - fontPtr = (MacFont *) tkfont; - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(gWorld, NULL); - - TextSize(fontPtr->size); - TextFace(fontPtr->style); - - lastFamilyPtr = fontPtr->subFontArray[0].familyPtr; - - if (numBytes == 0) { - curX = 0; - curByte = 0; - } else if (maxLength < 0) { - CONST char *p, *end, *next; - Tcl_UniChar ch; - FontFamily *thisFamilyPtr; - Tcl_DString runString; - - /* - * A three step process: - * 1. Find a contiguous range of characters that can all be - * represented by a single screen font. - * 2. Convert those chars to the encoding of that font. - * 3. Measure converted chars. - */ - - curX = 0; - end = source + numBytes; - for (p = source; p < end; ) { - next = p + Tcl_UtfToUniChar(p, &ch); - thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; - if (thisFamilyPtr != lastFamilyPtr) { - TextFont(lastFamilyPtr->faceNum); - Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, - p - source, &runString); - curX += TextWidth(Tcl_DStringValue(&runString), 0, - Tcl_DStringLength(&runString)); - Tcl_DStringFree(&runString); - lastFamilyPtr = thisFamilyPtr; - source = p; - } - p = next; - } - TextFont(lastFamilyPtr->faceNum); - Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, p - source, - &runString); - curX += TextWidth(Tcl_DStringValue(&runString), 0, - Tcl_DStringLength(&runString)); - Tcl_DStringFree(&runString); - curByte = numBytes; - } else { - CONST char *p, *end, *next, *sourceOrig; - int widthLeft; - FontFamily *thisFamilyPtr; - Tcl_UniChar ch; - CONST char *rest; - - /* - * How many chars will fit in the space allotted? - */ - - if (maxLength > 32767) { - maxLength = 32767; - } - - widthLeft = maxLength; - sourceOrig = source; - end = source + numBytes; - for (p = source; p < end; p = next) { - next = p + Tcl_UtfToUniChar(p, &ch); - thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; - if (thisFamilyPtr != lastFamilyPtr) { - if (p > source) { - rest = BreakLine(lastFamilyPtr, flags, source, - p - source, &widthLeft); - flags &= ~TK_AT_LEAST_ONE; - if (rest != NULL) { - p = source; - break; - } - } - lastFamilyPtr = thisFamilyPtr; - source = p; - } - } - - if (p > source) { - rest = BreakLine(lastFamilyPtr, flags, source, p - source, - &widthLeft); - } - - if (rest == NULL) { - curByte = numBytes; - } else { - curByte = rest - sourceOrig; - } - curX = maxLength - widthLeft; - } - - SetGWorld(saveWorld, saveDevice); - - *lengthPtr = curX; - return curByte; -} - -/* - *--------------------------------------------------------------------------- - * - * BreakLine -- - * - * Determine where the given line of text should be broken so that it - * fits in the specified range. Before calling this function, the - * font values and graphics port must be set. - * - * Results: - * The return value is NULL if the specified range is larger that the - * space the text needs, and *widthLeftPtr is filled with how much - * space is left in the range after measuring the whole text buffer. - * Otherwise, the return value is a pointer into the text buffer that - * indicates where the line should be broken (up to, but not including - * that character), and *widthLeftPtr is filled with how much space is - * left in the range after measuring up to that character. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -static CONST char * -BreakLine( - FontFamily *familyPtr, /* FontFamily that describes the font values - * that are already selected into the graphics - * port. */ - int flags, /* Various flag bits OR-ed together: - * TK_PARTIAL_OK means include the last char - * which only partially fit on this line. - * TK_WHOLE_WORDS means stop on a word - * boundary, if possible. - * TK_AT_LEAST_ONE means return at least one - * character even if no characters fit. */ - CONST char *source, /* UTF-8 string to be displayed. Need not be - * '\0' terminated. */ - int numBytes, /* Maximum number of bytes to consider - * from source string. */ - int *widthLeftPtr) /* On input, specifies size of range into - * which characters from source buffer should - * be fit. On output, filled with how much - * space is left after fitting as many - * characters as possible into the range. - * Result may be negative if TK_AT_LEAST_ONE - * was specified in the flags argument. */ -{ - Fixed pixelWidth, widthLeft; - StyledLineBreakCode breakCode; - Tcl_DString runString; - long textOffset; - Boolean leadingEdge; - Point point; - int charOffset, thisCharWasDoubleByte; - char *p, *end, *typeTable; - - TextFont(familyPtr->faceNum); - Tcl_UtfToExternalDString(familyPtr->encoding, source, numBytes, - &runString); - pixelWidth = Int2Fixed(*widthLeftPtr) + 1; - if (flags & TK_WHOLE_WORDS) { - textOffset = (flags & TK_AT_LEAST_ONE); - widthLeft = pixelWidth; - breakCode = StyledLineBreak(Tcl_DStringValue(&runString), - Tcl_DStringLength(&runString), 0, Tcl_DStringLength(&runString), - 0, &widthLeft, &textOffset); - if (breakCode != smBreakOverflow) { - /* - * StyledLineBreak includes all the space characters at the end of - * line that we want to suppress. - */ - - textOffset = VisibleLength(Tcl_DStringValue(&runString), textOffset); - goto getoffset; - } - } else { - point.v = 1; - point.h = 1; - textOffset = PixelToChar(Tcl_DStringValue(&runString), - Tcl_DStringLength(&runString), 0, pixelWidth, &leadingEdge, - &widthLeft, smOnlyStyleRun, point, point); - if (Fixed2Int(widthLeft) < 0) { - goto getoffset; - } - } - *widthLeftPtr = Fixed2Int(widthLeft); - Tcl_DStringFree(&runString); - return NULL; - - /* - * The conversion routine that converts UTF-8 to the target encoding - * must map one UTF-8 character to exactly one encoding-specific - * character, so that the following algorithm works: - * - * 1. Get byte offset of where line should be broken. - * 2. Get char offset corresponding to that byte offset. - * 3. Map that char offset to byte offset in UTF-8 string. - */ - - getoffset: - thisCharWasDoubleByte = 0; - if (familyPtr->isMultiByteFont == 0) { - charOffset = textOffset; - } else { - charOffset = 0; - typeTable = familyPtr->typeTable; - - p = Tcl_DStringValue(&runString); - end = p + textOffset; - thisCharWasDoubleByte = typeTable[*((unsigned char *) p)]; - for ( ; p < end; p++) { - thisCharWasDoubleByte = typeTable[*((unsigned char *) p)]; - p += thisCharWasDoubleByte; - charOffset++; - } - } - - if ((flags & TK_WHOLE_WORDS) == 0) { - if ((flags & TK_PARTIAL_OK) && (leadingEdge != 0)) { - textOffset += thisCharWasDoubleByte; - textOffset++; - charOffset++; - } else if (((flags & TK_PARTIAL_OK) == 0) && (leadingEdge == 0)) { - textOffset -= thisCharWasDoubleByte; - textOffset--; - charOffset--; - } - } - if ((textOffset == 0) && (Tcl_DStringLength(&runString) > 0) - && (flags & TK_AT_LEAST_ONE)) { - p = Tcl_DStringValue(&runString); - textOffset += familyPtr->typeTable[*((unsigned char *) p)]; - textOffset++; - charOffset++; - } - *widthLeftPtr = Fixed2Int(pixelWidth) - - TextWidth(Tcl_DStringValue(&runString), 0, textOffset); - Tcl_DStringFree(&runString); - return Tcl_UtfAtIndex(source, charOffset); -} - -/* - *--------------------------------------------------------------------------- - * - * Tk_DrawChars -- - * - * Draw a string of characters on the screen. - * - * Results: - * None. - * - * Side effects: - * Information gets drawn on the screen. - * - *--------------------------------------------------------------------------- - */ - -void -Tk_DrawChars( - Display *display, /* Display on which to draw. */ - Drawable drawable, /* Window or pixmap in which to draw. */ - GC gc, /* Graphics context for drawing characters. */ - Tk_Font tkfont, /* Font in which characters will be drawn; - * must be the same as font used in GC. */ - CONST char *source, /* UTF-8 string to be displayed. Need not be - * '\0' terminated. All Tk meta-characters - * (tabs, control characters, and newlines) - * should be stripped out of the string that - * is passed to this function. If they are - * not stripped out, they will be displayed as - * regular printing characters. */ - int numBytes, /* Number of bytes in string. */ - int x, int y) /* Coordinates at which to place origin of - * string when drawing. */ -{ - MacFont *fontPtr; - MacDrawable *macWin; - RGBColor macColor, origColor; - GWorldPtr destPort; - CGrafPtr saveWorld; - GDHandle saveDevice; - short txFont, txFace, txSize; - BitMapPtr stippleMap; - - fontPtr = (MacFont *) tkfont; - macWin = (MacDrawable *) drawable; - - destPort = TkMacGetDrawablePort(drawable); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(drawable); - TkMacSetUpGraphicsPort(gc); - - txFont = tcl_macQdPtr->thePort->txFont; - txFace = tcl_macQdPtr->thePort->txFace; - txSize = tcl_macQdPtr->thePort->txSize; - GetForeColor(&origColor); - - if ((gc->fill_style == FillStippled - || gc->fill_style == FillOpaqueStippled) - && gc->stipple != None) { - Pixmap pixmap; - GWorldPtr bufferPort; - - stippleMap = TkMacMakeStippleMap(drawable, gc->stipple); - - pixmap = Tk_GetPixmap(display, drawable, - stippleMap->bounds.right, stippleMap->bounds.bottom, 0); - - bufferPort = TkMacGetDrawablePort(pixmap); - SetGWorld(bufferPort, NULL); - - if (TkSetMacColor(gc->foreground, &macColor) == true) { - RGBForeColor(&macColor); - } - ShowPen(); - FillRect(&stippleMap->bounds, &tcl_macQdPtr->white); - MultiFontDrawText(fontPtr, source, numBytes, 0, 0); - - SetGWorld(destPort, NULL); - CopyDeepMask(&((GrafPtr) bufferPort)->portBits, stippleMap, - &((GrafPtr) destPort)->portBits, &stippleMap->bounds, - &stippleMap->bounds, &((GrafPtr) destPort)->portRect, - srcOr, NULL); - - /* TODO: this doesn't work quite right - it does a blend. you can't - * draw white text when you have a stipple. - */ - - Tk_FreePixmap(display, pixmap); - ckfree(stippleMap->baseAddr); - ckfree((char *)stippleMap); - } else { - if (TkSetMacColor(gc->foreground, &macColor) == true) { - RGBForeColor(&macColor); - } - ShowPen(); - MultiFontDrawText(fontPtr, source, numBytes, macWin->xOff + x, - macWin->yOff + y); - } - - TextFont(txFont); - TextSize(txSize); - TextFace(txFace); - RGBForeColor(&origColor); - SetGWorld(saveWorld, saveDevice); -} - -/* - *------------------------------------------------------------------------- - * - * MultiFontDrawText -- - * - * Helper function for Tk_DrawChars. Draws characters, using the - * various screen fonts in fontPtr to draw multilingual characters. - * Note: No bidirectional support. - * - * Results: - * None. - * - * Side effects: - * Information gets drawn on the screen. - * Contents of fontPtr may be modified if more subfonts were loaded - * in order to draw all the multilingual characters in the given - * string. - * - *------------------------------------------------------------------------- - */ - -static void -MultiFontDrawText( - MacFont *fontPtr, /* Contains set of fonts to use when drawing - * following string. */ - CONST char *source, /* Potentially multilingual UTF-8 string. */ - int numBytes, /* Length of string in bytes. */ - int x, int y) /* Coordinates at which to place origin * - * of string when drawing. */ -{ - FontFamily *lastFamilyPtr, *thisFamilyPtr; - Tcl_DString runString; - CONST char *p, *end, *next; - Tcl_UniChar ch; - - TextSize(fontPtr->size); - TextFace(fontPtr->style); - - lastFamilyPtr = fontPtr->subFontArray[0].familyPtr; - - end = source + numBytes; - for (p = source; p < end; ) { - next = p + Tcl_UtfToUniChar(p, &ch); - thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; - if (thisFamilyPtr != lastFamilyPtr) { - if (p > source) { - TextFont(lastFamilyPtr->faceNum); - Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, - p - source, &runString); - MoveTo((short) x, (short) y); - DrawText(Tcl_DStringValue(&runString), 0, - Tcl_DStringLength(&runString)); - x += TextWidth(Tcl_DStringValue(&runString), 0, - Tcl_DStringLength(&runString)); - Tcl_DStringFree(&runString); - source = p; - } - lastFamilyPtr = thisFamilyPtr; - } - p = next; - } - if (p > source) { - TextFont(thisFamilyPtr->faceNum); - Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, - p - source, &runString); - MoveTo((short) x, (short) y); - DrawText(Tcl_DStringValue(&runString), 0, - Tcl_DStringLength(&runString)); - Tcl_DStringFree(&runString); - } -} - -/* - *--------------------------------------------------------------------------- - * - * TkMacIsCharacterMissing -- - * - * Given a tkFont and a character determines whether the character has - * a glyph defined in the font or not. Note that this is potentially - * not compatible with Mac OS 8 as it looks at the font handle - * structure directly. Looks into the character array of the font - * handle to determine whether the glyph is defined or not. - * - * Results: - * Returns a 1 if the character is missing, a 0 if it is not. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -int -TkMacIsCharacterMissing( - Tk_Font tkfont, /* The font we are looking in. */ - unsigned int searchChar) /* The character we are looking for. */ -{ - MacFont *fontPtr = (MacFont *) tkfont; - FMInput fm; - FontRec **fontRecHandle; - - fm.family = fontPtr->subFontArray[0].familyPtr->faceNum; - fm.size = fontPtr->size; - fm.face = fontPtr->style; - fm.needBits = 0; - fm.device = 0; - fm.numer.h = fm.numer.v = fm.denom.h = fm.denom.v = 1; - -#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) - fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontResult; -#else - fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontHandle; -#endif - return *(short *) ((long) &(*fontRecHandle)->owTLoc - + ((long)((*fontRecHandle)->owTLoc + searchChar - - (*fontRecHandle)->firstChar) * sizeof(short))) == -1; -} - -/* - *--------------------------------------------------------------------------- - * - * InitFont -- - * - * Helper for TkpGetNativeFont() and TkpGetFontFromAttributes(). - * Initializes the memory for a MacFont that wraps the platform-specific - * data. - * - * The caller is responsible for initializing the fields of the - * TkFont that are used exclusively by the generic TkFont code, and - * for releasing those fields before calling TkpDeleteFont(). - * - * Results: - * Fills the MacFont structure. - * - * Side effects: - * Memory allocated. - * - *--------------------------------------------------------------------------- - */ - -static void -InitFont( - Tk_Window tkwin, /* For display where font will be used. */ - int faceNum, /* Macintosh font number. */ - int size, /* Point size for Macintosh font. */ - int style, /* Macintosh style bits. */ - MacFont *fontPtr) /* Filled with information constructed from - * the above arguments. */ -{ - Str255 nativeName; - FontInfo fi; - TkFontAttributes *faPtr; - TkFontMetrics *fmPtr; - CGrafPtr saveWorld; - GDHandle saveDevice; - short pixels; - - if (size == 0) { - size = -GetDefFontSize(); - } - pixels = (short) TkFontGetPixels(tkwin, size); - - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(gWorld, NULL); - TextFont(faceNum); - TextSize(pixels); - TextFace(style); - - GetFontInfo(&fi); - GetFontName(faceNum, nativeName); - - fontPtr->font.fid = (Font) fontPtr; - - faPtr = &fontPtr->font.fa; - faPtr->family = GetUtfFaceName(nativeName); - faPtr->size = TkFontGetPoints(tkwin, size); - faPtr->weight = (style & bold) ? TK_FW_BOLD : TK_FW_NORMAL; - faPtr->slant = (style & italic) ? TK_FS_ITALIC : TK_FS_ROMAN; - faPtr->underline = ((style & underline) != 0); - faPtr->overstrike = 0; - - fmPtr = &fontPtr->font.fm; - fmPtr->ascent = fi.ascent; - fmPtr->descent = fi.descent; - fmPtr->maxWidth = fi.widMax; - fmPtr->fixed = (CharWidth('i') == CharWidth('w')); - - fontPtr->size = pixels; - fontPtr->style = (short) style; - - fontPtr->numSubFonts = 1; - fontPtr->subFontArray = fontPtr->staticSubFonts; - InitSubFont(fontPtr, faceNum, &fontPtr->subFontArray[0]); - - SetGWorld(saveWorld, saveDevice); -} - -/* - *------------------------------------------------------------------------- - * - * ReleaseFont -- - * - * Called to release the Macintosh-specific contents of a TkFont. - * The caller is responsible for freeing the memory used by the - * font itself. - * - * Results: - * None. - * - * Side effects: - * Memory is freed. - * - *--------------------------------------------------------------------------- - */ - -static void -ReleaseFont( - MacFont *fontPtr) /* The font to delete. */ -{ - int i; - - for (i = 0; i < fontPtr->numSubFonts; i++) { - ReleaseSubFont(&fontPtr->subFontArray[i]); - } - if (fontPtr->subFontArray != fontPtr->staticSubFonts) { - ckfree((char *) fontPtr->subFontArray); - } -} - -/* - *------------------------------------------------------------------------- - * - * InitSubFont -- - * - * Wrap a screen font and load the FontFamily that represents - * it. Used to prepare a SubFont so that characters can be mapped - * from UTF-8 to the charset of the font. - * - * Results: - * The subFontPtr is filled with information about the font. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------- - */ - -static void -InitSubFont( - CONST MacFont *fontPtr, /* Font object in which the SubFont will be - * used. */ - int faceNum, /* The font number. */ - SubFont *subFontPtr) /* Filled with SubFont constructed from - * above attributes. */ -{ - subFontPtr->familyPtr = AllocFontFamily(fontPtr, faceNum); - subFontPtr->fontMap = subFontPtr->familyPtr->fontMap; -} - -/* - *------------------------------------------------------------------------- - * - * ReleaseSubFont -- - * - * Called to release the contents of a SubFont. The caller is - * responsible for freeing the memory used by the SubFont itself. - * - * Results: - * None. - * - * Side effects: - * Memory and resources are freed. - * - *--------------------------------------------------------------------------- - */ - -static void -ReleaseSubFont( - SubFont *subFontPtr) /* The SubFont to delete. */ -{ - FreeFontFamily(subFontPtr->familyPtr); -} - -/* - *------------------------------------------------------------------------- - * - * AllocFontFamily -- - * - * Find the FontFamily structure associated with the given font - * family. The information should be stored by the caller in a - * SubFont and used when determining if that SubFont supports a - * character. - * - * Results: - * A pointer to a FontFamily. The reference count in the FontFamily - * is automatically incremented. When the SubFont is released, the - * reference count is decremented. When no SubFont is using this - * FontFamily, it may be deleted. - * - * Side effects: - * A new FontFamily structure will be allocated if this font family - * has not been seen. - * - *------------------------------------------------------------------------- - */ - -static FontFamily * -AllocFontFamily( - CONST MacFont *fontPtr, /* Font object in which the FontFamily will - * be used. */ - int faceNum) /* The font number. */ -{ - FontFamily *familyPtr; - int i; - - familyPtr = fontFamilyList; - for (; familyPtr != NULL; familyPtr = familyPtr->nextPtr) { - if (familyPtr->faceNum == faceNum) { - familyPtr->refCount++; - return familyPtr; - } - } - - familyPtr = (FontFamily *) ckalloc(sizeof(FontFamily)); - memset(familyPtr, 0, sizeof(FontFamily)); - familyPtr->nextPtr = fontFamilyList; - fontFamilyList = familyPtr; - - /* - * Set key for this FontFamily. - */ - - familyPtr->faceNum = faceNum; - - /* - * An initial refCount of 2 means that FontFamily information will - * persist even when the SubFont that loaded the FontFamily is released. - * Change it to 1 to cause FontFamilies to be unloaded when not in use. - */ - - familyPtr->refCount = 2; - familyPtr->encoding = GetFontEncoding(faceNum, 1, &familyPtr->isSymbolFont); - familyPtr->isMultiByteFont = 0; - FillParseTable(familyPtr->typeTable, FontToScript(faceNum)); - for (i = 0; i < 256; i++) { - if (familyPtr->typeTable[i] != 0) { - familyPtr->isMultiByteFont = 1; - break; - } - } - return familyPtr; -} - -/* - *------------------------------------------------------------------------- - * - * FreeFontFamily -- - * - * Called to free a FontFamily when the SubFont is finished using it. - * Frees the contents of the FontFamily and the memory used by the - * FontFamily itself. - * - * Results: - * None. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------- - */ - -static void -FreeFontFamily( - FontFamily *familyPtr) /* The FontFamily to delete. */ -{ - FontFamily **familyPtrPtr; - int i; - - if (familyPtr == NULL) { - return; - } - familyPtr->refCount--; - if (familyPtr->refCount > 0) { - return; - } - Tcl_FreeEncoding(familyPtr->encoding); - for (i = 0; i < FONTMAP_PAGES; i++) { - if (familyPtr->fontMap[i] != NULL) { - ckfree((char *) familyPtr->fontMap[i]); - } - } - - /* - * Delete from list. - */ - - for (familyPtrPtr = &fontFamilyList; ; ) { - if (*familyPtrPtr == familyPtr) { - *familyPtrPtr = familyPtr->nextPtr; - break; - } - familyPtrPtr = &(*familyPtrPtr)->nextPtr; - } - - ckfree((char *) familyPtr); -} - -/* - *------------------------------------------------------------------------- - * - * FindSubFontForChar -- - * - * Determine which physical screen font is necessary to use to - * display the given character. If the font object does not have - * a screen font that can display the character, another screen font - * may be loaded into the font object, following a set of preferred - * fallback rules. - * - * Results: - * The return value is the SubFont to use to display the given - * character. - * - * Side effects: - * The contents of fontPtr are modified to cache the results - * of the lookup and remember any SubFonts that were dynamically - * loaded. - * - *------------------------------------------------------------------------- - */ - -static SubFont * -FindSubFontForChar( - MacFont *fontPtr, /* The font object with which the character - * will be displayed. */ - int ch) /* The Unicode character to be displayed. */ -{ - int i, j, k; - CONST char *fallbackName; - char **aliases; - SubFont *subFontPtr; - FontNameMap *mapPtr; - Tcl_DString faceNames; - char ***fontFallbacks; - char **anyFallbacks; - - if (FontMapLookup(&fontPtr->subFontArray[0], ch)) { - return &fontPtr->subFontArray[0]; - } - - for (i = 1; i < fontPtr->numSubFonts; i++) { - if (FontMapLookup(&fontPtr->subFontArray[i], ch)) { - return &fontPtr->subFontArray[i]; - } - } - - /* - * Keep track of all face names that we check, so we don't check some - * name multiple times if it can be reached by multiple paths. - */ - - Tcl_DStringInit(&faceNames); - - aliases = TkFontGetAliasList(fontPtr->font.fa.family); - - subFontPtr = NULL; - fontFallbacks = TkFontGetFallbacks(); - for (i = 0; fontFallbacks[i] != NULL; i++) { - for (j = 0; fontFallbacks[i][j] != NULL; j++) { - fallbackName = fontFallbacks[i][j]; - if (strcasecmp(fallbackName, fontPtr->font.fa.family) == 0) { - /* - * If the base font has a fallback... - */ - - goto tryfallbacks; - } else if (aliases != NULL) { - /* - * Or if an alias for the base font has a fallback... - */ - - for (k = 0; aliases[k] != NULL; k++) { - if (strcasecmp(aliases[k], fallbackName) == 0) { - goto tryfallbacks; - } - } - } - } - continue; - - /* - * ...then see if we can use one of the fallbacks, or an - * alias for one of the fallbacks. - */ - - tryfallbacks: - for (j = 0; fontFallbacks[i][j] != NULL; j++) { - fallbackName = fontFallbacks[i][j]; - subFontPtr = CanUseFallbackWithAliases(fontPtr, fallbackName, - ch, &faceNames); - if (subFontPtr != NULL) { - goto end; - } - } - } - - /* - * See if we can use something from the global fallback list. - */ - - anyFallbacks = TkFontGetGlobalClass(); - for (i = 0; anyFallbacks[i] != NULL; i++) { - fallbackName = anyFallbacks[i]; - subFontPtr = CanUseFallbackWithAliases(fontPtr, fallbackName, ch, - &faceNames); - if (subFontPtr != NULL) { - goto end; - } - } - - /* - * Try all face names available in the whole system until we - * find one that can be used. - */ - - for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { - fallbackName = mapPtr->utfName; - if (SeenName(fallbackName, &faceNames) == 0) { - subFontPtr = CanUseFallback(fontPtr, fallbackName, ch); - if (subFontPtr != NULL) { - goto end; - } - } - } - - end: - Tcl_DStringFree(&faceNames); - - if (subFontPtr == NULL) { - /* - * No font can display this character. We will use the base font - * and have it display the "unknown" character. - */ - - subFontPtr = &fontPtr->subFontArray[0]; - FontMapInsert(subFontPtr, ch); - } - return subFontPtr; -} - -/* - *------------------------------------------------------------------------- - * - * FontMapLookup -- - * - * See if the screen font can display the given character. - * - * Results: - * The return value is 0 if the screen font cannot display the - * character, non-zero otherwise. - * - * Side effects: - * New pages are added to the font mapping cache whenever the - * character belongs to a page that hasn't been seen before. - * When a page is loaded, information about all the characters on - * that page is stored, not just for the single character in - * question. - * - *------------------------------------------------------------------------- - */ - -static int -FontMapLookup( - SubFont *subFontPtr, /* Contains font mapping cache to be queried - * and possibly updated. */ - int ch) /* Character to be tested. */ -{ - int row, bitOffset; - - row = ch >> FONTMAP_SHIFT; - if (subFontPtr->fontMap[row] == NULL) { - FontMapLoadPage(subFontPtr, row); - } - bitOffset = ch & (FONTMAP_BITSPERPAGE - 1); - return (subFontPtr->fontMap[row][bitOffset >> 3] >> (bitOffset & 7)) & 1; -} - -/* - *------------------------------------------------------------------------- - * - * FontMapInsert -- - * - * Tell the font mapping cache that the given screen font should be - * used to display the specified character. This is called when no - * font on the system can be be found that can display that - * character; we lie to the font and tell it that it can display - * the character, otherwise we would end up re-searching the entire - * fallback hierarchy every time that character was seen. - * - * Results: - * None. - * - * Side effects: - * New pages are added to the font mapping cache whenever the - * character belongs to a page that hasn't been seen before. - * When a page is loaded, information about all the characters on - * that page is stored, not just for the single character in - * question. - * - *------------------------------------------------------------------------- - */ - -static void -FontMapInsert( - SubFont *subFontPtr, /* Contains font mapping cache to be - * updated. */ - int ch) /* Character to be added to cache. */ -{ - int row, bitOffset; - - row = ch >> FONTMAP_SHIFT; - if (subFontPtr->fontMap[row] == NULL) { - FontMapLoadPage(subFontPtr, row); - } - bitOffset = ch & (FONTMAP_BITSPERPAGE - 1); - subFontPtr->fontMap[row][bitOffset >> 3] |= 1 << (bitOffset & 7); -} - -/* - *------------------------------------------------------------------------- - * - * FontMapLoadPage -- - * - * Load information about all the characters on a given page. - * This information consists of one bit per character that indicates - * whether the associated HFONT can (1) or cannot (0) display the - * characters on the page. - * - * Results: - * None. - * - * Side effects: - * Mempry allocated. - * - *------------------------------------------------------------------------- - */ -static void -FontMapLoadPage( - SubFont *subFontPtr, /* Contains font mapping cache to be - * updated. */ - int row) /* Index of the page to be loaded into - * the cache. */ -{ - FMInput fm; - FontRec *fontRecPtr; - short *widths; - int i, end, bitOffset, isMultiByteFont; - char src[TCL_UTF_MAX]; - unsigned char buf[16]; - int srcRead, dstWrote; - Tcl_Encoding encoding; - Handle fHandle; - short theID; - ResType theType; - Str255 theName; - - subFontPtr->fontMap[row] = (char *) ckalloc(FONTMAP_BITSPERPAGE / 8); - memset(subFontPtr->fontMap[row], 0, FONTMAP_BITSPERPAGE / 8); - - encoding = subFontPtr->familyPtr->encoding; - - fm.family = subFontPtr->familyPtr->faceNum; - fm.size = 12; - fm.face = 0; - fm.needBits = 0; - fm.device = 0; - fm.numer.h = 1; - fm.numer.v = 1; - fm.denom.h = 1; - fm.denom.v = 1; - -#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) - fHandle = FMSwapFont(&fm)->fontHandle; -#else - fHandle = FMSwapFont(&fm)->fontHandle; -#endif - GetResInfo(fHandle, &theID, &theType, theName); - isMultiByteFont = subFontPtr->familyPtr->isMultiByteFont; - if( theType=='sfnt' ) { - /* - * Found an outline font which has very complex font record. - * Let's just assume *ALL* the characters are allowed. - */ - - end = (row + 1) << FONTMAP_SHIFT; - for (i = row << FONTMAP_SHIFT; i < end; i++) { - if (Tcl_UtfToExternal(NULL, encoding, src, Tcl_UniCharToUtf(i, - src), - TCL_ENCODING_STOPONERROR, NULL, (char *) buf, - sizeof(buf), - &srcRead, &dstWrote, NULL) == TCL_OK) { - bitOffset = i & (FONTMAP_BITSPERPAGE - 1); - subFontPtr->fontMap[row][bitOffset >> 3] |= 1 - << (bitOffset & 7); - } - } - } else { - /* - * Found an old bitmap font which has a well-defined record. - * We can check the width table to see which characters exist. - */ - - fontRecPtr = *((FontRec **) fHandle ); - widths = (short *) ((long) &fontRecPtr->owTLoc - + ((long) (fontRecPtr->owTLoc - fontRecPtr->firstChar) - * sizeof(short))); - - end = (row + 1) << FONTMAP_SHIFT; - for (i = row << FONTMAP_SHIFT; i < end; i++) { - if (Tcl_UtfToExternal(NULL, encoding, src, - Tcl_UniCharToUtf(i, src), - TCL_ENCODING_STOPONERROR, NULL, (char *) buf, sizeof(buf), - &srcRead, &dstWrote, NULL) == TCL_OK) { - - if (((isMultiByteFont != 0) && (buf[0] > 31)) - || (widths[buf[0]] != -1)) { - if ((buf[0] == 0x11) && (widths[0x12] == -1)) { - continue; - } - - /* - * Mac's char existence metrics are only for one-byte - * characters. If we have a double-byte char, just - * assume that the font supports that char if the font's - * encoding supports that char. - */ - - bitOffset = i & (FONTMAP_BITSPERPAGE - 1); - subFontPtr->fontMap[row][bitOffset >> 3] |= 1 - << (bitOffset & 7); - } - } - } - } -} - -/* - *--------------------------------------------------------------------------- - * - * CanUseFallbackWithAliases -- - * - * Helper function for FindSubFontForChar. Determine if the - * specified face name (or an alias of the specified face name) - * can be used to construct a screen font that can display the - * given character. - * - * Results: - * See CanUseFallback(). - * - * Side effects: - * If the name and/or one of its aliases was rejected, the - * rejected string is recorded in nameTriedPtr so that it won't - * be tried again. - * - *--------------------------------------------------------------------------- - */ - -static SubFont * -CanUseFallbackWithAliases( - MacFont *fontPtr, /* The font object that will own the new - * screen font. */ - CONST char *faceName, /* Desired face name for new screen font. */ - int ch, /* The Unicode character that the new - * screen font must be able to display. */ - Tcl_DString *nameTriedPtr) /* Records face names that have already - * been tried. It is possible for the same - * face name to be queried multiple times when - * trying to find a suitable screen font. */ -{ - SubFont *subFontPtr; - char **aliases; - int i; - - if (SeenName(faceName, nameTriedPtr) == 0) { - subFontPtr = CanUseFallback(fontPtr, faceName, ch); - if (subFontPtr != NULL) { - return subFontPtr; - } - } - aliases = TkFontGetAliasList(faceName); - if (aliases != NULL) { - for (i = 0; aliases[i] != NULL; i++) { - if (SeenName(aliases[i], nameTriedPtr) == 0) { - subFontPtr = CanUseFallback(fontPtr, aliases[i], ch); - if (subFontPtr != NULL) { - return subFontPtr; - } - } - } - } - return NULL; -} - -/* - *--------------------------------------------------------------------------- - * - * SeenName -- - * - * Used to determine we have already tried and rejected the given - * face name when looking for a screen font that can support some - * Unicode character. - * - * Results: - * The return value is 0 if this face name has not already been seen, - * non-zero otherwise. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -static int -SeenName( - CONST char *name, /* The name to check. */ - Tcl_DString *dsPtr) /* Contains names that have already been - * seen. */ -{ - CONST char *seen, *end; - - seen = Tcl_DStringValue(dsPtr); - end = seen + Tcl_DStringLength(dsPtr); - while (seen < end) { - if (strcasecmp(seen, name) == 0) { - return 1; - } - seen += strlen(seen) + 1; - } - Tcl_DStringAppend(dsPtr, (char *) name, (int) (strlen(name) + 1)); - return 0; -} - -/* - *------------------------------------------------------------------------- - * - * CanUseFallback -- - * - * If the specified physical screen font has not already been loaded - * into the font object, determine if the specified physical screen - * font can display the given character. - * - * Results: - * The return value is a pointer to a newly allocated SubFont, owned - * by the font object. This SubFont can be used to display the given - * character. The SubFont represents the screen font with the base set - * of font attributes from the font object, but using the specified - * font name. NULL is returned if the font object already holds - * a reference to the specified physical font or if the specified - * physical font cannot display the given character. - * - * Side effects: - * The font object's subFontArray is updated to contain a reference - * to the newly allocated SubFont. - * - *------------------------------------------------------------------------- - */ - -static SubFont * -CanUseFallback( - MacFont *fontPtr, /* The font object that will own the new - * screen font. */ - CONST char *faceName, /* Desired face name for new screen font. */ - int ch) /* The Unicode character that the new - * screen font must be able to display. */ -{ - int i; - SubFont subFont; - short faceNum; - - if (GetFamilyNum(faceName, &faceNum) == 0) { - return NULL; - } - - /* - * Skip all fonts we've already used. - */ - - for (i = 0; i < fontPtr->numSubFonts; i++) { - if (faceNum == fontPtr->subFontArray[i].familyPtr->faceNum) { - return NULL; - } - } - - /* - * Load this font and see if it has the desired character. - */ - - InitSubFont(fontPtr, faceNum, &subFont); - if (((ch < 256) && (subFont.familyPtr->isSymbolFont)) - || (FontMapLookup(&subFont, ch) == 0)) { - ReleaseSubFont(&subFont); - return NULL; - } - - if (fontPtr->numSubFonts >= SUBFONT_SPACE) { - SubFont *newPtr; - - newPtr = (SubFont *) ckalloc(sizeof(SubFont) - * (fontPtr->numSubFonts + 1)); - memcpy((char *) newPtr, fontPtr->subFontArray, - fontPtr->numSubFonts * sizeof(SubFont)); - if (fontPtr->subFontArray != fontPtr->staticSubFonts) { - ckfree((char *) fontPtr->subFontArray); - } - fontPtr->subFontArray = newPtr; - } - fontPtr->subFontArray[fontPtr->numSubFonts] = subFont; - fontPtr->numSubFonts++; - return &fontPtr->subFontArray[fontPtr->numSubFonts - 1]; -} - -/* - *------------------------------------------------------------------------- - * - * GetFamilyNum -- - * - * Determines if any physical screen font exists on the system with - * the given family name. If the family exists, then it should be - * possible to construct some physical screen font with that family - * name. - * - * Results: - * The return value is 0 if the specified font family does not exist, - * non-zero otherwise. *faceNumPtr is filled with the unique face - * number that identifies the screen font, or 0 if the font family - * did not exist. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------- - */ - -static int -GetFamilyNum( - CONST char *faceName, /* UTF-8 name of font family to query. */ - short *faceNumPtr) /* Filled with font number for above family. */ -{ - FontNameMap *mapPtr; - - if (faceName != NULL) { - for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { - if (strcasecmp(faceName, mapPtr->utfName) == 0) { - *faceNumPtr = mapPtr->faceNum; - return 1; - } - } - } - *faceNumPtr = 0; - return 0; -} - -static int -GetFamilyOrAliasNum( - CONST char *faceName, /* UTF-8 name of font family to query. */ - short *faceNumPtr) /* Filled with font number for above family. */ -{ - char **aliases; - int i; - - if (GetFamilyNum(faceName, faceNumPtr) != 0) { - return 1; - } - aliases = TkFontGetAliasList(faceName); - if (aliases != NULL) { - for (i = 0; aliases[i] != NULL; i++) { - if (GetFamilyNum(aliases[i], faceNumPtr) != 0) { - return 1; - } - } - } - return 0; -} - -/* - *------------------------------------------------------------------------- - * - * GetUtfFaceName -- - * - * Given the native name for a Macintosh font (in which the name of - * the font is in the encoding of the font itself), return the UTF-8 - * name that corresponds to that font. The specified font name must - * refer to a font that actually exists on the machine. - * - * This function is used to obtain the UTF-8 name when querying the - * properties of a Macintosh font object. - * - * Results: - * The return value is a pointer to the UTF-8 of the specified font. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------ - */ - -static Tk_Uid -GetUtfFaceName( - StringPtr nativeName) /* Pascal name for font in native encoding. */ -{ - FontNameMap *mapPtr; - - for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { - if (pstrcmp(nativeName, mapPtr->nativeName) == 0) { - return mapPtr->utfName; - } - } - panic("GetUtfFaceName: unexpected nativeName"); - return NULL; -} - -/* - *------------------------------------------------------------------------ - * - * GetFontEncoding -- - * - * Return a string that can be passed to Tcl_GetTextEncoding() and - * used to convert bytes from UTF-8 into the encoding of the - * specified font. - * - * The desired encoding to use to convert the name of a symbolic - * font into UTF-8 is macRoman, while the desired encoding to use - * to convert bytes in a symbolic font to UTF-8 is the corresponding - * symbolic encoding. Due to this dual interpretatation of symbolic - * fonts, the caller can specify what type of encoding to return - * should the specified font be symbolic. - * - * Results: - * The return value is a string that specifies the font's encoding. - * If the font's encoding could not be identified, NULL is returned. - * - * Side effects: - * None. - * - *------------------------------------------------------------------------ - */ - -static Tcl_Encoding -GetFontEncoding( - int faceNum, /* Macintosh font number. */ - int allowSymbol, /* If non-zero, then the encoding string - * for symbol fonts will be the corresponding - * symbol encoding. Otherwise, the encoding - * string for symbol fonts will be - * "macRoman". */ - int *isSymbolPtr) /* Filled with non-zero if this font is a - * symbol font, 0 otherwise. */ -{ - Str255 faceName; - int script, lang; - char *name; - - if (allowSymbol != 0) { - GetFontName(faceNum, faceName); - if (pstrcasecmp(faceName, "\psymbol") == 0) { - *isSymbolPtr = 1; - return Tcl_GetEncoding(NULL, "symbol"); - } - if (pstrcasecmp(faceName, "\pzapf dingbats") == 0) { - *isSymbolPtr = 1; - return Tcl_GetEncoding(NULL, "macDingbats"); - } - } - - *isSymbolPtr = 0; - - script = FontToScript(faceNum); - lang = GetScriptVariable(script, smScriptLang); - name = NULL; - if (script == smRoman) { - name = TkFindStateString(romanMap, lang); - } else if (script == smCyrillic) { - name = TkFindStateString(cyrillicMap, lang); - } - if (name == NULL) { - name = TkFindStateString(scriptMap, script); - } - return Tcl_GetEncoding(NULL, name); -} diff --git a/mac/tkMacHLEvents.c b/mac/tkMacHLEvents.c deleted file mode 100644 index 79ad66e..0000000 --- a/mac/tkMacHLEvents.c +++ /dev/null @@ -1,441 +0,0 @@ -/* - * tkMacHLEvents.c -- - * - * Implements high level event support for the Macintosh. Currently, - * the only event that really does anything is the Quit event. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacHLEvents.c,v 1.5 2001/08/06 18:29:41 dgp Exp $ - */ - -#include "tcl.h" -#include "tclMacInt.h" -#include "tkMacInt.h" - -#include <Aliases.h> -#include <AppleEvents.h> -#include <SegLoad.h> -#include <ToolUtils.h> - -/* - * This is a Tcl_Event structure that the Quit AppleEvent handler - * uses to schedule the tkReallyKillMe function. - */ - -typedef struct KillEvent { - Tcl_Event header; /* Information that is standard for - * all events. */ - Tcl_Interp *interp; /* Interp that was passed to the - * Quit AppleEvent */ -} KillEvent; - -/* - * Static functions used only in this file. - */ - -static pascal OSErr QuitHandler _ANSI_ARGS_((AppleEvent* event, - AppleEvent* reply, long refcon)); -static pascal OSErr OappHandler _ANSI_ARGS_((AppleEvent* event, - AppleEvent* reply, long refcon)); -static pascal OSErr OdocHandler _ANSI_ARGS_((AppleEvent* event, - AppleEvent* reply, long refcon)); -static pascal OSErr PrintHandler _ANSI_ARGS_((AppleEvent* event, - AppleEvent* reply, long refcon)); -static pascal OSErr ScriptHandler _ANSI_ARGS_((AppleEvent* event, - AppleEvent* reply, long refcon)); -static int MissedAnyParameters _ANSI_ARGS_((AppleEvent *theEvent)); -static int ReallyKillMe _ANSI_ARGS_((Tcl_Event *eventPtr, int flags)); - -/* - *---------------------------------------------------------------------- - * - * TkMacInitAppleEvents -- - * - * Initilize the Apple Events on the Macintosh. This registers the - * core event handlers. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkMacInitAppleEvents( - Tcl_Interp *interp) /* Interp to handle basic events. */ -{ - OSErr err; - AEEventHandlerUPP OappHandlerUPP, OdocHandlerUPP, - PrintHandlerUPP, QuitHandlerUPP, ScriptHandlerUPP; - - /* - * Install event handlers for the core apple events. - */ - QuitHandlerUPP = NewAEEventHandlerProc(QuitHandler); - err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, - QuitHandlerUPP, (long) interp, false); - - OappHandlerUPP = NewAEEventHandlerProc(OappHandler); - err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, - OappHandlerUPP, (long) interp, false); - - OdocHandlerUPP = NewAEEventHandlerProc(OdocHandler); - err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, - OdocHandlerUPP, (long) interp, false); - - PrintHandlerUPP = NewAEEventHandlerProc(PrintHandler); - err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, - PrintHandlerUPP, (long) interp, false); - - if (interp != NULL) { - ScriptHandlerUPP = NewAEEventHandlerProc(ScriptHandler); - err = AEInstallEventHandler('misc', 'dosc', - ScriptHandlerUPP, (long) interp, false); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacDoHLEvent -- - * - * Dispatch incomming highlevel events. - * - * Results: - * None. - * - * Side effects: - * Depends on the incoming event. - * - *---------------------------------------------------------------------- - */ - -void -TkMacDoHLEvent( - EventRecord *theEvent) -{ - AEProcessAppleEvent(theEvent); - - return; -} - -/* - *---------------------------------------------------------------------- - * - * QuitHandler, OappHandler, etc. -- - * - * These are the core Apple event handlers. Only the Quit event does - * anything interesting. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static pascal OSErr -QuitHandler( - AppleEvent *theAppleEvent, - AppleEvent *reply, - long handlerRefcon) -{ - Tcl_Interp *interp = (Tcl_Interp *) handlerRefcon; - KillEvent *eventPtr; - - /* - * Call the exit command from the event loop, since you are not supposed - * to call ExitToShell in an Apple Event Handler. We put this at the head - * of Tcl's event queue because this message usually comes when the Mac is - * shutting down, and we want to kill the shell as quickly as possible. - */ - - eventPtr = (KillEvent *) ckalloc(sizeof(KillEvent)); - eventPtr->header.proc = ReallyKillMe; - eventPtr->interp = interp; - - Tcl_QueueEvent((Tcl_Event *) eventPtr, TCL_QUEUE_HEAD); - - return noErr; -} - -static pascal OSErr -OappHandler( - AppleEvent *theAppleEvent, - AppleEvent *reply, - long handlerRefcon) -{ - return noErr; -} - -static pascal OSErr -OdocHandler( - AppleEvent *theAppleEvent, - AppleEvent *reply, - long handlerRefcon) -{ - Tcl_Interp *interp = (Tcl_Interp *) handlerRefcon; - AEDescList fileSpecList; - FSSpec file; - OSErr err; - DescType type; - Size actual; - long count; - AEKeyword keyword; - long index; - Tcl_DString command; - Tcl_DString pathName; - Tcl_CmdInfo dummy; - - /* - * Don't bother if we don't have an interp or - * the open document procedure doesn't exist. - */ - - if ((interp == NULL) || - (Tcl_GetCommandInfo(interp, "::tk::mac::OpenDocument", &dummy)) == 0) { - return noErr; - } - - /* - * If we get any errors wil retrieving our parameters - * we just return with no error. - */ - - err = AEGetParamDesc(theAppleEvent, keyDirectObject, - typeAEList, &fileSpecList); - if (err != noErr) { - return noErr; - } - - err = MissedAnyParameters(theAppleEvent); - if (err != noErr) { - return noErr; - } - - err = AECountItems(&fileSpecList, &count); - if (err != noErr) { - return noErr; - } - - Tcl_DStringInit(&command); - Tcl_DStringAppend(&command, "::tk::mac::OpenDocument", -1); - for (index = 1; index <= count; index++) { - int length; - Handle fullPath; - - err = AEGetNthPtr(&fileSpecList, index, typeFSS, - &keyword, &type, (Ptr) &file, sizeof(FSSpec), &actual); - if ( err != noErr ) { - continue; - } - - err = FSpPathFromLocation(&file, &length, &fullPath); - HLock(fullPath); - Tcl_ExternalToUtfDString(NULL, *fullPath, length, &pathName); - HUnlock(fullPath); - DisposeHandle(fullPath); - - Tcl_DStringAppendElement(&command, Tcl_DStringValue(&pathName)); - Tcl_DStringFree(&pathName); - } - - Tcl_GlobalEval(interp, Tcl_DStringValue(&command)); - - Tcl_DStringFree(&command); - return noErr; -} - -static pascal OSErr -PrintHandler( - AppleEvent *theAppleEvent, - AppleEvent *reply, - long handlerRefcon) -{ - return noErr; -} - -/* - *---------------------------------------------------------------------- - * - * DoScriptHandler -- - * - * This handler process the do script event. - * - * Results: - * Scedules the given event to be processed. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static pascal OSErr -ScriptHandler( - AppleEvent *theAppleEvent, - AppleEvent *reply, - long handlerRefcon) -{ - OSErr theErr; - AEDescList theDesc; - int tclErr = -1; - Tcl_Interp *interp; - char errString[128]; - - interp = (Tcl_Interp *) handlerRefcon; - - /* - * The do script event receives one parameter that should be data or a file. - */ - theErr = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, - &theDesc); - if (theErr != noErr) { - sprintf(errString, "AEDoScriptHandler: GetParamDesc error %d", theErr); - theErr = AEPutParamPtr(reply, keyErrorString, typeChar, errString, - strlen(errString)); - } else if (MissedAnyParameters(theAppleEvent)) { - sprintf(errString, "AEDoScriptHandler: extra parameters"); - AEPutParamPtr(reply, keyErrorString, typeChar, errString, - strlen(errString)); - theErr = -1771; - } else { - if (theDesc.descriptorType == (DescType)'TEXT') { - Tcl_DString encodedText; - short length, i; - - length = GetHandleSize(theDesc.dataHandle); - SetHandleSize(theDesc.dataHandle, length + 1); - *(*theDesc.dataHandle + length) = '\0'; - for (i=0; i<length; i++) { - if ((*theDesc.dataHandle)[i] == '\r') { - (*theDesc.dataHandle)[i] = '\n'; - } - } - - HLock(theDesc.dataHandle); - Tcl_ExternalToUtfDString(NULL, *theDesc.dataHandle, length, - &encodedText); - tclErr = Tcl_GlobalEval(interp, Tcl_DStringValue(&encodedText)); - Tcl_DStringFree(&encodedText); - HUnlock(theDesc.dataHandle); - } else if (theDesc.descriptorType == (DescType)'alis') { - Boolean dummy; - FSSpec theFSS; - Handle fullPath; - int length; - - theErr = ResolveAlias(NULL, (AliasHandle)theDesc.dataHandle, - &theFSS, &dummy); - if (theErr == noErr) { - FSpPathFromLocation(&theFSS, &length, &fullPath); - HLock(fullPath); - Tcl_EvalFile(interp, *fullPath); - HUnlock(fullPath); - DisposeHandle(fullPath); - } else { - sprintf(errString, "AEDoScriptHandler: file not found"); - AEPutParamPtr(reply, keyErrorString, typeChar, - errString, strlen(errString)); - } - } else { - sprintf(errString, - "AEDoScriptHandler: invalid script type '%-4.4s', must be 'alis' or 'TEXT'", - &theDesc.descriptorType); - AEPutParamPtr(reply, keyErrorString, typeChar, - errString, strlen(errString)); - theErr = -1770; - } - } - - /* - * If we actually go to run Tcl code - put the result in the reply. - */ - if (tclErr >= 0) { - if (tclErr == TCL_OK) { - AEPutParamPtr(reply, keyDirectObject, typeChar, - Tcl_GetStringResult(interp), - strlen(Tcl_GetStringResult(interp))); - } else { - AEPutParamPtr(reply, keyErrorString, typeChar, - Tcl_GetStringResult(interp), - strlen(Tcl_GetStringResult(interp))); - AEPutParamPtr(reply, keyErrorNumber, typeInteger, - (Ptr) &tclErr, sizeof(int)); - } - } - - AEDisposeDesc(&theDesc); - - return theErr; -} - -/* - *---------------------------------------------------------------------- - * - * ReallyKillMe -- - * - * This proc tries to kill the shell by running exit, and if that - * has not succeeded (e.g. because someone has renamed the exit - * command), calls Tcl_Exit to really kill the shell. Called from - * an event scheduled by the "Quit" AppleEvent handler. - * - * Results: - * Kills the shell. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -ReallyKillMe(Tcl_Event *eventPtr, int flags) -{ - Tcl_Interp *interp = ((KillEvent *) eventPtr)->interp; - if (interp != NULL) { - Tcl_GlobalEval(interp, "exit"); - } - Tcl_Exit(0); - - return 1; -} - -/* - *---------------------------------------------------------------------- - * - * MissedAnyParameters -- - * - * Checks to see if parameters are still left in the event. - * - * Results: - * True or false. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static int -MissedAnyParameters( - AppleEvent *theEvent) -{ - DescType returnedType; - Size actualSize; - OSErr err; - - err = AEGetAttributePtr(theEvent, keyMissedKeywordAttr, typeWildCard, - &returnedType, NULL, 0, &actualSize); - - return (err != errAEDescNotFound); -} diff --git a/mac/tkMacInit.c b/mac/tkMacInit.c deleted file mode 100644 index e40a55a..0000000 --- a/mac/tkMacInit.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * tkMacInit.c -- - * - * This file contains Mac-specific interpreter initialization - * functions. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacInit.c,v 1.10 2002/05/20 12:30:16 das Exp $ - */ - -#include <Resources.h> -#include <Files.h> -#include <TextUtils.h> -#include <Strings.h> -#include "tkInt.h" -#include "tkMacInt.h" -#include "tclMacInt.h" - -/* - * The following global is used by various parts of Tk to access - * information in the global qd variable. It is provided as a pointer - * in the AppInit because we don't assume that Tk is running as an - * application. For example, Tk could be a plugin and may not have - * access to the qd variable. This mechanism provides a way for the - * container application to give a pointer to the qd variable. - */ - -QDGlobalsPtr tcl_macQdPtr = NULL; - -/* - *---------------------------------------------------------------------- - * - * TkpInit -- - * - * Performs Mac-specific interpreter initialization related to the - * tk_library variable. - * - * Results: - * A standard Tcl completion code (TCL_OK or TCL_ERROR). Also - * leaves information in the interp's result. - * - * Side effects: - * Sets "tk_library" Tcl variable, runs initialization scripts - * for Tk. - * - *---------------------------------------------------------------------- - */ - -int -TkpInit( - Tcl_Interp *interp) /* Interp to initialize. */ -{ - CONST char *libDir, *tempPath; - Tcl_DString path, ds; - int result; - - static char initCmd[] = "if {[info proc tkInit]==\"\"} {\n\ -proc tkInit {} {\n\ -proc sourcePath {file} {\n\ - global tk_library\n\ - if {[catch {uplevel #0 [list source [file join $tk_library $file.tcl]]}] == 0} {\n\ - return\n\ - }\n\ - if {[catch {uplevel #0 [list source -rsrc $file]}] == 0} {\n\ - return\n\ - }\n\ - rename sourcePath {}\n\ - set msg \"Can't find $file resource or a usable $file.tcl file\"\n\ - append msg \" perhaps you need to install Tk or set your\"\n\ - append msg \" TK_LIBRARY environment variable?\"\n\ - error $msg\n\ -}\n\ -sourcePath tk\n\ -sourcePath dialog\n\ -sourcePath focus\n\ -sourcePath optMenu\n\ -sourcePath palette\n\ -sourcePath tearoff\n\ -if {[catch {package require msgcat}]} {sourcePath msgcat}\n\ -sourcePath bgerror\n\ -sourcePath msgbox\n\ -sourcePath comdlg\n\ -rename sourcePath {}\n\ -rename tkInit {}\n\ -} }\n\ -tkInit"; - - Tcl_DStringInit(&path); - Tcl_DStringInit(&ds); - - /* - * The tk_library path can be found in several places. Here is the order - * in which the are searched. - * 1) the variable may already exist - * 2) env array - * 3) System Folder:Extensions:Tool Command Language: - */ - - libDir = Tcl_GetVar(interp, "tk_library", TCL_GLOBAL_ONLY); - if (libDir == NULL) { - libDir = TclGetEnv("TK_LIBRARY", &ds); - } - if ((libDir == NULL) || (libDir[0] == '\0')) { - tempPath = TclGetEnv("EXT_FOLDER", &ds); - if ((tempPath != NULL) && (tempPath[0] != '\0')) { - Tcl_DString libPath; - CONST char *argv[3]; - - argv[0] = tempPath; - argv[1] = "Tool Command Language"; - Tcl_DStringInit(&libPath); - Tcl_DStringAppend(&libPath, "tk", -1); - argv[2] = Tcl_DStringAppend(&libPath, TK_VERSION, -1); - libDir = Tcl_JoinPath(3, argv, &path); - Tcl_DStringFree(&libPath); - } - } - if (libDir == NULL) { - libDir = "no library"; - } - - /* - * Assign path to the global Tcl variable tcl_library. - */ - Tcl_SetVar(interp, "tk_library", libDir, TCL_GLOBAL_ONLY); - Tcl_DStringFree(&path); - Tcl_DStringFree(&ds); - - result = Tcl_Eval(interp, initCmd); - return result; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetAppName -- - * - * Retrieves the name of the current application from a platform - * specific location. On the Macintosh we look to see if the - * App Name is specified in a resource. If not, the application - * name is the root of the tail of the path contained in the tcl - * variable argv0. - * - * Results: - * Returns the application name in the given Tcl_DString. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkpGetAppName( - Tcl_Interp *interp, /* The main interpreter. */ - Tcl_DString *namePtr) /* A previously initialized Tcl_DString. */ -{ - int argc; - CONST char **argv = NULL, *name, *p; - int nameLength = -1; - Handle h = NULL; - - h = GetNamedResource('STR ', "\pTk App Name"); - if (h != NULL) { - HLock(h); - Tcl_DStringAppend(namePtr, (*h)+1, **h); - HUnlock(h); - ReleaseResource(h); - return; - } - - name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY); - if (name != NULL) { - Tcl_SplitPath(name, &argc, &argv); - if (argc > 0) { - name = argv[argc-1]; - p = strrchr(name, '.'); - if (p != NULL) { - nameLength = p - name; - } - } else { - name = NULL; - } - } - if ((name == NULL) || (*name == 0) || (nameLength == 0)) { - name = "tk"; - nameLength = -1; - } - Tcl_DStringAppend(namePtr, name, nameLength); - if (argv != NULL) { - ckfree((char *)argv); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpDisplayWarning -- - * - * This routines is called from Tk_Main to display warning - * messages that occur during startup. - * - * Results: - * None. - * - * Side effects: - * Displays a message box. - * - *---------------------------------------------------------------------- - */ - -void -TkpDisplayWarning( - CONST char *msg, /* Message to be displayed. */ - CONST char *title) /* Title of warning. */ -{ - Tcl_DString ds; - Tcl_DStringInit(&ds); - Tcl_DStringAppend(&ds, title, -1); - Tcl_DStringAppend(&ds, ": ", -1); - Tcl_DStringAppend(&ds, msg, -1); - panic(Tcl_DStringValue(&ds)); - Tcl_DStringFree(&ds); -} diff --git a/mac/tkMacInt.h b/mac/tkMacInt.h deleted file mode 100644 index ecb97ae..0000000 --- a/mac/tkMacInt.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * tkMacInt.h -- - * - * Declarations of Macintosh specific shared variables and procedures. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacInt.h,v 1.10 2001/11/23 02:05:55 das Exp $ - */ - -#ifndef _TKMACINT -#define _TKMACINT - -#ifndef _TKINT -#include "tkInt.h" -#endif - -/* - * Include platform specific public interfaces. - */ - -#ifndef _TKMAC -#include "tkMac.h" -#endif - -#ifndef _TKPORT -#include "tkPort.h" -#endif - -#include <AppleEvents.h> -#include <Windows.h> -#include <QDOffscreen.h> -#include <Menus.h> - -#define TK_MAC_68K_STACK_GROWTH (256*1024) - -struct TkWindowPrivate { - TkWindow *winPtr; /* Ptr to tk window or NULL if Pixmap */ - GWorldPtr portPtr; /* Either WindowRef or off screen world */ - int xOff; /* X offset from toplevel window */ - int yOff; /* Y offset from toplevel window */ - RgnHandle clipRgn; /* Visable region of window */ - RgnHandle aboveClipRgn; /* Visable region of window & it's children */ - int referenceCount; /* Don't delete toplevel until children are - * gone. */ - struct TkWindowPrivate *toplevel; /* Pointer to the toplevel - * datastruct. */ - int flags; /* Various state see defines below. */ -}; -typedef struct TkWindowPrivate MacDrawable; - -/* - * This list is used to keep track of toplevel windows that have a Mac - * window attached. This is useful for several things, not the least - * of which is maintaining floating windows. - */ - -typedef struct TkMacWindowList { - struct TkMacWindowList *nextPtr; /* The next window in the list. */ - TkWindow *winPtr; /* This window */ -} TkMacWindowList; - -/* - * Defines use for the flags field of the MacDrawable data structure. - */ - -#define TK_SCROLLBAR_GROW 1 -#define TK_CLIP_INVALID 2 -#define TK_HOST_EXISTS 4 -#define TK_DRAWN_UNDER_MENU 8 - -/* - * I am reserving TK_EMBEDDED = 0x100 in the MacDrawable flags - * This is defined in tk.h. We need to duplicate the TK_EMBEDDED flag in the - * TkWindow structure for the window, but in the MacWin. This way we can still tell - * what the correct port is after the TKWindow structure has been freed. This - * actually happens when you bind destroy of a toplevel to Destroy of a child. - */ - -/* - * This structure is for handling Netscape-type in process - * embedding where Tk does not control the top-level. It contains - * various functions that are needed by Mac specific routines, like - * TkMacGetDrawablePort. The definitions of the function types - * are in tkMac.h. - */ - -typedef struct { - Tk_MacEmbedRegisterWinProc *registerWinProc; - Tk_MacEmbedGetGrafPortProc *getPortProc; - Tk_MacEmbedMakeContainerExistProc *containerExistProc; - Tk_MacEmbedGetClipProc *getClipProc; - Tk_MacEmbedGetOffsetInParentProc *getOffsetProc; -} TkMacEmbedHandler; - -extern TkMacEmbedHandler *gMacEmbedHandler; - -/* - * Defines used for TkMacInvalidateWindow - */ - -#define TK_WINDOW_ONLY 0 -#define TK_PARENT_WINDOW 1 - -/* - * Accessor for the privatePtr flags field for the TK_HOST_EXISTS field - */ - -#define TkMacHostToplevelExists(tkwin) \ - (((TkWindow *) (tkwin))->privatePtr->toplevel->flags & TK_HOST_EXISTS) - -/* - * Defines use for the flags argument to TkGenWMConfigureEvent. - */ - -#define TK_LOCATION_CHANGED 1 -#define TK_SIZE_CHANGED 2 -#define TK_BOTH_CHANGED 3 - -/* - * Variables shared among various Mac Tk modules but are not - * exported to the outside world. - */ - -extern int tkMacAppInFront; - -/* - * Globals shared among Macintosh Tk - */ - -extern MenuHandle tkAppleMenu; /* Handle to the Apple Menu */ -extern MenuHandle tkFileMenu; /* Handles to menus */ -extern MenuHandle tkEditMenu; /* Handles to menus */ -extern RgnHandle tkMenuCascadeRgn; /* A region to clip with. */ -extern int tkUseMenuCascadeRgn; /* If this is 1, clipping code - * should intersect tkMenuCascadeRgn - * before drawing occurs. - * tkMenuCascadeRgn will only - * be valid when the value of this - * variable is 1. */ -extern TkMacWindowList *tkMacWindowListPtr; - /* The list of toplevels */ - -/* - * The following types and defines are for MDEF support. - */ - -#if STRUCTALIGNMENTSUPPORTED -#pragma options align=mac8k -#endif -typedef struct TkMenuLowMemGlobals { - long menuDisable; /* A combination of the menu and the item - * that the mouse is currently over. */ - short menuTop; /* Where in global coords the top of the - * menu is. */ - short menuBottom; /* Where in global coords the bottom of - * the menu is. */ - Rect itemRect; /* This is the rectangle of the currently - * selected item. */ - short scrollFlag; /* This is used by the MDEF and the - * Menu Manager to control when scrolling - * starts. With hierarchicals, an - * mChooseMsg can come before an - * mDrawMsg, and scrolling should not - * occur until after the mDrawMsg. - * The mDrawMsg sets this flag; - * mChooseMsg checks the flag and - * does not scroll if it is set; - * and then resets the flag. */ -} TkMenuLowMemGlobals; -#if STRUCTALIGNMENTSUPPORTED -#pragma options align=reset -#endif - -typedef pascal void (*TkMenuDefProcPtr) (short message, MenuHandle theMenu, - Rect *menuRectPtr, Point hitPt, short *whichItemPtr, - TkMenuLowMemGlobals *globalsPtr); -enum { - tkUppMenuDefProcInfo = kPascalStackBased - | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short))) - | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(MenuRef))) - | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Rect*))) - | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(Point))) - | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(short*))) - | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(TkMenuLowMemGlobals *))) -}; - -#if GENERATINGCFM -typedef UniversalProcPtr TkMenuDefUPP; -#else -typedef TkMenuDefProcPtr TkMenuDefUPP; -#endif - -#if GENERATINGCFM -#define TkNewMenuDefProc(userRoutine) \ - (TkMenuDefUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), \ - tkUppMenuDefProcInfo, GetCurrentArchitecture()) -#else -#define TkNewMenuDefProc(userRoutine) \ - ((TkMenuDefUPP) (userRoutine)) -#endif - -#if GENERATINGCFM -#define TkCallMenuDefProc(userRoutine, message, theMenu, menuRectPtr, hitPt, \ - whichItemPtr, globalsPtr) \ - CallUniversalProc((UniversalProcPtr)(userRoutine), TkUppMenuDefProcInfo, \ - (message), (theMenu), (menuRectPtr), (hitPt), (whichItemPtr), \ - (globalsPtr)) -#else -#define TkCallMenuDefProc(userRoutine, message, theMenu, menuRectPtr, hitPt, \ - whichItemPtr, globalsPtr) \ - (*(userRoutine))((message), (theMenu), (menuRectPtr), (hitPt), \ - (whichItemPtr), (globalsPtr)) -#endif - -#include "tkIntPlatDecls.h" - -#ifdef BUILD_tk -#undef TCL_STORAGE_CLASS -#define TCL_STORAGE_CLASS DLLEXPORT -#endif - -/* - * mac specific procedures exported from the DLL - */ - -#undef TCL_STORAGE_CLASS -#define TCL_STORAGE_CLASS DLLIMPORT - -#endif /* _TKMACINT */ diff --git a/mac/tkMacKeyboard.c b/mac/tkMacKeyboard.c deleted file mode 100644 index 2cf8d0a..0000000 --- a/mac/tkMacKeyboard.c +++ /dev/null @@ -1,648 +0,0 @@ -/* - * tkMacKeyboard.c -- - * - * Routines to support keyboard events on the Macintosh. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacKeyboard.c,v 1.8 2002/02/08 02:57:11 dgp Exp $ - */ - -#include "tkInt.h" -#include "Xlib.h" -#include "keysym.h" - -#include <Events.h> -#include <Script.h> - -typedef struct { - short keycode; /* Macintosh keycode */ - KeySym keysym; /* X windows Keysym */ -} KeyInfo; - -static KeyInfo keyArray[] = { - {0x4C, XK_Return}, - {0x24, XK_Return}, - {0x33, XK_BackSpace}, - {0x75, XK_Delete}, - {0x30, XK_Tab}, - {0x74, XK_Page_Up}, - {0x79, XK_Page_Down}, - {0x73, XK_Home}, - {0x77, XK_End}, - {0x7B, XK_Left}, - {0x7C, XK_Right}, - {0x7E, XK_Up}, - {0x7D, XK_Down}, - {0x72, XK_Help}, - {0x35, XK_Escape}, - {0x47, XK_Clear}, - {0, 0} -}; - -static KeyInfo vituralkeyArray[] = { - {122, XK_F1}, - {120, XK_F2}, - {99, XK_F3}, - {118, XK_F4}, - {96, XK_F5}, - {97, XK_F6}, - {98, XK_F7}, - {100, XK_F8}, - {101, XK_F9}, - {109, XK_F10}, - {103, XK_F11}, - {111, XK_F12}, - {105, XK_F13}, - {107, XK_F14}, - {113, XK_F15}, - {0, 0} -}; - -static int initialized = 0; -static Tcl_HashTable keycodeTable; /* keyArray hashed by keycode value. */ -static Tcl_HashTable vkeyTable; /* vituralkeyArray hashed by virtual - keycode value. */ -static Ptr KCHRPtr; /* Pointer to 'KCHR' resource. */ - -/* - * Prototypes for static functions used in this file. - */ -static void InitKeyMaps _ANSI_ARGS_((void)); - - -/* - *---------------------------------------------------------------------- - * - * InitKeyMaps -- - * - * Creates hash tables used by some of the functions in this file. - * - * Results: - * None. - * - * Side effects: - * Allocates memory & creates some hash tables. - * - *---------------------------------------------------------------------- - */ - -static void -InitKeyMaps() -{ - register Tcl_HashEntry *hPtr; - register KeyInfo *kPtr; - int dummy; - - Tcl_InitHashTable(&keycodeTable, TCL_ONE_WORD_KEYS); - for (kPtr = keyArray; kPtr->keycode != 0; kPtr++) { - hPtr = Tcl_CreateHashEntry(&keycodeTable, (char *) kPtr->keycode, - &dummy); - Tcl_SetHashValue(hPtr, kPtr->keysym); - } - Tcl_InitHashTable(&vkeyTable, TCL_ONE_WORD_KEYS); - for (kPtr = vituralkeyArray; kPtr->keycode != 0; kPtr++) { - hPtr = Tcl_CreateHashEntry(&vkeyTable, (char *) kPtr->keycode, - &dummy); - Tcl_SetHashValue(hPtr, kPtr->keysym); - } - KCHRPtr = (Ptr) GetScriptManagerVariable(smKCHRCache); - initialized = 1; -} - -/* - *---------------------------------------------------------------------- - * - * XKeycodeToKeysym -- - * - * Translate from a system-dependent keycode to a - * system-independent keysym. - * - * Results: - * Returns the translated keysym, or NoSymbol on failure. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -KeySym -XKeycodeToKeysym( - Display* display, - KeyCode keycode, - int index) -{ - register Tcl_HashEntry *hPtr; - int c; - char virtualKey; - int newKeycode; - unsigned long dummy, newChar; - - if (!initialized) { - InitKeyMaps(); - } - - virtualKey = (char) (keycode >> 16); - c = (keycode) & 0xffff; - if (c > 255) { - return NoSymbol; - } - - /* - * When determining what keysym to produce we firt check to see if - * the key is a function key. We then check to see if the character - * is another non-printing key. Finally, we return the key syms - * for all ASCI chars. - */ - if (c == 0x10) { - hPtr = Tcl_FindHashEntry(&vkeyTable, (char *) virtualKey); - if (hPtr != NULL) { - return (KeySym) Tcl_GetHashValue(hPtr); - } - } - hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey); - if (hPtr != NULL) { - return (KeySym) Tcl_GetHashValue(hPtr); - } - - /* - * Recompute the character based on the Shift key only. - * TODO: The index may also specify the NUM_LOCK. - */ - newKeycode = virtualKey; - if (index & 0x01) { - newKeycode += 0x0200; - } - dummy = 0; - newChar = KeyTranslate(KCHRPtr, (short) newKeycode, &dummy); - c = newChar & charCodeMask; - - if (c >= XK_space && c < XK_asciitilde) { - return c; - } - - return NoSymbol; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetString -- - * - * Retrieve the string equivalent for the given keyboard event. - * - * Results: - * Returns the UTF string. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -char * -TkpGetString( - TkWindow *winPtr, /* Window where event occurred: needed to - * get input context. */ - XEvent *eventPtr, /* X keyboard event. */ - Tcl_DString *dsPtr) /* Uninitialized or empty string to hold - * result. */ -{ - register Tcl_HashEntry *hPtr; - char string[3]; - char virtualKey; - int c, len; - - if (!initialized) { - InitKeyMaps(); - } - - Tcl_DStringInit(dsPtr); - - virtualKey = (char) (eventPtr->xkey.keycode >> 16); - c = (eventPtr->xkey.keycode) & 0xffff; - - if (c < 256) { - string[0] = (char) c; - len = 1; - } else { - string[0] = (char) (c >> 8); - string[1] = (char) c; - len = 2; - } - - /* - * Just return NULL if the character is a function key or another - * non-printing key. - */ - if (c == 0x10) { - len = 0; - } else { - hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey); - if (hPtr != NULL) { - len = 0; - } - } - return Tcl_ExternalToUtfDString(NULL, string, len, dsPtr); -} - -/* - *---------------------------------------------------------------------- - * - * XGetModifierMapping -- - * - * Fetch the current keycodes used as modifiers. - * - * Results: - * Returns a new modifier map. - * - * Side effects: - * Allocates a new modifier map data structure. - * - *---------------------------------------------------------------------- - */ - -XModifierKeymap * -XGetModifierMapping( - Display* display) -{ - XModifierKeymap * modmap; - - modmap = (XModifierKeymap *) ckalloc(sizeof(XModifierKeymap)); - modmap->max_keypermod = 0; - modmap->modifiermap = NULL; - return modmap; -} - -/* - *---------------------------------------------------------------------- - * - * XFreeModifiermap -- - * - * Deallocate a modifier map that was created by - * XGetModifierMapping. - * - * Results: - * None. - * - * Side effects: - * Frees the datastructure referenced by modmap. - * - *---------------------------------------------------------------------- - */ - -void -XFreeModifiermap( - XModifierKeymap *modmap) -{ - if (modmap->modifiermap != NULL) { - ckfree((char *) modmap->modifiermap); - } - ckfree((char *) modmap); -} - -/* - *---------------------------------------------------------------------- - * - * XKeysymToString, XStringToKeysym -- - * - * These X window functions map Keysyms to strings & strings to - * keysyms. However, Tk already does this for the most common keysyms. - * Therefor, these functions only need to support keysyms that will be - * specific to the Macintosh. Currently, there are none. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -char * -XKeysymToString( - KeySym keysym) -{ - return NULL; -} - -KeySym -XStringToKeysym( - const char* string) -{ - return NoSymbol; -} - -/* - *---------------------------------------------------------------------- - * - * XKeysymToKeycode -- - * - * The function XKeysymToKeycode is only used by tkTest.c and - * currently only implementes the support for keys used in the - * Tk test suite. - * FIXME - This is no longer true. This function is now used in - * "event generate" so we really should make it work. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -KeyCode -XKeysymToKeycode( - Display* display, - KeySym keysym) -{ - KeyCode keycode = 0; - char virtualKeyCode = 0; - - if ((keysym >= XK_space) && (XK_asciitilde)) { - if (keysym == 'a') { - virtualKeyCode = 0x00; - } else if (keysym == 'b' || keysym == 'B') { - virtualKeyCode = 0x0B; - } else if (keysym == 'c') { - virtualKeyCode = 0x08; - } else if (keysym == 'x' || keysym == 'X') { - virtualKeyCode = 0x07; - } else if (keysym == 'z') { - virtualKeyCode = 0x06; - } else if (keysym == ' ') { - virtualKeyCode = 0x31; - } else if (keysym == XK_Return) { - virtualKeyCode = 0x24; - keysym = '\r'; - } - keycode = keysym + (virtualKeyCode <<16); - } - - return keycode; -} - -/* - * When mapping from a keysym to a keycode, need - * information about the modifier state that should be used - * so that when they call XKeycodeToKeysym taking into - * account the xkey.state, they will get back the original - * keysym. - */ - -void -TkpSetKeycodeAndState(tkwin, keySym, eventPtr) - Tk_Window tkwin; - KeySym keySym; - XEvent *eventPtr; -{ - Display *display; - int state; - KeyCode keycode; - - display = Tk_Display(tkwin); - - if (keySym == NoSymbol) { - keycode = 0; - } else { - keycode = XKeysymToKeycode(display, keySym); - } - if (keycode != 0) { - for (state = 0; state < 4; state++) { - if (XKeycodeToKeysym(display, keycode, state) == keySym) { - if (state & 1) { - eventPtr->xkey.state |= ShiftMask; - } - if (state & 2) { - TkDisplay *dispPtr; - - dispPtr = ((TkWindow *) tkwin)->dispPtr; - eventPtr->xkey.state |= dispPtr->modeModMask; - } - break; - } - } - } - eventPtr->xkey.keycode = keycode; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetKeySym -- - * - * Given an X KeyPress or KeyRelease event, map the - * keycode in the event into a KeySym. - * - * Results: - * The return value is the KeySym corresponding to - * eventPtr, or NoSymbol if no matching Keysym could be - * found. - * - * Side effects: - * In the first call for a given display, keycode-to- - * KeySym maps get loaded. - * - *---------------------------------------------------------------------- - */ - -KeySym -TkpGetKeySym(dispPtr, eventPtr) - TkDisplay *dispPtr; /* Display in which to - * map keycode. */ - XEvent *eventPtr; /* Description of X event. */ -{ - KeySym sym; - int index; - - /* - * Refresh the mapping information if it's stale - */ - - if (dispPtr->bindInfoStale) { - TkpInitKeymapInfo(dispPtr); - } - - /* - * Figure out which of the four slots in the keymap vector to - * use for this key. Refer to Xlib documentation for more info - * on how this computation works. - */ - - index = 0; - if (eventPtr->xkey.state & dispPtr->modeModMask) { - index = 2; - } - if ((eventPtr->xkey.state & ShiftMask) - || ((dispPtr->lockUsage != LU_IGNORE) - && (eventPtr->xkey.state & LockMask))) { - index += 1; - } - sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, index); - - /* - * Special handling: if the key was shifted because of Lock, but - * lock is only caps lock, not shift lock, and the shifted keysym - * isn't upper-case alphabetic, then switch back to the unshifted - * keysym. - */ - - if ((index & 1) && !(eventPtr->xkey.state & ShiftMask) - && (dispPtr->lockUsage == LU_CAPS)) { - if (!(((sym >= XK_A) && (sym <= XK_Z)) - || ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) - || ((sym >= XK_Ooblique) && (sym <= XK_Thorn)))) { - index &= ~1; - sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, - index); - } - } - - /* - * Another bit of special handling: if this is a shifted key and there - * is no keysym defined, then use the keysym for the unshifted key. - */ - - if ((index & 1) && (sym == NoSymbol)) { - sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, - index & ~1); - } - return sym; -} - -/* - *-------------------------------------------------------------- - * - * TkpInitKeymapInfo -- - * - * This procedure is invoked to scan keymap information - * to recompute stuff that's important for binding, such - * as the modifier key (if any) that corresponds to "mode - * switch". - * - * Results: - * None. - * - * Side effects: - * Keymap-related information in dispPtr is updated. - * - *-------------------------------------------------------------- - */ - -void -TkpInitKeymapInfo(dispPtr) - TkDisplay *dispPtr; /* Display for which to recompute keymap - * information. */ -{ - XModifierKeymap *modMapPtr; - KeyCode *codePtr; - KeySym keysym; - int count, i, j, max, arraySize; -#define KEYCODE_ARRAY_SIZE 20 - - dispPtr->bindInfoStale = 0; - modMapPtr = XGetModifierMapping(dispPtr->display); - - /* - * Check the keycodes associated with the Lock modifier. If - * any of them is associated with the XK_Shift_Lock modifier, - * then Lock has to be interpreted as Shift Lock, not Caps Lock. - */ - - dispPtr->lockUsage = LU_IGNORE; - codePtr = modMapPtr->modifiermap + modMapPtr->max_keypermod*LockMapIndex; - for (count = modMapPtr->max_keypermod; count > 0; count--, codePtr++) { - if (*codePtr == 0) { - continue; - } - keysym = XKeycodeToKeysym(dispPtr->display, *codePtr, 0); - if (keysym == XK_Shift_Lock) { - dispPtr->lockUsage = LU_SHIFT; - break; - } - if (keysym == XK_Caps_Lock) { - dispPtr->lockUsage = LU_CAPS; - break; - } - } - - /* - * Look through the keycodes associated with modifiers to see if - * the the "mode switch", "meta", or "alt" keysyms are associated - * with any modifiers. If so, remember their modifier mask bits. - */ - - dispPtr->modeModMask = 0; - dispPtr->metaModMask = 0; - dispPtr->altModMask = 0; - codePtr = modMapPtr->modifiermap; - max = 8*modMapPtr->max_keypermod; - for (i = 0; i < max; i++, codePtr++) { - if (*codePtr == 0) { - continue; - } - keysym = XKeycodeToKeysym(dispPtr->display, *codePtr, 0); - if (keysym == XK_Mode_switch) { - dispPtr->modeModMask |= ShiftMask << (i/modMapPtr->max_keypermod); - } - if ((keysym == XK_Meta_L) || (keysym == XK_Meta_R)) { - dispPtr->metaModMask |= ShiftMask << (i/modMapPtr->max_keypermod); - } - if ((keysym == XK_Alt_L) || (keysym == XK_Alt_R)) { - dispPtr->altModMask |= ShiftMask << (i/modMapPtr->max_keypermod); - } - } - - /* - * Create an array of the keycodes for all modifier keys. - */ - - if (dispPtr->modKeyCodes != NULL) { - ckfree((char *) dispPtr->modKeyCodes); - } - dispPtr->numModKeyCodes = 0; - arraySize = KEYCODE_ARRAY_SIZE; - dispPtr->modKeyCodes = (KeyCode *) ckalloc((unsigned) - (KEYCODE_ARRAY_SIZE * sizeof(KeyCode))); - for (i = 0, codePtr = modMapPtr->modifiermap; i < max; i++, codePtr++) { - if (*codePtr == 0) { - continue; - } - - /* - * Make sure that the keycode isn't already in the array. - */ - - for (j = 0; j < dispPtr->numModKeyCodes; j++) { - if (dispPtr->modKeyCodes[j] == *codePtr) { - goto nextModCode; - } - } - if (dispPtr->numModKeyCodes >= arraySize) { - KeyCode *new; - - /* - * Ran out of space in the array; grow it. - */ - - arraySize *= 2; - new = (KeyCode *) ckalloc((unsigned) - (arraySize * sizeof(KeyCode))); - memcpy((VOID *) new, (VOID *) dispPtr->modKeyCodes, - (dispPtr->numModKeyCodes * sizeof(KeyCode))); - ckfree((char *) dispPtr->modKeyCodes); - dispPtr->modKeyCodes = new; - } - dispPtr->modKeyCodes[dispPtr->numModKeyCodes] = *codePtr; - dispPtr->numModKeyCodes++; - nextModCode: continue; - } - XFreeModifiermap(modMapPtr); -} diff --git a/mac/tkMacLibrary.r b/mac/tkMacLibrary.r deleted file mode 100644 index 88474f2..0000000 --- a/mac/tkMacLibrary.r +++ /dev/null @@ -1,73 +0,0 @@ -/* - * tkMacLibrary.r -- - * - * This file creates resources for use in most Tk applications. - * This is designed to be an example of using the Tcl/Tk - * libraries in a Macintosh Application. - * - * Copyright (c) 1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacLibrary.r,v 1.8 2002/09/12 17:34:16 das Exp $ - */ - -#include <Types.r> -#include <SysTypes.r> -#include <AEUserTermTypes.r> - -/* - * The folowing include and defines help construct - * the version string for Tcl. - */ - -#define RC_INVOKED -#include <tcl.h> -#include "tk.h" - -#if (TK_RELEASE_LEVEL == 0) -# define RELEASE_LEVEL alpha -#elif (TK_RELEASE_LEVEL == 1) -# define RELEASE_LEVEL beta -#elif (TK_RELEASE_LEVEL == 2) -# define RELEASE_LEVEL final -#endif - -#if (TK_RELEASE_LEVEL == 2) -# define MINOR_VERSION (TK_MINOR_VERSION * 16) + TK_RELEASE_SERIAL -# define RELEASE_CODE 0x00 -#else -# define MINOR_VERSION TK_MINOR_VERSION * 16 -# define RELEASE_CODE TK_RELEASE_SERIAL -#endif - -#define RELEASE_CODE 0x00 - -resource 'vers' (1) { - TK_MAJOR_VERSION, MINOR_VERSION, - RELEASE_LEVEL, RELEASE_CODE, verUS, - TK_PATCH_LEVEL, - TK_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team" -}; - -resource 'vers' (2) { - TK_MAJOR_VERSION, MINOR_VERSION, - RELEASE_LEVEL, RELEASE_CODE, verUS, - TK_PATCH_LEVEL, - "Tk Library " TK_PATCH_LEVEL " © 1993-2001" -}; - -/* - * The -16397 string will be displayed by Finder when a user - * tries to open the shared library. The string should - * give the user a little detail about the library's capabilities - * and enough information to install the library in the correct location. - * A similar string should be placed in all shared libraries. - */ -resource 'STR ' (-16397, purgeable) { - "Tk Library\n\n" - "This is the library needed to run Tcl/Tk programs. " - "To work properly, it should be placed in the Tool Command Language folder " - "within the Extensions folder." -}; diff --git a/mac/tkMacMDEF.c b/mac/tkMacMDEF.c deleted file mode 100644 index bf8743c..0000000 --- a/mac/tkMacMDEF.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * TkMacMDEF.c -- - * - * This module is implements the MDEF for tkMenus. The address of the - * real entry proc will be blasted into the MDEF. - * - * Copyright (c) 1996 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMDEF.c,v 1.2 1998/09/14 18:23:37 stanton Exp $ - */ - -#define MAC_TCL -#define NeedFunctionPrototypes 1 -#define NeedWidePrototypes 0 - -#include <Menus.h> -#include <LowMem.h> -#include "tkMacInt.h" - - -/* - * The following structure is built from assembly equates in MPW 3.0 - * AIncludes file: "Private.a." We're forced to update several locations not - * documented in "Inside Mac" to make our MDEF behave properly with hierarchical - * menus. - */ - -#if STRUCTALIGNMENTSUPPORTED -#pragma options align=mac68k -#endif -typedef struct mbPrivate { - Byte unknown[6]; - Rect mbItemRect; /* rect of currently chosen menu item */ -} mbPrivate; -#if STRUCTALIGNMENTSUPPORTED -#pragma options align=reset -#endif - -/* - * We are forced to update a low-memory global to get cascades to work. This - * global does not have a LMEquate associated with it. - */ - -#define SELECTRECT (*(Rect *)0x09fa) /* Menu select seems to need this */ -#define MBSAVELOC (*(short *)0x0B5C) /* address of handle to mbarproc private data redefined below */ - -pascal void main _ANSI_ARGS_((short message, - MenuHandle menu, Rect *menuRect, - Point hitPt, short *whichItem)); - - -/* - *---------------------------------------------------------------------- - * - * TkMacStdMenu -- - * - * The dispatch routine called by the system to handle menu drawing, - * scrolling, etc. This is a stub; the address of the real routine - * is blasted in. The real routine will be a UniversalProcPtr, - * which will give the real dispatch routine in Tk globals - * and the like. - * - * Results: - * None. - * - * Side effects: - * This routine causes menus to be drawn and will certainly allocate - * memory as a result. Also, the menu can scroll up and down, and - * various other interface actions can take place - * - *---------------------------------------------------------------------- - */ - -pascal void -main( - short message, /* What action are we taking? */ - MenuHandle menu, /* The menu we are working with */ - Rect *menuRect, /* A pointer to the rect we are working with */ - Point hitPt, /* Where the mouse was hit for appropriate - * messages. */ - short *whichItemPtr) /* Output result. Which item was hit by - * the user? */ -{ - /* - * The constant 'MDEF' is what will be punched during menu intialization. - */ - - TkMenuDefProcPtr procPtr = (TkMenuDefProcPtr) 'MDEF'; - TkMenuLowMemGlobals globals; - short oldItem; - - globals.menuDisable = LMGetMenuDisable(); - globals.menuTop = LMGetTopMenuItem(); - globals.menuBottom = LMGetAtMenuBottom(); - if (MBSAVELOC == -1) { - globals.itemRect = (**(mbPrivate***)&MBSAVELOC)->mbItemRect; - } - if (message == mChooseMsg) { - oldItem = *whichItemPtr; - } - - TkCallMenuDefProc(procPtr, message, menu, menuRect, hitPt, whichItemPtr, - &globals); - - LMSetMenuDisable(globals.menuDisable); - LMSetTopMenuItem(globals.menuTop); - LMSetAtMenuBottom(globals.menuBottom); - if ((message == mChooseMsg) && (oldItem != *whichItemPtr) - && (MBSAVELOC != -1)) { - (**(mbPrivate***)&MBSAVELOC)->mbItemRect = globals.itemRect; - SELECTRECT = globals.itemRect; - } -} diff --git a/mac/tkMacMDEF.r b/mac/tkMacMDEF.r deleted file mode 100644 index 3fdde61..0000000 --- a/mac/tkMacMDEF.r +++ /dev/null @@ -1,45 +0,0 @@ -/* - * tkMacMDEF.r -- - * - * This file contains the actual MDEF. Since this is not likely to - * change much, this seems the easiest method to use. The address - * of the routine descriptor is written into offset 0x24 hex, and - * then when the MDEF is called, the Mixed Mode Manager will take - * care of the setup. - * - * This file also contains the icons 'SICN' used by the menu code - * in menu items. - * - * Copyright (c) 1996-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMDEF.r,v 1.3 2001/11/23 02:06:02 das Exp $ - */ - -#include <Types.r> - -/* - * This code was generated by a project file and will not need to be changed. - * It is just a stub. The address of the real MDEF handler will be blasted - * in. - */ - -data 'MDEF' (591, preload) { - $"600A 0000 4D44 4546 024F 0000 4EFA 0004" /* `...MDEF.O..N™.. */ - $"4E75 48E7 1030 4FEF FFEE 266F 0022 247C" /* NuHÁ.0OÔÓ&o."$| */ - $"4D44 4546 594F 2EB8 0B54 2E9F 554F 3EB8" /* MDEFYO.½.T.üUO>½ */ - $"0A0A 3F5F 0004 554F 3EB8 0A0C 3F5F 0006" /* ..?_..UO>½..?_.. */ - $"3038 0B5C 48C0 0C80 FFFF FFFF 6612 2078" /* 08.\H¿.Äf. x */ - $"0B5C 2050 2F68 0006 0008 2F68 000A 000C" /* .\ P/h..../h.... */ - $"302F 0032 48C0 0C80 0000 0001 6602 3613" /* 0/.2H¿.Ä....f.6. */ - $"3F2F 0032 2F2F 0030 2F2F 0030 2F2F 0030" /* ?/.2//.0//.0//.0 */ - $"2F0B 486F 0012 4E92 2F17 21DF 0B54 3F2F" /* /.Ho..Ní/.!þ.T?/ */ - $"0004 31DF 0A0A 3F2F 0006 31DF 0A0C 302F" /* ..1þ..?/..1þ..0/ */ - $"0032 48C0 0C80 0000 0001 6638 3013 48C0" /* .2H¿.Ä....f80.H¿ */ - $"3203 48C1 B280 672C 3038 0B5C 48C0 0C80" /* 2.H¡¾Äg,08.\H¿.Ä */ - $"FFFF FFFF 671E 2078 0B5C 2050 216F 0008" /* g. x.\ P!o.. */ - $"0006 216F 000C 000A 21EF 0008 09FA 21EF" /* ..!o....!Ô..™!Ô */ - $"000C 09FE 4FEF 0012 4CDF 0C08 4E74 0012" /* ..œOÔ..Lþ..Nt.. */ -}; diff --git a/mac/tkMacMenu.c b/mac/tkMacMenu.c deleted file mode 100644 index ed29f5d..0000000 --- a/mac/tkMacMenu.c +++ /dev/null @@ -1,4607 +0,0 @@ -/* - * tkMacMenu.c -- - * - * This module implements the Mac-platform specific features of menus. - * - * Copyright (c) 1996-1997 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMenu.c,v 1.21 2001/11/23 02:06:07 das Exp $ - */ - -#include "tkMacInt.h" -#include "tkMenu.h" -#include "tkMenuButton.h" -#include "tkColor.h" -#include "tkMacInt.h" -#undef Status -#include <Menus.h> -#include <OSUtils.h> -#include <Palettes.h> -#include <Resources.h> -#include <string.h> -#include <ToolUtils.h> -#include <Balloons.h> -#include <Appearance.h> -#include <Devices.h> - -typedef struct MacMenu { - MenuHandle menuHdl; /* The Menu Manager data structure. */ - Rect menuRect; /* The rectangle as calculated in the - * MDEF. This is used to figure ou the - * clipping rgn before we push - * the <<MenuSelect>> virtual binding - * through. */ -} MacMenu; - -typedef struct MenuEntryUserData { - Drawable mdefDrawable; - TkMenuEntry *mePtr; - Tk_Font tkfont; - Tk_FontMetrics *fmPtr; -} MenuEntryUserData; -/* - * Various geometry definitions: - */ - -#define CASCADE_ARROW_HEIGHT 10 -#define CASCADE_ARROW_WIDTH 8 -#define DECORATION_BORDER_WIDTH 2 -#define MAC_MARGIN_WIDTH 8 - -/* - * The following are constants relating to the SICNs used for drawing the MDEF. - */ - -#define SICN_RESOURCE_NUMBER 128 - -#define SICN_HEIGHT 16 -#define SICN_ROWS 2 -#define CASCADE_ICON_WIDTH 7 -#define SHIFT_ICON_WIDTH 10 -#define OPTION_ICON_WIDTH 16 -#define CONTROL_ICON_WIDTH 12 -#define COMMAND_ICON_WIDTH 10 - -#define CASCADE_ARROW 0 -#define SHIFT_ICON 1 -#define OPTION_ICON 2 -#define CONTROL_ICON 3 -#define COMMAND_ICON 4 -#define DOWN_ARROW 5 -#define UP_ARROW 6 - -/* - * Platform specific flags for menu entries - * - * ENTRY_COMMAND_ACCEL Indicates the entry has the command key - * in its accelerator string. - * ENTRY_OPTION_ACCEL Indicates the entry has the option key - * in its accelerator string. - * ENTRY_SHIFT_ACCEL Indicates the entry has the shift key - * in its accelerator string. - * ENTRY_CONTROL_ACCEL Indicates the entry has the control key - * in its accelerator string. - */ - -#define ENTRY_COMMAND_ACCEL ENTRY_PLATFORM_FLAG1 -#define ENTRY_OPTION_ACCEL ENTRY_PLATFORM_FLAG2 -#define ENTRY_SHIFT_ACCEL ENTRY_PLATFORM_FLAG3 -#define ENTRY_CONTROL_ACCEL ENTRY_PLATFORM_FLAG4 -#define ENTRY_ACCEL_MASK (ENTRY_COMMAND_ACCEL | ENTRY_OPTION_ACCEL \ - | ENTRY_SHIFT_ACCEL | ENTRY_CONTROL_ACCEL) - -/* - * This structure is used to keep track of subfields within Macintosh menu - * items. - */ - -typedef struct EntryGeometry { - int accelTextStart; /* Offset into the accel string where - * the text starts. Everything before - * this is modifier key descriptions. - */ - int modifierWidth; /* Width of modifier symbols. */ - int accelTextWidth; /* Width of the text after the modifier - * keys. */ - int nonAccelMargin; /* The width of the margin for entries - * without accelerators. */ -} EntryGeometry; - -/* - * Structure to keep track of toplevel windows and their menubars. - */ - -typedef struct TopLevelMenubarList { - struct TopLevelMenubarList *nextPtr; - /* The next window in the list. */ - Tk_Window tkwin; /* The toplevel window. */ - TkMenu *menuPtr; /* The menu associated with this - * toplevel. */ -} TopLevelMenubarList; - -/* - * Platform-specific flags for menus. - * - * MENU_APPLE_MENU 0 indicates a custom Apple menu has - * not been installed; 1 a custom Apple - * menu has been installed. - * MENU_HELP_MENU 0 indicates a custom Help menu has - * not been installed; 1 a custom Help - * menu has been installed. - * MENU_RECONFIGURE_PENDING 1 indicates that an idle handler has - * been scheduled to reconfigure the - * Macintosh MenuHandle. - */ - -#define MENU_APPLE_MENU MENU_PLATFORM_FLAG1 -#define MENU_HELP_MENU MENU_PLATFORM_FLAG2 -#define MENU_RECONFIGURE_PENDING MENU_PLATFORM_FLAG3 - -#define CASCADE_CMD (0x1b) - /* The special command char for cascade - * menus. */ -#define SEPARATOR_TEXT "\p(-" - /* The text for a menu separator. */ - -#define MENUBAR_REDRAW_PENDING 1 - -static int gNoTkMenus = 0; /* This is used by Tk_MacTurnOffMenus as the - * flag that Tk is not to draw any menus. */ -RgnHandle tkMenuCascadeRgn = NULL; - /* The region to clip drawing to when the - * MDEF is up. */ -int tkUseMenuCascadeRgn = 0; /* If this is 1, clipping code - * should intersect tkMenuCascadeRgn - * before drawing occurs. - * tkMenuCascadeRgn will only - * be valid when the value of this - * variable is 1. */ - -static Tcl_HashTable commandTable; - /* The list of menuInstancePtrs associated with - * menu ids */ -static short currentAppleMenuID; - /* The id of the current Apple menu. 0 for - * none. */ -static short currentHelpMenuID; /* The id of the current Help menu. 0 for - * none. */ -static Tcl_Interp *currentMenuBarInterp; - /* The interpreter of the window that owns - * the current menubar. */ -static char *currentMenuBarName; - /* Malloced. Name of current menu in menu bar. - * NULL if no menu set. TO DO: make this a - * DString. */ -static Tk_Window currentMenuBarOwner; - /* Which window owns the current menu bar. */ -static char elipsisString[TCL_UTF_MAX + 1]; - /* The UTF representation of the elipsis (Š) - * character. */ -static int helpItemCount; /* The number of items in the help menu. - * -1 means that the help menu is - * unavailable. This does not include - * the automatically generated separator. */ -static int inPostMenu; /* We cannot be re-entrant like X - * windows. */ -static short lastMenuID; /* To pass to NewMenu; need to figure out - * a good way to do this. */ -static unsigned char lastCascadeID; - /* Cascades have to have ids that are - * less than 256. */ -static MacDrawable macMDEFDrawable; - /* Drawable for use by MDEF code */ -static MDEFScrollFlag = 0; /* Used so that popups don't scroll too soon. */ -static int menuBarFlags; /* Used for whether the menu bar needs - * redrawing or not. */ -static TkMenuDefUPP menuDefProc = NULL ; - /* The routine descriptor to the MDEF proc. - * The MDEF is needed to draw menus with - * non-standard attributes and to support - * tearoff menus. */ -static struct TearoffSelect { - TkMenu *menuPtr; /* The menu that is torn off */ - Point point; /* The point to place the new menu */ - Rect excludeRect; /* We don't want to drag tearoff highlights - * when we are in this menu */ -} tearoffStruct; - -static RgnHandle totalMenuRgn = NULL; - /* Used to update windows which have been - * obscured by menus. */ -static RgnHandle utilRgn = NULL;/* Used when creating the region that is to - * be clipped out while the MDEF is active. */ - -static TopLevelMenubarList *windowListPtr; - /* A list of windows that have menubars set. */ -static MenuItemDrawingUPP tkThemeMenuItemDrawingUPP; - /* Points to the UPP for theme Item drawing. */ - - -/* - * Forward declarations for procedures defined later in this file: - */ - -static void CompleteIdlers _ANSI_ARGS_((TkMenu *menuPtr)); -static void DrawMenuBarWhenIdle _ANSI_ARGS_(( - ClientData clientData)); -static void DrawMenuBackground _ANSI_ARGS_(( - Rect *menuRectPtr, Drawable d, ThemeMenuType type)); -static void DrawMenuEntryAccelerator _ANSI_ARGS_(( - TkMenu *menuPtr, TkMenuEntry *mePtr, - Drawable d, GC gc, Tk_Font tkfont, - CONST Tk_FontMetrics *fmPtr, - Tk_3DBorder activeBorder, int x, int y, - int width, int height, int drawArrow)); -static void DrawMenuEntryBackground _ANSI_ARGS_(( - TkMenu *menuPtr, TkMenuEntry *mePtr, - Drawable d, Tk_3DBorder activeBorder, - Tk_3DBorder bgBorder, int x, int y, - int width, int heigth)); -static void DrawMenuEntryIndicator _ANSI_ARGS_(( - TkMenu *menuPtr, TkMenuEntry *mePtr, - Drawable d, GC gc, GC indicatorGC, - Tk_Font tkfont, - CONST Tk_FontMetrics *fmPtr, int x, int y, - int width, int height)); -static void DrawMenuEntryLabel _ANSI_ARGS_(( - TkMenu * menuPtr, TkMenuEntry *mePtr, Drawable d, - GC gc, Tk_Font tkfont, - CONST Tk_FontMetrics *fmPtr, int x, int y, - int width, int height)); -static void DrawMenuSeparator _ANSI_ARGS_((TkMenu *menuPtr, - TkMenuEntry *mePtr, Drawable d, GC gc, - Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, - int x, int y, int width, int height)); -static void DrawTearoffEntry _ANSI_ARGS_((TkMenu *menuPtr, - TkMenuEntry *mePtr, Drawable d, GC gc, - Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, - int x, int y, int width, int height)); -static Handle FixMDEF _ANSI_ARGS_((void)); -static void GetEntryText _ANSI_ARGS_((TkMenuEntry *mePtr, - Tcl_DString *dStringPtr)); -static void GetMenuAccelGeometry _ANSI_ARGS_((TkMenu *menuPtr, - TkMenuEntry *mePtr, Tk_Font tkfont, - CONST Tk_FontMetrics *fmPtr, int *modWidthPtr, - int *textWidthPtr, int *heightPtr)); -static void GetMenuLabelGeometry _ANSI_ARGS_((TkMenuEntry *mePtr, - Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, - int *widthPtr, int *heightPtr)); -static void GetMenuIndicatorGeometry _ANSI_ARGS_(( - TkMenu *menuPtr, TkMenuEntry *mePtr, - Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, - int *widthPtr, int *heightPtr)); -static void GetMenuSeparatorGeometry _ANSI_ARGS_(( - TkMenu *menuPtr, TkMenuEntry *mePtr, - Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, - int *widthPtr, int *heightPtr)); -static void GetTearoffEntryGeometry _ANSI_ARGS_((TkMenu *menuPtr, - TkMenuEntry *mePtr, Tk_Font tkfont, - CONST Tk_FontMetrics *fmPtr, int *widthPtr, - int *heightPtr)); -static int GetNewID _ANSI_ARGS_((Tcl_Interp *interp, - TkMenu *menuInstPtr, int cascade, - short *menuIDPtr)); -static char FindMarkCharacter _ANSI_ARGS_((TkMenuEntry *mePtr)); -static void FreeID _ANSI_ARGS_((short menuID)); -static void InvalidateMDEFRgns _ANSI_ARGS_((void)); -static void MenuDefProc _ANSI_ARGS_((short message, - MenuHandle menu, Rect *menuRectPtr, - Point hitPt, short *whichItem, - TkMenuLowMemGlobals *globalsPtr)); -static void MenuSelectEvent _ANSI_ARGS_((TkMenu *menuPtr)); -static void ReconfigureIndividualMenu _ANSI_ARGS_(( - TkMenu *menuPtr, MenuHandle macMenuHdl, - int base)); -static void ReconfigureMacintoshMenu _ANSI_ARGS_ (( - ClientData clientData)); -static void RecursivelyClearActiveMenu _ANSI_ARGS_(( - TkMenu *menuPtr)); -static void RecursivelyDeleteMenu _ANSI_ARGS_(( - TkMenu *menuPtr)); -static void RecursivelyInsertMenu _ANSI_ARGS_(( - TkMenu *menuPtr)); -static void SetDefaultMenubar _ANSI_ARGS_((void)); -static int SetMenuCascade _ANSI_ARGS_((TkMenu *menuPtr)); -static void SetMenuIndicator _ANSI_ARGS_((TkMenuEntry *mePtr)); -static void SetMenuTitle _ANSI_ARGS_((MenuHandle menuHdl, - Tcl_Obj *titlePtr)); -static void AppearanceEntryDrawWrapper _ANSI_ARGS_((TkMenuEntry *mePtr, - Rect * menuRectPtr, TkMenuLowMemGlobals *globalsPtr, - Drawable d, Tk_FontMetrics *fmPtr, Tk_Font tkfont, - int x, int y, int width, int height)); -pascal void tkThemeMenuItemDrawingProc _ANSI_ARGS_ ((const Rect *inBounds, - SInt16 inDepth, Boolean inIsColorDevice, - SInt32 inUserData)); - - -/* - *---------------------------------------------------------------------- - * - * TkMacUseID -- - * - * Take the ID out of the available list for new menus. Used by the - * default menu bar's menus so that they do not get created at the tk - * level. See GetNewID for more information. - * - * Results: - * Returns TCL_OK if the id was not in use. Returns TCL_ERROR if the - * id was in use. - * - * Side effects: - * A hash table entry in the command table is created with a NULL - * value. - * - *---------------------------------------------------------------------- - */ - -int -TkMacUseMenuID( - short macID) /* The id to take out of the table */ -{ - Tcl_HashEntry *commandEntryPtr; - int newEntry; - - TkMenuInit(); - commandEntryPtr = Tcl_CreateHashEntry(&commandTable, (char *) macID, - &newEntry); - if (newEntry == 1) { - Tcl_SetHashValue(commandEntryPtr, NULL); - return TCL_OK; - } else { - return TCL_ERROR; - } -} - -/* - *---------------------------------------------------------------------- - * - * GetNewID -- - * - * Allocates a new menu id and marks it in use. Each menu on the - * mac must be designated by a unique id, which is a short. In - * addition, some ids are reserved by the system. Since Tk uses - * mostly dynamic menus, we must allocate and free these ids on - * the fly. We use the id as a key into a hash table; if there - * is no hash entry, we know that we can use the id. - * - * Results: - * Returns TCL_OK if succesful; TCL_ERROR if there are no more - * ids of the appropriate type to allocate. menuIDPtr contains - * the new id if succesful. - * - * Side effects: - * An entry is created for the menu in the command hash table, - * and the hash entry is stored in the appropriate field in the - * menu data structure. - * - *---------------------------------------------------------------------- - */ - -static int -GetNewID( - Tcl_Interp *interp, /* Used for error reporting */ - TkMenu *menuPtr, /* The menu we are working with */ - int cascade, /* 0 if we are working with a normal menu; - 1 if we are working with a cascade */ - short *menuIDPtr) /* The resulting id */ -{ - int found = 0; - int newEntry; - Tcl_HashEntry *commandEntryPtr; - short returnID = *menuIDPtr; - - /* - * The following code relies on shorts and unsigned chars wrapping - * when the highest value is incremented. Also, the values between - * 236 and 255 inclusive are reserved for DA's by the Mac OS. - */ - - if (!cascade) { - short curID = lastMenuID + 1; - if (curID == 236) { - curID = 256; - } - - while (curID != lastMenuID) { - commandEntryPtr = Tcl_CreateHashEntry(&commandTable, - (char *) curID, &newEntry); - if (newEntry == 1) { - found = 1; - lastMenuID = returnID = curID; - break; - } - curID++; - if (curID == 236) { - curID = 256; - } - } - } else { - - /* - * Cascade ids must be between 0 and 235 only, so they must be - * dealt with separately. - */ - - unsigned char curID = lastCascadeID + 1; - if (curID == 236) { - curID = 0; - } - - while (curID != lastCascadeID) { - commandEntryPtr = Tcl_CreateHashEntry(&commandTable, - (char *) curID, &newEntry); - if (newEntry == 1) { - found = 1; - lastCascadeID = returnID = curID; - break; - } - curID++; - if (curID == 236) { - curID = 0; - } - } - } - - if (found) { - Tcl_SetHashValue(commandEntryPtr, (char *) menuPtr); - *menuIDPtr = returnID; - return TCL_OK; - } else { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "No more menus can be allocated.", - (char *) NULL); - return TCL_ERROR; - } -} - -/* - *---------------------------------------------------------------------- - * - * FreeID -- - * - * Marks the id as free. - * - * Results: - * None. - * - * Side effects: - * The hash table entry for the ID is cleared. - * - *---------------------------------------------------------------------- - */ - -static void -FreeID( - short menuID) /* The id to free */ -{ - Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(&commandTable, - (char *) menuID); - - if (entryPtr != NULL) { - Tcl_DeleteHashEntry(entryPtr); - } - if (menuID == currentAppleMenuID) { - currentAppleMenuID = 0; - } - if (menuID == currentHelpMenuID) { - currentHelpMenuID = 0; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpNewMenu -- - * - * Gets a new blank menu. Only the platform specific options are filled - * in. - * - * Results: - * Returns a standard TCL error. - * - * Side effects: - * Allocates a Macintosh menu handle and puts in the platformData - * field of the menuPtr. - * - *---------------------------------------------------------------------- - */ - -int -TkpNewMenu( - TkMenu *menuPtr) /* The common structure we are making the - * platform structure for. */ -{ - short menuID; - Str255 itemText; - int length; - MenuHandle macMenuHdl; - int error = TCL_OK; - - error = GetNewID(menuPtr->interp, menuPtr, 0, &menuID); - if (error != TCL_OK) { - return error; - } - length = strlen(Tk_PathName(menuPtr->tkwin)); - memmove(&itemText[1], Tk_PathName(menuPtr->tkwin), - (length > 230) ? 230 : length); - itemText[0] = (length > 230) ? 230 : length; - macMenuHdl = NewMenu(menuID, itemText); -#if GENERATINGCFM - { - Handle mdefProc = FixMDEF(); - if ((mdefProc != NULL)) { - (*macMenuHdl)->menuProc = mdefProc; - } - } -#endif - menuPtr->platformData = (TkMenuPlatformData) ckalloc(sizeof(MacMenu)); - ((MacMenu *) menuPtr->platformData)->menuHdl = macMenuHdl; - SetRect(&((MacMenu *) menuPtr->platformData)->menuRect, 0, 0, 0, 0); - - if ((currentMenuBarInterp == menuPtr->interp) - && (currentMenuBarName != NULL)) { - Tk_Window parentWin = Tk_Parent(menuPtr->tkwin); - - if (strcmp(currentMenuBarName, Tk_PathName(parentWin)) == 0) { - if ((strcmp(Tk_PathName(menuPtr->tkwin) - + strlen(Tk_PathName(parentWin)), ".apple") == 0) - || (strcmp(Tk_PathName(menuPtr->tkwin) - + strlen(Tk_PathName(parentWin)), ".help") == 0)) { - if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) { - Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL); - menuBarFlags |= MENUBAR_REDRAW_PENDING; - } - } - } - } - - menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyMenu -- - * - * Destroys platform-specific menu structures. - * - * Results: - * None. - * - * Side effects: - * All platform-specific allocations are freed up. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyMenu( - TkMenu *menuPtr) /* The common menu structure */ -{ - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - - if (menuPtr->menuFlags & MENU_RECONFIGURE_PENDING) { - Tcl_CancelIdleCall(ReconfigureMacintoshMenu, (ClientData) menuPtr); - menuPtr->menuFlags &= ~MENU_RECONFIGURE_PENDING; - } - - if ((*macMenuHdl)->menuID == currentHelpMenuID) { - MenuHandle helpMenuHdl; - - if ((HMGetHelpMenuHandle(&helpMenuHdl) == noErr) - && (helpMenuHdl != NULL)) { - int i, count = CountMItems(helpMenuHdl); - - for (i = helpItemCount; i <= count; i++) { - DeleteMenuItem(helpMenuHdl, helpItemCount); - } - } - currentHelpMenuID = 0; - } - - if (menuPtr->platformData != NULL) { - DeleteMenu((*macMenuHdl)->menuID); - FreeID((*macMenuHdl)->menuID); - DisposeMenu(macMenuHdl); - ckfree((char *) menuPtr->platformData); - menuPtr->platformData = NULL; - } -} - -/* - *---------------------------------------------------------------------- - * - * SetMenuCascade -- - * - * Does any cleanup to change a menu from a normal to a cascade. - * - * Results: - * Standard Tcl error. - * - * Side effects: - * The mac menu id is reset. - * - *---------------------------------------------------------------------- - */ - -static int -SetMenuCascade( - TkMenu* menuPtr) /* The menu we are setting up to be a - * cascade. */ -{ - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - short newMenuID, menuID = (*macMenuHdl)->menuID; - int error = TCL_OK; - - if (menuID >= 256) { - error = GetNewID(menuPtr->interp, menuPtr, 1, &newMenuID); - if (error == TCL_OK) { - FreeID(menuID); - (*macMenuHdl)->menuID = newMenuID; - } - } - return error; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyMenuEntry -- - * - * Cleans up platform-specific menu entry items. - * - * Results: - * None - * - * Side effects: - * All platform-specific allocations are freed up. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyMenuEntry( - TkMenuEntry *mePtr) /* The common structure for the menu - * entry. */ -{ - TkMenu *menuPtr = mePtr->menuPtr; - - ckfree((char *) mePtr->platformEntryData); - if ((menuPtr->platformData != NULL) - && !(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) { - menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * GetEntryText -- - * - * Given a menu entry, gives back the text that should go in it. - * Separators should be done by the caller, as they have to be - * handled specially. This is primarily used to do a substitution - * between "..." and "Š". - * - * Results: - * itemText points to the new text for the item. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetEntryText( - TkMenuEntry *mePtr, /* A pointer to the menu entry. */ - Tcl_DString *dStringPtr) /* The DString to put the text into. This - * will be initialized by this routine. */ -{ - Tcl_DStringInit(dStringPtr); - if (mePtr->type == TEAROFF_ENTRY) { - Tcl_DStringAppend(dStringPtr, "(Tear-off)", -1); - } else if ((mePtr->imagePtr != NULL) && (mePtr->compound == COMPOUND_NONE)) { - Tcl_DStringAppend(dStringPtr, "(Image)", -1); - } else if ((mePtr->bitmapPtr != NULL) && (mePtr->compound == COMPOUND_NONE)) { - Tcl_DStringAppend(dStringPtr, "(Pixmap)", -1); - } else if (mePtr->labelPtr == NULL || mePtr->labelLength == 0) { - /* - * The Mac menu manager does not like null strings. - */ - - Tcl_DStringAppend(dStringPtr, " ", -1); - } else { - int length; - char *text = Tcl_GetStringFromObj(mePtr->labelPtr, &length); - char *dStringText; - int i; - - for (i = 0; *text; text++, i++) { - if ((*text == '.') - && (*(text + 1) != '\0') && (*(text + 1) == '.') - && (*(text + 2) != '\0') && (*(text + 2) == '.')) { - Tcl_DStringAppend(dStringPtr, elipsisString, -1); - i += strlen(elipsisString) - 1; - text += 2; - } else { - Tcl_DStringSetLength(dStringPtr, - Tcl_DStringLength(dStringPtr) + 1); - dStringText = Tcl_DStringValue(dStringPtr); - dStringText[i] = *text; - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * FindMarkCharacter -- - * - * Finds the Macintosh mark character based on the font of the - * item. We calculate a good mark character based on the font - * that this item is rendered in. - * - * We try the following special mac characters. If none of them - * are present, just use the check mark. - * '' - Check mark character (\022) - * '€' - Mac Bullet character (\245) - * '' - Filled diamond (\023) - * '×' - Hollow diamond (\327) - * '‹' = Mac Long dash ("em dash") (\321) - * '-' = short dash (minus, "en dash"); - * - * Results: - * None. - * - * Side effects: - * New item is added to platform menu - * - *---------------------------------------------------------------------- - */ - -static char -FindMarkCharacter( - TkMenuEntry *mePtr) /* The entry we are finding the character - * for. */ -{ - char markChar; - Tk_Font tkfont; - - tkfont = Tk_GetFontFromObj(mePtr->menuPtr->tkwin, - (mePtr->fontPtr == NULL) ? mePtr->menuPtr->fontPtr - : mePtr->fontPtr); - - if (!TkMacIsCharacterMissing(tkfont, '\022')) { - markChar = '\022'; /* Check mark */ - } else if (!TkMacIsCharacterMissing(tkfont, '\245')) { - markChar = '\245'; /* Bullet */ - } else if (!TkMacIsCharacterMissing(tkfont, '\023')) { - markChar = '\023'; /* Filled Diamond */ - } else if (!TkMacIsCharacterMissing(tkfont, '\327')) { - markChar = '\327'; /* Hollow Diamond */ - } else if (!TkMacIsCharacterMissing(tkfont, '\321')) { - markChar = '\321'; /* Long Dash */ - } else if (!TkMacIsCharacterMissing(tkfont, '-')) { - markChar = '-'; /* Short Dash */ - } else { - markChar = '\022'; /* Check mark */ - } - return markChar; -} - -/* - *---------------------------------------------------------------------- - * - * SetMenuIndicator -- - * - * Sets the Macintosh mark character based on the font of the - * item. - * - * Results: - * None. - * - * Side effects: - * New item is added to platform menu - * - *---------------------------------------------------------------------- - */ - -static void -SetMenuIndicator( - TkMenuEntry *mePtr) /* The entry we are setting */ -{ - TkMenu *menuPtr = mePtr->menuPtr; - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - char markChar; - - /* - * There can be no indicators on menus that are not checkbuttons - * or radiobuttons. However, we should go ahead and set them - * so that menus look right when they are displayed. We should - * not set cascade entries, however, as the mark character - * means something different for cascade items on the Mac. - * Also, we do reflect the tearOff menu items in the Mac menu - * handle, so we ignore them. - */ - - if (mePtr->type == CASCADE_ENTRY) { - return; - } - - markChar = 0; - if ((mePtr->type == RADIO_BUTTON_ENTRY) - || (mePtr->type == CHECK_BUTTON_ENTRY)) { - if (mePtr->indicatorOn && (mePtr->entryFlags & ENTRY_SELECTED)) { - markChar = FindMarkCharacter(mePtr); - } - } - SetItemMark(macMenuHdl, mePtr->index + 1, markChar); -} - -/* - *---------------------------------------------------------------------- - * - * SetMenuTitle -- - * - * Sets title of menu so that the text displays correctly in menubar. - * This code directly manipulates menu handle data. This code - * was originally part of an ancient Apple Developer Response mail. - * - * Results: - * None. - * - * Side effects: - * The menu handle will change size depending on the length of the - * title - * - *---------------------------------------------------------------------- - */ - -static void -SetMenuTitle( - MenuHandle menuHdl, /* The menu we are setting the title of. */ - Tcl_Obj *titlePtr) /* The C string to set the title to. */ -{ - int oldLength, newLength, oldHandleSize, dataLength; - Ptr menuDataPtr; - char *title = (titlePtr == NULL) ? "" - : Tcl_GetStringFromObj(titlePtr, NULL); - - menuDataPtr = (Ptr) (*menuHdl)->menuData; - - if (strncmp(title, menuDataPtr + 1, menuDataPtr[0]) != 0) { - newLength = strlen(title) + 1; - oldLength = menuDataPtr[0] + 1; - oldHandleSize = GetHandleSize((Handle) menuHdl); - dataLength = oldHandleSize - (sizeof(MenuInfo) - sizeof(Str255)) - - oldLength; - if (newLength > oldLength) { - SetHandleSize((Handle) menuHdl, oldHandleSize + (newLength - - oldLength)); - menuDataPtr = (Ptr) (*menuHdl)->menuData; - } - - BlockMove(menuDataPtr + oldLength, menuDataPtr + newLength, - dataLength); - BlockMove(title, menuDataPtr + 1, newLength - 1); - menuDataPtr[0] = newLength - 1; - - if (newLength < oldLength) { - SetHandleSize((Handle) menuHdl, oldHandleSize + (newLength - - oldLength)); - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpConfigureMenuEntry -- - * - * Processes configurations for menu entries. - * - * Results: - * Returns standard TCL result. If TCL_ERROR is returned, then - * the interp's result contains an error message. - * - * Side effects: - * Configuration information get set for mePtr; old resources - * get freed, if any need it. - * - *---------------------------------------------------------------------- - */ - -int -TkpConfigureMenuEntry( - register TkMenuEntry *mePtr) /* Information about menu entry; may - * or may not already have values for - * some fields. */ -{ - TkMenu *menuPtr = mePtr->menuPtr; - int index = mePtr->index; - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - MenuHandle helpMenuHdl = NULL; - - /* - * Cascade menus have to have menu IDs of less than 256. So - * we need to change the child menu if this has been configured - * for a cascade item. - */ - - if (mePtr->type == CASCADE_ENTRY) { - if ((mePtr->childMenuRefPtr != NULL) - && (mePtr->childMenuRefPtr->menuPtr != NULL)) { - MenuHandle childMenuHdl = ((MacMenu *) mePtr - ->childMenuRefPtr->menuPtr->platformData)->menuHdl; - - if (childMenuHdl != NULL) { - int error = SetMenuCascade(mePtr->childMenuRefPtr->menuPtr); - - if (error != TCL_OK) { - return error; - } - - if (menuPtr->menuType == MENUBAR) { - SetMenuTitle(childMenuHdl, mePtr->labelPtr); - } - } - } - } - - /* - * We need to parse the accelerator string. If it has the strings - * for Command, Control, Shift or Option, we need to flag it - * so we can draw the symbols for it. We also need to precalcuate - * the position of the first real character we are drawing. - */ - - if (0 == mePtr->accelLength) { - ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart = -1; - } else { - char *accelString = (mePtr->accelPtr == NULL) ? "" - : Tcl_GetStringFromObj(mePtr->accelPtr, NULL); - char *accel = accelString; - mePtr->entryFlags |= ~ENTRY_ACCEL_MASK; - - while (1) { - if ((0 == strncasecmp("Control", accelString, 6)) - && (('-' == accelString[6]) || ('+' == accelString[6]))) { - mePtr->entryFlags |= ENTRY_CONTROL_ACCEL; - accelString += 7; - } else if ((0 == strncasecmp("Ctrl", accelString, 4)) - && (('-' == accelString[4]) || ('+' == accelString[4]))) { - mePtr->entryFlags |= ENTRY_CONTROL_ACCEL; - accelString += 5; - } else if ((0 == strncasecmp("Shift", accelString, 5)) - && (('-' == accelString[5]) || ('+' == accelString[5]))) { - mePtr->entryFlags |= ENTRY_SHIFT_ACCEL; - accelString += 6; - } else if ((0 == strncasecmp("Option", accelString, 6)) - && (('-' == accelString[6]) || ('+' == accelString[6]))) { - mePtr->entryFlags |= ENTRY_OPTION_ACCEL; - accelString += 7; - } else if ((0 == strncasecmp("Opt", accelString, 3)) - && (('-' == accelString[3]) || ('+' == accelString[3]))) { - mePtr->entryFlags |= ENTRY_OPTION_ACCEL; - accelString += 4; - } else if ((0 == strncasecmp("Command", accelString, 7)) - && (('-' == accelString[7]) || ('+' == accelString[7]))) { - mePtr->entryFlags |= ENTRY_COMMAND_ACCEL; - accelString += 8; - } else if ((0 == strncasecmp("Cmd", accelString, 3)) - && (('-' == accelString[3]) || ('+' == accelString[3]))) { - mePtr->entryFlags |= ENTRY_COMMAND_ACCEL; - accelString += 4; - } else if ((0 == strncasecmp("Alt", accelString, 3)) - && (('-' == accelString[3]) || ('+' == accelString[3]))) { - mePtr->entryFlags |= ENTRY_OPTION_ACCEL; - accelString += 4; - } else if ((0 == strncasecmp("Meta", accelString, 4)) - && (('-' == accelString[4]) || ('+' == accelString[4]))) { - mePtr->entryFlags |= ENTRY_COMMAND_ACCEL; - accelString += 5; - } else { - break; - } - } - - ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart - = ((long) accelString - (long) accel); - } - - if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) { - menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr); - } - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * ReconfigureIndividualMenu -- - * - * This routine redoes the guts of the menu. It works from - * a base item and offset, so that a regular menu will - * just have all of its items added, but the help menu will - * have all of its items appended after the apple-defined - * items. - * - * Results: - * None. - * - * Side effects: - * The Macintosh menu handle is updated - * - *---------------------------------------------------------------------- - */ - -static void -ReconfigureIndividualMenu( - TkMenu *menuPtr, /* The menu we are affecting. */ - MenuHandle macMenuHdl, /* The macintosh menu we are affecting. - * Will not necessarily be - * menuPtr->platformData because this could - * be the help menu. */ - int base) /* The last index that we do not want - * touched. 0 for normal menus; - * helpMenuItemCount for help menus. */ -{ - int count; - int index; - TkMenuEntry *mePtr; - Str255 itemText; - int parentDisabled = 0; - - for (mePtr = menuPtr->menuRefPtr->parentEntryPtr; mePtr != NULL; - mePtr = mePtr->nextCascadePtr) { - char *name = (mePtr->namePtr == NULL) ? "" - : Tcl_GetStringFromObj(mePtr->namePtr, NULL); - - if (strcmp(Tk_PathName(menuPtr->tkwin), name) == 0) { - if (mePtr->state == ENTRY_DISABLED) { - parentDisabled = 1; - } - break; - } - } - - /* - * First, we get rid of all of the old items. - */ - - count = CountMItems(macMenuHdl); - for (index = base; index < count; index++) { - DeleteMenuItem(macMenuHdl, base + 1); - } - - count = menuPtr->numEntries; - - for (index = 1; index <= count; index++) { - mePtr = menuPtr->entries[index - 1]; - - /* - * We have to do separators separately because SetMenuItemText - * does not parse meta-characters. - */ - - if (mePtr->type == SEPARATOR_ENTRY) { - AppendMenu(macMenuHdl, SEPARATOR_TEXT); - } else { - Tcl_DString itemTextDString; - int destWrote; - - GetEntryText(mePtr, &itemTextDString); - Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&itemTextDString), - Tcl_DStringLength(&itemTextDString), 0, NULL, - (char *) &itemText[1], - 231, NULL, &destWrote, NULL); - itemText[0] = destWrote; - - AppendMenu(macMenuHdl, "\px"); - SetMenuItemText(macMenuHdl, base + index, itemText); - Tcl_DStringFree(&itemTextDString); - - /* - * Set enabling and disabling correctly. - */ - - if (parentDisabled || (mePtr->state == ENTRY_DISABLED)) { - DisableItem(macMenuHdl, base + index); - } else { - EnableItem(macMenuHdl, base + index); - } - - /* - * Set the check mark for check entries and radio entries. - */ - - SetItemMark(macMenuHdl, base + index, 0); - if ((mePtr->type == CHECK_BUTTON_ENTRY) - || (mePtr->type == RADIO_BUTTON_ENTRY)) { - CheckItem(macMenuHdl, base + index, (mePtr->entryFlags - & ENTRY_SELECTED) && mePtr->indicatorOn); - if (mePtr->indicatorOn - && (mePtr->entryFlags & ENTRY_SELECTED)) { - SetItemMark(macMenuHdl, base + index, - FindMarkCharacter(mePtr)); - } - } - - if (mePtr->type == CASCADE_ENTRY) { - if ((mePtr->childMenuRefPtr != NULL) - && (mePtr->childMenuRefPtr->menuPtr != NULL)) { - MenuHandle childMenuHdl = - ((MacMenu *) mePtr->childMenuRefPtr - ->menuPtr->platformData)->menuHdl; - - if (childMenuHdl == NULL) { - childMenuHdl = ((MacMenu *) mePtr->childMenuRefPtr - ->menuPtr->platformData)->menuHdl; - } - if (childMenuHdl != NULL) { - if (TkMacHaveAppearance() > 1) { - SetMenuItemHierarchicalID(macMenuHdl, base + index, - (*childMenuHdl)->menuID); - } else { - SetItemMark(macMenuHdl, base + index, - (*childMenuHdl)->menuID); - SetItemCmd(macMenuHdl, base + index, CASCADE_CMD); - } - } - /* - * If we changed the highligthing of this menu, its - * children all have to be reconfigured so that - * their state will be reflected in the menubar. - */ - - if (!(mePtr->childMenuRefPtr->menuPtr->menuFlags - & MENU_RECONFIGURE_PENDING)) { - mePtr->childMenuRefPtr->menuPtr->menuFlags - |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, - (ClientData) mePtr->childMenuRefPtr->menuPtr); - } - } - } - - if ((mePtr->type != CASCADE_ENTRY) - && (ENTRY_COMMAND_ACCEL - == (mePtr->entryFlags & ENTRY_ACCEL_MASK))) { - char *accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL); - SetItemCmd(macMenuHdl, base + index, accel[((EntryGeometry *) - mePtr->platformEntryData)->accelTextStart]); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * ReconfigureMacintoshMenu -- - * - * Rebuilds the Macintosh MenuHandle items from the menu. Called - * usually as an idle handler, but can be called synchronously - * if the menu is about to be posted. - * - * Results: - * None. - * - * Side effects: - * Configuration information get set for mePtr; old resources - * get freed, if any need it. - * - *---------------------------------------------------------------------- - */ - -static void -ReconfigureMacintoshMenu( - ClientData clientData) /* Information about menu entry; may - * or may not already have values for - * some fields. */ -{ - TkMenu *menuPtr = (TkMenu *) clientData; - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - MenuHandle helpMenuHdl = NULL; - - menuPtr->menuFlags &= ~MENU_RECONFIGURE_PENDING; - - if (NULL == macMenuHdl) { - return; - } - - ReconfigureIndividualMenu(menuPtr, macMenuHdl, 0); - - if (menuPtr->menuFlags & MENU_APPLE_MENU) { - AppendResMenu(macMenuHdl, 'DRVR'); - } - - if ((*macMenuHdl)->menuID == currentHelpMenuID) { - HMGetHelpMenuHandle(&helpMenuHdl); - if (helpMenuHdl != NULL) { - ReconfigureIndividualMenu(menuPtr, helpMenuHdl, helpItemCount); - } - } - - if (menuPtr->menuType == MENUBAR) { - if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) { - Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL); - menuBarFlags |= MENUBAR_REDRAW_PENDING; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * CompleteIdlers -- - * - * Completes all idle handling so that the menus are in sync when - * the user invokes them with the mouse. - * - * Results: - * None. - * - * Side effects: - * The Macintosh menu handles are flushed out. - * - *---------------------------------------------------------------------- - */ - -static void -CompleteIdlers( - TkMenu *menuPtr) /* The menu we are completing. */ -{ - int i; - - if (menuPtr->menuFlags & MENU_RECONFIGURE_PENDING) { - Tcl_CancelIdleCall(ReconfigureMacintoshMenu, (ClientData) menuPtr); - ReconfigureMacintoshMenu((ClientData) menuPtr); - } - - for (i = 0; i < menuPtr->numEntries; i++) { - if (menuPtr->entries[i]->type == CASCADE_ENTRY) { - if ((menuPtr->entries[i]->childMenuRefPtr != NULL) - && (menuPtr->entries[i]->childMenuRefPtr->menuPtr - != NULL)) { - CompleteIdlers(menuPtr->entries[i]->childMenuRefPtr - ->menuPtr); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpPostMenu -- - * - * Posts a menu on the screen - * - * Results: - * None. - * - * Side effects: - * The menu is posted and handled. - * - *---------------------------------------------------------------------- - */ - -int -TkpPostMenu( - Tcl_Interp *interp, /* The interpreter this menu lives in */ - TkMenu *menuPtr, /* The menu we are posting */ - int x, /* The global x-coordinate of the top, left- - * hand corner of where the menu is supposed - * to be posted. */ - int y) /* The global y-coordinate */ -{ - MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl; - long popUpResult; - int result; - int oldMode; - - if (inPostMenu) { - Tcl_AppendResult(interp, - "Cannot call post menu while already posting menu", - (char *) NULL); - result = TCL_ERROR; - } else { - Window dummyWin; - unsigned int state; - int dummy, mouseX, mouseY; - short menuID; - Window window; - int oldWidth = menuPtr->totalWidth; - Tk_Window parentWindow = Tk_Parent(menuPtr->tkwin); - - inPostMenu++; - - result = TkPreprocessMenu(menuPtr); - if (result != TCL_OK) { - inPostMenu--; - return result; - } - - /* - * The post commands could have deleted the menu, which means - * we are dead and should go away. - */ - - if (menuPtr->tkwin == NULL) { - inPostMenu--; - return TCL_OK; - } - - CompleteIdlers(menuPtr); - if (menuBarFlags & MENUBAR_REDRAW_PENDING) { - Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL); - DrawMenuBarWhenIdle((ClientData *) NULL); - } - - if (NULL == parentWindow) { - tearoffStruct.excludeRect.top = tearoffStruct.excludeRect.left - = tearoffStruct.excludeRect.bottom - = tearoffStruct.excludeRect.right = SHRT_MAX; - } else { - int left, top; - - Tk_GetRootCoords(parentWindow, &left, &top); - tearoffStruct.excludeRect.left = left; - tearoffStruct.excludeRect.top = top; - tearoffStruct.excludeRect.right = left + Tk_Width(parentWindow); - tearoffStruct.excludeRect.bottom = top + Tk_Height(parentWindow); - if (Tk_Class(parentWindow) == Tk_GetUid("Menubutton")) { - TkWindow *parentWinPtr = (TkWindow *) parentWindow; - TkMenuButton *mbPtr = - (TkMenuButton *) parentWinPtr->instanceData; - int menuButtonWidth = Tk_Width(parentWindow) - - 2 * (mbPtr->highlightWidth + mbPtr->borderWidth + 1); - menuPtr->totalWidth = menuButtonWidth > menuPtr->totalWidth - ? menuButtonWidth : menuPtr->totalWidth; - } - } - - InsertMenu(macMenuHdl, -1); - RecursivelyInsertMenu(menuPtr); - CountMItems(macMenuHdl); - - FixMDEF(); - oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL); - popUpResult = PopUpMenuSelect(macMenuHdl, y, x, menuPtr->active); - Tcl_SetServiceMode(oldMode); - - menuPtr->totalWidth = oldWidth; - RecursivelyDeleteMenu(menuPtr); - DeleteMenu((*macMenuHdl)->menuID); - - /* - * Simulate the mouse up. - */ - - XQueryPointer(NULL, None, &dummyWin, &dummyWin, &mouseX, - &mouseY, &dummy, &dummy, &state); - window = Tk_WindowId(menuPtr->tkwin); - TkGenerateButtonEvent(mouseX, mouseY, window, state); - - /* - * Dispatch the command. - */ - - menuID = HiWord(popUpResult); - if (menuID != 0) { - result = TkMacDispatchMenuEvent(menuID, LoWord(popUpResult)); - } else { - TkMacHandleTearoffMenu(); - result = TCL_OK; - } - InvalidateMDEFRgns(); - RecursivelyClearActiveMenu(menuPtr); - - inPostMenu--; - } - return result; -} - -/* - *---------------------------------------------------------------------- - * - * TkpMenuNewEntry -- - * - * Adds a pointer to a new menu entry structure with the platform- - * specific fields filled in. The Macintosh uses the - * platformEntryData field of the TkMenuEntry record to store - * geometry information. - * - * Results: - * Standard TCL error. - * - * Side effects: - * Storage gets allocated. New menu entry data is put into the - * platformEntryData field of the mePtr. - * - *---------------------------------------------------------------------- - */ - -int -TkpMenuNewEntry( - TkMenuEntry *mePtr) /* The menu we are adding an entry to */ -{ - EntryGeometry *geometryPtr = - (EntryGeometry *) ckalloc(sizeof(EntryGeometry)); - TkMenu *menuPtr = mePtr->menuPtr; - - geometryPtr->accelTextStart = 0; - geometryPtr->accelTextWidth = 0; - geometryPtr->nonAccelMargin = 0; - geometryPtr->modifierWidth = 0; - mePtr->platformEntryData = (TkMenuPlatformEntryData) geometryPtr; - if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) { - menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr); - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * - * Tk_MacTurnOffMenus -- - * - * Turns off all the menu drawing code. This is more than just disabling - * the "menu" command, this means that Tk will NEVER touch the menubar. - * It is needed in the Plugin, where Tk does not own the menubar. - * - * Results: - * None. - * - * Side effects: - * A flag is set which will disable all menu drawing. - * - *---------------------------------------------------------------------- - */ - -void -Tk_MacTurnOffMenus() -{ - gNoTkMenus = 1; -} - -/* - *---------------------------------------------------------------------- - * - * - * DrawMenuBarWhenIdle -- - * - * Update the menu bar next time there is an idle event. - * - * Results: - * None. - * - * Side effects: - * Menu bar is redrawn. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuBarWhenIdle( - ClientData clientData) /* ignored here */ -{ - TkMenuReferences *menuRefPtr; - TkMenu *appleMenuPtr, *helpMenuPtr; - MenuHandle macMenuHdl; - Tcl_HashEntry *hashEntryPtr; - - /* - * If we have been turned off, exit. - */ - - if (gNoTkMenus) { - return; - } - - /* - * We need to clear the apple and help menus of any extra items. - */ - - if (currentAppleMenuID != 0) { - hashEntryPtr = Tcl_FindHashEntry(&commandTable, - (char *) currentAppleMenuID); - appleMenuPtr = (TkMenu *) Tcl_GetHashValue(hashEntryPtr); - TkpDestroyMenu(appleMenuPtr); - TkpNewMenu(appleMenuPtr); - appleMenuPtr->menuFlags &= ~MENU_APPLE_MENU; - appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, - (ClientData) appleMenuPtr); - } - - if (currentHelpMenuID != 0) { - hashEntryPtr = Tcl_FindHashEntry(&commandTable, - (char *) currentHelpMenuID); - helpMenuPtr = (TkMenu *) Tcl_GetHashValue(hashEntryPtr); - TkpDestroyMenu(helpMenuPtr); - TkpNewMenu(helpMenuPtr); - helpMenuPtr->menuFlags &= ~MENU_HELP_MENU; - helpMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, - (ClientData) helpMenuPtr); - } - - /* - * We need to find the clone of this menu that is the menubar. - * Once we do that, for every cascade in the menu, we need to - * insert the Mac menu in the Mac menubar. Finally, we need - * to redraw the menubar. - */ - - menuRefPtr = NULL; - if (currentMenuBarName != NULL) { - menuRefPtr = TkFindMenuReferences(currentMenuBarInterp, - currentMenuBarName); - } - if (menuRefPtr != NULL) { - TkMenu *menuPtr, *menuBarPtr; - TkMenu *cascadeMenuPtr; - char *appleMenuName, *helpMenuName; - int appleIndex = -1, helpIndex = -1; - int i; - - menuPtr = menuRefPtr->menuPtr; - if (menuPtr != NULL) { - TkMenuReferences *specialMenuRefPtr; - TkMenuEntry *specialEntryPtr; - - appleMenuName = ckalloc(strlen(currentMenuBarName) - + 1 + strlen(".apple") + 1); - sprintf(appleMenuName, "%s.apple", - Tk_PathName(menuPtr->tkwin)); - specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp, - appleMenuName); - if ((specialMenuRefPtr != NULL) - && (specialMenuRefPtr->menuPtr != NULL)) { - for (specialEntryPtr - = specialMenuRefPtr->parentEntryPtr; - specialEntryPtr != NULL; - specialEntryPtr - = specialEntryPtr->nextCascadePtr) { - if (specialEntryPtr->menuPtr == menuPtr) { - appleIndex = specialEntryPtr->index; - break; - } - } - } - ckfree(appleMenuName); - - helpMenuName = ckalloc(strlen(currentMenuBarName) - + 1 + strlen(".help") + 1); - sprintf(helpMenuName, "%s.help", - Tk_PathName(menuPtr->tkwin)); - specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp, - helpMenuName); - if ((specialMenuRefPtr != NULL) - && (specialMenuRefPtr->menuPtr != NULL)) { - for (specialEntryPtr - = specialMenuRefPtr->parentEntryPtr; - specialEntryPtr != NULL; - specialEntryPtr - = specialEntryPtr->nextCascadePtr) { - if (specialEntryPtr->menuPtr == menuPtr) { - helpIndex = specialEntryPtr->index; - break; - } - } - } - ckfree(helpMenuName); - - } - - for (menuBarPtr = menuPtr; - (menuBarPtr != NULL) - && (menuBarPtr->menuType != MENUBAR); - menuBarPtr = menuBarPtr->nextInstancePtr) { - - /* - * Null loop body. - */ - - } - - if (menuBarPtr == NULL) { - SetDefaultMenubar(); - } else { - if (menuBarPtr->tearoff != menuPtr->tearoff) { - if (menuBarPtr->tearoff) { - appleIndex = (-1 == appleIndex) ? appleIndex - : appleIndex + 1; - helpIndex = (-1 == helpIndex) ? helpIndex - : helpIndex + 1; - } else { - appleIndex = (-1 == appleIndex) ? appleIndex - : appleIndex - 1; - helpIndex = (-1 == helpIndex) ? helpIndex - : helpIndex - 1; - } - } - ClearMenuBar(); - - if (appleIndex == -1) { - InsertMenu(tkAppleMenu, 0); - currentAppleMenuID = 0; - } else { - short appleID; - appleMenuPtr = menuBarPtr->entries[appleIndex] - ->childMenuRefPtr->menuPtr; - TkpDestroyMenu(appleMenuPtr); - GetNewID(appleMenuPtr->interp, appleMenuPtr, 0, - &appleID); - macMenuHdl = NewMenu(appleID, "\p\024"); - appleMenuPtr->platformData = - (TkMenuPlatformData) ckalloc(sizeof(MacMenu)); - ((MacMenu *)appleMenuPtr->platformData)->menuHdl - = macMenuHdl; - SetRect(&((MacMenu *) appleMenuPtr->platformData)->menuRect, - 0, 0, 0, 0); - appleMenuPtr->menuFlags |= MENU_APPLE_MENU; - if (!(appleMenuPtr->menuFlags - & MENU_RECONFIGURE_PENDING)) { - appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, - (ClientData) appleMenuPtr); - } - InsertMenu(macMenuHdl, 0); - RecursivelyInsertMenu(appleMenuPtr); - currentAppleMenuID = appleID; - } - if (helpIndex == -1) { - currentHelpMenuID = 0; - } - - for (i = 0; i < menuBarPtr->numEntries; i++) { - if (i == appleIndex) { - if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) { - DisableItem(((MacMenu *) menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr - ->platformData)->menuHdl, - 0); - } else { - EnableItem(((MacMenu *) menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr - ->platformData)->menuHdl, - 0); - } - continue; - } else if (i == helpIndex) { - TkMenu *helpMenuPtr = menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr; - MenuHandle helpMenuHdl = NULL; - - if (helpMenuPtr == NULL) { - continue; - } - helpMenuPtr->menuFlags |= MENU_HELP_MENU; - if (!(helpMenuPtr->menuFlags - & MENU_RECONFIGURE_PENDING)) { - helpMenuPtr->menuFlags - |= MENU_RECONFIGURE_PENDING; - Tcl_DoWhenIdle(ReconfigureMacintoshMenu, - (ClientData) helpMenuPtr); - } - macMenuHdl = - ((MacMenu *) helpMenuPtr->platformData)->menuHdl; - currentHelpMenuID = (*macMenuHdl)->menuID; - } else if (menuBarPtr->entries[i]->type - == CASCADE_ENTRY) { - if ((menuBarPtr->entries[i]->childMenuRefPtr != NULL) - && menuBarPtr->entries[i]->childMenuRefPtr - ->menuPtr != NULL) { - cascadeMenuPtr = menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr; - macMenuHdl = ((MacMenu *) cascadeMenuPtr - ->platformData)->menuHdl; - DeleteMenu((*macMenuHdl)->menuID); - InsertMenu(macMenuHdl, 0); - RecursivelyInsertMenu(cascadeMenuPtr); - if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) { - DisableItem(((MacMenu *) menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr - ->platformData)->menuHdl, - 0); - } else { - EnableItem(((MacMenu *) menuBarPtr->entries[i] - ->childMenuRefPtr->menuPtr - ->platformData)->menuHdl, - 0); - } - } - } - } - } - } else { - SetDefaultMenubar(); - } - DrawMenuBar(); - menuBarFlags &= ~MENUBAR_REDRAW_PENDING; -} - - -/* - *---------------------------------------------------------------------- - * - * RecursivelyInsertMenu -- - * - * Puts all of the cascades of this menu in the Mac hierarchical list. - * - * - * Results: - * None. - * - * Side effects: - * The menubar is changed. - * - *---------------------------------------------------------------------- - */ - -static void -RecursivelyInsertMenu( - TkMenu *menuPtr) /* All of the cascade items in this menu - * will be inserted into the mac menubar. */ -{ - int i; - TkMenu *cascadeMenuPtr; - MenuHandle macMenuHdl; - - for (i = 0; i < menuPtr->numEntries; i++) { - if (menuPtr->entries[i]->type == CASCADE_ENTRY) { - if ((menuPtr->entries[i]->childMenuRefPtr != NULL) - && (menuPtr->entries[i]->childMenuRefPtr->menuPtr - != NULL)) { - cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr; - macMenuHdl = - ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; - InsertMenu(macMenuHdl, -1); - RecursivelyInsertMenu(cascadeMenuPtr); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * RecursivelyDeleteMenu -- - * - * Takes all of the cascades of this menu out of the Mac hierarchical - * list. - * - * - * Results: - * None. - * - * Side effects: - * The menubar is changed. - * - *---------------------------------------------------------------------- - */ - -static void -RecursivelyDeleteMenu( - TkMenu *menuPtr) /* All of the cascade items in this menu - * will be inserted into the mac menubar. */ -{ - int i; - TkMenu *cascadeMenuPtr; - MenuHandle macMenuHdl; - - for (i = 0; i < menuPtr->numEntries; i++) { - if (menuPtr->entries[i]->type == CASCADE_ENTRY) { - if ((menuPtr->entries[i]->childMenuRefPtr != NULL) - && (menuPtr->entries[i]->childMenuRefPtr->menuPtr - != NULL)) { - cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr; - macMenuHdl = - ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; - DeleteMenu((*macMenuHdl)->menuID); - RecursivelyInsertMenu(cascadeMenuPtr); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * SetDefaultMenubar -- - * - * Puts the Apple, File and Edit menus into the Macintosh menubar. - * - * Results: - * None. - * - * Side effects: - * The menubar is changed. - * - *---------------------------------------------------------------------- - */ - -static void -SetDefaultMenubar() -{ - if (currentMenuBarName != NULL) { - ckfree(currentMenuBarName); - currentMenuBarName = NULL; - } - currentMenuBarOwner = NULL; - ClearMenuBar(); - InsertMenu(tkAppleMenu, 0); - InsertMenu(tkFileMenu, 0); - InsertMenu(tkEditMenu, 0); - if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) { - Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL); - menuBarFlags |= MENUBAR_REDRAW_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpSetMainMenubar -- - * - * Puts the menu associated with a window into the menubar. Should - * only be called when the window is in front. - * - * Results: - * None. - * - * Side effects: - * The menubar is changed. - * - *---------------------------------------------------------------------- - */ - -void -TkpSetMainMenubar( - Tcl_Interp *interp, /* The interpreter of the application */ - Tk_Window tkwin, /* The frame we are setting up */ - char *menuName) /* The name of the menu to put in front. - * If NULL, use the default menu bar. - */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - WindowRef macWindowPtr = (WindowRef) TkMacGetDrawablePort(winPtr->window); - WindowRef frontNonFloating; - - if (TkMacHaveAppearance() >= 0x110) { - frontNonFloating = FrontNonFloatingWindow(); - } else { - frontNonFloating = FrontWindow(); - } - - if ((macWindowPtr == NULL) || (macWindowPtr != frontNonFloating)) { - return; - } - - if ((currentMenuBarInterp != interp) - || (currentMenuBarOwner != tkwin) - || (currentMenuBarName == NULL) - || (menuName == NULL) - || (strcmp(menuName, currentMenuBarName) != 0)) { - Tk_Window searchWindow; - TopLevelMenubarList *listPtr; - - if (currentMenuBarName != NULL) { - ckfree(currentMenuBarName); - } - - if (menuName == NULL) { - searchWindow = tkwin; - if (strcmp(Tk_Class(searchWindow), "Menu") == 0) { - TkMenuReferences *menuRefPtr; - - menuRefPtr = TkFindMenuReferences(interp, Tk_PathName(tkwin)); - if (menuRefPtr != NULL) { - TkMenu *menuPtr = menuRefPtr->menuPtr; - if (menuPtr != NULL) { - menuPtr = menuPtr->masterMenuPtr; - searchWindow = menuPtr->tkwin; - } - } - } - for (; searchWindow != NULL; - searchWindow = Tk_Parent(searchWindow)) { - - for (listPtr = windowListPtr; listPtr != NULL; - listPtr = listPtr->nextPtr) { - if (listPtr->tkwin == searchWindow) { - break; - } - } - if (listPtr != NULL) { - menuName = Tk_PathName(listPtr->menuPtr->masterMenuPtr - ->tkwin); - break; - } - } - } - - if (menuName == NULL) { - currentMenuBarName = NULL; - } else { - currentMenuBarName = ckalloc(strlen(menuName) + 1); - strcpy(currentMenuBarName, menuName); - } - currentMenuBarOwner = tkwin; - currentMenuBarInterp = interp; - } - if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) { - Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL); - menuBarFlags |= MENUBAR_REDRAW_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpSetWindowMenuBar -- - * - * Associates a given menu with a window. - * - * Results: - * None. - * - * Side effects: - * On Windows and UNIX, associates the platform menu with the - * platform window. - * - *---------------------------------------------------------------------- - */ - -void -TkpSetWindowMenuBar( - Tk_Window tkwin, /* The window we are setting the menu in */ - TkMenu *menuPtr) /* The menu we are setting */ -{ - TopLevelMenubarList *listPtr, *prevPtr; - - /* - * Remove any existing reference to this window. - */ - - for (prevPtr = NULL, listPtr = windowListPtr; - listPtr != NULL; - prevPtr = listPtr, listPtr = listPtr->nextPtr) { - if (listPtr->tkwin == tkwin) { - break; - } - } - - if (listPtr != NULL) { - if (prevPtr != NULL) { - prevPtr->nextPtr = listPtr->nextPtr; - } else { - windowListPtr = listPtr->nextPtr; - } - ckfree((char *) listPtr); - } - - if (menuPtr != NULL) { - listPtr = (TopLevelMenubarList *) ckalloc(sizeof(TopLevelMenubarList)); - listPtr->nextPtr = windowListPtr; - windowListPtr = listPtr; - listPtr->tkwin = tkwin; - listPtr->menuPtr = menuPtr; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacDispatchMenuEvent -- - * - * Given a menu id and an item, dispatches the command associated - * with it. - * - * Results: - * None. - * - * Side effects: - * Commands get executed. - * - *---------------------------------------------------------------------- - */ - -int -TkMacDispatchMenuEvent( - int menuID, /* The menu id of the menu we are invoking */ - int index) /* The one-based index of the item that was - * selected. */ -{ - int result = TCL_OK; - if (menuID != 0) { - if (menuID == kHMHelpMenuID) { - if (currentMenuBarOwner != NULL) { - TkMenuReferences *helpMenuRef; - char *helpMenuName = ckalloc(strlen(currentMenuBarName) - + strlen(".help") + 1); - sprintf(helpMenuName, "%s.help", currentMenuBarName); - helpMenuRef = TkFindMenuReferences(currentMenuBarInterp, - helpMenuName); - ckfree(helpMenuName); - if ((helpMenuRef != NULL) && (helpMenuRef->menuPtr != NULL)) { - int newIndex = index - helpItemCount - 1; - result = TkInvokeMenu(currentMenuBarInterp, - helpMenuRef->menuPtr, newIndex); - } - } - } else { - Tcl_HashEntry *commandEntryPtr = - Tcl_FindHashEntry(&commandTable, (char *) menuID); - TkMenu *menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr); - if ((currentAppleMenuID == menuID) - && (index > menuPtr->numEntries + 1)) { - Str255 itemText; - - GetMenuItemText(GetMenuHandle(menuID), index, itemText); - OpenDeskAcc(itemText); - result = TCL_OK; - } else { - result = TkInvokeMenu(menuPtr->interp, menuPtr, index - 1); - } - } - } - return result; -} - -/* - *---------------------------------------------------------------------- - * - * GetMenuIndicatorGeometry -- - * - * Gets the width and height of the indicator area of a menu. - * - * Results: - * widthPtr and heightPtr are set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetMenuIndicatorGeometry ( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are measuring */ - Tk_Font tkfont, /* Precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* Precalculated font metrics */ - int *widthPtr, /* The resulting width */ - int *heightPtr) /* The resulting height */ -{ - char markChar; - - *heightPtr = fmPtr->linespace; - - markChar = (char) FindMarkCharacter(mePtr); - *widthPtr = Tk_TextWidth(tkfont, &markChar, 1) + 4; -} - -/* - *---------------------------------------------------------------------- - * - * GetMenuAccelGeometry -- - * - * Gets the width and height of the accelerator area of a menu. - * - * Results: - * widthPtr and heightPtr are set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetMenuAccelGeometry ( - TkMenu *menuPtr, /* The menu we are measuring */ - TkMenuEntry *mePtr, /* The entry we are measuring */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - int *modWidthPtr, /* The width of all of the key - * modifier symbols. */ - int *textWidthPtr, /* The resulting width */ - int *heightPtr) /* The resulting height */ -{ - *heightPtr = fmPtr->linespace; - *modWidthPtr = 0; - if (mePtr->type == CASCADE_ENTRY) { - *textWidthPtr = SICN_HEIGHT; - *modWidthPtr = Tk_TextWidth(tkfont, "W", 1); - } else if (0 == mePtr->accelLength) { - *textWidthPtr = 0; - } else { - char *accel = (mePtr->accelPtr == NULL) ? "" - : Tcl_GetStringFromObj(mePtr->accelPtr, NULL); - - if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) { - *textWidthPtr = Tk_TextWidth(tkfont, accel, mePtr->accelLength); - } else { - int emWidth = Tk_TextWidth(tkfont, "W", 1) + 1; - if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) { - int width = Tk_TextWidth(tkfont, accel, mePtr->accelLength); - *textWidthPtr = emWidth; - if (width < emWidth) { - *modWidthPtr = 0; - } else { - *modWidthPtr = width - emWidth; - } - } else { - int length = ((EntryGeometry *)mePtr->platformEntryData) - ->accelTextStart; - if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) { - *modWidthPtr += CONTROL_ICON_WIDTH; - } - if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) { - *modWidthPtr += SHIFT_ICON_WIDTH; - } - if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) { - *modWidthPtr += OPTION_ICON_WIDTH; - } - if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) { - *modWidthPtr += COMMAND_ICON_WIDTH; - } - if (1 == (mePtr->accelLength - length)) { - *textWidthPtr = emWidth; - } else { - *textWidthPtr += Tk_TextWidth(tkfont, accel - + length, mePtr->accelLength - length); - } - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * GetTearoffEntryGeometry -- - * - * Gets the width and height of of a tearoff entry. - * - * Results: - * widthPtr and heightPtr are set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetTearoffEntryGeometry ( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are measuring */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - int *widthPtr, /* The resulting width */ - int *heightPtr) /* The resulting height */ -{ - if ((GetResource('MDEF', 591) == NULL) && - (menuPtr->menuType == MASTER_MENU)) { - *heightPtr = fmPtr->linespace; - *widthPtr = 0; - } else { - *widthPtr = *heightPtr = 0; - } -} - -/* - *---------------------------------------------------------------------- - * - * GetMenuSeparatorGeometry -- - * - * Gets the width and height of menu separator. - * - * Results: - * widthPtr and heightPtr are set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetMenuSeparatorGeometry( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are measuring */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalcualted font metrics */ - int *widthPtr, /* The resulting width */ - int *heightPtr) /* The resulting height */ -{ - if (TkMacHaveAppearance() > 1) { - SInt16 outHeight; - - GetThemeMenuSeparatorHeight(&outHeight); - *widthPtr = 0; - *heightPtr = outHeight; - } else { - *widthPtr = 0; - *heightPtr = fmPtr->linespace; - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuEntryIndicator -- - * - * This procedure draws the indicator part of a menu. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuEntryIndicator( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are drawing */ - Drawable d, /* The drawable we are drawing */ - GC gc, /* The GC we are drawing with */ - GC indicatorGC, /* The GC to use for the indicator */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - int x, /* topleft hand corner of entry */ - int y, /* topleft hand corner of entry */ - int width, /* width of entry */ - int height) /* height of entry */ -{ - if ((mePtr->type == CHECK_BUTTON_ENTRY) || - (mePtr->type == RADIO_BUTTON_ENTRY)) { - if (mePtr->indicatorOn - && (mePtr->entryFlags & ENTRY_SELECTED)) { - int baseline; - short markShort; - - baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; - GetItemMark(((MacMenu *) menuPtr->platformData)->menuHdl, - mePtr->index + 1, &markShort); - if (markShort != 0) { - char markChar; - char markCharUTF[TCL_UTF_MAX + 1]; - int dstWrote; - - markChar = (char) markShort; - Tcl_ExternalToUtf(NULL, NULL, &markChar, 1, 0, NULL, - markCharUTF, TCL_UTF_MAX + 1, NULL, &dstWrote, NULL); - Tk_DrawChars(menuPtr->display, d, gc, tkfont, markCharUTF, - dstWrote, x + 2, baseline); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuBackground -- - * - * If Appearance is present, draws the Appearance background - * - * Results: - * Nothing - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ -static void -DrawMenuBackground( - Rect *menuRectPtr, /* The menu rect */ - Drawable d, /* What we are drawing into */ - ThemeMenuType type /* Type of menu */ - ) -{ - if (!TkMacHaveAppearance()) { - return; - } else { - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(d); - DrawThemeMenuBackground (menuRectPtr, type); - SetGWorld(saveWorld, saveDevice); - return; - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawSICN -- - * - * Given a resource id and an index, loads the appropriate SICN - * and draws it into a given drawable using the given gc. - * - * Results: - * Returns 1 if the SICN was found, 0 if not found. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ -static int -DrawSICN( - int resourceID, /* The resource # of the SICN table */ - int index, /* The index into the SICN table of the - * icon we want. */ - Drawable d, /* What we are drawing into */ - GC gc, /* The GC to draw with */ - int x, /* The left hand coord of the SICN */ - int y) /* The top coord of the SICN */ -{ - Handle sicnHandle = (Handle) GetResource('SICN', SICN_RESOURCE_NUMBER); - - if (NULL == sicnHandle) { - return 0; - } else { - BitMap sicnBitmap; - Rect destRect; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - BitMapPtr destBitMap; - RGBColor origForeColor, origBackColor, foreColor, backColor; - - HLock(sicnHandle); - destPort = TkMacGetDrawablePort(d); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(d); - TkMacSetUpGraphicsPort(gc); - GetForeColor(&origForeColor); - GetBackColor(&origBackColor); - - if (TkSetMacColor(gc->foreground, &foreColor)) { - RGBForeColor(&foreColor); - } - - if (TkSetMacColor(gc->background, &backColor)) { - RGBBackColor(&backColor); - } - - SetRect(&destRect, x, y, x + SICN_HEIGHT, y + SICN_HEIGHT); - sicnBitmap.baseAddr = (Ptr) (*sicnHandle) + index * SICN_HEIGHT - * SICN_ROWS; - sicnBitmap.rowBytes = SICN_ROWS; - SetRect(&sicnBitmap.bounds, 0, 0, 16, 16); - destBitMap = &((GrafPtr) destPort)->portBits; - CopyBits(&sicnBitmap, destBitMap, &sicnBitmap.bounds, &destRect, - destPort->txMode, NULL); - HUnlock(sicnHandle); - RGBForeColor(&origForeColor); - RGBBackColor(&origBackColor); - SetGWorld(saveWorld, saveDevice); - return 1; - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuEntryAccelerator -- - * - * This procedure draws the accelerator part of a menu. We - * need to decide what to draw here. Should we replace strings - * like "Control", "Command", etc? - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuEntryAccelerator( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are drawing */ - Drawable d, /* The drawable we are drawing in */ - GC gc, /* The gc to draw into */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - Tk_3DBorder activeBorder, /* border for menu background */ - int x, /* The left side of the entry */ - int y, /* The top of the entry */ - int width, /* The width of the entry */ - int height, /* The height of the entry */ - int drawArrow) /* Whether or not to draw cascade arrow */ -{ - int activeBorderWidth; - - Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr, - &activeBorderWidth); - if (mePtr->type == CASCADE_ENTRY) { - /* - * Under Appearance, we let the Appearance Manager draw the icon - */ - - if (!TkMacHaveAppearance()) { - if (0 == DrawSICN(SICN_RESOURCE_NUMBER, CASCADE_ARROW, d, gc, - x + width - SICN_HEIGHT, (y + (height / 2)) - - (SICN_HEIGHT / 2))) { - XPoint points[3]; - Tk_Window tkwin = menuPtr->tkwin; - - if (mePtr->type == CASCADE_ENTRY) { - points[0].x = width - activeBorderWidth - - MAC_MARGIN_WIDTH - CASCADE_ARROW_WIDTH; - points[0].y = y + (height - CASCADE_ARROW_HEIGHT)/2; - points[1].x = points[0].x; - points[1].y = points[0].y + CASCADE_ARROW_HEIGHT; - points[2].x = points[0].x + CASCADE_ARROW_WIDTH; - points[2].y = points[0].y + CASCADE_ARROW_HEIGHT/2; - Tk_Fill3DPolygon(menuPtr->tkwin, d, activeBorder, points, - 3, DECORATION_BORDER_WIDTH, TK_RELIEF_FLAT); - } - } - } - } else if (mePtr->accelLength != 0) { - int leftEdge = x + width; - int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; - char *accel; - - accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL); - - if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) { - leftEdge -= ((EntryGeometry *) mePtr->platformEntryData) - ->accelTextWidth; - Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel, - mePtr->accelLength, leftEdge, baseline); - } else { - EntryGeometry *geometryPtr = - (EntryGeometry *) mePtr->platformEntryData; - int length = mePtr->accelLength - geometryPtr->accelTextStart; - - leftEdge -= geometryPtr->accelTextWidth; - if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) { - leftEdge -= geometryPtr->modifierWidth; - } - - Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel - + geometryPtr->accelTextStart, length, leftEdge, baseline); - - if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) { - leftEdge -= COMMAND_ICON_WIDTH; - DrawSICN(SICN_RESOURCE_NUMBER, COMMAND_ICON, d, gc, - leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1); - } - - if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) { - leftEdge -= OPTION_ICON_WIDTH; - DrawSICN(SICN_RESOURCE_NUMBER, OPTION_ICON, d, gc, - leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1); - } - - if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) { - leftEdge -= SHIFT_ICON_WIDTH; - DrawSICN(SICN_RESOURCE_NUMBER, SHIFT_ICON, d, gc, - leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1); - } - - if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) { - leftEdge -= CONTROL_ICON_WIDTH; - DrawSICN(SICN_RESOURCE_NUMBER, CONTROL_ICON, d, gc, - leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuSeparator -- - * - * The menu separator is drawn. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuSeparator( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are drawing */ - Drawable d, /* The drawable we are drawing into */ - GC gc, /* The gc we are drawing with */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - int x, /* left coordinate of entry */ - int y, /* top coordinate of entry */ - int width, /* width of entry */ - int height) /* height of entry */ -{ - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(d); - if (TkMacHaveAppearance() > 1) { - Rect r; - r.top = y; - r.left = x; - r.bottom = y + height; - r.right = x + width; - - DrawThemeMenuSeparator(&r); - } else { - /* - * We don't want to use the text GC for drawing the separator. It - * needs to be the same color as disabled items. - */ - - TkMacSetUpGraphicsPort(mePtr->disabledGC != None ? mePtr->disabledGC - : menuPtr->disabledGC); - - MoveTo(x, y + (height / 2)); - Line(width, 0); - - SetGWorld(saveWorld, saveDevice); -} -} - -/* - *---------------------------------------------------------------------- - * - * MenuDefProc -- - * - * This routine is the MDEF handler for Tk. It receives all messages - * for the menu and dispatches them. - * - * Results: - * None. - * - * Side effects: - * This routine causes menus to be drawn and will certainly allocate - * memory as a result. Also, the menu can scroll up and down, and - * various other interface actions can take place. - * - *---------------------------------------------------------------------- - */ - -static void -MenuDefProc( - short message, /* What action are we taking? */ - MenuHandle menu, /* The menu we are working with */ - Rect *menuRectPtr, /* A pointer to the rect for the - * whole menu. */ - Point hitPt, /* Where the mouse was clicked for - * the appropriate messages. */ - short *whichItem, /* Output result. Which item was - * hit by the user? */ - TkMenuLowMemGlobals *globalsPtr) /* The low mem globals we have - * to change */ -{ -#define SCREEN_MARGIN 5 - TkMenu *menuPtr; - TkMenuEntry *parentEntryPtr; - Tcl_HashEntry *commandEntryPtr; - GrafPtr windowMgrPort; - Tk_Font tkfont, menuFont; - Tk_FontMetrics fontMetrics, entryMetrics; - Tk_FontMetrics *fmPtr; - TkMenuEntry *mePtr; - int i; - int maxMenuHeight; - int oldItem; - int newItem = -1; - GDHandle device; - Rect itemRect; - short windowPart; - WindowRef whichWindow; - RGBColor bgColor; - RGBColor fgColor; - RGBColor origFgColor; - PenState origPenState; - Rect dragRect; - Rect scratchRect = {-32768, -32768, 32767, 32767}; - RgnHandle oldClipRgn; - TkMenuReferences *menuRefPtr; - TkMenu *searchMenuPtr; - Rect menuClipRect; - - HLock((Handle) menu); - commandEntryPtr = Tcl_FindHashEntry(&commandTable, - (char *) (*menu)->menuID); - HUnlock((Handle) menu); - menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr); - - switch (message) { - case mSizeMsg: - GetWMgrPort(&windowMgrPort); - maxMenuHeight = windowMgrPort->portRect.bottom - - windowMgrPort->portRect.top - - GetMBarHeight() - SCREEN_MARGIN; - (*menu)->menuWidth = menuPtr->totalWidth; - (*menu)->menuHeight = maxMenuHeight < menuPtr->totalHeight ? - maxMenuHeight : menuPtr->totalHeight; - break; - - case mDrawMsg: - - /* - * Store away the menu rectangle so we can keep track of the - * different regions that the menu obscures. - */ - - ((MacMenu *) menuPtr->platformData)->menuRect = *menuRectPtr; - if (tkMenuCascadeRgn == NULL) { - tkMenuCascadeRgn = NewRgn(); - } - if (utilRgn == NULL) { - utilRgn = NewRgn(); - } - if (totalMenuRgn == NULL) { - totalMenuRgn = NewRgn(); - } - SetEmptyRgn(tkMenuCascadeRgn); - for (searchMenuPtr = menuPtr; searchMenuPtr != NULL; ) { - RectRgn(utilRgn, - &((MacMenu *) searchMenuPtr->platformData)->menuRect); - InsetRgn(utilRgn, -1, -1); - UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn); - OffsetRgn(utilRgn, 1, 1); - UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn); - - if (searchMenuPtr->menuRefPtr->parentEntryPtr != NULL) { - searchMenuPtr = searchMenuPtr->menuRefPtr - ->parentEntryPtr->menuPtr; - } else { - break; - } - if (searchMenuPtr->menuType == MENUBAR) { - break; - } - } - UnionRgn(totalMenuRgn, tkMenuCascadeRgn, totalMenuRgn); - SetEmptyRgn(utilRgn); - - /* - * Now draw the background if Appearance is present... - */ - - GetGWorld(&macMDEFDrawable.portPtr, &device); - if (TkMacHaveAppearance() > 1) { - ThemeMenuType menuType; - - if (menuPtr->menuRefPtr->topLevelListPtr != NULL) { - menuType = kThemeMenuTypePullDown; - } else if (menuPtr->menuRefPtr->parentEntryPtr != NULL) { - menuType = kThemeMenuTypeHierarchical; - } else { - menuType = kThemeMenuTypePopUp; - } - - DrawMenuBackground(menuRectPtr, (Drawable) &macMDEFDrawable, - menuType); - } - - /* - * Next, figure out scrolling information. - */ - - menuClipRect = *menuRectPtr; - if ((menuClipRect.bottom - menuClipRect.top) - < menuPtr->totalHeight) { - if (globalsPtr->menuTop < menuRectPtr->top) { - DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW, - (Drawable) &macMDEFDrawable, - menuPtr->textGC, - menuRectPtr->left - + menuPtr->entries[1]->indicatorSpace, - menuRectPtr->top); - menuClipRect.top += SICN_HEIGHT; - } - if ((globalsPtr->menuTop + menuPtr->totalHeight) - > menuRectPtr->bottom) { - DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW, - (Drawable) &macMDEFDrawable, - menuPtr->textGC, - menuRectPtr->left - + menuPtr->entries[1]->indicatorSpace, - menuRectPtr->bottom - SICN_HEIGHT); - menuClipRect.bottom -= SICN_HEIGHT; - } - GetClip(utilRgn); - } - - /* - * Now, actually draw the menu. Don't draw entries that - * are higher than the top arrow, and don't draw entries - * that are lower than the bottom. - */ - - menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); - Tk_GetFontMetrics(menuFont, &fontMetrics); - for (i = 0; i < menuPtr->numEntries; i++) { - mePtr = menuPtr->entries[i]; - if (globalsPtr->menuTop + mePtr->y + mePtr->height - < menuClipRect.top) { - continue; - } else if (globalsPtr->menuTop + mePtr->y - > menuClipRect.bottom) { - continue; - } - /* ClipRect(&menuClipRect); */ - if (mePtr->fontPtr == NULL) { - fmPtr = &fontMetrics; - tkfont = menuFont; - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); - Tk_GetFontMetrics(tkfont, &entryMetrics); - fmPtr = &entryMetrics; - } - AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, - (Drawable) &macMDEFDrawable, fmPtr, tkfont, - menuRectPtr->left + mePtr->x, - globalsPtr->menuTop + mePtr->y, - (mePtr->entryFlags & ENTRY_LAST_COLUMN) ? - menuPtr->totalWidth - mePtr->x : mePtr->width, - menuPtr->entries[i]->height); - } - globalsPtr->menuBottom = globalsPtr->menuTop - + menuPtr->totalHeight; - if (!EmptyRgn(utilRgn)) { - SetClip(utilRgn); - SetEmptyRgn(utilRgn); - } - MDEFScrollFlag = 1; - break; - - case mChooseMsg: { - int hasTopScroll, hasBottomScroll; - enum { - DONT_SCROLL, DOWN_SCROLL, UP_SCROLL - } scrollDirection; - Rect updateRect; - short scrollAmt; - RGBColor origForeColor, origBackColor, foreColor, backColor; - - GetGWorld(&macMDEFDrawable.portPtr, &device); - GetForeColor(&origForeColor); - GetBackColor(&origBackColor); - - if (TkSetMacColor(menuPtr->textGC->foreground, - &foreColor)) { - /* if (!TkMacHaveAppearance()) { */ - RGBForeColor(&foreColor); - /* } */ - } - if (TkSetMacColor(menuPtr->textGC->background, - &backColor)) { - /* if (!TkMacHaveAppearance()) { */ - RGBBackColor(&backColor); - /* } */ - } - - /* - * Find out which item was hit. If it is the same as the old item, - * we don't need to do anything. - */ - - oldItem = *whichItem - 1; - - if (PtInRect(hitPt, menuRectPtr)) { - for (i = 0; i < menuPtr->numEntries; i++) { - mePtr = menuPtr->entries[i]; - itemRect.left = menuRectPtr->left + mePtr->x; - itemRect.top = globalsPtr->menuTop + mePtr->y; - if (mePtr->entryFlags & ENTRY_LAST_COLUMN) { - itemRect.right = itemRect.left + menuPtr->totalWidth - - mePtr->x; - } else { - itemRect.right = itemRect.left + mePtr->width; - } - itemRect.bottom = itemRect.top - + menuPtr->entries[i]->height; - if (PtInRect(hitPt, &itemRect)) { - if ((mePtr->type == SEPARATOR_ENTRY) - || (mePtr->state == ENTRY_DISABLED)) { - newItem = -1; - } else { - TkMenuEntry *cascadeEntryPtr; - int parentDisabled = 0; - - for (cascadeEntryPtr - = menuPtr->menuRefPtr->parentEntryPtr; - cascadeEntryPtr != NULL; - cascadeEntryPtr - = cascadeEntryPtr->nextCascadePtr) { - char *name; - - name = Tcl_GetStringFromObj( - cascadeEntryPtr->namePtr, NULL); - if (strcmp(name, Tk_PathName(menuPtr->tkwin)) - == 0) { - if (cascadeEntryPtr->state == ENTRY_DISABLED) { - parentDisabled = 1; - } - break; - } - } - if (parentDisabled) { - newItem = -1; - } else { - newItem = i; - if ((mePtr->type == CASCADE_ENTRY) - && (oldItem != newItem)) { - globalsPtr->itemRect = itemRect; - } - } - } - break; - } - } - } - - /* - * Now we need to take care of scrolling the menu. - */ - - hasTopScroll = globalsPtr->menuTop < menuRectPtr->top; - hasBottomScroll = globalsPtr->menuBottom > menuRectPtr->bottom; - scrollDirection = DONT_SCROLL; - if (hasTopScroll - && (hitPt.v < menuRectPtr->top + SICN_HEIGHT)) { - newItem = -1; - scrollDirection = DOWN_SCROLL; - } else if (hasBottomScroll - && (hitPt.v > menuRectPtr->bottom - SICN_HEIGHT)) { - newItem = -1; - scrollDirection = UP_SCROLL; - } - menuClipRect = *menuRectPtr; - if (hasTopScroll) { - menuClipRect.top += SICN_HEIGHT; - } - if (hasBottomScroll) { - menuClipRect.bottom -= SICN_HEIGHT; - } - if (MDEFScrollFlag) { - scrollDirection = DONT_SCROLL; - MDEFScrollFlag = 0; - } - GetClip(utilRgn); - ClipRect(&menuClipRect); - - if (oldItem != newItem) { - if (oldItem >= 0) { - mePtr = menuPtr->entries[oldItem]; - if (mePtr->fontPtr == NULL) { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, - menuPtr->fontPtr); - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, - mePtr->fontPtr); - } - Tk_GetFontMetrics(tkfont, &fontMetrics); - AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, - (Drawable) &macMDEFDrawable, &fontMetrics, tkfont, - menuRectPtr->left + mePtr->x, - globalsPtr->menuTop + mePtr->y, - (mePtr->entryFlags & ENTRY_LAST_COLUMN) ? - menuPtr->totalWidth - mePtr->x : mePtr->width, - mePtr->height); - } - if (newItem != -1) { - int oldActiveItem = menuPtr->active; - - mePtr = menuPtr->entries[newItem]; - if (mePtr->state != ENTRY_DISABLED) { - TkActivateMenuEntry(menuPtr, newItem); - } - if (mePtr->fontPtr == NULL) { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, - menuPtr->fontPtr); - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, - mePtr->fontPtr); - } - Tk_GetFontMetrics(tkfont, &fontMetrics); - AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, - (Drawable) &macMDEFDrawable, &fontMetrics, tkfont, - menuRectPtr->left + mePtr->x, - globalsPtr->menuTop + mePtr->y, - (mePtr->entryFlags & ENTRY_LAST_COLUMN) ? - menuPtr->totalWidth - mePtr->x : mePtr->width, - mePtr->height); - } - - tkUseMenuCascadeRgn = 1; - MenuSelectEvent(menuPtr); - Tcl_ServiceAll(); - tkUseMenuCascadeRgn = 0; - if (mePtr->state != ENTRY_DISABLED) { - TkActivateMenuEntry(menuPtr, -1); - } - *whichItem = newItem + 1; - } - globalsPtr->menuDisable = ((*menu)->menuID << 16) | (newItem + 1); - - if (scrollDirection == UP_SCROLL) { - scrollAmt = menuClipRect.bottom - hitPt.v; - if (scrollAmt < menuRectPtr->bottom - - globalsPtr->menuBottom) { - scrollAmt = menuRectPtr->bottom - globalsPtr->menuBottom; - } - if (!hasTopScroll && ((globalsPtr->menuTop + scrollAmt) - < menuRectPtr->top)) { - SetRect(&updateRect, menuRectPtr->left, - globalsPtr->menuTop, menuRectPtr->right, - globalsPtr->menuTop + SICN_HEIGHT); - EraseRect(&updateRect); - DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW, - (Drawable) &macMDEFDrawable, - menuPtr->textGC, menuRectPtr->left - + menuPtr->entries[1]->indicatorSpace, - menuRectPtr->top); - menuClipRect.top += SICN_HEIGHT; - } - } else if (scrollDirection == DOWN_SCROLL) { - scrollAmt = menuClipRect.top - hitPt.v; - if (scrollAmt > menuRectPtr->top - globalsPtr->menuTop) { - scrollAmt = menuRectPtr->top - globalsPtr->menuTop; - } - if (!hasBottomScroll && ((globalsPtr->menuBottom + scrollAmt) - > menuRectPtr->bottom)) { - SetRect(&updateRect, menuRectPtr->left, - globalsPtr->menuBottom - SICN_HEIGHT, - menuRectPtr->right, globalsPtr->menuBottom); - EraseRect(&updateRect); - DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW, - (Drawable) &macMDEFDrawable, - menuPtr->textGC, menuRectPtr->left - + menuPtr->entries[1]->indicatorSpace, - menuRectPtr->bottom - SICN_HEIGHT); - menuClipRect.bottom -= SICN_HEIGHT; - } - } - if (scrollDirection != DONT_SCROLL) { - Tk_Font menuFont; - RgnHandle updateRgn = NewRgn(); - ScrollRect(&menuClipRect, 0, scrollAmt, updateRgn); - updateRect = (*updateRgn)->rgnBBox; - DisposeRgn(updateRgn); - globalsPtr->menuTop += scrollAmt; - globalsPtr->menuBottom += scrollAmt; - if (globalsPtr->menuTop == menuRectPtr->top) { - updateRect.top -= SICN_HEIGHT; - } - if (globalsPtr->menuBottom == menuRectPtr->bottom) { - updateRect.bottom += SICN_HEIGHT; - } - ClipRect(&updateRect); - EraseRect(&updateRect); - menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); - Tk_GetFontMetrics(menuFont, &fontMetrics); - for (i = 0; i < menuPtr->numEntries; i++) { - mePtr = menuPtr->entries[i]; - if (globalsPtr->menuTop + mePtr->y + mePtr->height - < updateRect.top) { - continue; - } else if (globalsPtr->menuTop + mePtr->y - > updateRect.bottom) { - continue; - } - if (mePtr->fontPtr == NULL) { - fmPtr = &fontMetrics; - tkfont = menuFont; - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, - mePtr->fontPtr); - Tk_GetFontMetrics(tkfont, &entryMetrics); - fmPtr = &entryMetrics; - } - AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, - (Drawable) &macMDEFDrawable, fmPtr, tkfont, - menuRectPtr->left + mePtr->x, - globalsPtr->menuTop + mePtr->y, - (mePtr->entryFlags & ENTRY_LAST_COLUMN) ? - menuPtr->totalWidth - mePtr->x : mePtr->width, - menuPtr->entries[i]->height); - } - } - - SetClip(utilRgn); - SetEmptyRgn(utilRgn); - RGBForeColor(&origForeColor); - RGBBackColor(&origBackColor); - - /* - * If the menu is a tearoff, and the mouse is outside the menu, - * we need to draw the drag rectangle. - * - * In order for tearoffs to work properly, we need to set - * the active member of the containing menubar. - */ - - menuRefPtr = TkFindMenuReferences(menuPtr->interp, - Tk_PathName(menuPtr->tkwin)); - if ((menuRefPtr != NULL) && (menuRefPtr->parentEntryPtr != NULL)) { - char *name; - for (parentEntryPtr = menuRefPtr->parentEntryPtr; - parentEntryPtr != NULL - ; parentEntryPtr = parentEntryPtr->nextCascadePtr) { - name = Tcl_GetStringFromObj(parentEntryPtr->namePtr, - NULL); - if (strcmp(name, Tk_PathName(menuPtr->tkwin)) != 0) { - break; - } - } - if (parentEntryPtr != NULL) { - TkActivateMenuEntry(parentEntryPtr->menuPtr, - parentEntryPtr->index); - } - } - - if (menuPtr->tearoff) { - scratchRect = *menuRectPtr; - if (tearoffStruct.menuPtr == NULL) { - scratchRect.top -= 10; - scratchRect.bottom += 10; - scratchRect.left -= 10; - scratchRect.right += 10; - } - - windowPart = FindWindow(hitPt, &whichWindow); - if ((windowPart != inMenuBar) && (newItem == -1) - && (hitPt.v != 0) && (hitPt.h != 0) - && (!PtInRect(hitPt, &scratchRect)) - && (!PtInRect(hitPt, &tearoffStruct.excludeRect))) { -/* - * This is the second argument to the Toolbox Delay function. It changed - * from long to unsigned long between Universal Headers 2.0 & 3.0 - */ -#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) - long dummy; -#else - unsigned long dummy; -#endif - oldClipRgn = NewRgn(); - GetClip(oldClipRgn); - GetForeColor(&origFgColor); - GetPenState(&origPenState); - GetForeColor(&fgColor); - GetBackColor(&bgColor); - GetGray(device, &bgColor, &fgColor); - RGBForeColor(&fgColor); - SetRect(&scratchRect, -32768, -32768, 32767, 32767); - ClipRect(&scratchRect); - - dragRect = *menuRectPtr; - tearoffStruct.menuPtr = menuPtr; - - PenMode(srcXor); - dragRect = *menuRectPtr; - OffsetRect(&dragRect, -dragRect.left, -dragRect.top); - OffsetRect(&dragRect, tearoffStruct.point.h, - tearoffStruct.point.v); - if ((dragRect.top != 0) && (dragRect.left != 0)) { - FrameRect(&dragRect); - Delay(1, &dummy); - FrameRect(&dragRect); - } - tearoffStruct.point = hitPt; - - SetClip(oldClipRgn); - DisposeRgn(oldClipRgn); - RGBForeColor(&origFgColor); - SetPenState(&origPenState); - } else { - tearoffStruct.menuPtr = NULL; - tearoffStruct.point.h = tearoffStruct.point.v = 0; - } - } else { - tearoffStruct.menuPtr = NULL; - tearoffStruct.point.h = tearoffStruct.point.v = 0; - } - - break; - } - - case mPopUpMsg: - - /* - * Note that for some oddball reason, h and v are reversed in the - * point given to us by the MDEF. - */ - - oldItem = *whichItem; - if (oldItem >= menuPtr->numEntries) { - oldItem = -1; - } - GetWMgrPort(&windowMgrPort); - maxMenuHeight = windowMgrPort->portRect.bottom - - windowMgrPort->portRect.top - - GetMBarHeight() - SCREEN_MARGIN; - if (menuPtr->totalHeight > maxMenuHeight) { - menuRectPtr->top = GetMBarHeight(); - } else { - int delta; - menuRectPtr->top = hitPt.h; - if (oldItem >= 0) { - menuRectPtr->top -= menuPtr->entries[oldItem]->y; - } - - if (menuRectPtr->top < GetMBarHeight()) { - /* Displace downward if the menu would stick off the - * top of the screen. - */ - - menuRectPtr->top = GetMBarHeight() + SCREEN_MARGIN; - } else { - /* - * Or upward if the menu sticks off the - * bottom end... - */ - - delta = menuRectPtr->top + menuPtr->totalHeight - - maxMenuHeight; - if (delta > 0) { - menuRectPtr->top -= delta; - } - } - } - menuRectPtr->left = hitPt.v; - menuRectPtr->right = menuRectPtr->left + menuPtr->totalWidth; - menuRectPtr->bottom = menuRectPtr->top + - ((maxMenuHeight < menuPtr->totalHeight) - ? maxMenuHeight : menuPtr->totalHeight); - if (menuRectPtr->top == GetMBarHeight()) { - *whichItem = hitPt.h; - } else { - *whichItem = menuRectPtr->top; - } - globalsPtr->menuTop = *whichItem; - globalsPtr->menuBottom = menuRectPtr->bottom; - break; - } -} - -/* - *---------------------------------------------------------------------- - * - * AppearanceEntryDrawWrapper -- - * - * This routine wraps the TkpDrawMenuEntry function. Under Appearance, - * it routes to the Appearance Managers DrawThemeEntry, otherwise it - * just goes straight to TkpDrawMenuEntry. - * - * Results: - * A menu entry is drawn - * - * Side effects: - * None - * - *---------------------------------------------------------------------- - */ -static void -AppearanceEntryDrawWrapper( - TkMenuEntry *mePtr, - Rect *menuRectPtr, - TkMenuLowMemGlobals *globalsPtr, - Drawable d, - Tk_FontMetrics *fmPtr, - Tk_Font tkfont, - int x, - int y, - int width, - int height) -{ - if (TkMacHaveAppearance() > 1) { - MenuEntryUserData meData; - Rect itemRect; - ThemeMenuState theState; - ThemeMenuItemType theType; - - meData.mePtr = mePtr; - meData.mdefDrawable = d; - meData.fmPtr = fmPtr; - meData.tkfont = tkfont; - - itemRect.top = y; - itemRect.left = x; - itemRect.bottom = itemRect.top + height; - itemRect.right = itemRect.left + width; - - if (mePtr->state == ENTRY_ACTIVE) { - theState = kThemeMenuSelected; - } else if (mePtr->state == ENTRY_DISABLED) { - theState = kThemeMenuDisabled; - } else { - theState = kThemeMenuActive; - } - - if (mePtr->type == CASCADE_ENTRY) { - theType = kThemeMenuItemHierarchical; - } else { - theType = kThemeMenuItemPlain; - } - - DrawThemeMenuItem (menuRectPtr, &itemRect, - globalsPtr->menuTop, globalsPtr->menuBottom, theState, - theType, tkThemeMenuItemDrawingUPP, - (unsigned long) &meData); - - } else { - TkpDrawMenuEntry(mePtr, d, tkfont, fmPtr, - x, y, width, height, 0, 1); - } -} - -/* - *---------------------------------------------------------------------- - * - * tkThemeMenuItemDrawingProc -- - * - * This routine is called from the Appearance DrawThemeMenuEntry - * - * Results: - * A menu entry is drawn - * - * Side effects: - * None - * - *---------------------------------------------------------------------- - */ -pascal void -tkThemeMenuItemDrawingProc ( - const Rect *inBounds, - SInt16 inDepth, - Boolean inIsColorDevice, - SInt32 inUserData) -{ - MenuEntryUserData *meData = (MenuEntryUserData *) inUserData; - - TkpDrawMenuEntry(meData->mePtr, meData->mdefDrawable, - meData->tkfont, meData->fmPtr, inBounds->left, - inBounds->top, inBounds->right - inBounds->left, - inBounds->bottom - inBounds->top, 0, 1); - -} - -/* - *---------------------------------------------------------------------- - * - * TkMacHandleTearoffMenu() -- - * - * This routine sees if the MDEF has set a menu and a mouse position - * for tearing off and makes a tearoff menu if it has. - * - * Results: - * menuPtr->interp will have the result of the tearoff command. - * - * Side effects: - * A new tearoff menu is created if it is supposed to be. - * - *---------------------------------------------------------------------- - */ - -void -TkMacHandleTearoffMenu(void) -{ - if (tearoffStruct.menuPtr != NULL) { - Tcl_DString tearoffCmdStr; - char intString[TCL_INTEGER_SPACE]; - short windowPart; - WindowRef whichWindow; - - windowPart = FindWindow(tearoffStruct.point, &whichWindow); - - if (windowPart != inMenuBar) { - Tcl_DStringInit(&tearoffCmdStr); - Tcl_DStringAppendElement(&tearoffCmdStr, "tk::TearOffMenu"); - Tcl_DStringAppendElement(&tearoffCmdStr, - Tk_PathName(tearoffStruct.menuPtr->tkwin)); - sprintf(intString, "%d", tearoffStruct.point.h); - Tcl_DStringAppendElement(&tearoffCmdStr, intString); - sprintf(intString, "%d", tearoffStruct.point.v); - Tcl_DStringAppendElement(&tearoffCmdStr, intString); - Tcl_Eval(tearoffStruct.menuPtr->interp, - Tcl_DStringValue(&tearoffCmdStr)); - Tcl_DStringFree(&tearoffCmdStr); - tearoffStruct.menuPtr = NULL; - } - } -} - -/* - *-------------------------------------------------------------- - * - * TkpInitializeMenuBindings -- - * - * For every interp, initializes the bindings for Windows - * menus. Does nothing on Mac or XWindows. - * - * Results: - * None. - * - * Side effects: - * C-level bindings are setup for the interp which will - * handle Alt-key sequences for menus without beeping - * or interfering with user-defined Alt-key bindings. - * - *-------------------------------------------------------------- - */ - -void -TkpInitializeMenuBindings(interp, bindingTable) - Tcl_Interp *interp; /* The interpreter to set. */ - Tk_BindingTable bindingTable; /* The table to add to. */ -{ - /* - * Nothing to do. - */ -} - -/* - *-------------------------------------------------------------- - * - * TkpComputeMenubarGeometry -- - * - * This procedure is invoked to recompute the size and - * layout of a menu that is a menubar clone. - * - * Results: - * None. - * - * Side effects: - * Fields of menu entries are changed to reflect their - * current positions, and the size of the menu window - * itself may be changed. - * - *-------------------------------------------------------------- - */ - -void -TkpComputeMenubarGeometry(menuPtr) - TkMenu *menuPtr; /* Structure describing menu. */ -{ - TkpComputeStandardMenuGeometry(menuPtr); -} - -/* - *---------------------------------------------------------------------- - * - * DrawTearoffEntry -- - * - * This procedure draws the background part of a menu. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -void -DrawTearoffEntry( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are drawing */ - Drawable d, /* The drawable we are drawing into */ - GC gc, /* The gc we are drawing with */ - Tk_Font tkfont, /* The font we are drawing with */ - CONST Tk_FontMetrics *fmPtr, /* The metrics we are drawing with */ - int x, /* Left edge of entry. */ - int y, /* Top edge of entry. */ - int width, /* Width of entry. */ - int height) /* Height of entry. */ -{ - XPoint points[2]; - int margin, segmentWidth, maxX; - Tk_3DBorder border; - - if ((menuPtr->menuType != MASTER_MENU) || (FixMDEF() != NULL)) { - return; - } - - margin = (fmPtr->ascent + fmPtr->descent)/2; - points[0].x = x; - points[0].y = y + height/2; - points[1].y = points[0].y; - segmentWidth = 6; - maxX = width - 1; - border = Tk_Get3DBorderFromObj(menuPtr->tkwin, menuPtr->borderPtr); - - while (points[0].x < maxX) { - points[1].x = points[0].x + segmentWidth; - if (points[1].x > maxX) { - points[1].x = maxX; - } - Tk_Draw3DPolygon(menuPtr->tkwin, d, border, points, 2, 1, - TK_RELIEF_RAISED); - points[0].x += 2*segmentWidth; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacSetHelpMenuItemCount -- - * - * Has to be called after the first call to InsertMenu. Sets - * up the global variable for the number of items in the - * unmodified help menu. - * - * Results: - * None. - * - * Side effects: - * Sets the global helpItemCount. - * - *---------------------------------------------------------------------- - */ - -void -TkMacSetHelpMenuItemCount() -{ - MenuHandle helpMenuHandle; - - if ((HMGetHelpMenuHandle(&helpMenuHandle) != noErr) - || (helpMenuHandle == NULL)) { - helpItemCount = -1; - } else { - helpItemCount = CountMItems(helpMenuHandle); - DeleteMenuItem(helpMenuHandle, helpItemCount); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacMenuClick -- - * - * Prepares a menubar for MenuSelect or MenuKey. - * - * Results: - * None. - * - * Side effects: - * Any pending configurations of the menubar are completed. - * - *---------------------------------------------------------------------- - */ - -void -TkMacMenuClick() -{ - TkMenu *menuPtr; - TkMenuReferences *menuRefPtr; - - if ((currentMenuBarInterp != NULL) && (currentMenuBarName != NULL)) { - menuRefPtr = TkFindMenuReferences(currentMenuBarInterp, - currentMenuBarName); - for (menuPtr = menuRefPtr->menuPtr->masterMenuPtr; - menuPtr != NULL; menuPtr = menuPtr->nextInstancePtr) { - if (menuPtr->menuType == MENUBAR) { - CompleteIdlers(menuPtr); - break; - } - } - } - - if (menuBarFlags & MENUBAR_REDRAW_PENDING) { - Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL); - DrawMenuBarWhenIdle((ClientData *) NULL); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpDrawMenuEntry -- - * - * Draws the given menu entry at the given coordinates with the - * given attributes. - * - * Results: - * None. - * - * Side effects: - * X Server commands are executed to display the menu entry. - * - *---------------------------------------------------------------------- - */ - -void -TkpDrawMenuEntry( - TkMenuEntry *mePtr, /* The entry to draw */ - Drawable d, /* What to draw into */ - Tk_Font tkfont, /* Precalculated font for menu */ - CONST Tk_FontMetrics *menuMetricsPtr, - /* Precalculated metrics for menu */ - int x, /* X-coordinate of topleft of entry */ - int y, /* Y-coordinate of topleft of entry */ - int width, /* Width of the entry rectangle */ - int height, /* Height of the current rectangle */ - int strictMotif, /* Boolean flag */ - int drawArrow) /* Whether or not to draw the cascade - * arrow for cascade items. Only applies - * to Windows. */ -{ - GC gc; - TkMenu *menuPtr = mePtr->menuPtr; - int padY = (menuPtr->menuType == MENUBAR) ? 3 : 0; - GC indicatorGC; - Tk_3DBorder bgBorder, activeBorder; - const Tk_FontMetrics *fmPtr; - Tk_FontMetrics entryMetrics; - int adjustedY = y + padY; - int adjustedHeight = height - 2 * padY; - - /* - * Choose the gc for drawing the foreground part of the entry. - * Under Appearance, we pass a null (appearanceGC) to tell - * ourselves not to change whatever color the appearance manager has set. - */ - - if ((mePtr->state == ENTRY_ACTIVE) && !strictMotif) { - gc = mePtr->activeGC; - if (gc == NULL) { - gc = menuPtr->activeGC; - } - } else { - TkMenuEntry *cascadeEntryPtr; - int parentDisabled = 0; - - for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr; - cascadeEntryPtr != NULL; - cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) { - char *name = (cascadeEntryPtr->namePtr == NULL) ? "" - : Tcl_GetStringFromObj(cascadeEntryPtr->namePtr, NULL); - - if (strcmp(name, Tk_PathName(menuPtr->tkwin)) == 0) { - if (cascadeEntryPtr->state == ENTRY_DISABLED) { - parentDisabled = 1; - } - break; - } - } - - if (((parentDisabled || (mePtr->state == ENTRY_DISABLED))) - && (menuPtr->disabledFgPtr != NULL)) { - gc = mePtr->disabledGC; - if (gc == NULL) { - gc = menuPtr->disabledGC; - } - } else { - gc = mePtr->textGC; - if (gc == NULL) { - gc = menuPtr->textGC; - } - } - } - - indicatorGC = mePtr->indicatorGC; - if (indicatorGC == NULL) { - indicatorGC = menuPtr->indicatorGC; - } - - bgBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin, - (mePtr->borderPtr == NULL) - ? menuPtr->borderPtr : mePtr->borderPtr); - if (strictMotif) { - activeBorder = bgBorder; - } else { - activeBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin, - (mePtr->activeBorderPtr == NULL) - ? menuPtr->activeBorderPtr : mePtr->activeBorderPtr); - } - - if (mePtr->fontPtr == NULL) { - fmPtr = menuMetricsPtr; - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); - Tk_GetFontMetrics(tkfont, &entryMetrics); - fmPtr = &entryMetrics; - } - - /* - * Need to draw the entire background, including padding. On Unix, - * for menubars, we have to draw the rest of the entry taking - * into account the padding. - */ - - DrawMenuEntryBackground(menuPtr, mePtr, d, activeBorder, - bgBorder, x, y, width, height); - - if (mePtr->type == SEPARATOR_ENTRY) { - DrawMenuSeparator(menuPtr, mePtr, d, gc, tkfont, - fmPtr, x, adjustedY, width, adjustedHeight); - } else if (mePtr->type == TEAROFF_ENTRY) { - DrawTearoffEntry(menuPtr, mePtr, d, gc, tkfont, fmPtr, x, adjustedY, - width, adjustedHeight); - } else { - DrawMenuEntryLabel(menuPtr, mePtr, d, gc, tkfont, fmPtr, x, - adjustedY, width, adjustedHeight); - DrawMenuEntryAccelerator(menuPtr, mePtr, d, gc, tkfont, fmPtr, - activeBorder, x, adjustedY, width, adjustedHeight, drawArrow); - if (!mePtr->hideMargin) { - DrawMenuEntryIndicator(menuPtr, mePtr, d, gc, indicatorGC, tkfont, - fmPtr, x, adjustedY, width, adjustedHeight); - } - - } -} - -/* - *-------------------------------------------------------------- - * - * TkpComputeStandardMenuGeometry -- - * - * This procedure is invoked to recompute the size and - * layout of a menu that is not a menubar clone. - * - * Results: - * None. - * - * Side effects: - * Fields of menu entries are changed to reflect their - * current positions, and the size of the menu window - * itself may be changed. - * - *-------------------------------------------------------------- - */ - -void -TkpComputeStandardMenuGeometry( - TkMenu *menuPtr) /* Structure describing menu. */ -{ - Tk_Font tkfont, menuFont; - Tk_FontMetrics menuMetrics, entryMetrics, *fmPtr; - int x, y, height, modifierWidth, labelWidth, indicatorSpace; - int windowWidth, windowHeight, accelWidth, maxAccelTextWidth; - int i, j, lastColumnBreak, maxModifierWidth, maxWidth, nonAccelMargin; - int maxNonAccelMargin, maxEntryWithAccelWidth, maxEntryWithoutAccelWidth; - int entryWidth, maxIndicatorSpace, borderWidth, activeBorderWidth; - TkMenuEntry *mePtr, *columnEntryPtr; - EntryGeometry *geometryPtr; - - if (menuPtr->tkwin == NULL) { - return; - } - - Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->borderWidthPtr, - &borderWidth); - Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr, - &activeBorderWidth); - x = y = borderWidth; - indicatorSpace = labelWidth = accelWidth = maxAccelTextWidth = 0; - windowHeight = windowWidth = maxWidth = lastColumnBreak = 0; - maxModifierWidth = nonAccelMargin = maxNonAccelMargin = 0; - maxEntryWithAccelWidth = maxEntryWithoutAccelWidth = 0; - maxIndicatorSpace = 0; - - /* - * On the Mac especially, getting font metrics can be quite slow, - * so we want to do it intelligently. We are going to precalculate - * them and pass them down to all of the measuring and drawing - * routines. We will measure the font metrics of the menu once. - * If an entry does not have its own font set, then we give - * the geometry/drawing routines the menu's font and metrics. - * If an entry has its own font, we will measure that font and - * give all of the geometry/drawing the entry's font and metrics. - */ - - menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); - Tk_GetFontMetrics(menuFont, &menuMetrics); - - for (i = 0; i < menuPtr->numEntries; i++) { - mePtr = menuPtr->entries[i]; - if (mePtr->fontPtr == NULL) { - tkfont = menuFont; - fmPtr = &menuMetrics; - } else { - tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); - Tk_GetFontMetrics(tkfont, &entryMetrics); - fmPtr = &entryMetrics; - } - - if ((i > 0) && mePtr->columnBreak) { - if (maxIndicatorSpace != 0) { - maxIndicatorSpace += 2; - } - for (j = lastColumnBreak; j < i; j++) { - columnEntryPtr = menuPtr->entries[j]; - geometryPtr = - (EntryGeometry *) columnEntryPtr->platformEntryData; - - columnEntryPtr->indicatorSpace = maxIndicatorSpace; - columnEntryPtr->width = maxIndicatorSpace + maxWidth - + 2 * activeBorderWidth; - geometryPtr->accelTextWidth = maxAccelTextWidth; - geometryPtr->modifierWidth = maxModifierWidth; - columnEntryPtr->x = x; - columnEntryPtr->entryFlags &= ~ENTRY_LAST_COLUMN; - if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) { - geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth - - maxEntryWithAccelWidth; - if (geometryPtr->nonAccelMargin > maxNonAccelMargin) { - geometryPtr->nonAccelMargin = maxNonAccelMargin; - } - } else { - geometryPtr->nonAccelMargin = 0; - } - } - x += maxIndicatorSpace + maxWidth + 2 * borderWidth; - windowWidth = x; - maxWidth = maxIndicatorSpace = maxAccelTextWidth = 0; - maxModifierWidth = maxNonAccelMargin = maxEntryWithAccelWidth = 0; - maxEntryWithoutAccelWidth = 0; - lastColumnBreak = i; - y = borderWidth; - } - - if (mePtr->type == SEPARATOR_ENTRY) { - GetMenuSeparatorGeometry(menuPtr, mePtr, tkfont, - fmPtr, &entryWidth, &height); - mePtr->height = height; - } else if (mePtr->type == TEAROFF_ENTRY) { - GetTearoffEntryGeometry(menuPtr, mePtr, tkfont, - fmPtr, &entryWidth, &height); - mePtr->height = height; - } else { - /* - * For each entry, compute the height required by that - * particular entry, plus three widths: the width of the - * label, the width to allow for an indicator to be displayed - * to the left of the label (if any), and the width of the - * accelerator to be displayed to the right of the label - * (if any). These sizes depend, of course, on the type - * of the entry. - */ - - GetMenuLabelGeometry(mePtr, tkfont, fmPtr, &labelWidth, - &height); - mePtr->height = height; - - if (mePtr->type == CASCADE_ENTRY) { - GetMenuAccelGeometry(menuPtr, mePtr, tkfont, fmPtr, - &modifierWidth, &accelWidth, &height); - nonAccelMargin = 0; - } else if (mePtr->accelLength == 0) { - nonAccelMargin = mePtr->hideMargin ? 0 - : Tk_TextWidth(tkfont, "m", 1); - accelWidth = modifierWidth = 0; - } else { - labelWidth += Tk_TextWidth(tkfont, "m", 1); - GetMenuAccelGeometry(menuPtr, mePtr, tkfont, - fmPtr, &modifierWidth, &accelWidth, &height); - if (height > mePtr->height) { - mePtr->height = height; - } - nonAccelMargin = 0; - } - - if (!(mePtr->hideMargin)) { - GetMenuIndicatorGeometry(menuPtr, mePtr, tkfont, - fmPtr, &indicatorSpace, &height); - if (height > mePtr->height) { - mePtr->height = height; - } - } else { - indicatorSpace = 0; - } - - if (nonAccelMargin > maxNonAccelMargin) { - maxNonAccelMargin = nonAccelMargin; - } - if (accelWidth > maxAccelTextWidth) { - maxAccelTextWidth = accelWidth; - } - if (modifierWidth > maxModifierWidth) { - maxModifierWidth = modifierWidth; - } - if (indicatorSpace > maxIndicatorSpace) { - maxIndicatorSpace = indicatorSpace; - } - - entryWidth = labelWidth + modifierWidth + accelWidth - + nonAccelMargin; - - if (entryWidth > maxWidth) { - maxWidth = entryWidth; - } - - if (mePtr->accelLength > 0) { - if (entryWidth > maxEntryWithAccelWidth) { - maxEntryWithAccelWidth = entryWidth; - } - } else { - if (entryWidth > maxEntryWithoutAccelWidth) { - maxEntryWithoutAccelWidth = entryWidth; - } - } - - mePtr->height += 2 * activeBorderWidth; - } - mePtr->y = y; - y += menuPtr->entries[i]->height + borderWidth; - if (y > windowHeight) { - windowHeight = y; - } - } - - for (j = lastColumnBreak; j < menuPtr->numEntries; j++) { - columnEntryPtr = menuPtr->entries[j]; - geometryPtr = (EntryGeometry *) columnEntryPtr->platformEntryData; - - columnEntryPtr->indicatorSpace = maxIndicatorSpace; - columnEntryPtr->width = maxIndicatorSpace + maxWidth - + 2 * activeBorderWidth; - geometryPtr->accelTextWidth = maxAccelTextWidth; - geometryPtr->modifierWidth = maxModifierWidth; - columnEntryPtr->x = x; - columnEntryPtr->entryFlags |= ENTRY_LAST_COLUMN; - if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) { - geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth - - maxEntryWithAccelWidth; - if (geometryPtr->nonAccelMargin > maxNonAccelMargin) { - geometryPtr->nonAccelMargin = maxNonAccelMargin; - } - } else { - geometryPtr->nonAccelMargin = 0; - } - } - windowWidth = x + maxIndicatorSpace + maxWidth - + 2 * activeBorderWidth + borderWidth; - windowHeight += borderWidth; - - /* - * The X server doesn't like zero dimensions, so round up to at least - * 1 (a zero-sized menu should never really occur, anyway). - */ - - if (windowWidth <= 0) { - windowWidth = 1; - } - if (windowHeight <= 0) { - windowHeight = 1; - } - menuPtr->totalWidth = windowWidth; - menuPtr->totalHeight = windowHeight; -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuEntryLabel -- - * - * This procedure draws the label part of a menu. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuEntryLabel( - TkMenu *menuPtr, /* The menu we are drawing */ - TkMenuEntry *mePtr, /* The entry we are drawing */ - Drawable d, /* What we are drawing into */ - GC gc, /* The gc we are drawing into */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */ - int x, /* left edge */ - int y, /* right edge */ - int width, /* width of entry */ - int height) /* height of entry */ -{ - int indicatorSpace = mePtr->indicatorSpace; - int leftEdge = x + indicatorSpace; - int imageHeight, imageWidth; - int textHeight, textWidth; - int haveImage = 0, haveText = 0; - int imageXOffset = 0, imageYOffset = 0; - int textXOffset = 0, textYOffset = 0; - - /* - * Work out what we will need to draw first. - */ - - if (mePtr->image != NULL) { - Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight); - haveImage = 1; - } else if (mePtr->bitmapPtr != NULL) { - Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr); - Tk_SizeOfBitmap(menuPtr->display, bitmap, &imageWidth, &imageHeight); - haveImage = 1; - } - if (!haveImage || (mePtr->compound != COMPOUND_NONE)) { - if (mePtr->labelLength > 0) { - Tcl_DString itemTextDString; - textHeight = fmPtr->linespace; - GetEntryText(mePtr, &itemTextDString); - textWidth = Tk_TextWidth(tkfont, - Tcl_DStringValue(&itemTextDString), - Tcl_DStringLength(&itemTextDString)); - Tcl_DStringFree(&itemTextDString); - haveText = 1; - } - } - - /* - * Now work out what the relative positions are. - */ - - if (haveImage && haveText) { - int fullWidth = (imageWidth > textWidth ? imageWidth : textWidth); - switch ((enum compound) mePtr->compound) { - case COMPOUND_TOP: { - textXOffset = (fullWidth - textWidth)/2; - textYOffset = imageHeight/2 + 2; - imageXOffset = (fullWidth - imageWidth)/2; - imageYOffset = -textHeight/2; - break; - } - case COMPOUND_BOTTOM: { - textXOffset = (fullWidth - textWidth)/2; - textYOffset = -imageHeight/2; - imageXOffset = (fullWidth - imageWidth)/2; - imageYOffset = textHeight/2 + 2; - break; - } - case COMPOUND_LEFT: { - textXOffset = imageWidth + 2; - textYOffset = 0; - imageXOffset = 0; - imageYOffset = 0; - break; - } - case COMPOUND_RIGHT: { - textXOffset = 0; - textYOffset = 0; - imageXOffset = textWidth + 2; - imageYOffset = 0; - break; - } - case COMPOUND_CENTER: { - textXOffset = (fullWidth - textWidth)/2; - textYOffset = 0; - imageXOffset = (fullWidth - imageWidth)/2; - imageYOffset = 0; - break; - } - case COMPOUND_NONE: {break;} - } - } else { - textXOffset = 0; - textYOffset = 0; - imageXOffset = 0; - imageYOffset = 0; - } - - /* - * Draw label and/or bitmap or image for entry. - */ - - if (mePtr->image != NULL) { - Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight); - if ((mePtr->selectImage != NULL) - && (mePtr->entryFlags & ENTRY_SELECTED)) { - Tk_RedrawImage(mePtr->selectImage, 0, 0, - imageWidth, imageHeight, d, leftEdge + imageXOffset, - (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset)); - } else { - Tk_RedrawImage(mePtr->image, 0, 0, imageWidth, - imageHeight, d, leftEdge + imageXOffset, - (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset)); - } - } else if (mePtr->bitmapPtr != NULL) { - Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr); - XCopyPlane(menuPtr->display, bitmap, d, gc, 0, 0, - (unsigned) imageWidth, (unsigned) imageHeight, - leftEdge + imageXOffset, - (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset), 1); - } - if ((mePtr->compound != COMPOUND_NONE) || !haveImage) { - if (mePtr->labelLength > 0) { - Tcl_DString itemTextDString, convertedTextDString; - int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; - - GetEntryText(mePtr, &itemTextDString); - - /* Somehow DrawChars is changing the colors, it is odd, since - it works for the Apple Platinum Appearance, but not for - some Kaleidoscope Themes... Untill I can figure out what - exactly is going on, this will have to do: */ - - TkMacSetUpGraphicsPort(gc); - MoveTo((short) leftEdge + textXOffset, - (short) baseline + textYOffset); - Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&itemTextDString), - Tcl_DStringLength(&itemTextDString), &convertedTextDString); - DrawText(Tcl_DStringValue(&convertedTextDString), 0, - Tcl_DStringLength(&convertedTextDString)); - - /* Tk_DrawChars(menuPtr->display, d, gc, - tkfont, Tcl_DStringValue(&itemTextDString), - Tcl_DStringLength(&itemTextDString), - leftEdge, baseline); */ - - Tcl_DStringFree(&itemTextDString); - } - } - - if (mePtr->state == ENTRY_DISABLED) { - if (menuPtr->disabledFgPtr == NULL) { - if (!TkMacHaveAppearance()) { - XFillRectangle(menuPtr->display, d, menuPtr->disabledGC, x, y, - (unsigned) width, (unsigned) height); - } - } else if ((mePtr->image != NULL) - && (menuPtr->disabledImageGC != None)) { - XFillRectangle(menuPtr->display, d, menuPtr->disabledImageGC, - leftEdge + imageXOffset, - (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset), - (unsigned) imageWidth, (unsigned) imageHeight); - } - } -} - -/* - *---------------------------------------------------------------------- - * - * DrawMenuEntryBackground -- - * - * This procedure draws the background part of a menu entry. - * Under Appearance, we only draw the background if the entry's - * border is set, we DO NOT inherit it from the menu... - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menu in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -static void -DrawMenuEntryBackground( - TkMenu *menuPtr, /* The menu we are drawing. */ - TkMenuEntry *mePtr, /* The entry we are drawing. */ - Drawable d, /* What we are drawing into */ - Tk_3DBorder activeBorder, /* Border for active items */ - Tk_3DBorder bgBorder, /* Border for the background */ - int x, /* left edge */ - int y, /* top edge */ - int width, /* width of rectangle to draw */ - int height) /* height of rectangle to draw */ -{ - if (!TkMacHaveAppearance() - || (menuPtr->menuType == TEAROFF_MENU) - || ((mePtr->state == ENTRY_ACTIVE) - && (mePtr->activeBorderPtr != None)) - || ((mePtr->state != ENTRY_ACTIVE) && (mePtr->borderPtr != None))) { - if (mePtr->state == ENTRY_ACTIVE) { - bgBorder = activeBorder; - } - Tk_Fill3DRectangle(menuPtr->tkwin, d, bgBorder, - x, y, width, height, 0, TK_RELIEF_FLAT); - } -} - -/* - *---------------------------------------------------------------------- - * - * GetMenuLabelGeometry -- - * - * Figures out the size of the label portion of a menu item. - * - * Results: - * widthPtr and heightPtr are filled in with the correct geometry - * information. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -GetMenuLabelGeometry( - TkMenuEntry *mePtr, /* The entry we are computing */ - Tk_Font tkfont, /* The precalculated font */ - CONST Tk_FontMetrics *fmPtr, /* The precalculated metrics */ - int *widthPtr, /* The resulting width of the label - * portion */ - int *heightPtr) /* The resulting height of the label - * portion */ -{ - TkMenu *menuPtr = mePtr->menuPtr; - int haveImage = 0, haveText = 0; - - if (mePtr->image != NULL) { - Tk_SizeOfImage(mePtr->image, widthPtr, heightPtr); - haveImage = 1; - } else if (mePtr->bitmapPtr != NULL) { - Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr); - Tk_SizeOfBitmap(menuPtr->display, bitmap, widthPtr, heightPtr); - haveImage = 1; - } else { - *heightPtr = 0; - *widthPtr = 0; - } - - if (haveImage && (mePtr->compound == COMPOUND_NONE)) { - /* We don't care about the text in this case */ - } else { - /* Either it is compound or we don't have an image */ - if (mePtr->labelPtr != NULL) { - Tcl_DString itemTextDString; - int textWidth; - GetEntryText(mePtr, &itemTextDString); - textWidth = Tk_TextWidth(tkfont, - Tcl_DStringValue(&itemTextDString), - Tcl_DStringLength(&itemTextDString)); - Tcl_DStringFree(&itemTextDString); - - if ((mePtr->compound != COMPOUND_NONE) && haveImage) { - switch ((enum compound) mePtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - if (textWidth > *widthPtr) { - *widthPtr = textWidth; - } - /* Add text and padding */ - *heightPtr += fmPtr->linespace + 2; - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - if (fmPtr->linespace > *heightPtr) { - *heightPtr = fmPtr->linespace; - } - /* Add text and padding */ - *widthPtr += textWidth + 2; - break; - } - case COMPOUND_CENTER: { - if (fmPtr->linespace > *heightPtr) { - *heightPtr = fmPtr->linespace; - } - if (textWidth > *widthPtr) { - *widthPtr = textWidth; - } - break; - } - case COMPOUND_NONE: {break;} - } - } else { - /* We don't have an image or we're not compound */ - *heightPtr = fmPtr->linespace; - *widthPtr = textWidth; - } - } else { - /* An empty entry still has this height */ - *heightPtr = fmPtr->linespace; - } - } - *heightPtr += 1; -} - -/* - *---------------------------------------------------------------------- - * - * MenuSelectEvent -- - * - * Generates a "MenuSelect" virtual event. This can be used to - * do context-sensitive menu help. - * - * Results: - * None. - * - * Side effects: - * Places a virtual event on the event queue. - * - *---------------------------------------------------------------------- - */ - -static void -MenuSelectEvent( - TkMenu *menuPtr) /* the menu we have selected. */ -{ - XVirtualEvent event; - Point where; - - event.type = VirtualEvent; - event.serial = menuPtr->display->request; - event.send_event = false; - event.display = menuPtr->display; - Tk_MakeWindowExist(menuPtr->tkwin); - event.event = Tk_WindowId(menuPtr->tkwin); - event.root = XRootWindow(menuPtr->display, 0); - event.subwindow = None; - event.time = TkpGetMS(); - - GetMouse(&where); - event.x_root = where.h; - event.y_root = where.v; - event.state = TkMacButtonKeyState(); - event.same_screen = true; - event.name = Tk_GetUid("MenuSelect"); - Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL); -} - -/* - *---------------------------------------------------------------------- - * - * RecursivelyClearActiveMenu -- - * - * Recursively clears the active entry in the menu's cascade hierarchy. - * - * Results: - * None. - * - * Side effects: - * Generates <<MenuSelect>> virtual events. - * - *---------------------------------------------------------------------- - */ - -void -RecursivelyClearActiveMenu( - TkMenu *menuPtr) /* The menu to reset. */ -{ - int i; - TkMenuEntry *mePtr; - - TkActivateMenuEntry(menuPtr, -1); - MenuSelectEvent(menuPtr); - for (i = 0; i < menuPtr->numEntries; i++) { - mePtr = menuPtr->entries[i]; - if (mePtr->type == CASCADE_ENTRY) { - if ((mePtr->childMenuRefPtr != NULL) - && (mePtr->childMenuRefPtr->menuPtr != NULL)) { - RecursivelyClearActiveMenu(mePtr->childMenuRefPtr->menuPtr); - } - } - } -} - -/* - *---------------------------------------------------------------------- - * - * InvalidateMDEFRgns -- - * - * Invalidates the regions covered by menus that did redrawing and - * might be damaged. - * - * Results: - * None. - * - * Side effects: - * Generates Mac update events for affected windows. - * - *---------------------------------------------------------------------- - */ - -void -InvalidateMDEFRgns(void) -{ - GDHandle saveDevice; - GWorldPtr saveWorld, destPort; - Point scratch; - MacDrawable *macDraw; - TkMacWindowList *listPtr; - - if (totalMenuRgn == NULL) { - return; - } - - GetGWorld(&saveWorld, &saveDevice); - for (listPtr = tkMacWindowListPtr ; listPtr != NULL; - listPtr = listPtr->nextPtr) { - macDraw = (MacDrawable *) Tk_WindowId(listPtr->winPtr); - if (macDraw->flags & TK_DRAWN_UNDER_MENU) { - destPort = TkMacGetDrawablePort(Tk_WindowId(listPtr->winPtr)); - SetGWorld(destPort, NULL); - scratch.h = scratch.v = 0; - GlobalToLocal(&scratch); - OffsetRgn(totalMenuRgn, scratch.v, scratch.h); - InvalRgn(totalMenuRgn); - OffsetRgn(totalMenuRgn, -scratch.v, -scratch.h); - macDraw->flags &= ~TK_DRAWN_UNDER_MENU; - } - } - - SetGWorld(saveWorld, saveDevice); - SetEmptyRgn(totalMenuRgn); -} - -/* - *---------------------------------------------------------------------- - * - * TkMacClearMenubarActive -- - * - * Recursively clears the active entry in the current menubar hierarchy. - * - * Results: - * None. - * - * Side effects: - * Generates <<MenuSelect>> virtual events. - * - *---------------------------------------------------------------------- - */ - -void -TkMacClearMenubarActive(void) -{ - TkMenuReferences *menuBarRefPtr; - - if (currentMenuBarName != NULL) { - menuBarRefPtr = TkFindMenuReferences(currentMenuBarInterp, - currentMenuBarName); - if ((menuBarRefPtr != NULL) && (menuBarRefPtr->menuPtr != NULL)) { - TkMenu *menuPtr; - - for (menuPtr = menuBarRefPtr->menuPtr->masterMenuPtr; menuPtr != NULL; - menuPtr = menuPtr->nextInstancePtr) { - if (menuPtr->menuType == MENUBAR) { - RecursivelyClearActiveMenu(menuPtr); - } - } - } - } - InvalidateMDEFRgns(); - FixMDEF(); -} - -/* - *---------------------------------------------------------------------- - * - * TkpMenuNotifyToplevelCreate -- - * - * This routine reconfigures the menu and the clones indicated by - * menuName becuase a toplevel has been created and any system - * menus need to be created. Only applicable to Windows. - * - * Results: - * None. - * - * Side effects: - * An idle handler is set up to do the reconfiguration. - * - *---------------------------------------------------------------------- - */ - -void -TkpMenuNotifyToplevelCreate( - Tcl_Interp *interp, /* The interp the menu lives in. */ - char *menuName) /* The name of the menu to - * reconfigure. */ -{ - /* - * Nothing to do. - */ -} - -/* - *---------------------------------------------------------------------- - * - * FixMDEF -- - * - * Loads the MDEF and blasts our routine descriptor into it. - * We have to set up the MDEF. This is pretty slimy. The real MDEF - * resource is 68K code. All this code does is call another procedure. - * When the application in launched, a dummy value for the procedure - * is compiled into the MDEF. We are going to replace that dummy - * value with a routine descriptor. When the routine descriptor - * is invoked, the globals and everything will be setup, and we - * can do what we need. This will not work from 68K or CFM 68k - * currently, so we will conditional compile this until we - * figure it out. - * - * Results: - * Returns the MDEF handle. - * - * Side effects: - * The MDEF is read in and massaged. - * - *---------------------------------------------------------------------- - */ - -#if __MWERKS__ != 0x2400 -#define MDEF_PROC_OFFSET 0x24 -#else -#define MDEF_PROC_OFFSET 0x20 -#endif - -static Handle -FixMDEF(void) -{ -#if GENERATINGCFM - Handle MDEFHandle = GetResource('MDEF', 591); - Handle SICNHandle = GetResource('SICN', SICN_RESOURCE_NUMBER); - if ((MDEFHandle != NULL) && (SICNHandle != NULL)) { - HLock(MDEFHandle); - HLock(SICNHandle); - if (menuDefProc == NULL) { - menuDefProc = TkNewMenuDefProc(MenuDefProc); - } - memmove((void *) (((long) (*MDEFHandle)) + MDEF_PROC_OFFSET), &menuDefProc, 4); - return MDEFHandle; - } else { - return NULL; - } -#else - return NULL; -#endif -} - -/* - *---------------------------------------------------------------------- - * - * TkpMenuInit -- - * - * Initializes Mac-specific menu data. - * - * Results: - * None. - * - * Side effects: - * Allocates a hash table. - * - *---------------------------------------------------------------------- - */ - -void -TkpMenuInit(void) -{ - lastMenuID = 256; - Tcl_InitHashTable(&commandTable, TCL_ONE_WORD_KEYS); - currentMenuBarOwner = NULL; - tearoffStruct.menuPtr = NULL; - currentAppleMenuID = 0; - currentHelpMenuID = 0; - currentMenuBarInterp = NULL; - currentMenuBarName = NULL; - windowListPtr = NULL; - - /* - * Get the GC that we will use as the sign to the font - * routines that they should not muck with the foreground color... - */ - - if (TkMacHaveAppearance() > 1) { - XGCValues tmpValues; - TkColor *tmpColorPtr; - - tmpColorPtr = TkpGetColor(NULL, "systemAppearanceColor"); - tmpValues.foreground = tmpColorPtr->color.pixel; - tmpValues.background = tmpColorPtr->color.pixel; - ckfree((char *) tmpColorPtr); - - tkThemeMenuItemDrawingUPP = NewMenuItemDrawingProc(tkThemeMenuItemDrawingProc); - } - FixMDEF(); - - Tcl_ExternalToUtf(NULL, NULL, "\311", /* Š */ - -1, 0, NULL, elipsisString, - TCL_UTF_MAX + 1, NULL, NULL, NULL); -} - -/* - *---------------------------------------------------------------------- - * - * TkpMenuThreadInit -- - * - * Does platform-specific initialization of thread-specific - * menu state. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkpMenuThreadInit() -{ - /* - * Nothing to do. - */ -} - -/* - *---------------------------------------------------------------------- - * - * TkpPreprocessMacMenu -- - * - * Handle preprocessing of menubar if it exists. - * - * Results: - * None. - * - * Side effects: - * All post commands for the current menubar get executed. - * - *---------------------------------------------------------------------- - */ - -void -TkMacPreprocessMenu() -{ - TkMenuReferences *mbRefPtr; - int code; - - if ((currentMenuBarName != NULL) && (currentMenuBarInterp != NULL)) { - mbRefPtr = TkFindMenuReferences(currentMenuBarInterp, - currentMenuBarName); - if ((mbRefPtr != NULL) && (mbRefPtr->menuPtr != NULL)) { - Tcl_Preserve((ClientData)currentMenuBarInterp); - code = TkPreprocessMenu(mbRefPtr->menuPtr->masterMenuPtr); - if ((code != TCL_OK) && (code != TCL_CONTINUE) - && (code != TCL_BREAK)) { - Tcl_AddErrorInfo(currentMenuBarInterp, - "\n (menu preprocess)"); - Tcl_BackgroundError(currentMenuBarInterp); - } - Tcl_Release((ClientData)currentMenuBarInterp); - } - } -} diff --git a/mac/tkMacMenu.r b/mac/tkMacMenu.r deleted file mode 100644 index b2fb815..0000000 --- a/mac/tkMacMenu.r +++ /dev/null @@ -1,47 +0,0 @@ -/* - * tkMacMenu.r -- - * - * Resources needed by menus. - * - * This file also contains the icons 'SICN' used by the menu code - * in menu items. - * - * Copyright (c) 1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMenu.r,v 1.3 1998/09/14 18:23:38 stanton Exp $ - */ - -#include <Types.r> - -/* - * Icons used in menu items. - */ - -resource 'SICN' (128, preload, locked) { - { /* array: 7 elements */ - /* [1] */ - $"0000 0000 8000 C000 E000 F000 F800 FC00" - $"F800 F000 E000 C000 80", - /* [2] */ - $"0000 0000 0000 0800 1400 2200 4100 8080" - $"E380 2200 2200 2200 3E", - /* [3] */ - $"0000 0000 0000 0000 0000 F8F0 C4F0 F270" - $"0900 0480 0270 0130 00F0", - /* [4] */ - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 E4E0 CE60 1B00 3180", - /* [5] */ - $"0000 0000 0000 0000 6300 9480 9480 7F00" - $"1400 7F00 9480 9480 63", - /* [6] */ - $"0000 0000 0000 0000 0000 3FF8 1FF0 0FE0" - $"07C0 0380 01", - /* [7] */ - $"0000 0000 0000 0000 0000 0100 0380 07C0" - $"0FE0 1FF0 3FF8" - } -}; diff --git a/mac/tkMacMenubutton.c b/mac/tkMacMenubutton.c deleted file mode 100644 index 002c5d4..0000000 --- a/mac/tkMacMenubutton.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * tkMacMenubutton.c -- - * - * This file implements the Macintosh specific portion of the - * menubutton widget. - * - * Copyright (c) 1996 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMenubutton.c,v 1.9.4.1 2003/11/17 23:29:36 hobbs Exp $ - */ - -#include "tkMenubutton.h" -#include "tkMacInt.h" -#include <Controls.h> - -#define kShadowOffset (3) /* amount to offset shadow from frame */ -#define kTriangleWidth (11) /* width of the triangle */ -#define kTriangleHeight (6) /* height of the triangle */ -#define kTriangleMargin (5) /* margin around triangle */ - -/* - * Declaration of Unix specific button structure. - */ - -typedef struct MacMenuButton { - TkMenuButton info; /* Generic button info. */ -} MacMenuButton; - -/* - * The structure below defines menubutton class behavior by means of - * procedures that can be invoked from generic window code. - */ - -Tk_ClassProcs tkpMenubuttonClass = { - sizeof(Tk_ClassProcs), /* size */ - TkMenuButtonWorldChanged, /* worldChangedProc */ -}; - -/* - *---------------------------------------------------------------------- - * - * TkpCreateMenuButton -- - * - * Allocate a new TkMenuButton structure. - * - * Results: - * Returns a newly allocated TkMenuButton structure. - * - * Side effects: - * Registers an event handler for the widget. - * - *---------------------------------------------------------------------- - */ - -TkMenuButton * -TkpCreateMenuButton( - Tk_Window tkwin) -{ - MacMenuButton *butPtr = (MacMenuButton *)ckalloc(sizeof(MacMenuButton)); - - return (TkMenuButton *) butPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDisplayMenuButton -- - * - * This procedure is invoked to display a menubutton widget. - * - * Results: - * None. - * - * Side effects: - * Commands are output to X to display the menubutton in its - * current mode. - * - *---------------------------------------------------------------------- - */ - -void -TkpDisplayMenuButton( - ClientData clientData) /* Information about widget. */ -{ - TkMenuButton *mbPtr = (TkMenuButton *) clientData; - GC gc; - Tk_3DBorder border; - int x = 0; /* Initialization needed only to stop - * compiler warning. */ - int y; - Tk_Window tkwin = mbPtr->tkwin; - int width, height, fullWidth, fullHeight; - int imageWidth, imageHeight; - int imageXOffset, imageYOffset, textXOffset, textYOffset; - int haveImage = 0, haveText = 0; - MacMenuButton * macMBPtr = (MacMenuButton *) mbPtr; - GWorldPtr destPort; - CGrafPtr saveWorld; - GDHandle saveDevice; - MacDrawable *macDraw; - - mbPtr->flags &= ~REDRAW_PENDING; - if ((mbPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { - return; - } - - GetGWorld(&saveWorld, &saveDevice); - destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin)); - SetGWorld(destPort, NULL); - macDraw = (MacDrawable *) Tk_WindowId(tkwin); - - if ((mbPtr->state == STATE_DISABLED) && (mbPtr->disabledFg != NULL)) { - gc = mbPtr->disabledGC; - } else if ((mbPtr->state == STATE_ACTIVE) - && !Tk_StrictMotif(mbPtr->tkwin)) { - gc = mbPtr->activeTextGC; - } else { - gc = mbPtr->normalTextGC; - } - border = mbPtr->normalBorder; - - if (mbPtr->image != None) { - Tk_SizeOfImage(mbPtr->image, &width, &height); - haveImage = 1; - } else if (mbPtr->bitmap != None) { - Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); - haveImage = 1; - } - imageWidth = width; - imageHeight = height; - - haveText = (mbPtr->textWidth != 0 && mbPtr->textHeight != 0); - - /* - * In order to avoid screen flashes, this procedure redraws - * the menu button in a pixmap, then copies the pixmap to the - * screen in a single operation. This means that there's no - * point in time where the on-sreen image has been cleared. - */ - - Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), border, 0, 0, - Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); - - imageXOffset = 0; - imageYOffset = 0; - textXOffset = 0; - textYOffset = 0; - fullWidth = 0; - fullHeight = 0; - - if (mbPtr->compound != COMPOUND_NONE && haveImage && haveText) { - switch ((enum compound) mbPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - /* Image is above or below text */ - if (mbPtr->compound == COMPOUND_TOP) { - textYOffset = height + mbPtr->padY; - } else { - imageYOffset = mbPtr->textHeight + mbPtr->padY; - } - fullHeight = height + mbPtr->textHeight + mbPtr->padY; - fullWidth = (width > mbPtr->textWidth ? width : - mbPtr->textWidth); - textXOffset = (fullWidth - mbPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - /* Image is left or right of text */ - if (mbPtr->compound == COMPOUND_LEFT) { - textXOffset = width + mbPtr->padX; - } else { - imageXOffset = mbPtr->textWidth + mbPtr->padX; - } - fullWidth = mbPtr->textWidth + mbPtr->padX + width; - fullHeight = (height > mbPtr->textHeight ? height : - mbPtr->textHeight); - textYOffset = (fullHeight - mbPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; - } - case COMPOUND_CENTER: { - /* Image and text are superimposed */ - fullWidth = (width > mbPtr->textWidth ? width : - mbPtr->textWidth); - fullHeight = (height > mbPtr->textHeight ? height : - mbPtr->textHeight); - textXOffset = (fullWidth - mbPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - textYOffset = (fullHeight - mbPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; - } - case COMPOUND_NONE: {break;} - } - - - TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, - mbPtr->indicatorWidth + fullWidth, fullHeight, - &x, &y); - - imageXOffset += x; - imageYOffset += y; - if (mbPtr->image != NULL) { - Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin), - imageXOffset, imageYOffset); - } else if (mbPtr->bitmap != None) { - XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin), - gc, 0, 0, (unsigned) width, (unsigned) height, - imageXOffset, imageYOffset, 1); - } - - Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, - mbPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1); - Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, - mbPtr->textLayout, x + textXOffset, y + textYOffset, - mbPtr->underline); - } else if (haveImage) { - TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, - width + mbPtr->indicatorWidth, height, &x, &y); - imageXOffset += x; - imageYOffset += y; - if (mbPtr->image != NULL) { - Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin), - imageXOffset, imageYOffset); - } else if (mbPtr->bitmap != None) { - XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin), - gc, 0, 0, (unsigned) width, (unsigned) height, - x, y, 1); - } - } else { - TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY, - mbPtr->textWidth + mbPtr->indicatorWidth, - mbPtr->textHeight, &x, &y); - Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, - mbPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1); - Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, - mbPtr->textLayout, x + textXOffset, y + textYOffset, - mbPtr->underline); - } - -#if 0 /* this is the original code */ - /* - * Display image or bitmap or text for button. - */ - - if (mbPtr->image != None) { - Tk_SizeOfImage(mbPtr->image, &width, &height); - - imageOrBitmap: - TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, - width + mbPtr->indicatorWidth, height, &x, &y); - if (mbPtr->image != NULL) { - Tk_RedrawImage(mbPtr->image, 0, 0, width, height, - Tk_WindowId(tkwin), x, y); - } else { - XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin), - gc, 0, 0, (unsigned) width, (unsigned) height, x, y, 1); - } - } else if (mbPtr->bitmap != None) { - Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); - goto imageOrBitmap; - } else { - TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY, - mbPtr->textWidth + mbPtr->indicatorWidth, mbPtr->textHeight, - &x, &y); - Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, - mbPtr->textLayout, x, y, 0, -1); - } -#endif - - /* - * If the menu button is disabled with a stipple rather than a special - * foreground color, generate the stippled effect. - */ - - if ((mbPtr->state == STATE_DISABLED) - && ((mbPtr->disabledFg != NULL) || (mbPtr->image != NULL))) { - /* - * Stipple the whole button if no disabledFg was specified, - * otherwise restrict stippling only to displayed image - */ - if (mbPtr->disabledFg == NULL) { - XFillRectangle(mbPtr->display, Tk_WindowId(tkwin), - mbPtr->stippleGC, mbPtr->inset, mbPtr->inset, - (unsigned) (Tk_Width(tkwin) - 2*mbPtr->inset), - (unsigned) (Tk_Height(tkwin) - 2*mbPtr->inset)); - } else { - XFillRectangle(mbPtr->display, Tk_WindowId(tkwin), - mbPtr->stippleGC, imageXOffset, imageYOffset, - (unsigned) imageWidth, (unsigned) imageHeight); - } - } - - /* - * Draw the cascade indicator for the menu button on the - * right side of the window, if desired. - */ - - if (mbPtr->indicatorOn) { - int w, h, i; - Rect r; - - r.left = macDraw->xOff + Tk_Width(tkwin) - mbPtr->inset - - mbPtr->indicatorWidth; - r.top = macDraw->yOff + Tk_Height(tkwin)/2 - - mbPtr->indicatorHeight/2; - r.right = macDraw->xOff + Tk_Width(tkwin) - mbPtr->inset - - kTriangleMargin; - r.bottom = macDraw->yOff + Tk_Height(tkwin)/2 - + mbPtr->indicatorHeight/2; - - h = mbPtr->indicatorHeight; - w = mbPtr->indicatorWidth - 1 - kTriangleMargin; - for (i = 0; i < h; i++) { - MoveTo(r.left + i, r.top + i); - LineTo(r.left + i + w, r.top + i); - w -= 2; - } - } - - /* - * Draw the border and traversal highlight last. This way, if the - * menu button's contents overflow onto the border they'll be covered - * up by the border. - */ - - TkMacSetUpClippingRgn(Tk_WindowId(tkwin)); - if (mbPtr->borderWidth > 0) { - Rect r; - - r.left = macDraw->xOff + mbPtr->highlightWidth + mbPtr->borderWidth; - r.top = macDraw->yOff + mbPtr->highlightWidth + mbPtr->borderWidth; - r.right = macDraw->xOff + Tk_Width(tkwin) - mbPtr->highlightWidth - - mbPtr->borderWidth; - r.bottom = macDraw->yOff + Tk_Height(tkwin) - mbPtr->highlightWidth - - mbPtr->borderWidth; - FrameRect(&r); - - PenSize(mbPtr->borderWidth - 1, mbPtr->borderWidth - 1); - MoveTo(r.right, r.top + kShadowOffset); - LineTo(r.right, r.bottom); - LineTo(r.left + kShadowOffset, r.bottom); - } - - if (mbPtr->highlightWidth != 0) { - GC fgGC, bgGC; - - bgGC = Tk_GCForColor(mbPtr->highlightBgColorPtr, Tk_WindowId(tkwin)); - if (mbPtr->flags & GOT_FOCUS) { - fgGC = Tk_GCForColor(mbPtr->highlightColorPtr, Tk_WindowId(tkwin)); - TkpDrawHighlightBorder(tkwin, fgGC, bgGC, mbPtr->highlightWidth, - Tk_WindowId(tkwin)); - } else { - TkpDrawHighlightBorder(tkwin, bgGC, bgGC, mbPtr->highlightWidth, - Tk_WindowId(tkwin)); - } - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyMenuButton -- - * - * Free data structures associated with the menubutton control. - * - * Results: - * None. - * - * Side effects: - * Restores the default control state. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyMenuButton( - TkMenuButton *mbPtr) -{ -} - -/* - *---------------------------------------------------------------------- - * - * TkpComputeMenuButtonGeometry -- - * - * After changes in a menu button's text or bitmap, this procedure - * recomputes the menu button's geometry and passes this information - * along to the geometry manager for the window. - * - * Results: - * None. - * - * Side effects: - * The menu button's window may change size. - * - *---------------------------------------------------------------------- - */ - -void -TkpComputeMenuButtonGeometry(mbPtr) - register TkMenuButton *mbPtr; /* Widget record for menu button. */ -{ - int width=0, height=0, textwidth=0, textheight=0, mm, pixels, noimage=0; - - mbPtr->inset = mbPtr->highlightWidth + mbPtr->borderWidth; - if (mbPtr->image != None) { - Tk_SizeOfImage(mbPtr->image, &width, &height); - if (mbPtr->width > 0) { - width = mbPtr->width; - } - if (mbPtr->height > 0) { - height = mbPtr->height; - } - } else if (mbPtr->bitmap != None) { - Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); - if (mbPtr->width > 0) { - width = mbPtr->width; - } - if (mbPtr->height > 0) { - height = mbPtr->height; - } - } else { - noimage=1; - } - - if ( noimage || mbPtr->compound != COMPOUND_NONE ) { - Tk_FreeTextLayout(mbPtr->textLayout); - mbPtr->textLayout = Tk_ComputeTextLayout(mbPtr->tkfont, mbPtr->text, - -1, mbPtr->wrapLength, mbPtr->justify, 0, &mbPtr->textWidth, - &mbPtr->textHeight); - textwidth = mbPtr->textWidth; - textheight = mbPtr->textHeight; - if (mbPtr->width > 0) { - textwidth = mbPtr->width * Tk_TextWidth(mbPtr->tkfont, "0", 1); - } - if (mbPtr->height > 0) { - Tk_FontMetrics fm; - - Tk_GetFontMetrics(mbPtr->tkfont, &fm); - textheight = mbPtr->height * fm.linespace; - } - textwidth += 2*mbPtr->padX; - textheight += 2*mbPtr->padY; - } - - switch ((enum compound) mbPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - height += textheight + mbPtr->padY; - width = (width > textwidth ? width : textwidth); - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - height = (height > textheight ? height : textheight); - width += textwidth + mbPtr->padX; - break; - } - case COMPOUND_CENTER: { - height = (height > textheight ? height : textheight); - width = (width > textwidth ? width : textwidth); - break; - } - case COMPOUND_NONE: { - if (noimage) { - height = textheight; - width = textwidth; - } - break; - } - } - - if (mbPtr->indicatorOn) { - mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin)); - pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin)); - mbPtr->indicatorHeight= kTriangleHeight; - mbPtr->indicatorWidth = kTriangleWidth + kTriangleMargin; - width += mbPtr->indicatorWidth; - } else { - mbPtr->indicatorHeight = 0; - mbPtr->indicatorWidth = 0; - } - - Tk_GeometryRequest(mbPtr->tkwin, (int) (width + 2*mbPtr->inset), - (int) (height + 2*mbPtr->inset)); - Tk_SetInternalBorder(mbPtr->tkwin, mbPtr->inset); -} diff --git a/mac/tkMacMenus.c b/mac/tkMacMenus.c deleted file mode 100644 index 8114daf..0000000 --- a/mac/tkMacMenus.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * tkMacMenus.c -- - * - * These calls set up and manage the menubar for the - * Macintosh version of Tk. - * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacMenus.c,v 1.8 2002/01/27 11:11:02 das Exp $ - */ - -#include "tcl.h" -#include "tclMacInt.h" /* Needed for FSpLocationFromPath */ -#include "tk.h" -#include "tkInt.h" -#include "tkMacInt.h" - -/* - * The define Status defined by Xlib.h conflicts with the function Status - * defined by Devices.h. We undefine it here to compile. - */ -#undef Status -#include <Devices.h> -#include <Menus.h> -#include <Memory.h> -#include <SegLoad.h> -#include <StandardFile.h> -#include <ToolUtils.h> -#include <Balloons.h> - -#define kAppleMenu 256 -#define kAppleAboutItem 1 -#define kFileMenu 2 -#define kEditMenu 3 - -#define kSourceItem 1 -#define kCloseItem 2 -#define kQuitItem 4 - -#define EDIT_CUT 1 -#define EDIT_COPY 2 -#define EDIT_PASTE 3 -#define EDIT_CLEAR 4 - -MenuHandle tkAppleMenu; -MenuHandle tkFileMenu; -MenuHandle tkEditMenu; - -static Tcl_Interp * gInterp; /* Interpreter for this application. */ - -static void GenerateEditEvent _ANSI_ARGS_((int flag)); -static void SourceDialog _ANSI_ARGS_((void)); - -/* - *---------------------------------------------------------------------- - * - * TkMacHandleMenuSelect -- - * - * Handles events that occur in the Menu bar. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkMacHandleMenuSelect( - long mResult, - int optionKeyPressed) -{ - short theItem = LoWord(mResult); - short theMenu = HiWord(mResult); - Str255 name; - Tk_Window tkwin; - Window window; - TkDisplay *dispPtr; - - if (mResult == 0) { - TkMacHandleTearoffMenu(); - TkMacClearMenubarActive(); - return; - } - - switch (theMenu) { - - case kAppleMenu: - switch (theItem) { - case kAppleAboutItem: - { - Tcl_CmdInfo dummy; - - if (optionKeyPressed || gInterp == NULL || - Tcl_GetCommandInfo(gInterp, - "tkAboutDialog", &dummy) == 0) { - TkAboutDlg(); - } else { - Tcl_Eval(gInterp, "tkAboutDialog"); - } - break; - } - default: - GetMenuItemText(tkAppleMenu, theItem, name); - HiliteMenu(0); - OpenDeskAcc(name); - return; - } - break; - case kFileMenu: - switch (theItem) { - case kSourceItem: - /* TODO: source script */ - SourceDialog(); - break; - case kCloseItem: - /* Send close event */ - if (TkMacHaveAppearance() >= 0x110) { - window = TkMacGetXWindow(FrontNonFloatingWindow()); - } else { - window = TkMacGetXWindow(FrontWindow()); - } - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - TkGenWMDestroyEvent(tkwin); - break; - case kQuitItem: - /* Exit */ - if (optionKeyPressed || gInterp == NULL) { - Tcl_Exit(0); - } else { - Tcl_Eval(gInterp, "exit"); - } - break; - } - break; - case kEditMenu: - /* - * This implementation just send keysyms - * the Tk thinks are associated with function keys that - * do Cut, Copy & Paste on a Sun keyboard. - */ - GenerateEditEvent(theItem); - break; - default: - TkMacDispatchMenuEvent(theMenu, theItem); - TkMacClearMenubarActive(); - break; - } - - /* - * Finally we unhighlight the menu. - */ - HiliteMenu(0); -} /* TkMacHandleMenuSelect */ - -/* - *---------------------------------------------------------------------- - * - * TkMacInitMenus -- - * - * This procedure initializes the Macintosh menu bar. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkMacInitMenus( - Tcl_Interp *interp) -{ - gInterp = interp; - - /* - * At this point, InitMenus() should have already been called. - */ - - if (TkMacUseMenuID(256) != TCL_OK) { - panic("Menu ID 256 is already in use!"); - } - tkAppleMenu = NewMenu(256, "\p\024"); - if (tkAppleMenu == NULL) { - panic("memory - menus"); - } - InsertMenu(tkAppleMenu, 0); - AppendMenu(tkAppleMenu, "\pAbout Tcl & TkŠ"); - AppendMenu(tkAppleMenu, "\p(-"); - AppendResMenu(tkAppleMenu, 'DRVR'); - - if (TkMacUseMenuID(kFileMenu) != TCL_OK) { - panic("Menu ID %d is already in use!", kFileMenu); - } - tkFileMenu = NewMenu(kFileMenu, "\pFile"); - if (tkFileMenu == NULL) { - panic("memory - menus"); - } - InsertMenu(tkFileMenu, 0); - AppendMenu(tkFileMenu, "\pSourceŠ"); - AppendMenu(tkFileMenu, "\pClose/W"); - AppendMenu(tkFileMenu, "\p(-"); - AppendMenu(tkFileMenu, "\pQuit/Q"); - - if (TkMacUseMenuID(kEditMenu) != TCL_OK) { - panic("Menu ID %d is already in use!", kEditMenu); - } - tkEditMenu = NewMenu(kEditMenu, "\pEdit"); - if (tkEditMenu == NULL) { - panic("memory - menus"); - } - InsertMenu(tkEditMenu, 0); - AppendMenu(tkEditMenu, "\pCut/X"); - AppendMenu(tkEditMenu, "\pCopy/C"); - AppendMenu(tkEditMenu, "\pPaste/V"); - AppendMenu(tkEditMenu, "\pClear"); - if (TkMacUseMenuID(kHMHelpMenuID) != TCL_OK) { - panic("Help menu ID %s is already in use!", kHMHelpMenuID); - } - - DrawMenuBar(); - TkMacSetHelpMenuItemCount(); - - return; -} - -/* - *---------------------------------------------------------------------- - * - * GenerateEditEvent -- - * - * Takes an edit menu item and posts the corasponding a virtual - * event to Tk's event queue. - * - * Results: - * None. - * - * Side effects: - * May place events of queue. - * - *---------------------------------------------------------------------- - */ - -static void -GenerateEditEvent( - int flag) -{ - XVirtualEvent event; - Point where; - Tk_Window tkwin; - Window window; - TkDisplay *dispPtr; - - if (TkMacHaveAppearance() >= 0x110) { - window = TkMacGetXWindow(FrontNonFloatingWindow()); - } else { - window = TkMacGetXWindow(FrontWindow()); - } - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr; - if (tkwin == NULL) { - return; - } - - event.type = VirtualEvent; - event.serial = Tk_Display(tkwin)->request; - event.send_event = false; - event.display = Tk_Display(tkwin); - event.event = Tk_WindowId(tkwin); - event.root = XRootWindow(Tk_Display(tkwin), 0); - event.subwindow = None; - event.time = TkpGetMS(); - - GetMouse(&where); - tkwin = Tk_TopCoordsToWindow(tkwin, where.h, where.v, - &event.x, &event.y); - LocalToGlobal(&where); - event.x_root = where.h; - event.y_root = where.v; - event.state = TkMacButtonKeyState(); - event.same_screen = true; - - switch (flag) { - case EDIT_CUT: - event.name = Tk_GetUid("Cut"); - break; - - case EDIT_COPY: - event.name = Tk_GetUid("Copy"); - break; - - case EDIT_PASTE: - event.name = Tk_GetUid("Paste"); - break; - - case EDIT_CLEAR: - event.name = Tk_GetUid("Clear"); - break; - } - Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL); -} - -/* - *---------------------------------------------------------------------- - * - * SourceDialog -- - * - * Presents a dialog to the user for selecting a Tcl file. The - * selected file will be sourced into the main interpreter. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -SourceDialog() -{ - int result; - CONST char *path; - char openCmd[] = "tk_getOpenFile -filetypes {\ - {{TCL Scripts} {.tcl} TEXT} {{Text Files} {} TEXT}}"; - - if (gInterp == NULL) { - return; - } - - if (Tcl_Eval(gInterp, openCmd) != TCL_OK) { - return; - } - - path = Tcl_GetStringResult(gInterp); - - if (strlen(path) == 0) { - return; - } - - result = Tcl_EvalFile(gInterp, path); - if (result == TCL_ERROR) { - Tcl_BackgroundError(gInterp); - } -} diff --git a/mac/tkMacPort.h b/mac/tkMacPort.h deleted file mode 100644 index 91b1b35..0000000 --- a/mac/tkMacPort.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * tkMacPort.h -- - * - * This file is included by all of the Tk C files. It contains - * information that may be configuration-dependent, such as - * #includes for system include files and a few other things. - * - * Copyright (c) 1994-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacPort.h,v 1.11 2001/11/23 02:06:14 das Exp $ - */ - -#ifndef _TKMACPORT -#define _TKMACPORT - -/* - * Macro to use instead of "void" for arguments that must have - * type "void *" in ANSI C; maps them to type "char *" in - * non-ANSI systems. This macro may be used in some of the include - * files below, which is why it is defined here. - */ - -#ifndef VOID -# ifdef __STDC__ -# define VOID void -# else -# define VOID char -# endif -#endif - -#ifndef _TCL -# include <tcl.h> -#endif - -#include <time.h> -#include <stdlib.h> -#include <string.h> -#include "tclMath.h" -#include <ctype.h> -#include <limits.h> - -#include <Xlib.h> -#include <cursorfont.h> -#include <keysym.h> -#include <Xatom.h> -#include <Xfuncproto.h> -#include <Xutil.h> -#include "tkIntXlibDecls.h" - -/* - * Not all systems declare the errno variable in errno.h. so this - * file does it explicitly. - */ - -extern int errno; - -/* - * Define "NBBY" (number of bits per byte) if it's not already defined. - */ - -#ifndef NBBY -# define NBBY 8 -#endif - -/* - * Declarations for various library procedures that may not be declared - * in any other header file. - */ - -#ifndef panic /* In a stubs-aware setting, this could confuse the #define */ -EXTERN void panic _ANSI_ARGS_(TCL_VARARGS(char *, string)); -#endif -#ifndef strcasecmp -EXTERN int strcasecmp _ANSI_ARGS_((CONST char *s1, - CONST char *s2)); -#endif -#ifndef strncasecmp -EXTERN int strncasecmp _ANSI_ARGS_((CONST char *s1, - CONST char *s2, size_t n)); -#endif -/* - * Defines for X functions that are used by Tk but are treated as - * no-op functions on the Macintosh. - */ - -#define XFlush(display) -#define XFree(data) {if ((data) != NULL) ckfree((char *) (data));} -#define XGrabServer(display) -#define XNoOp(display) {display->request++;} -#define XUngrabServer(display) -#define XSynchronize(display, bool) {display->request++;} -#define XSync(display, bool) {display->request++;} -#define XVisualIDFromVisual(visual) (visual->visualid) - -/* - * The following functions are not used on the Mac, so we stub them out. - */ - -#define TkFreeWindowId(dispPtr,w) -#define TkInitXId(dispPtr) -#define TkpButtonSetDefaults(specPtr) {} -#define TkpCmapStressed(tkwin,colormap) (0) -#define TkpFreeColor(tkColPtr) -#define TkSetPixmapColormap(p,c) {} -#define TkpSync(display) - -/* - * The following macro returns the pixel value that corresponds to the - * RGB values in the given XColor structure. - */ - -#define PIXEL_MAGIC ((unsigned char) 0x69) -#define TkpGetPixel(p) ((((((PIXEL_MAGIC << 8) \ - | (((p)->red >> 8) & 0xff)) << 8) \ - | (((p)->green >> 8) & 0xff)) << 8) \ - | (((p)->blue >> 8) & 0xff)) - -/* - * This macro stores a representation of the window handle in a string. - * This should perhaps use the real size of an XID. - */ - -#define TkpPrintWindowId(buf,w) \ - sprintf((buf), "0x%x", (unsigned int) (w)) - -/* - * TkpScanWindowId is just an alias for Tcl_GetInt on Unix. - */ - -#define TkpScanWindowId(i,s,wp) \ - Tcl_GetInt((i),(s),(int *)(wp)) - -/* - * Magic pixel values for dynamic (or active) colors. - */ - -#define HIGHLIGHT_PIXEL 31 -#define HIGHLIGHT_TEXT_PIXEL 33 -#define CONTROL_TEXT_PIXEL 35 -#define CONTROL_BODY_PIXEL 37 -#define CONTROL_FRAME_PIXEL 39 -#define WINDOW_BODY_PIXEL 41 -#define MENU_ACTIVE_PIXEL 43 -#define MENU_ACTIVE_TEXT_PIXEL 45 -#define MENU_BACKGROUND_PIXEL 47 -#define MENU_DISABLED_PIXEL 49 -#define MENU_TEXT_PIXEL 51 -#define APPEARANCE_PIXEL 52 - -/* - * The following declaration is used to get access to a private Tcl interface - * that is needed for portability reasons. - */ - -#ifndef _TCLINT -#include <tclInt.h> -#endif - -#endif /* _TKMACPORT */ diff --git a/mac/tkMacProjects.sea.hqx b/mac/tkMacProjects.sea.hqx deleted file mode 100644 index a4dbd68..0000000 --- a/mac/tkMacProjects.sea.hqx +++ /dev/null @@ -1,3718 +0,0 @@ -(This file must be converted with BinHex 4.0) -:%A4V6@&M8(*[DQ9MG(-ZFf9K!%&38%aKGA0d)!!!!5F$!!'6Y5MI8h4eCQC*G#! -SBbNa16Nh,6%j16JJ3@aKC'4TEL"6HA0dC@ec,#"*EQ-Z,#"SG(4`1Lm[Gj!$,Q& -XB@4ND@jcHA-ZBfpY,e0dG@CQ5A3[$3SD!!83!!%R!`#3!h)!!3#3!h+H#JfPT9* -PFf9bGQ9NTD8!TC!%!3!!23"%YeSN#ER+0Li!N!d0(p)!N!26!#TU"`!"*M!!!R4 -V6@&M8(*[DQ9MG(-!!'l0!*N"63*m!cX"`2q3"!)HrrMrm-Y!!!#!!*!%!5i,TC! -%!3!!1!"%Y[&1mlEa6e`!N!0b!!%Pk!#3!h)!#*j@!!!",`!UD#%!!55j!!)Y2L" -#G@PXC!!!NqF!G`!$!B8#)`(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!e!%5d(A& -cZFSb"`#3!p-!!564!*!$d`!&k(!!!!')!#TQ1`!")dN!"Ldq)(4V!!"4'J"p!"! -"f3(k!F$rN!3#([rirr$,3!!!J!#3"k@3"!%!!$S!J,5Kk8#h64Vb!!!",`!!$PJ -!!!%[!!UlRJ!!USS!!!ab!*!%$`"8Dep04%9',Xq!!!"!XNe08(*$9dP&!3$rN!3 -!N!U!F!#3"N,"e+m!ShpY8pbfEdh,f+P*HUj[2"9e3-k!SAj`@SQ0BeALjCD&G!e -H`rE%$YFh)m2m'P9a'jDKMm&p[l*Xd1VSUmTrp(-,R(0)+CX8h*8DCEbQZY)G!kS -N[r'lPccY[hF&9FRKCmd,$#"8KX[+8!XYfbABbfMpe20%lmFrX))lpZ5*6q#mV9I -L'2lL%8KQKr,Q(j0XLC@iL1V'6NSI9$b,LTc%c1D-R4Pc!djpZIi`RM[hS'D06Z4 -c"NfU8YM8f%Dr!q$CHfc6kkfR"3)S0d"D0&E#AiLm)bk!a"8!*cN5CTHI'6kb[$b -C6e61M9YPAJk#cM[I-PGRjf685IAJ$c&JBFmiTk-AN5bNFHUDrS(cU!CH9mjDcFR -mA-%#)DkJ&$rGfU%UCI#Pe*K,%cIf@Zfkc((03"b9[S2U51T+-aB"%AQ'EmfNUrb -2k@1jQ`pFQKr14ID16DLfC#QkqLlNr9RRMNiB$GlZ"31ZGBJNk3XCI-l-%,5NdP, -LEhdPX*VG[iQaI"IV93pi83#21F0pM5p$#104XQl+)ZmcV5**rR!DIijDZa"rehZ -YqGEKK@lMp&d*la-a%*AGZ9kT6A6`H"PQ3kLAmljV,S3B+29-SqMV`i,*1$33FfV -#8K-TRbfMY*FX'HM'P9-3k9LIi3ajNadfimF%"r&8`Seh@UA$$)iI64YkrcP3,R` -%6"mG3VhP)i'ReraXSG4QJY21T2i,2m"eQi%ifNlPhY0+k--LF383V,+k,&@@VKl -a[pMFeFRMkj4",5HjV4XKqBi1dAFe!BPBBS)F#f%ZX)"@TC'b@V-E3ZJ1XZ9RZNd -p9eqRhF&PS+f6(XaCKHaSiH+4Te6bbA4,4C0VIjbHQMJfi)@(VQD!k&%VA4LpmP) -D!KP#TZ1iK6V*(#FJ961AKXY[)lGXI(+FdN6kPl#!++9J-%$-Q+%mZje$A*)k`Li -ZQ[4j"XQV&@BDPSME[*+DQJYaU0Qqi(fmf1R&FajY,PQCPA1Z#bPLej!!V,5J+6N -A(V(SF3C"![9P5dfXMiX3@ZeS#b"ZebaZ2"+&SEC*c6qL!A3$l`S-k0XY&#`BJGd -EfJh*ka9`C"+U3Hcq6H"Lc1'#QmIFCaI3Lq`&ShcY,fcl)B8PJT3aq5mLJ*lRfpH -5KJ0!LS,UeJm#hC!!&RM[+&M*DKEr9GdcTK+j`bhQ#"Gl&@U0q2PK'GX%eMLSf5@ -G![S@M!5Gq+l`rHrH1S!6p%GRLGLUcDhTFc,6X'b,L3+He01fZXNck090))[[38+ -e&d4A4-KXbGTKIJFUN["NB('MN@LjdZP"ZJY4m,Yl&S'FPIEE(jh!kPB0+dY8h## -,'5IlRh8L1%0E1l)XphLM$Kq$(NdrLHH2!ePKfA$cbY)8kR1TDq$DpRkXFDq*i%S -lEG2a0"8A-%XkkMqlI#5,[qC"Y&eM[DVR!)J,1,XrRA`B,"DcPPl1fEp)Td*-E0N -C"J$le2LE$[S)cYh'+Nk,D*BFT""VT$)GQ6r!GfQ*$8YhN!$h-jY5Kk,E%lmpZdj -@DG0B+jTXP%3*1cJA@c,I&%JCNBBU[0hU&eMBKK'Z-23pNbhljm*3Jd+N(l[ZB@- -kG8YJXM`fDX8GMCU*`pT%5Gf8QJd+l,*hG4*j-2&`PbHjNS88A`hPL4Xj)p&!$d( -!3dS%@Lk,IS'%56,Da[rFJdj0dd9X1#*fQeApGIdPDkL!f&`K!+1h0!CA*,6Kq0E -`qR@!Dc!('Vc6h9lFS*LB%j&b["N9!DLhfflMD5T6h"C+0b@"c+%qP3r"1,4q9)U -kBik('`qmb&4iR8VPEK!@6I()Vp!2#6PHh"%NFRfYX009lZSM3LLcViD2@)9DH#6 -1S65C*p4SZk@Qm%%BYAp(U6AjLiS3HE4G0$S'RCe*[CD[5Mq%,E*&)02iHR6jDPp -08C%[93G-$R*L[Ll&[Y#pIrY8%(d,+2I`C%L2ji$Sdel4#GT-c[3*X*RD52maR[8 -kIiK#h&NCFIN(cfp8ei5I+5['Bh5P[99)jc+Lim2mCRp24`54e-S$FI2UbrR&Eca -3-G+X50#kaMkI[''4304P)8'C5#M1!VDd1@I+Ie1K5lhFHQKJiIRb'`!Fqk0#!5p -#0Iakl@+55#YR"MEm[JTe09L-AHrIiRETS!f8E2pV3*[0fD$ih$$@-qm$+`eA[93 -h8pPa66!H#@a%I%aZ#R226eC-)8J[%I`,-6KDBPdjETaDPmhZVA1HK$hH2S+EibV -'',rLDL(qL@,44j)b8SHF[P[b!Vd#LlVLVNq*dfbhU'*S,K3$QE20DN1V6D5Md!M -cf#!Q*C!!jTN+ai*!Y,j6+31ZY45GiZ[-%N5#Dr`ba4CI-fMYAbPi-NNbG`b&PBL -p1b#6qRZGVXMj3UF'%Fd(R'R5SJ4F'*M-jPL"Mb+A4(H6B+3BL#3Y)%Cl&ddA#I, -bpAhrp'Y+9(k8k8@5UJ#Y8(h(HDP8dPTlPmTkNP'3!,m6EYQbN!!(eUIp0id`103 -5a10GZlJ5EMNhb6!pS1+rU-EZd+pApdSEc`JJQH5JeiZ5h80F"Kep)$P)k+J(TTr -S+H*)PmCCIIVJ*'l6QG#T(H(QaKH26'FI3I0XL-c"T`4dMDqHDKf#DekIV&)@X*! -!$R'#UQIJeK8bR)XSiS9F-pbQ5H`QQ*S$BeDjpT5LA+0A"@Sp1E'[d2)UXi$BAkd -UrjE4G5G$rA!LFJpThmaVdXLrI)qq19rr1G#1d5L&qi%'*K%8&B8P*fC)e)lbBC! -!&l@81Aj1V6LK0IXd6R[G*%*1FR4`3kMaT'*keMlXU0RXr-&lP-''Zd1N4P5Q5(D -[lDDJr5"Tc!Q4VR@iKFU6Bm!3h%qC50UZELG2fX(%0YLEc[fmr%F6r@K!i`!RV'# -+'S-SK`l*4%D+A[48S4k6@,D)LBDp"'RFrQLqKIhm"MT(L+Z,C4im'&Zk4VN#2*P -U1kM'5qF9R@Xk$&IqQDNMM((&5p5*Zf&eE!hM*h,@2j!!Qa1lL2DC#Qp*N@krY$- -+&qfV&*LV26!f3Xj4"X4#-b(1BFL$61!mSRdqJ#%bhEbj+L`RmYUqi4PL@9TH+a' -M!hIm+A6c4jmd@Z"+-0be2Z"YVK9K-L"mq!0#2%i8@Ehi6&@HD9IZDLj*'EN8USj -3a,pBPP6*cI1Mcpi)b2fJN4jB4!fQ2rFM2KIKJN84X)#EBlAdjP$jp`[Dm[p(ke1 -IK-Va)M+E5j8NK@F[4aQQN`"L(dUQh!0#DDmL+0TQC%lal[54p[)jKeUQ9HHr`c$ -@fcP%QDDS&cZamHhTDT,@T(Xc$6K*"!`F4"2Dq+RpADF15cjb(0BmC``8iTSqFcI -N'(qm-L$GBLGE+YDbA[EK4U[V*#+(SMaXmC,'&I2PKVrEMrb&@*iK2d,2@9SNADh -1f2bYbjkXNVZ#CA@ah8e#L&T1IQU0h#ae9bCXr"pj9%qBPFM3fVUrZp!k(iSe'ek -Uq8$LcY['KRE"CJF+eLRB)`f[9hDAK"Cm1$U#J5Qh3qPS3*JFD9pCVK`&IH&[2#A -%eFMU40@AM&9H[mNL$#Xj$Jqq`T*Yc1kSFb+VVAjj*'C-G#mYS#i)Ib+Nf#Li*"Y -E@U,C*`mQS,05kcR20V[Hd'MqhX,j-5jc#(%iKY[TXAb[S$AfH0U,0`U$V@'*X8p -cRQYT$mUc"lEZ0ddpLp-,TmU3!2aN#LISXU2!&MEaHH!$0eHqNP$2k(JfCVR!9f) -M5XTLDU%Ym3@-3MNh@i@b(l&Njp,k"'fLplMbc&KUa1d,9UUh`8T`JG,!HAqqc#& -E'ia@J-!MZ*rZ2fmk59F&`jU2l!EkpX31q1(40!DLcZE9E[S@KYTq*@[2cq&A501 -mXP6P1N%iiFS#*50PI%i%01ZQhKmZSKPV2`XmLT59iYfG56Librm$M*`'El'$dqc -VDS68!'PVJ&V52Idd+V1a&R690+YYSBUV3I!klJZ5pc'G#M&pV1TH6jS(9KrbQlQ -JD(VfqC&p*lU4HLX32r5Jrq(+Mf8cad+DS$Y*)D'SABY!Sjad52M5Qc,'i3Fbd#Y -a31X-GbPdiP)US8m`8p5ilGb9[E9r9YN-hNX+fjRRR*RJQ34KaEK!))aKJiC'"`" -YBjr"pP,@9cJCM(DM-ZPeA!rReSrjalTQNc+@X@4-5G5LjD@!VNC8'YIGkFrS#VC -%LMpKUXe4R+4@pabL9V)j`dF1+d93rFCc'!EiR+qCr$*9@-*AB[T*3Xm12S31(IX -heIFq4D8dUc%UX,[rCMSH9L30,0LC2fNZV$Yq01GL'G8%!!#PN!3"!!!q!"#i)p` -(Z#2F"`!!!BJ!!"i(!!!",`!1Km`!!2"0!!!263#3"!m!9'YI684&4Ll2J#jiE@` -!!(2"9%9B9%0A588"!2q3"!#3#S!!N!G#`G6T*BNSlI8[DSa1RMMR#l)FH([BdN# -briKlm@-Y"[+C#`LF@90GbfA@VaFECBeY#K%'X$!1d3le`b4Z$Qr"QDkbeI8T0CM -@H+&Ij16B8hX$T(RZPka18bIBiHYa2iTmq9mbYaK#M91Ei#94k[5LUi5%I'5q'#! -@k@415brdY(L9fN4`YQXE$)!DB21jk#IKGVeLkL!jelXf!ZDAC!@pqLUbHBhVSK5 -'paDEPa[+QDP@mYjfXqj!c86ql#Eq!1ji)$)EbjVc#Fdp4C'f)aX0F)JKDa6fCr) --"PUD!92&Y+$ahYSBTPpSMh)GS+2Vj0$[Ba8dH3R8FPKlKD5#aaHKb8+BCRC[H$5 -#CPXKHELB(Lrhc!$c`dFrMCH@Bakf4RC+E!#MK9cDFcS56)&I8XFp`jiJqV)ZjC( -fR"b&r*e0XHrZdRlG+8JK1'a*l#pY%*QEN!"F),P(`A2CQaHYjG#6AQfL$e55K*r -S'ShVHcPdMl#I6T!!V,-'ip#h$*QfFNMerC`NdiZ$X,J6%AF'2rLl8G5,*0pqeN" -8T'a`e6%hQTS&f*UlH"a&Q$J!LXB%!df!6'0VS1al3Xd38U$r*-9cVBBHJcjPek* -mR@Db&!hIeSLN5-GSNp+5G-ACLp@CdYD*lF6CapV[TcBlVEQkfXKJ`FI6XTD,Zr3 -P2Y)-5J*PJZmkfB-6I%IJeNiR5UDTkcq"Q[De53USpqpjS5VDehV82Q34r[crB`e -j-i1-XPHN2#%%ljre6"['-h@4(56YcqMZRMNc8@MpFRS&"2Zq$ZA0%1!I3Uep4#P --2FD"5G3[A!dB2X9KLk98DF$2M!jUGRD0qbkUFT!!%VV-ASjVZ*S*NqI,'LM8ZiU -2NcSh#$EjfYMX8M@(cX!AC'cY#3ZUZ(Q&KNbS,*'LD9`b6N@MH)fJ$PEY+eH&VcP -EXd!%f4,A1ZJ)0L3)Al+*bIA963GcR8RMhI6)+Dp1a%Z(Q-fjbNPqRYfmFYi4DeE -VF!FZhS3EQ@2ql'hT04$dPj*k'@QaDji85L(N&0@J2Fb-SFVCieV12UL5FYPeIKQ -KK(LML$(Yd#H(4*Ub&*ZA522%0T@SS4[e8XIfZD[Pd8"dZ"94CTCGKS,0*6LidrY -XbmQT&AD,b@3%SDf"36$SiC!!LiH$q$AdaHd#,,CB2j8S+a3daLX*&c,$9-kPDHK -Qmhkcfk6e*dG1BSS'pB'L*Sbd)"J'DP9NB2eRqr$*,aV&G9L[48!Hm6$Kbk+"M'J -&H'eRFKe0Zc+kDi`*54q-9NJJ0X"G1e0pi`+0ar+Lfc-Idp,d(`(TTL9ih@H-9&F -h"$rY)HG5dKGHFB8hT6qa$fM+08r@X)TDSZNVVDcT%RkKjMX&@ldqYP'hE*Y%Cj! -!&Y'ZP+%Pc2(UlP1AC+H14,K6kS+)G",bmmkQ4!&`J2S+iAUe(*JKRq3Vk*8!h$# -a"ATKKCi(2C+TXH`4DjbAJ-%%CPBp9(5J4J''ihKbC+emrG&JA42E(%Kqb,jk`Fd -QBPJ[0&5AGM"UP(c5SeP[(mK486IHTDV%@0'MNfY5D0'&!'PbJJIq6KQNNjd5-T[ -K64$VX%+*@Zb#@FR*GjfSY312a2N%`U2JD+%l(Z*EjHH1SbJ6UdTd"CT2l'q'qIG -FYPf4R2KD58DX#V0jc)KhbX,E9"r)JKDq8B@ZE4!B$Z"IYMrQ6lj"2UI6p+D3!&q -Z1iL#"lCpjqim@)UeR4dkX`YNJ"l6iVY9NkHX(Bd4`CQ6&R35TJcL*G9TDhAGUTN -aZp"QDN!RQ!5#bH&H@0j-3!A,$CV&qAK0kG-65b$hDdmV46kHkq$2F8[1'al"L52 -U-HIBk0P[2R,h,@)NYJdSDm"3"LN6mm"cidkqf[(6+f9UVHqS[eVKpm"TL#((EH6 -BU2+kP9L3!2[ZX#d06([X)HU(qHJZ"KCB,PZ,pe5SMRE0hX$6qZ@eliriaD39I#N -)L*LCI9mJl8%'3q$'Lq6GqE`hRp@2*J-GTC3$P,&Ba55B0K8TfBbmDN*SQZJrcjb -9q+H1X'EaQ[T3PG+2%U*,3)HZmf*jQce+MYa'rB9FU-YVdL+k)59XJ+NV'K"["Pk -J`f3!)0U"UL`Sqlf2d001NhfJDacJ``$1D'`X#(kc0TebHrBcAASH#cD`PfRXRrb -PY[92RI9$8DF*Qa&FBLL$rVB#%*jRa(J2jcUpc3pXPkiq@Jje-6UBEQ4)`5342Jk -##8%dT6,LDlRY-Je-mA$&H3m3blk`"CVYK'+%rDrLljm*K1)B@j!!V5NR-$$ZTa# -3!)dE%1jjc1I"EG,[(`@Fm%NiPQ40M$SDPbHTiI$9L0Sl113hVH05GQf8$8SH+ed -4&1*reI[$Vcil&ACGa"`4b0j-5X5#,C8-*ih+eKK'HcABf0q--hNJF"KH2P)bX$c -Z5mSTCVE,['Dh)&#*PdafP)rNAY30)2CJacc3,i`@-V)@812PUYV`%U)hS$3Q'D& -rBKDb)!*mDi8adecKQm#'[12l*l*dqI0Ea6+8K3ZKMhA'AG5aiMi88h$AZZP#X+H -%)#kaG[f,,(Kp!`R8#ca(DFMrCQPLc,&Z63lD'j1S81"!aXq4M'5J,$[mm`kT"!j -amMS4PeN%bAAP5jm))&mF)-k`cY[dHcTTZPFYEQ#2!UrDElCVIdfji0GNd2&BK-8 -XM[d`!*&ApfF"P'3iD62ZQlMX6r2kZSa8VGDGr8ecL$a1!CaESqPhr-0K8q('X"Y -$[)q+8h0-ih*R!Z-pPmIY2)3,Q,cB0b5*Q&'ZZ+8DS8f@%Hf2q2)JmEZF"`*YMF3 -)%'LqX8ZT@0@0`-`d0B4DPlH0TPHUZ)bU45p#2&1"qYZqT&%I6R'3!-HHaXEacji -p[PEpb"F@[hB&fERE'LAd(%1URq-@kBrp'dbLjXFb"Z1!INcljEG1"%[RAqD&V+[ -3'LBeA$bISB0[EB1mA-6[X2bjScddEHR5F"k-G#BTD4fYmNL3!2`Zf#m*K,dPBLJ -22-51(5lrL8qiUijfCQZF8RqpPAUhrVX*rKPD6FY5Y5YeV-dR`c$qiP$"ebS*l[b -[`Dq`YF4kfN1f@fC"UG#ka&*6AmVjGcqPLGJ29Y-12rTfl%(Hqd(SpZ+mrcR5'38 -A01LM"$fKr)m%D2c@-i`mJ(bf8%IhJA)k-C-h*j'HH$6RNbV%U8AlKm6L[fe@AM1 -PjIK0'm5-@(U3!#N[lI$PDF@Peq+LM@,NSmX#6``Q6cX)m5lF2"hcHT-ihN-KU5Q -i62C#*$fmphfL12fma9[!'(*9E-'pdZAmPG!EE1K6S9k3!*YRFG*KN!"AES##&50 -`lSRq9[-5b+iZXjG&f$G"3N-E`h8fp6Gr-XH"l!ZK9fL22(6R5Da,`0ap'rS1V0[ -(@G-9+Tm`E,5$fF'V552E2"&NL`'T%V,D)523[M5'LL8kSR`"lC)jf*45rA0C@`& -E0V!9M&-3Eq'&hNEHS,r#b32EDIQ5&dT!kTiFArY"CL*`qhA)pD)m+!UI**-2-J6 -8(b!eCJ%0f'J["U&&CpGYh0Di!X8k+PS'lSECAaXL+&!*r[rH8kA&Rrkr,'I@FH5 -TIL"6Vf!bDTCHjf@NAV9-kAUiRZBm9'cFfVB2388[l+e8Elc"qHf&#h+4cSd1YBi -M$+B#L6T"pccf,)d5,AFHN!"ammYdGGC#'C!!Ib1[@YTk,ejj#EbUj&q-T[i4UYm -@PdE42fGA,C!!6F"cj4)UEr-'[J(4J,pQCJ0("iFeNq3j[S!B(&SrLciDr%2$jXQ -UDMjTIjT(qT4IS(V#A@SdHb9C5"lbXQGh[e,RkTeXEZ`aRXCh*!Cc!jXTI6,a5D& -(RjG(@aVj4pbkR(c)1P"U&I,IC5G6hZYDcHUK99P&FE`!G2BrXD"Sj1H4Q`S(%!- -m[Br2L8!,&e(38jppRmDU(f[F4&!rTLehC4RHKXA)5CAHP`Sq2Yb3!!X+c5B)PF, -l0[!i$B``Q(,+CikL5D#L8C6Nh#B1K+5a#ck%*PrIPj`)lll4-,LpVpdb-LY99)' -V-6S*,d(e930*#Zj+V(YG'&8)8"!G2LXM[pqIDHYh!%N'a4XlbaX@##1km#!UHiE -Q#d)+Q#N%Q0Q5NA+`SL5Jb5-)i4T2-U,VVp0V`,He(F[jJP8Z38`DlG-b`IYD%i[ -eV4Y@`QHU[mDJ"5q#pA%2Yq(!,$@T"Zb*Lf5mkePD6T@GqbT$aZXS`fbeLrc",8) -MBEB#Ydm3YAhDlFAE-NTleD5&G$b#P,5Nd3$-HMl%&G(H3qd%A2T0Q8K*$-G@G#) -*"mM[dqde!8Rkp2&bZG21KimM06%02&E3qXIjdm$Tf24h+9*c!K93E8X6%b6%A0Y --Xef[X3%L$pPe&RT*!B(Z3i0I&!eJQ!KJFCC(U2MHH`VcaFdK0D94(fH##FTUBfG -@ZmH&28L,#DKHe969aSliX#&%l1010+8bSh'R[F4+58LdN5XaePMEiMZN$@9UAB0 -(,8#"1AkY#*`'5Ra0"E33a5SE)*[Bc1`Rkj1Zqm4$j&abq2@`HZ)V6l6lCq(aYbN -KI5Y9pma%VANU%J(EQMi-T2c+lFHq4dpRHbCG6%@aF$!,ri1DF3Z8TDB#m@JVXLX -cr',mF4cUM*F@kk[3j,(ikYL06@'Q!XST6q$CKCDY,p%CDfZRih@mZ[`9eiIPSH( -eSQIKX!-'&"Ice"Ml)rLA2p`e)U+T"+VSZf%%rH,QT2PlIqB8Lc%V+*r*+Ulbe2J -P(DkKGJpfh,[U2+f@&CLI95'GQNX10!Xr9Ra&9-,8`jSXG`dd0[*k,`i*mFX6@"c -b9JX0lNkE&K+YFfcB"3-+pCm81QPr"%4#1Pf%fKP**h`i@fVKD(1%'P%iPp)[p`+ -AMr(b@0d)cK$%*M3d,l,Mm2m!BYN8UcJPN@Q-ZRIiYFXfEk#RKf2fqJh)2lPmSe, -IdXe*X`[1GCSdQ$'2`"$CT8qQdXbBfeTJAT!!ie`mCSZYNaPVH41SX#+mZ#d`N!" -eFelhdYX0UPk!0Aa1Vbb&5TK1REK$Y3K(B!jZHY#$rmV%41qqPpPYB0bLmeZdQ@! -p+[@deR&j8cNFL&5$9(6AXQE-N!#h[k5a(!$T%Y1QrPZ#-L#2*"XTi0%BDV,I`Xj -+X"6!'F`E+LYp9TCd[mTS5eGriQRP2f%,,IE5'1r!RbBJ"4KUfRGN`)i$iqlfm`4 -plE0e,ES%2mGBc*CM&DU0Y116qhd+EN$4T@a"N!!NMPHCXX3+*&P`$S3CB-pq%J8 -a0f'Lk@*8$qj@1[a)KHTES1XAjqPlSf'2i`#PN!3"!!!q!)#dSHR'ZFE#'!!!$PJ -!!(CB!!!",`!1)I`!"kpM!!"Al`#3"!m!9'Y-D@*bBA*TCA-Zci!!!%#b68e3FN0 -A588"!2q3"!#3#S"`!*!'3X(9%)Lf[k"9Nii4G-`J5jTGUp)0N!"U+fi$e2kMVXU -#k-'XAS')A18f2@"E%B&4BfPe!3Z3!%-Lp(jR3+[C9$dhlk[qd$HL3fQX)k*,&lQ -jA&MDFVLQ"kpS&BraKa8e$eZI95j8!8P58)J09EQF+)48"-DbCHR#Adie[!q21S5 -&TPckKX($#$86i2N"q6F9rE!BS6DU861NKbLqdR,b61J,R0Q+6*I""hi'C5r!lS+ -YNrYQqP[TcTi-CHKY@8)r,U,"V*&$X2&iZ)"eE%$S#2HPBDS*)'a3`*!!##KG-XY -HX[+DaYNXBmJeS``Rai25"CGY8"h(XmV&IXHTq4q&@3,S'-38#Bc(R,l@bfG[(RF -M)NEaJZ$ie5b'3dK8&dUiSHF9d0ImqHI3"UL(&QAfLP"#S8,BaXZc-IhKBEp0eP& -3SC4BBbp3(9`dkqBHpF90b"GIeTN9*ZF*0A+(r[9"20ErA9p5`*PC[9D$Af0"Ce5 -@a[mhp)R-@fdqiRQH)(CVrAe0l(3IT4JidPDFk'r-''d9-eG,l3iD2(R@-@[84!E -mbCaDMYq2c-l5)VT9J*J&Uj'qCPjP3lV583dd0QlLDL`qr16IRC!!4[KJr#h51#A -NbNljNU2a2RX3GYK0rDdbClhVQk)$U!NHS"5kDilp'+5!#bKQ(3A$T'$e-)Qh5LX -KaP)M&R3'fN"@J5h8C+'*iE(0-Bd'@-PlAV[I92A$Eb3CTD2jXe*d&$+LeEGmA3l -LFD)8+-VHa@'T3)`*I#E-AqS&k[A4FF@`pCH'@kDTM8@(8`5r$Tf0`"SN&0%"r8q -a-IVrLkA*@rH'*$#klCr(-K8Lppl'[cRB',3,GUq8Hk&@raI3cGd2c@ZaHXG#LRE -PCL+A4UiLGAUF3-LVdKNRT$1B335dKM@hU5@j,cL)[f'KUKblK+9(MXqe!!Ccp"( -'*jX$HK-FXS0CU`Jq`'&a'MiZdhjmc"c"aQlUh%UcT-$'#I2DiL*Ec@l8jYY0*qV -PYGb"YHqhf48Kr'QSb"*c1NbhGTCT%NeM8iLZE[CJF80J946aiXBUj+SU'UU"("8 -p%e1ZBi$3NEZh)IYM0&++9B,jaq3(Jr3(RF'TSmX46*(-)0rrlb0'RYdca%Z"!YL -akhcVhel*SQ&2hG61i)e1#4MACb(UC,SApf*D#QdYekC,MPICAJjM2!lKG185+DM -M2YSS+G$&iXqS`KV[3B+bpq-Fb[Qi-BQ5NeH8Bd#)mLk-hiF5h8G8AR`PA0[6Tem -9%C@T8%aSpBFF'q(k3X+(Pc!4ETKf!lLS4$`6FY5'!9bllJ9`m8VPS+rS4pakr(F -pT&6bCHN9585'+bjQ99![F$Q+CfjVi@AHV-JY&m-9jqY[e2+YdZh,l*!!)Ai`6mF -eQaa#+*-C8"'0Y#bGbV$9Rb6D$d)BT,[$hq@pibQJc9R'f3cS$Mbh#!5Uclm-I() -qEE9Z,r"Y`Xr`i4Cq0L"5b*2i[VEAT1(!h[Vhefk4Jb[@4'm0cplGcGKM-el8Sp@ -XdY[cD0aIf5TjBVbP$G!QJ*!!pke$,JI(Pp*0!D(54JVhhdFmC'8B"SGHK'@fZAi -59Md,-hjSDVQp6P6*eQSqAcY6G(2I4r!lB3EY0clY-h[TILA![%3`hXN(5Cj+D2T -K"l&08maXri5&qKXN6K0U6PF*I!j5PYah9&j#2M5l8JMT0"D"1XlVddGh5p),%bU -ISMAjmDj@ChUh$YRA1QpFckp9k9-YmC3lc6'qCKkhd,S!p`0-D8%US"#1DNi3YiA -)iXpb'"5S-lZV'TlX((HF43Z##UNb,lHIbYD6VKpUa'Yf@mB'k6kI#%2YDfmLf0m -TdERP*GUN(R!eQJS"9RIY1A#+VR'Mh-VVZN$+IV,UH,h#+%P-SpAd6S5"qjGV,aC -UeXqa*QM#ShN3h&9SMCC,ie"T)(iU6i'23Mlqe0E+BU,l+Zrb+)F5'R'Y-1FZmY' -Aa0leS'Tej8!Vi[iZ1UHhh`FSBH["@,SB2jLE@)`338XlN@C2UPjDVSB5Cj!$@df -((J8fa0biP4dc$KEkJ412mTk&q9691EI$jck(&a,SHjBbN!#MbI"$qjK1*'&G3&i -N2Gdm*TGQ34P0PVMp5#PT`PjefpLqj1BK+2iX9lCc,NpSSYaim-DNbC8!i@A3l[a -6[*l3hdFEa3)-R$!QN4@`pC%#Ua'!M0Md!8Ta'T)kQ@DH$%f11-DX8#Ai5m--6ZC -*e2ImZ60'NiBp8'PNZM!SSjqZfS&)3#8-X,T)[MQVGdV!2G6Y8)mS%"rX*[&Jd8H -3!#m)(h2A`QX,E3LSMB,@fJ0JSKh%64[iIaqf)5GG"5LRRXG8(3Vi!-'fXDEi)P9 -Nm5h89b8'@*@U6!9cCCX$r1dSGJ66pA'MG0$8lK8jNehmR[5eRBMI8eJ2fb24MmB -chB&qP+bS[#l)-H"5jaH2(Gmd'qV0#Kf!X6Q@i'Nm*S(UXX8'*$5fHlB#dk@02-G -jVmEZU2hmqj8)VK8rUME48EH!NFV0IGrErB#VZ&@N"jeY[,XZD@[(JVqTI0Xq[[I -@P@4dC"9`+3H(hX93aj`3@hI2(ABjK3"crecjBQY`K)3K1)T!1"TQ1l%eX$q3!'E -`TqR@TDfYkS"&EQIAiG4Q(!K@S,I(TD8mAMXE&)jLk%3Z4MZkk%KkI+YD*0rERU$ -0Ki`q"[8"XjDiF3*H&N4fGiSGGli1BFFp[A2NBFAeS-9Bhb)@A69R#kU[l4XfFTE -Q"ZV(8Hm'd41HLPf*MQ4GFY8jZR`)P$(#b&NV0JRZMbL%PMlj+mQIZ-j(YPQK!I# -TTH'jN!$MC1mKDNVN&D--fMb8Ill1AYj2cV[)(U2%!mBjfq9'QX0eah-kl!aVMlA -NLXc'RCZDmFqj'Hj92DXK"JqjeZQJ-HJ4mYYPqFr55Y%Ib-k%RljLN!!AJcPIMLL -))aq6YC'd1SMdiEGTCaQb&4jGF!qUVSadZKdYmT,be$T3#'8jpHRa9Dm4#2Zd(QA -6#*3mmK,P@N)9AKRbN!$T4HBdI)qL0&ei8PIUa!h0HKL3!%qK!Lad'pAkaQ#(AYj -V&(rVHJ&@389hIl5(G$pB1*(!,!@eml-NDd3Y3@NCB,Rm@*M6S###[J'IXh1qUNC -p(`HXpQ(")TK#4$%8DAG40!q&2JUe+)ar*iXNTPJVj-JUe[-$!F1R!e$BCGKjKV3 -!(Pdb"p!1jdF6iY#eD),#%!0$EJa@hfXqP!+-ZRIhGV#XiZ@NAk62k`j0C'$%Fm+ -2jYG$Cp0$a5PQ9C6-`l,eM#ImA"dl"9&G5D)Z044NN!$Sc+cLBAE-@bUmUj+1Jj( -*P(Q0mR#VDQQkc#,61q&)eRV)3ElqE@GEI8Ql*`"$G`96CrIY1Cd4r-Q'$X4,1e$ -hr3ZACN#2"0flm0"kk`l,E-'Vhf#JB!h5'bFjT`VIEqHS+FATeD#&DrjUB2'9$$P -)XJG2SiJIPNae9m!,k3lk8(qJ1Ka0851PTd@JXZ$4j!9kG*PS,lN&82F[XHJRlK) -b"T2diM@P8PMiKRXkI)bNNR56AcTPAMV$EdT2D,H4EL-FV#EEk)Kip)c19B("Af` -lFMpSbilIpE2rj`c,16jQIJ(Jk3L0B3BA-5((0E+VG6L&TSj)63c66D*bVG%*XTF -DRS1[ZPX%@LM)8A!A'DbfHkhLlHYFj6"2f2ph"X(5,C9ke*P0"DZC@C3j)N$M&I0 -cC2d"k"#h54KRQZ$X[J!6DFLLalIh&"D0U-l4cR2[,B1X9@[Hbi8AhekLC,&CPfm -eLFU%qi0'Pd#ph%NV-6fSZ2*Ch1FP"HM%P`qK+aXRLj1qpE5mVQLI0,[R(mimN!" -aFRf5lUNSSk-p!4*E5Y[@r1P*dF)Tc9Br3mQp*&e$#l(hL*()"@qd'KLTeR@BHl% -@6VHUT51A0MK*q4SfB!)(qU#58[-3H(eKLPI[rU$F08A"a@i""P4bbJTa4Daj1qI -lMlP%@TF,8IY261CY055p1V&HQ&8FGXXdk8@Q!"+G!$lQ-a*ImX9(@-T4'pGkpd& -fKp@,j&'p31S(`ZUCePY2+BIm#CGGJ`V9NdR(NEr@YQ#SqSEha-+*MQr3BmDlESX -*JfCdT1edM4*+P#1b"(("0IH#a90rK`QAaB%UcNp-&d,m&B1%6"BFjj)a(XVMqi6 -R'4IS5aX&%H982PPZfpb#5`6K0(p!EN8IbBiFmm+-2F%4S5DqrQVmNT3AMVaRiRk -q3i+Z'Rb*i5(p-JjA%4rNb(cE!+SCZN'5AD,6+M0lK''AMh90-kHjbX(RB"GllIC -LiXRL$"j$A+[ebA%R!LcMci-kc+E!1Ef8mNieId%2[r`9LdHZLaia-'SaGI-)2Er -`[Q5UGXl[%rXh&9ibQ$ER0KpB*`6J)6PRC)[(MHjAS'e)JNS!lVYiq5b2T)([AE9 --hUf,VE`e!kC+mL'J,m-qUqTBhd+V$HCh@Ye-E*2Pp%Z#2rQI3h05i6"aLa30QYE -&hMD1@&1U9X4rSbR,df,i4UB)ZdR-U2YU03X8[)YjedTB`Kf8%4eq)Y24a9qP(&B -l'TH$2)aYBl)l2k(STDCUCADlYbP[2[am2`KiHZe6)[kZHYdMe9YUkf4EPICG@9a -hm*mdpd(!S8dc!h@,##4$fl$8"P$XRpqm'ArBQ6cdC&Ab8N,V'19"TL9DL&YqVP) -`jjp8##*Ua%1jcL"iF(MG&$@%fK'Pc6K3fpjr`i92Kh-qHcP92)`AC0[Z-f(%ab! -c4AB4)m6+d)SAJ*!!`#JQ'lXK,UpRRT,!j`cm$(&Urka@$1'B32ljDq41p*bVYXT -jqf@GYj+*@1XJ'bhL`Za4ASUJ1T-K`&KqpI2NaN%k#E5i1lAh"$ZYU)PIR&q(#lc -3TmP39lN!'2Z2rCR'TS1+R0+flR#Z4FU0X6Qm11emrTAd5dRqLclqaU0X!a,$p"f -)`3(JeV2HGCNZ+(,YkIf@IbmCFFfh#c6LDN&edRB[a"QSB&*6iIe#FckpTkkQi[[ -*E%miZI0`AiT"RP,NQ6al@adi#l&A)bmD4Za6XIE1BcJ3&"I6%VP0`Ha2B2CrH,, -m(N9JNJh@bk(pq!1,N!"`MJElqCKR-GDdTCTGI159D(,J2480A42J@U`(qfcJ5p$ -ZMDUK09EM6!X!`Y*I!#F+$(Zb+Y1-Fj@EY1&X-59MF,c2lN''Y2'pi+Ap*aVX&hT -Cc"9NlqG%m)BCl#DB,3X,PXA-!m'VI4m#ip3JL&+MCE(HX!F0f+KAkHlIR3AabC8 -+CGHS*CETFGH`GSkVF+GSNlN(mMG13I3afN$Hr"qKTHNcJA(eXHrZ5(2(!U-j-Tp -AkE1D&R5f)eNe1!4K)-`,fMfEpcV&BNb50M2TqdQN[GA@T3Ch+rZLS"a$qZ$0G*U -KeR&F+T+BEJCLaIeRpY+9f&c*ikZq$dXP*HYPk*-)21Z([i'pc+lFD(5Sa1mdKib -BT221DU*JYjB!KP$9$m90QR!NZL#X[Ir,jC!!YfmUUJZ!XmG0ULRk[4#hYkfBc$L -9+m2&J5CaAhL5(ifL&8-9Ed6[6","al'XM`05rF`hLCiKM2fbZhXFZ'UpN8RX&*L -Z2jZh9X%p#S0"H&F8ZVB-QJH'Bd,9BAC9+bXKVX9+idZHB%dpkeCF8Y-+&i#F4&` -@#Ui+[%RP"NANpjA)e8B3cr'm)8LcKTR(#m1+a!QQR(I2a6Dm1Xlmj`i&pIQ,Mf@ -"@4#0G#`)GH2Bb-q@"IH3!+"d16'Sm'$GU$61S'3DGE+DkjF3@eY`I0a1#-5*,ec -I@3K9S[#$cpPA2MSYE[!(86GkG[G@LZ#9@`r`(84$9mfCMKQ+iNe[pFrN,irP+mN -[00U#cVlb%"MQQ0%"cEl-RSfhj18*8PaJ-CIBV6bja`',!3RLXA36FiQeU[6`GSV -TH23!G5Ipd#'SbUPS@9d@jR#I8YGf'TJE,'HNIVTj[$F5U9b@Kq'`PT41SVBH*Xf -e8FEedR-0Qj0SaV@XN!!V-'f,Qkair#+)m2p@DCFj$YGVe*4Im4+%h3RCMQA4IS$ -Scd9q@"j$&SK4l@`XEqXF&mZT$D3r[0Qjh2d42bPlDb3kRX9+3Qb9(mbZPb8G[Rd -h#UBB+6ZN@$Y*#Z%LHm6'4($l1I$GfLiqA8""rdbTF(fTie9,F&qNJ*m8hp$(CLR -Pld`AkE[TeR%%3S0rYc&&X`VCX2lh0KekQ!K434ZqSKKI"#X1fm6ADqZVM[TfK`l -Q1be,Jrdjmk15%AJNCP18!"QA"pQU,fc@j!cjUJ&F"qJpr#m9L%mirh$U--c65Kp -MRjh!@bf3!$Q(Db-LCT[[EG6iBjI#aLM%0+RB`25%GY20N@q*-Nck9IDM9#2e`lH -%`[l@YQ2Y+T%fhJRfT&9["'a"ZAcIDNE*@c`TeV8&dk9B21Hd%Jr8K!,%'V+`XK' -M@pXadlPDG@XmGDBbf2ZH!TR(f4f'-L,Spc8UCeC[IH,G)@r3R@8hR[$)(LiL"Te -[l6Î$!rfflUKcML%)3H"ZNb0j4"A49VhrSLh86rEXp*6AGSl&,mcrUp@pF(U -dh[YKJ-1+4AXXP`0MU)*U4c#48Ue$RHf&!VQF1RDcKHK%"GCB'HkPAMjJJri9,Y+ -N$r9"+IJ,X0r2,A'm,02fTkU$56L)T4!12Y(,68)Km@8"PKh%%qAaHd@QZAUL[S$ -!*B#$!le*D2bXL*ej"M0rH1R@'h-KbP'Xa!&EX+ZDS0+q,$,)a,bfkVD8'-1ZQ*6 -VfmZK!E`lM0c49l0Zj8X3C[Q%[%[J,YaZa'S(d)928*PbYQJ1GhrN-2RG2D!,mV( -1IPRTlf9#q,Q8%("qHNM#dI8BiYAfU2"jL3-S808jhJaAN`%k%Ki*li!P%"&-Uqj -NTQU&ZR@pkiUFjP+jYF)9'06$a`F6ilC$NBa9ZrIXAXdLF+rH@fJN(q-@(!fhf6e -*pb&mRZMDM&4jUbNVJXphSl9IMFTq2S6chqdllR"Q`,G-dV1$4Qa$0plmD(GhpRF -DL8[5Z[4Ei+XLm62Z-KIPGFCKZSal+,"%NA6qG86,H1@"$"-8Y)KM*bVq559-bip -'%$UjV!d8$J`-Sj'R*-bJC0iCKVMX[-f)Sq[$4r)jhk*M+cdR4+$cd%Z#9$4C#ke -2TUkQLh%ckfFim**bF@mXVp4FYMh@QhHYV&0!%"U)IMj`9@De0b'1P929ZdXRmj[ -6@44eEpH"bf1jYZ,V4V-3cbYLEU[Ikj*LI2Km@$i1B`,(-X-d0eD9DDCa1hS5am" -$Ih8"VA4Sj(aE[&mP(E2S"E,)2ee-)p%9-`J&Krj!md,jG5dZ'HVHaqS)0Cq+kDC -K+*jpUGNK2@i0P`d8)4CIZ''bD[Y@ULbMf8MHH13RpRGD%bN-j%*ZCYr4`b+B6dE -d[*3dD&"Tri48N`jk`+hmF`ZX#H$m`jaP43RZXPfa$XN8dfV+A8l)R39cjB4G`5i -(b8YBU9[f4!8`Z$4fJjj'LK(-a(LX'2TF$Ami&DcdQdFKUaBDf+j1BQ&(BV1X`rL -p6DP$AG2K$%#D"F3F48rl!6r8Uj()3Gje`'2)lJIZBHU&YqecB(PhP!8AVSRc)d+ -&GH)#)@Y9+VLd66'##L3XN!$UJF40!!CB@9XcQ1VHAEm`Q+FV3Ek*[8XmbTl8()e -@Y*4K)8Ka"V,FC,V-E2"FUr[RGSqb20"Dr(aM+d,V5ShPZA!)D$Y@f`flS%HqK4K -cqrRNhJefYLh-UfM9@!KrT&pf#YUD*!deJAEmPCkDR%$HG@P)ED"VF6-jde)-VL$ -mCI43Bb'6i6FEZk&Pb)Jhh+XpAD-qMM`F"&EH+-2BL@r84'HREa+i3Eb#2!(N#L, -1cYdmZ'SH!Dh!Kik4*f'5QlZMC@Ie-Ua[N!!me'qLa1VC#%iCSA,*a-b0h`S*BZ! -hD3%,Zm"V!-1XLUm054dc&"mpTLNXj'K8EGULY4L1JV6N&TLR4F,d4c""R@25iP4 -1&-$1fVQE*23`(1PRfl*Qr[#Iq$L$$i[TMp$R'4ZGB5eP48"3pNb!,B!p))b2ZeX -X@4%JVU5Z,UhL&k'd,-$'4#$1QC4R"He4E$TiH(1IGf$M1*Z!DRD@*5PGc5+V*2' -6p648Q1#[m5)31)l&6hfr@5kb)6b&Lhki14&B,Q&Ie90bq0`JiYQrj3JUFQ"&iaa -a@1U(l1*ar@XZ6,FGIZkX#Z*`jYk`XF+2Gam$'E%U3#0f1bc5%#TDMf%cAckjGe* -H,[L4qC4lHm$6mM-Q2PXYf33r`VlEjlIhc`,1GQ(l#fUiA9!TGGalmi1X2E(ED1R -"HHr"6VaT%rL"#)#'6`0b5Xal@Ta[4#,42ab14qiIZLT4eDa1+4PVFQI,,UN"0+V -a(fHl$,**k'#e($Eli)lE,B"`%XN9lL[*CMk69K&cR5@ajFp#i(h1+0(jTT2&-kG -UCh3hjbC9(BkDL@9H1*Zj3rFT1X*K*2qbP02&L4UTAl%5AHaKLl3m(kcK,VTEFY` -2@0fCIe,B4h5(qZ&DAifrp9VlKA(Nh$H&3qp+pY4DU,rGU8TRcLA[`q-$)p!($6e -Q6GMChmkY5jkf-ZLCU-GSc2hUrQ`SLhG%U$c$LZULFZRl85XR9*!!09[f$TDEZM! -2+%ZL2RMpc#KIqX#qNTNQk'mEBFJ!!fkK4-TU4[rS(VcXN4,U2'F1kk1,BJek&K* -3AIbj,Pl$P9'iK#8T'IHI3GJ+J"(!94IAq!r,2p9`Q92EXM[,TRfGXMiT%irUMLe -6SVR2#fm234NQ'Z3@@DLE9(p%2+Cd'`fj8*RY,ckblhP),kiRe402p@YRF5'QP,F -,T!0Scr995pC[#j!!+0[N9Ii10PJ@KAjhReepKLVDc4*$'("mrpZMb9YDNBpC(+S -2M3IaIY*bA-LY@`e4NV'"BX0!J5FI%8h-1"C2jr34VBkfF`J2NJ1RFT&!MR*XADm -KUTHTTD8Ck-GQ$3#5"i99V4%`UVf)2G**"3djq&40kmLAMEY044"6%e$9p%`&N4@ -q%XTY(``!*$92&MB,+@H&SR%qBq2r1J-6Jm0h4TV1i(!%T4PbaApDq4aMULNXj+R -9TB64%FbB-bfZQT105HP6kq-b8D(J`&D@,elr,X[c*HL9+!&1J9V%[60Q%8BEAF6 -0krSN,XrUi(-NDpeL8&SaR6D)ca+jS)PiH1fI$'Ym5S[1QPQ-K9T*c$9KZYbP4F$ -3$+L%![4keaJacP8#PMdfjME&!))qC6IS3)*JUT2P@D*F[a,00KaU5NZbDmUAA%c -d609+@KH9LSNDpPaCVDb`VaXcmLK)B9N0Erd@Y5M#mI!(p%FK0CM916LImDLL`BG -3pX3R#*+fiSGrKIa&dK''C$R,['"+T-pidG3&3FH5@4fRTH(r5@kGjV8i(X5AN[' -"99-2$)(YMJbIk8e$Nk#N[Tp'qj!!Qm)+pk(&mkq*2fdK"PDM')Y(rKr!jKRJc'U -X#rI8UdeI6PrpfTE-GB*khYf2ja-fU!hE&f('Bcpj0+$,8ZBr$HS5TAMf!@$G3qf -eq6,cMe2&M!LK'ri#3TE3dI4Mlb8J(jX9q5NH'JI#db"fP[hNlZaJ5eY5%lYhD%K -'dAlICp,I+'@eN8+XF2ZE8G!IZE9lrE`1MF0fQk8q$m@'G"K&CGaK'5,0Z(%Dbl$ -D&5,BRq#,LKRC"0@%!F6YURMeYEmdajq%Gh!2aBSSD91r4[J*Ih8`fX"d4rep!Ra -I18kr2rDJ1G5DY(YjT0A+#'QCSd"jEr!UH`cQXqMq1rjeEXH15dK`[r1ACjFjIZ0 -YkAdXMS%BHU+@bh8UIrKM9k3c4"BAMa%p#[i)4aDb8dplhSm`E0e`%SLIAUEZr9A -MT"AJJm"Ncc)Zr39Z39#qShSBr`+bZm'&6E2dS0rbRjR6VPDA[@$6T9aIeiShKq) -Hc,&qPiVZpCUSqm"D@i%C[@0$fd%lGHRCYCF,T%'22m5Gfq`$*d'*56Fh1H2cNb# --DMS!e+55`+G[86k[&8%,P)QR`1SZKkfHYa`VcQH*C0Jh%c(KDNQHD0kI-Y*QpU8 -@m$dhh5SM8%1(4jrh`@LlrUdq2$GN4Hj+m9E*N6!IZ,EMIKLrSm-Z2T2Ejk9SY!6 -B)1-eeIF+Nd1YYKT"rB[Jl6H$hYj#Eqf[H6ih4V!e#S#2-6E8HY8-rIa*3+P&pfA -)KKp+i-He$rdq#KX[HmUAceGD&2'Yh3*BN!"b+eRYa98[j,)KKD1+[DiEjHeJr0a -GN6ZVS,03(5X#k1fTpBi#a*GA6adS#8f4#!TFR)e"kpdJ9k[e@l)f2d&aplXfbmp -1SH&3Q"Sc1D1kB4-G"LA6RQ&acUhET%U(la$2c$cQZA4[dfGP`T!!a*-%#E)`hGG -Y!Y(e%HCXR,-28Mh0G5IpiF(I%VH#BSUTL,XCYH`a9['UCX6kh!j%r@@l26*LVTP -H0M0BAB+"#MeH$YMRPV!e!LEG6qNXA8IeXG!fGG2H$DdDqe%p6L#ai3a#FbpdUUr -%9j%%66PYjI6PL&lDH%BkT$&Da,DdqXQe2D5aK0&,!UYrrhC-&C@@RJNG'[HjdVX -QkI$PZr5[0Q-6eK3SBrqf8DQN-4d!1a2Q0Y2AIi`1EQ[eYLl*@4FkKf95@BDMc(5 --NYD3!%!iMTmm!%a1PF'afP+46V`*1l#bfF"Je'-H&)V$eI2`Ki"N[U6Be#kA[cP -pT8IJf1r3JK5G,JXA"M2#TVr8pTZ+Y+"dCYQZHXMi#d8q&6$FS&IkNRf84jHJj1K -h@hVd`fGH-M8D9(3U)ccGk#[XcqX`pp6dp+I3I(`qlSaiVeE%J[HJ)3`(XG,MdKf -f(%V&Mb`jd!D"UZ[2ek[%YHJPplb)h2'mf#Cclpi-KS6re!mZD1Zk#V6!Dd,$mNh -Z46M@*Si"JU#e[Y`i'b2*Lq90cPdC*iKhj&F2*%*+cl@kNf*1e3J1VYEFI8"0d0+ -J"q9&,5eibLpJDd`l!(aAZE,MZ)B1pEX94eJJ,R4Qhrp0#XdcpU4&h*A@dT)c1p* -,VBe1CPNR*EKKT&a5$D`[RVP,c05V`a9(eq[am@ed#,3cb!a,XQ48@`C@%0b2r&` -2FZf%#Ye`d5,i-feV+DN,Ef6N3!13!(,FL#d[cV-(-*iMLZ!6#F6eAM3(V,T#GfJ -2A!eC%TH++j6*h0"2"Jk3!-"Xa!4ZjmFdfKc`*0Fc5@V[+%Am#l9rd8N&LUT3C0S -PYTPQH5F)iP``l'kpQc+pCIde'X4EUIY$l[*,DkhU'BV+6YcP%jZqVd'qfc93VZT -YQbPZK-UrVXPJ13jh-N9j91!Chj%BhD8i5k%iI,0U335V5D$US(+li6GlTReH&R, -QC2C+6Lj`JZ0#mAq%a-lNTD,P`X'hiaGJV3U&MhQ6UJlLYX,BDGXlR6pG`)*HfhE -+A(+94Jq#'dT@A6&qJ*YeE"fUAEXVE%*'1`Sq[Mf()-Bm2%0$[M8I+6j*2K58c#8 -ST)GUHhVlT69D`-BX3Hq'5UJrHc&X1P!-6MrL9c#'#hka$&3CA2`"0C1$Hri&k"( -Cc(Nh!04i!l@rZreQ$HM$P54bBkDJl*UC'SC[-*SIqah(Th3UG%2rTk'CdNAI1', -A94+Mb%lRSF,LceflSGHd#r3#b5r&F$RCC4afpVpEmh'U#'X9Kq[Vk)[l#&T,(jG -%lRC6D9'G9[C*1r[4M"Fj*FG-1NCUMG2PqNTq#Uca*Uj8P,9QFJdINNLcK!6*-CJ -YfdUDT1ZTGR%DNj1V"2XEi0"LT1b`eLHG0-99rQiJ!lCj`5pL44!&m(6XlJGkD*) -HKBXMhPY)-h(qLf)$SDdJ#pVqdHK@Qd,p&6,K&jfHS%ea4aJTd!B8AUQQ$Sm'NP- -9i`*mrZJQD"2mA+k0eBjDEqi&*EcB6FYP52ILfh@`4pcqi[kY#`lP89H6qldIp+4 -#S0r(&8RQmXKk'4RdB4MmSPXbI,aR(fP4ZcJJT8FKeIcYTcZ)35[%e%Tp*[2hBBN -89h(l0qbdj80Hj8X#@iF6`pH''S%TXaHTS!fU'S0E03*K%9Gl5dGMee26S5f[CU$ -T[f&JJa)AflbZ'2Ch9'E@f'dM9Zl'!#'-'4%)44Pq*B[1)+l)QUC8d*LJ+``GZBV -"kCLiK6Y9I`F8H5Kh!!B8k'mBMRRCa-)R*!@AC#%B@5FPLjq06[JUclH@GSrN5N` -Q"JBX*f85kC-20%0C2V@hFHeD@B3ZLG[(NbLl68hU0JLc&U&j6'3$hZbbP[4mbM9 -8TRfZ[Y4r5p1%jU%E8m*9rh+QI9!Kp#FB`qkaCdXHKbe$#e*@BciA+p04H05S2QS -hiJP&"+##01GqSI9!bmTjPGIr@[0qA+'QNkC!"qVZ'Y%2G9Cpp8i`X'26h(j+!f- -+PEdlPF(L6T`[i'CkV0[R!F6ca%ADG'L-V!8(2RdY,h%,MY!K!9r3UEa4[ArbkHI -VUM#DXr0H34p+SLPl-`[$6bGm9`2CE`d8MhLLc2-23mdqmLUA##(rq`Xiej1q$k2 -,9'*Tkj*4UPTee8kf0!-eR8Nf1pPQ2B9!mrP6&4!(%VD*8)PYjAfZ9C)VP#j@-A1 -[,IK9$9!(8BK6kjZK*XRX[1QT5icbd%[[JY#00rI$Gi3Gd6mi@EkSAlQcl+XKGpB -X)aE5+$jB1RI(JfpEZ`(BVLTlJ6Le+eJrKIq3!2VqI"iLH%rc2Nb#NH"b0L8@-Y% -KNXG4aBcQ")Xm6Qkb#V+8&`%3Y4rqL)HaQNG-EU29Ul1!KH9E#3+'deM4H&pi*'E -APcCrm@h13R&K2KhqbJeT5"ed)hNcKbdY!Ere@IAEl@eMpNGkHZ*-T"drS8k!YeD -0le691$U'EF5Dl1ZSMV%UDeE3RT5G$THIlbbh$RRZ+,miD(kKaQbb`kLlVEENR-8 -b[0H6KeHJ"HSj*A0QkZZ$YY35cKHfQT(%mEPSP-6#P-F`r6Df`1ZKQe$DMSb0Ab9 -&NYp#+Pff1(pqI+VDU#NhaV!M5f2pTcX*VYRDKB@*AC(i0L%+a0j+YqFSAKNH)62 -q*LA*U25jT5D&qr$$hE1GBqTC9r9I@SL'-f@k"SIS&rc!aP)qZDC#%'ACr259d"0 -DR[Jr+ZiC`4EdaNCGLY'+'UT%fJ)cd*P5jfbPKMU*Y&*6U@(DbN[TcT!!kR53!0# -ZmP)pD84EN8"f)0hR,ZS1kZS85LHd!!5ji$rEfM&%fNV#HDQRl(f@l%c"L"qQ'`G -#QKpX*B%9,`NqA-XRBXNdQDe@DqN#!aNIF+1lKTb-Qa32Q+p)A#*p`(K9Tc,DZq0 -09@4((5k6GKT[Ta81(fkdBB'a-e(CPI&T`[a@l!LT&cjEdpZj#Hi`kAGh#&1@V#c -J2"FIF`)4lR9Ej#'e-Q+VREG!"d@kaRbB5X"(ZmQmj!cmEaf!re0@B%S&ZJbC+"Q -#NL!MPIM,ZX([jQ3SH$Q)3(rPF0EAA&1jqU!&!h&fr@TNMCNCMIbUjHK,$&0m*6- -hr#A#E%)$&HCHbVYJ0%FN@0I'ZTA-8GF"aL#CXLV'mm0aUiNA`EE6ZU4CFc+)++h -+T3pd+Za)QkAqd`0VGY%rjHa#i3(YAPl)hQA'DC@Y1cdZ2F*!,bpcl&2Y4C9JqpL -h1EqAXehc9HI6rSp@+%HQ-T-"Ue!N!P86D1%cj6XVl5mpmDkS-C2P")2*`@eqJfP -XlI5p25rZE*YIGH9+bVRrPEc%2Xb3!+cl-%*0`h,hYfG(mV$,-H56N!!FG3B`hU` -QL#2MPEd9GbNkLHV6IcHR)88X)!86%r+!8r4hr[b(8e`c1%*#%e9R0EI)KfNeCH* -RPEV!r+B(#JMjmJMjX9H,V*J)dV'r`Xl3Xe6)"3d2KM1a5H!Z5QYEN!$#l%@aIP* -K-'TCGFMlNk"1rSmh@8#122k+`a-Le8RlKS9Maa!ch[hHI606Zp1N0)Y%V3+ifqL -bUirpJ8eq-GS8+#I&aS%2mIFZP'20kNeVZTeKC'Cr&0EhRXCB,YfefRPZB#2Raa" -86TYFV9"4ma[@[1H(Q)XY[#PAcXRPpG-RN6a5HcjZ@(@E$@bDL5(b(-U8TQDRK1% -Pfe2L9Z@,fcY(0E'pkc%J'er"q!d1$Pf*f#'$&mJbGR,Z'DAfaZi,VU)QZl2h+8i -V*rZLHKe#6"1LZ2cIjIe2P%kiqdFHp-J`30VpJ,0h1IH,j&YSE)Uf,M&F0j2&,Kk -hV'T&Z[0!fU#,,1dl*1"&55',M[-6!hl,kUJm+Qq)9jY[Rk55A[pZ50pLeHa[`fK -&jUJFEfAA#1F$*0YY588##LlM0&FGLjCp%Hd3YGSMNMkX5#m6%*iH8k(`Y3*RTTl -*8XREN!",pCF(qPq(qGU9fZb@-%bT0SN@k)0JqUFl%AfM"*C3)P#!TfDIZI++[5c -F02ecTmq(Q2HT2@p#VN-B)hL*9j2Gr9I4RmT5TcN-T,h1Tar3aA"T!faUDHVG9p- -$3Ir#Y4eUpAdK@+B"&$Vh4K4bjkVqpM8lHKGGKHQ0T[8E)6cNAaY&$(DqLA',9fN -M+,aP#X0a@V0,m&q0CU956KZp"qQ2+eDD3@HEJ)jEFbr6S$pYHHAI+8S0)HAD)AH -AGQX*pSh'k'SdTi!b''TA2BIcHE#pXMN[r$Pbipd4*!jBm@56'mP2$-Bl[`E#*B% -l)Jq'pNTEmFG`D8DaU3NZ@Ni9kT`+@r@JJNS4CfKDdp$)3SVSYb$&'&*YU#1kZ([ -j%PFBCF!k'"4KDSr*P$1i@E!hN!#+cBjHVdQkB#iP'iqXi[l9$`)4Za0CNHaf@Ja -8l!TFmT9l+fAGVlqlcD922q-6D#9U5'Aem6U@b'Qp$p$,M[mJpG"!mR&aXHT+b9q -a"%ch3"bT'DB6,b0L%b4"f5`HKID2AbL$"V!r'hALhLN05VVc0413!(#fT%d63,A -GXDQNEqjQrLPDfeST%)-DR,ql&&1Z#9Ap'ldJR1Z[p"Ni5D1"0a[&a!T-N!"%TpU -R)r5Gm2L@F6E!&mpb'!qj11QNNrXCe-GmH$eVR[Aj"(8GiQkAHmd13YmC*#a!EG1 -TQ)1RjlK(YY8I,I")$mNHT[rKLMA"6UVCEXQqB`Y0-[hCl!+8(QFF3--S+-SU8#H -F)S%m*2)T'3jp[HYCA5h`,VMa@+f0KfhQhK'8Z4TldrIZQKN"PRCV*&a$E%'AUhR -rP!GVGI*e!1V6leb&%SQQ@p#SJJ*hmk3V*cIZjj'YdhI@jAT[6P8S#4&*[@E*I-- -L1HPilZZ)LN-R&ZKa%!SJ35$46N*M5%M-#$VeUF4%D!mV2Ice+cI-45c0T&#fQI! -q$Er%GTUX1A1Z"RNK5FhN%LdU"2p5'LN4hVb(3IUD5U6"CVKKSY"qMmrUKAI-H0r -L'CaIiSh*JeS+FK#SI-!R69c5@#AXC*3KK-N2``hADI(5X*QaHdr-RC%Jf38kh4T -EqAP,2E2jkF`'m6+eKKIY9JIf6*HFS%0RARLqcZb3!*5q"Sb'QZ2#$@[fjL2b433 -P-mr$qr`31&QYq,-8`fQHh#&'(CH3!*UAd19APFI6ZHUU6BDmAp%JrH&d0(&0f9l -G65f6AX4(A'm1hNaiJ41DeZbSJEReGqS!GjPpmKSG9Mhqr2"BIFELm"$"CicU#MS -Xp)Qb(HHl)qK&(e$PieZ1B2hJ'6D@L$-S8X#'B"8VHKf)bI90f0HKSP@@ihHL"0k -6ae%r13LNl-l*GhFKV-'m0[-lD[N9c8G1el1JH)6c$HaC)NQS$1mjP"T(%mr-NiV -9*K20'E1(8e`cE2'V*AFlpQPp*CX)f#mLi25FjblV*ihJEG8IN[S"Z-[Yp(CPM)X -5dkLi[6qZDAYR38F%Dd4(#KM)bT5!-1jpQlPbAM+F1P"Zm*YkU)9hT#lcU2V6(54 -f@,KT1#jpa#cfE92L$9BhDIEQjGq"",`5(P!3Pbpfa`JUPSR,8rm5cbC`SZ-D&f( -X22dV5TdA@VX6H'eAr[CLXUE1I-kV5Q&la#*HRlhGl*Ue9@,FdIe%kaiXHJ,TX#j -0A44%'QmLPPG%eiUp@,1#Mk*5ULjjD[J"0Rb4m*0f(*Uh*kl0TC+fGUC)NFU`Q+# -prKPGeUZq@X24US$FK9T13[lqS,cZ5f)H0GU,0rS''A[+QBeT(5*)*'iP(%"j@@Q -ZB4VrpN2ecKe0ZMdc!L3'hiij0IfCKea'9Echq(R@8F%1hXjT[Q9e")*)VeQ+qCj -hMbZ(KU8E(2EJN9F'PDhK0VJeMNml9T08(*iaA98i+8+KB'QGaEVK,KV'HZ2IMXV -N'R(#*I0%Hff(@NNr5E&U0!*EM+NU,cBIDGKESdab542T+3Gjfq[Yed8*1+k3!"" -PYe05ZcCeM*9fK6a'MCKDQ!H-[+j#DF[RhVUDcR`YE2$DG4LLLrb2&,Hh5G%rZ9( -B-%2#%Y$bPP#+$8p694Q)cC!!PXL+'$&2XIA`6Q(F[3"e+G[&'V9G9Ym-BIlrC!B -Yd9"1I#dbP,Q3!1HIUC(aITi(H#j)9H@,8rXDKlSXPQ8LIdL-m@fJ+q@%F,cFX6i -qGS8Gfd0D)AVc1#LpNh1RPHYJM6$d34+%44%6[V*1hjZ`EbSUKlHVF'CIKlliQ$' -HI5be+4IP&QfVY)eE"T,ffl`lU%mH3abH5SE1-CP-'()U3hY[(Q9P,4CBBGT%GGF -NaFF$RVGYM(a5Y1+4d-!*6*j6%D,qFLl33a#e&Fjr&HafGDR2CFQ1*lbcXcdk&V` -QPQ)Y)ZkMr`V24Uh,VYr+p-'"SC%$Gb4qXSNrY,UDYGGD!H%k#0(Xb,KEJ,!QCal -6a#rPf%@-0rC6l!R$(ed9IGiYQZ!-k5Z@VP%KJU$D*GI[&KL%04H[eCR&E)m+apT -0HB*I&b2Ja%Dl[GqN$DM30+Y"qaH$SY+%48bCA0J44(m)B15U8frH4E!AS$5'([J -DB$pURIJ'j*P+R"FHi-Vl10$XLEj@`EP#[#!8mIP0Jdkd13,QC,!hC4m)jK$"QYY -lT9H,aE1r'N@2Bf6`dRe[qBELmr)ha'NBa%5c8"@`fj!!3HPlr+2$*0)*K90QHb& -KA#R`IJVVQrYVX'NmX(jb"G`6pV(+Y+e3kKpFTk`CZBlb83Cb@3Y0$1q#PAcCLd9 -VcPULUL1l`4icQ6H5#b606@U,*QR+eNqJ@jp3$+9N!$e#cpEBEFG&qKUmljVVh5X -Kj'08EjUc`0%0q2'G#rL0`Cj-dSV-E1mMh1@'Sj!!$&B1ECXiNjk*TLG3,b@+(Z2 -pY3j&-8MqhX#!`Hm49BVF+XRA)R",9jQrdUZ[!ZhDLDcTm"CD$d-eIe5!,GL[Tp% -&S@#VHdXA`l%p3LT9#%0B!hAD,$RD"$85Gi8lVD23R11Y-&2L$F)-D`F94D`D6r! -ERrrClLX+Tp#GPK!,!*dEE+lkr,$LZU5e"RpQFf'*8XZNY,IR6`M,ST%p&*c9af! -bDj*@ACb"(jh9*T)cj,9jMD!UHkR--l'iA%ciAdfeejk[I#9!04)f`RUFHVI4C3` -14h463KS!JZUTA['-liT$bi68Nb!'!l'R%@#L"eecBX8(0%N'Zj2,p3GZmT'2PKc -0kc)T1E2&K"p@r1TNC$6k48i6b[r8!INc058GGBC$Lp#6H3kf%#q,0650VF-YX)r -Cd[$d"NF(e1I5!0BU4#8B4NG-'l#6+!I@FRl3jdEr3b@CNF*M!U"ESAcR'DCVNiF -31e4-3T!!XCJhGR(LV`MQ"X[&,5(eVmXSDMlBb*,d(-VXF(UlR*[VlYap4+e!J8m -pISAd*%,b95fc%'',[cBLZi&DLA%aApTa[lmdTk9,)$VZ1afShkF3'8d)rm5+QS8 -DJ!GAM@H[F(5Aml()$A&3H)PF*Z+['UejahX9,B4r4LbBqSlU9iqR26*I2CdiTKX -%G@RHLKcN9cJiZ[BkbeFmfI+!*DUhDD'L2l9)@2Jpqa2Yc)Ye5q'C"Di#9NqcCVA -dr@1dZ$Yr)MGccII,ZLS31TII!+D$)NKfDcDi'B2pR(1c#2'+pE)ZIhNb8U8fbS6 -""HKiCPZCDe)Q#63(G$Y6FJ"jHR%!f5A*44`TKdhJ-U!RjUX3`h0p'4f[Be)@3K$ -G0HM5hcc%HGlfkIlfSX#Jb%p)+0SV`l"3Ti6HI&Aj@#FqU2`-M84Mr%e4Ecmec0! -B1'jHp#N"%CUdGJR6F5)PB5YA"225K@04"&1NlCA+AjZcNMjblf6-2bZjEHC+*l6 -ClkqBKVQh)Q,4@3$%Pf"qdC[pF-41IHIYJq$HF"!q&-RXaCKJ'h6((4XM6Vl&Q%! -DZqf'(jD-&hJp!GdYMGiH&9&&m&-%lQ9le22BTEj)*"i,pdIRCJJ`M1M8br*`mLP -%S(5HmTYNE2@D@c2qq%Ch4JZjVdqaZem3iI"TB8,@!@EBCe8,9ZIMmC&,aj8[K&@ -B9590%EEfq45Cadi6Q,rAI@NEb-A`cQcjC'9i#Y2+1Nl+CB(I`+13!1CrZ[eYVJI -[9%[p*mT,%ik,[X8iG+Rq+Ecb5i`ic@J(qSXBX4Z205BIS1aY&E(b$j!!fSrh6[j -KkNAbS*2"`DDN@[+(!UDQkHP`R)mITP(D#*)Vdc8cl9UYDD6m6X12ZlFVbZ6[jXk -"Z@41fCLQhd5V)pX05I#r0rAAKF)(*8MZq$$eNUM+,PCdUbACAU0rbNiqpLhmAhi -5S#RRqF(J+8#p#ffP5lb`"k@Y(Mki*pBb$MdhFYXRYB$B8ReCF*!!Uhj*qSSQT[9 -T(hR0ra&McaEQ[d,B)1"`fmcXPB3V-)R,R+*QI9115'6'e"R3))@N[a"[Rp9PYIP -F6eliYNrh4K6m,L,h4&A9%4SRQZAM0ePNe,cJ#@i1!k,a6k'N,iPCfL8PXR5Z5NU -rN!!BmPiIR(M31DmY81NCq2$Db2*DfBR[ke*1QI(44cKV5GY)$pdmT,6A'6CSFGG -f-hBclCaSi"C+ffkcfZh'j'F64'Z3!%!-SpDLZ%JlUfE%`L2Hcr%`EGbrh3iVHG6 -J35ZZ@(*i'eG$4!GrV,5#G6HcQ2a[9N9a%Uhl`TYcEh4Ie-*@eXj(l3IAY4$,`fK -Lm)ma1(A6N8$3$qR[d-U$Ejbi3MV8%XhLKbC0+M)G1XPL)T08dI2r(PS2Si)-ZJM -0p`jf*U@f!ceR9VJea!D&DmaN8,bam#0DQmE`JPmL!kU'cKScNi'@fe3`#e,aETZ -MKSX5QBR*A4lRV0AmUFNfidE0F!pmm8$`*BjjT@L3!,,lbYq+8jlSr45%haaY*N$ -lm&52haK2AHUcF)[E343**HIeHZHA44UJEY0Nhr9%$F!eG[8CCmiK@$PPK%prL`e -1(PbB0qD&cl[AIVLPc%0f",+(dG(jZq6NZrmqp[)ZDd5Gp5TRGc6LjBaC0dfD$[c -SXaqiF`-!3a68$01(8JS+#8K+NJePFdaZc8M@QjR[Bf+QP@[Ih1X93U$f6DB66mj -0fj)4,H4@b@-Y'q@%TQQP'C55Hccr8!JGM[Qf-[V'6T(33QKRT1Yf[I$jVTNhT1C -&R5Q26!2"Q$B0*3-5j%I#bG!(S%HYd[Jd2cBKU))%!Pk-JLS@VjjY@B@5pDk'1#% -H30M4`DFDMXNF9pTrdLM359lU`2QGer35$KJ"jkfHUF3SAI1AK@*1'bNHb9jhSUf -SMJ-D[H4l9rkTR+N%qqh'GTcbB-f#B#jKi$C4RQLX!%$qhDQqfPG)hk-d2#DalX6 -,IZElpPDUJb[VY9$F"4G-&%5TQH*VK6IqFC!!Lbi#S1#`0-N*G1Q`+q"VZ9%,`5M -NDS0MJFE6kL[01jJ$M"B+j!J"IrRVk9SIkp%)4d3)G$Kbja+ZRYZ),)E*c-h!S2p -(AXLpThjHDij[i[Ibk'fVef(-qbTIP3cMTd8MI0C2MeKr@f(2`*'appcYdrB0&,b -IXA0"E3#RhES(*Lb"a&'3!"9Q9NaL8eIPGU9EZC3S4Re4,1665(UG8-q[Ed`2rI# -X0F2Ud#L`))&eNhe&RdYfY3Y&2X8$pBY&&Lr-P4ml1!PGeIk9B*IU54J56NV,R9U -DP1"-c$a8B1$1l2aGhYDakjVh-G5'M0SqP%)JSTpZ`jZU$ZV5M,4VZEUVJ)hljca --mi$p0!f*NXhFGb`'0l2daQj8FPQdP`J2@BeaYNJ69Dc$14I@TI&eCi!-JbG$f(a -Il!&YAU)I)1VP0Cb!AkM[&@S%ql)SZd5SE1,*bLVM6EM3UKD$j)hiZ3mDN@CH-Y' -E(V#8[3l[!5SMaH8ZcY+"5rZXANY8aSET$L*ka%F`djYN`4UirB6lBeid9DV'(1E -d-2PcjU@"0iMIM@1+ad!@!P#e6(djD6JhEQ$#Pj(1m)5il)[bL*aZ4jQ9fZQ83kJ -C&KmI`H,ccBk4qrTXaclG!HFAC,Z0[eI`-28Q&"p1M,3(9HXCB+L1E4&MpX#lalP -BIp&pq,[mR5cAhElcNeqeY8"*FU5G%p"#`"*dVqIFb4L3!)ZBIG[NNUlRB5*$dKl -IF)m%fP%%Hb(bV-m&R59(%QeF-`!d33&&m@ei1iTM#ar)'Fid*dk1THNBrh(2fK# -mNi6'pcJEIJ2D#MRJ'8D["G@@MX3jcH1*f)r3*TN&$EN(SDMk8[FbjeLfYd"S2Ap -#IAhpEF"''Vh0fpPDr2e%mAUEVXEGpr(,0UTGq'8EDH`*0RkIE#3RBkZ2*8ZG5Z! -ZjiL&%i-TZB4#b2BlG[65(BbB*E+XdDdaBcNmU,'2A!#I`+q9k@)XSXMDC2F-6Rm -P6B@0NCq(ir5MQ'$)`m!M`3r-,K-ZCkQede1ZXdN(K@11VfPLi1(c(BA"4GDc5a$ -G9"F@CAY&h#$#H!UF*!4icY6H!9,k)Q8*%8b,Mci-RUHma-Uh3X89dSGZ1akV'e` -+`*pDB+P[2Z5dB8h8h)[('SFIjSFXc2Ekm%i-N9Sip2Y9'b4%Y"2*VB-eU[aepN5 -0XX5BbXZiCHqaTh8r3DiiAm!!ice(+ZpiFUF08*ET@E(jkPaJi"+01PE%+8pM8Ef -!QkqXc61S`8Y+m3-cI$jDq6fYMI3jeKZ+&X""CATZ9rAUbSTj-KXRp5K(pGl8N!" -4e$k,Ck#5rUfflK"Gf+PcYBlJ6&DK[kj,)Mdb2[-b$pm&l"!ZX"qV)E$`4IcIV!% -qh#i8mXdEp84Pe`R(fXG*`pTF$q"pVp&5aiV4Bk"I*9&"0&r*k3"*kb"iiZF)fDP -T"5)r4&ZQ#f%2CLPr`!0)92`-i8'Rk@bh&FpGd@B"(+2P$9EVS@E,%BjDXD!-8p' -R%m%6)e%!B[YY-$X5ia1,p)k'A3$mI1["$YhJHiYG5p(c!HeTX6b%*(K6Iqre@a` -I5TKRkLd"RC!!@64U'K"[Qk'2GXaFfACMEieA1GacY53F"hY[J4Tii8cQ1qSVGA@ -mXf(Fl3dm&LL-HLr2HB,j!6A,)Q*mH2+-M8#bNQ&3)lmk2a1%fYE*Td9)$H-&S!Q -1R`M6GMc&kKfCXp@[5bcd%))28US0rGaT2q&hJjlD8J2T$h-23d'R4R94q(b&4Ld -"rK)XqmImh&HH%UPVeEF!IiQk*BI)(di$MpI5&S!,hV,N6#"0#N'e)[$M#[0RQi% --&P!*PNZD'QhKV$jqki'9FHEJP-6F@$eJ&T%A%VC(-1T'-JXB5T1l3PNm5JK*U5V -Qa@PdF515Ya9l+90MLaJm-p$ai'UH-$fCX6G4afId2QiUij1mj'h(LeJiYZeJF"2 -GiF-Z)elk3*+Ia8RY6AqeX,l"lmqfAqSFE3&AmX)AXh%(J&jX9p+pKK3H$V[0A6q -&ZYYq5YEaH-FccphN"*h4K!ka8E0eZSjbH-N1M+ZG![H4Ja@i0i"flV[c03e2plc -MC@jS*X0F1f-,C2E,mcDDTK*@3*ISB'9MpBFlQbii-dP9aidZlGYqE4SR,F9H1G3 -i3$[+b-DeQfjZTR)@Q2S`-[,$h#d+qFTbGH!)400@&C*GVVF''8)jG'r*D&BfC(d -1")"i8K$6NP3ieX8dc)-9U0HTrf9E3KC!%S,@H&[PK&Vlr$$)qHCV%PZ&m0&h&UI -AHN,CF8`DUEiK9ckBSJejGf*`9K2*cSMd4VL)`A!f$,-p6+Gj6$31!B)`c[i@*6D -&f%IF'%FcVN#jU`HUT90TeH4eZAGKr2jGp$bedJVM,Yl9N8ZUdQ9P2rUSpXe-q@F -5U85ANNlS0,cqS[l,Jm2pAbPT#F'iSV)GMqA`GjN$YMTkiC3KEMEV2QajQm,cBpN -)VC3+bH)X9F@d5a%"Qm-mQ&LKDJ`dlT'ad&jl&jr!km6#9%A"[-lD*ChGVRSc(qY -RLUh2!Ij`d-(8`b-AEq%%VaP[XM48#8dI,a*1eYCGX%r&"p@FABM++N20Sk8K1,h -)mQVDJcPMl`Q,Rh6@3B6Z)cNfqjKdQ+ECp2`&BF"%)3ZNb50cki8f)KbEb,ZAejl -2c,(9)`XHR*r9Y(A9CUTHc$Qefc5p+J5-SeRGbaQ&fHRGFN04SR[9cDl23CaJq-V -BX"G"1S'cA[2HXTpQXNPrLd[@I8HaX+@Qa9B!SjQTS!'Y8lUcB8iJ5q+d[ZLQ5Zr -kCNpRTMGBYfh(T`bQ*KAm['`4(LrSJ-jR[1Q3!&jp[G`)Y*Z`(d*Bq+Bd[%@HRD8 -I*)bNLX1FYcZ!pEBb&223VkHS(LTD6X'r#MTk9#`SYV2d!p+-b&f@*9D6&ZJr#P6 -GP-Mc(H"MU$-P)mckjC!!IhFQ&18bq(eKD34DG@(MY)YR'm39m*`H5iDia10*RGJ -*T'f'CjR"T*m%mVNebc9#(GZMk[c4e(+,-T[MMP8C3,aR3fST+X*5d&$$F3h#al" -ca!2&H%,1alqfDZCRFEqeA18Y$IDe#G*SQ3RF9K"hafRhk1e4!jGb4R22YVVl4iN -)k0S+Q1+p#Kd)*a%LU6@3!)UIJTi9FP15M89UpQ-l#X3P3`c)J#iCAf02rEl2l`8 -Jb[J9&N6*GYqPlK2DH8J"*f31(-D@4Y8*1$S1)IQH`hTLjaTe-9Lh*hcKa)08m0D -,E3[c*PpKRdK*FAK0SKH`4RJmkVPJB)[BE1p)`mM6I$cQAl0lN3'm%fI*p8!54V1 -"ZSr#Gm88+T)Q!1)E&QTkMldAk4&ZdpFiqNmBJU8-0NEdhNNbe`frABZmG4*XPfc -ff8""lfcCmKfML3'H[+ePQMm80B[2`AjDEJe-X(Q$d"pI`[-*Z`H2GK#b+eNbSXc -Y-!9`qR6"(GpZapah60NI@V9fjTQ#3rQKB(Rl&2Vp*r90-&P+[qBb2&,&0D+,6G@ -3!&UrH9ieHK$-(AS'k9!V[EF'2&Me6&mfUj42SMkJaHc5*[iT65JGJd$9*Te++YX -6kJ9H*RN-lA&#SCKNel(aY+L$eR+kkJ2)8iEGG+PPE,EeIAGCKj+J,0T+Y"hNAU- -rA,G4E+SjC@-dJHU9jb2&&aG+XMU4G%AhX-SRb-CapcQVK`JcTA@4!,+B'#U9(4d -PSeh,MA)9U[2bKaYXV3@U&RGceJ,9BjXZdE[eSCP#1fMFrrJDTl[RrSkc@LiIf@r -Dr[3JAH!dfTj5%+['&`Hih,9dAk8"RlL9064DYC[&-6(2qiPq*E-QeKX+-PA51Cd -rSG416e1cLM'!GEqc!T)Va`j43'mKBFrDplYA"6d[GF+r,'KBLLar#LUMY2mDXE8 -D@6VI+eD#cF$dNS(DMmDZ`FVP)%&9CR56CK0Hbe)SNY4j)@#24C6mK&0([*c+b1( -dMmUrbPJ(dHGG&q@S5aYGYSULDhP-$"+G"R(Le%0(K-P%M3iVM'1`U!q(#J%&HJe -G-!d[*+F`0%XCE849''GNaKb8Nbr+XTNQlqVb)#3`IK8S5$8+UaD[-'H[pm03*TM --T-+Jf1(HfJ-2fD%$1eXPbG2iR5Ulh+br3ZU4m,QI-Xi3dA1LYk06dpJ3R98LCH8 -12"6$`TEN+(BS&VJ"rfUfCZ"GCd5(52%iMrYAV"ZpK6Ta@`M*"LU1$FiK0J,G6'` -f"Ne[b#ISfqjI218kU1D*FcIfXkmaqTUHDG$F3NfaJ0eReF3D)PH*mHZiZf-ciB# -H5D0!`%lT*LJ9r`TI6I`r&pYj5dIT'ddi+9U`NPN*'FKUIL(A*6*cTcNrSCdQAA) -`QFL#bJ33)!ZJFMP!rir63G)!@9jidf-N6`B,I)5eH1DeX2mSXmm$*3EjUL9mBVP -9X"3!4$'Z'8G5&H0TA*k#fE,QC8I[md&2VpN,qZlT6jdl(`YEIX(a+1(Pi0$KbXk -k0VD$hD@qr3fH6c5Ff0rUAED`kCM010F28DbpUiGf#Tc")#2j-HTUecH[Kaj65A( -Y4`CHUq-1hMlHDB#L1!#'C"01S6E#Q1$S`$q#RY+F6RSHh3@C!ldH4%e6e'eM4C( -K20PSJDNebe*bZF)ri$H8kEQ[D#QRpX"LbapM8)#9(SEb(TZUTi"6-UNaQ8'JUSH -HYQNe&VYbIaRK#6NpN!"8q+%c`&j-PVPAB-,%,00R9[mLDQ6K4XZDM,ajD"@@kNA -qD)SE&T!!Y,4FI%h9''l118Lhf0jd$'`*SN5`VrIkqe53!)&P@lUVB(N%Rr0RZZ8 -V*@Q4YE8ad[)5`a8"38aHR#pU$dC$QD,d)CD*Q%&qb!$#(0$+1pj$C'6$$pl*H*G -iB1i9ZQ&M%"+epQ`KCG!QFCJH&Th[CRRUp-L8eYT+i,eRcX"DqUi#GrP1i6rhCiV -[$)&1jJY(FC5QllB)ID1HPJM+eAAFKiJRBGDdHUjR8p5mlpJp$leVPbBkU)8Ec1a -iC4(i%05Mc82M[Q,DS@aT9lQSdUKk3"[0,@X3*R-C"28rJ0RX+-@&J)YXhZR8U6i -EM-D*N!"8fRP%#`0$aAKrhB[[L9L(rB'+ZIP$PrJa*aj5&Q1QAfhG6pmF!pr64$I -lq4GV)6JXq&@(6,!-bLikL@'A8-M9L,S*jVrXiUAXY3cr`3$D*GZ'cm5T63PC-Kk -CJ["e0iq4hXd+eJE"ImL9VLVEaDQ25D0i@j&%9lF98!ji%%a*S"j*E%Zedm6(i3! -kP(VF9Cdhr%jD@'JBS[#*P[R[l9jb$erq))JQSG1V,G2hpK[XfdI46,F'j"U2V8k -YY-k1M(ZDd+&NmIZ"H8B+5ff*iVj-#ViCFUNlJTJ['eRJAi`KbNPRq,1(F4lpAfZ -PXQ[Q#UqMa+[RQc#9Mkq+S5QqmdlBNH3$2dTKBp,A5k0C5$bFK&f3!(8JAm#9*Bh -++JcHGB1BZ"R12(lI1C5E%VX8Y@DR6&FBIT9$l8SAVi+Xf#!8qEiN!&"a(Xc%)K@ -DipqLHjf%pIeSRNdk62LGe`YrkL`h4kB3H&r&KE(8qi6CcMk*@rmQkfmS`%c1SSb -hPT90Z+J+4([hUea$V0`K6$B4)'2[6T,Q!Mh'e4mNp@A86hjqber4,@)J6Iej[Sa -)m#GGT6aGe"Xl"hkmkGGf'mAUEcGp$ip2a`Xk,jj0&m5M+(R+'GT%664AL*4FA+Q -l0p+bLTUNiIYI+'1j--)3iVkqqGQI6p(AQ%cGHA2@%,ZXD3rBeY6c$9Z+#j!!XP% -Bc0Fb@!HKh1f'p!4T+Xrbd(bf-SXPSI``cX0kl&E*G[aYLAH&QD,aa&ESK"4`ZBm -`kH`cY`4+4G&LACFRX+''rj!!,3*rZGHF@KKIPjBf"DaKC8p&HhbAm(T)9m$KYZ4 -la)jQ#a%6[`jqMBhD6%D-b3f'N!$TRI%h`Y*caieIc,`8qLDA-5FYdiaIcY+(f"8 -&NdRD3Zkq3DVq)pErD',U%dDjcV"rVjL3!)pkb2S5P&@ddBcBbK8G"-mhZPj4Q)H -'NUVhEf`U+"(#"cMh4$&dc90G2K4F0mci+iTj,4*J4DrE`*L40MR-Rd9J3Xdr,cV -H$'&CZXYSS5mT$TG9AkD68jH#fX)r1b('(rdUH3Jc1Z0[1-a(#miBrlh&09V*iSS -Rf`qq*@-,LAHhpf6!C0@`6'm`5`B*$Rk''FZ28D6pL`rr-RIKih4fjLq4VVeVdcj -I[R%3*$fZjbP5GU5IN33Gjr%&cem8aSaUq4MD#V'm&f!3kUlYXaAe8Y,IU`ZSN6F -)&5V"mfQ8N!"JTKhXD2G%Y*cC!BV9Q(&0NG[C`A6kIilGXb-3GF!kp[0ThNKIUEI -(Y"`T(bImAI@mcBhm)G,E,XqB"$"[ZK1DUH$QXhIV&dFHh0C[qEi9qTRTeUR[209 -[A'5B*5ULm+6%jZ-'Raf*l4Eh6lb6Gq%&m1I0RN#TF1$S`#VH"-ah03,XL*1eX4( -$5q'H3i1ke530mNjehXpLE-l%2`2k!+!2dUf1Lhrk"pX4+FQR%k[d2r9J13Q(Umi -Z+4!aK[FlL2-U0SS,J0)[fI9BJ!-f+$#YB`9!(%+b@A8iZ9J'bh41l@h,9B[HYL9 -`!"*iJei#R,P8[L$63ql))6Q*F2LE(C&%Pr&fAD35&SAbBp@)ebBcP[KRHJei#VI -U@5h+)E212@`XpJhRHTMEAAcSedL3!'rL#QHP"eX[p-(Pq'2CZSQV"10!PQkiY&I -S60f9&%R(25`a[bh+NVP#)U'$$6`%kR0G`NLGUXpfMq-9*CILZi!faR@21,+S',' -240#BDGG)aP8lVFjb&EIEh'qaf!M6Up#4dhK-`FU#S@AeLKVLrDkq-ZdXA#KC9ka -91MS@iN[&B[V-8IYfHDpqUBiEA[D@-@4M%Xc4+(X5GSi[1qTN6q09%U@l&3i2qFf -mcjUIj2j5S1m&FflDf015G*IZRp@JUd(@lkCG!!P8X6k!F-q[1M`VqQhNMhH[)AM -"BShY#eLT,4,%0IHbR80NE$)$2UL4Hrpr90"3&3E%9hRkGM2-I))Y2eBlQI(R"KZ -!HiB#M6qHrp'Xi&,m+%@5TV9a[kdUQ1Ca1e$S""$G2!iF29!P"'V1b0fpK#meDIB -51[`YY+"%(jR#*ZR(-hIGc4Kb0BENq)Dr%6'IpDkV'p5fKlY)DP'KaiTeIYHXI16 -!Q1cV0"5-e0SMMEIPf`@Qa(JeMNi@p#4E*1ZA@LbNQhAS(6Q6UXdkEPK2d&K[E3, -BP)*0Emf0"H*FGhJ)@4+bY&SEpqcFl#KSFbC3MD#Fm9hE3j(ST5TS2'eMfjDLX$r -6Fb&8fP@@EUVfk40)UHVK4P&Z+ZeE$pj&rU-d6#*3p*ZN'V5T&KfMNP)Tj4QV!M5 -+cppBT8q)jf`*GNL@r)DSbiE[%##$MH(``T(4#E[LQ9edIe[U*dI[V6Q[Q#LD1@a --T0[!D5[C`!)+58SDSH+Z8rfIMl@QQIpdBB-"DhIVHqUqc#fJ@pNIP'S'#5b,D*! -!Zpc,[8$,HT[L-J9`Sf!FqjD(-RY(T-L@NR2e39MlGpAURAY0-)DajffVpr4UM23 -dCh"*GfdkX!Y)B4V(3VmF1TqL2dQhXqB9D&A5i3[9T'dBi1r0jEaE2([MaF%BTU9 -`Q'*6b``6j`#3!&C!TLeBjM40pPpjT5Jie,Jae5EP6Jjc0d8jc'Cid5k8E%L2b)) -64ER[FEYHk&Rq&p`&10f8E-iZQVH`&+RFRIdc1QC-Z2lcm)FF3j%GE`+H8mJbmDQ -EY[#LH5,LB!$"")!a-1k@`&p6[bj,qKM,T1I5!p#3!#-l*4YU(+XI5BXF)ABX'qd -f"38('"+3!'Vi'i$#G)EB6(5!ar5e,D816S2f5%jZ*Uc(F'K$JefTk!30"pAC6k@ -hBJAfJD[T[&ABbrrUTTQRk1CD1r2[qdZL-alT!Iq%K,N$h@&lI"GQ2cIAVF5-fYA -aCL2F+4"a#k8XR*0Mmprj#D4DEP0JqHpJMH&U[Z(#H+HZ2UG-`Rp`MYYpJ)-XGEG -&(G5*U00iqGGAkkE`f%c@'%Kf&iFUdNIqQaq@2![,P9[Qp&6-5X#0Jj,X#3a0FK! -!PaU*[P6qqEGUhU5qS4rX"6J1,ZP"4T!!'"p"6a&98LK'F2QjQ-j8I*GKUTp#,1" -4UBqm2&!S5C,d3I[KD4`B0&NPSIUKC[m+QF22dSaU))k3!"q)0d#d"RbhMC5f6Xm -IdrhprZ[Jmk5X,BKD"Zl*4B2'%5"QrA+ej*c`3V0G0%i5'pcaV6lM2p0(a1"G[FP -,*6F!Y-MC6cbX5lPJK8e@9l[b04[@MUPRcIC$XPSQj$m0JVj6A`[*CE4aq1KcV[C -lXjV5XJm#)2I1JR+&*ABE5mUHHSTY(l24$Hd4&&r@JCl&J*PXfhURqm%b!SFmi%V -,GK#kZRhJ20J!k@#F[f0jN9ZISX$pcF'@G$@T2N)U2lDR5I$Z-2"*$CV28ZJ*QI$ -r!-2TF#pKjcRP2'@Am*,5F2BXf2UAq'L3!*0kf*pXPIV,IA%j8Lp'KJUV++'!Ei( -@H%TE3dD[XT!!TJ2Xld%KSh++BeBr1!5(im!Md*'[@Gbd&BJX0iC@*+5ML"UJ1ec -`Y1`H!+%j6"FYSD6bHaYJr$UE8PY3,9DA+kbSG)M%1'Bp$,Jk&Ufh8!XTE`6LS4F -0!48#Da%fQ$3PN3XFfD$RlmMCGCE55p2AD,fd)B#5Je$(LU&cLmqJGk#2Y'Xd-)$ -bEH$Vcj93HMTB28PCfaM*$*5F3(JAXp+I0q-(B(H9SmCpeFUhl9XAl,QY9)%SIE* -5-!RN9*DUUXjS'IcjEce`bVf[6"jr')6TpE99%M$%VIiSH4[A0#N@[M524*I+GP" -l1C[V1-C-Y0%1[G+N%'IfqlA!%FlpNecUC()V2kX3GDB92@+i)iKcRN04rqbA`)$ -2mYFH+YD`BJNHFT1NUfBE%(H`0CHG`UCN`TeVe"6!BB*Bdp[aB&-iE'5#MLYXN!# -+"Tc[AB,MXR,%p[0hr'VpEb1H*RXirI&2R2F#T(0`b-22cBM$VYF!&rG9(Mj`)!d -NrLp)aiSmU5mJ%2M`F6)+5@+&f8Z'4iaF6cp&@)IQ!ZV#QbaPGZi`D`[GjcF4MU0 -lCfiMcX+h!BB#IF'd!TeN%XbqNjQ3!(+e(PmFQB-!FmCdp5BYVAaljI)Kd"jfE5Y -*(X[4VS@8f&M3DZ8hiDYN"Qq68D@j+F#)r`ZB0E$"jcL$(JMELIeVe,lm`8c+M9, -'c6%m2E#[LVU"T$JA@Xh%06$bEm%Ul090l"!8ABJRM!%B!9!CKQ@"P$T2QJd$H)4 -Q-p5m31h)lk&B#-QH-,"-G#K0h8-*if!i&k$&[BDepKAI9K&h@hd),3dr`DBr#5[ -iDQ(f,Q9b#j9jIm"ZX4IQ2"Z`62Qa5FZ[UId4!Ia@TC+l1VaGV#DmI-E%UeYH[Be -[1%PZ3q-NkmQh(`A8D,!JM'@(b)j%CNJm)`D2S)B,m%lNPNehZY`96pdY)3&B9h, -U!mi@ZENp0b!Xl[QBZb$,+PZ$JJA,Mdm!K'ajjGj`8BEG3b"$d9HAlYdMd*!!kX$ -e"Z,de93Vl#R4b(4RFG)E,dj1ebjr3$9lM#$-fS'5Tb6(V)dX8crTC2)6eGTcA$8 -B8P,b3mjHACDEH0N$Fd+I)X0@d5UcAFhD2*!!2[E*!Q*UK-9hJ4LGkQRrRS99Apk -%9E5#X$@*R3jprEHpLMBZ#f2B``B[XJABCM1H-f+HX&j*mPpX)G9%ijpUTIVdFck -2-389MN'XY)C4#XS4Y@X@ajD&60%Z2#j9E4((Y19+hp,XLd"ai-``bU3jqpUCp`I -%1XKRPMKE-N`YGh"r9,2cMNm018FF0%#lAErrD9'$,J!LVS61Se`3SeL'2,'-5YG -,K!"aiRil5*-Lffj"1C8k(6aa5*RXBcEe+59'HEJM9F'4RHCDqCS'A'XkR0SlZiK -&9r+qX'M6%Lce*A#*Q%EJ[D0b[K"ha`Q,0i0RdQ'+3mfAG"5S@SUE8RD8!@$@k&k -1BYV,I00r$Z1V8XE+SiU8#3%a9YRR'ArURITSMfp3*mLRlSKkq&N$5$2L*f-E'Y4 -)LdPZaD`L+HPm&+(#e1G*T,Ec"F8dI!pE*5V95RCbam`4Mr6**f4d&'AiGK'2Uc* -$1!Y[LRR'j8rC(JRLP`T-bqAXC09GXU3Ti[85I)9IeF4Rj'QkkZ*+pfBe)!"2qq( -IRiXhpISj"#M`&EF"`@Mp8,J[&1dkSG*DFjJ@$SI6d46Ya`d'H!V18J)UXNY(He" -2AG8ae#Hl88[)SlUdVL1[M2Y4NrkBC`ffLK0Rf)E4k$'MYPG2eml[&`5d03-[0Tr -$[86cHH[A[GThP4$ad(@2C-XeaB4YiL"3aAmDbA1SfB9k(i%Xf4EbLB(IrkDVPSU -(dG'mVP93$R!er03CHehDIb8cb`UP8r-D3IUS`dI9"K,(L$A'jkf3!2-3LK*YSTA -Jpq-IbN&!5d(PX%Qd5T&0UMKI#[kD(l@&FZlC%Z(jTc958,%YbH0drKQB%`qZjYP -YqJA!,YmJ$%2l4jFaMpq#Xap)B[-!iBVa5`,(#Q5q*)rHp)&4V0H'4iYfXQ)+iKN -(,X*Glm%p9HE4hYFUEF+*%fAq#6RklPZCE-811QFMe5G[P"r[+"f[mX+&3,B%U%[ -RMQr%F83!TC!%!3!!3J!3Z#2F!,R'`UB!!"i(!!#`3J!!!5m!%R'B!!kNH`!!13d -!N!32!&4V6'PLFQ&bD@9c,Xq!,RKYE!!"m)Y849K83eG*43%!rj!%!*!+J!#3#3' -D!*!$D3#3"!m!3X(8LR6XRV2cd)#%E942VNJ1jkhchrY)K0bPlVlVi(1%rZlb0-M -5JEZEqhHlaPFlmrDjdKl,LX4c&HT!J"dKS'YRe3$6d&B*kL1GLLpqbp%86Ti1D-V -`#L5MjV-&Z&Ue8DEB1M8Y&XGJ3X(9!lZbb6dXY"hc4NPYMidK3cN%q*9YD%+eJ%S -j6r#)fGiFdFpl4QbMaLV5R+*qdJPK(Kp6XL'*34T496pH',-l50cBXZUC!HF!*#5 -VfII`)c#64P[2k0D1a!df)"@`)k$55RR#,eP,`dc"A6r5#P"`3B(ZZLT`D@LNZq@ -bRJ6Af-NbajIF+%Q'SFq8l6L400Dra*53!+16UF*)U0blbc[@HT`Da"JZK`qM!e* -I`)CRF,e#J*Cd[6d8c$`j22@Ab`4`X`PCh+BAKL'k+D#+ULS6!fk$9E*,2L1QqE2 -Ip9IX883))G0kRKqA`9XIa,qhS*Y9dD-Kc+dZ6m4Hf,pTeS6Dr&i-GkLcm59K+-d -d$0ZDli$@e8@VI*iH,'fh5$kbC0B`"23c%93MDp1DSN[DVY+iYP`@CBUeUZEZb*! -!1NYZ1Y[r"m'K2eh)H8c*h8H+(KdD`22j9YjTipf02(e!FU6'k@IT*ML"%2(j&)9 -34bIYbf2hD61eKQjS@R,Q`Y[NZhrEM8F3K4eQ,BkX(Lb#`l%IZaZ2DK8Am8XrK54 -bB5J-$pL[9!EH3+CcjfmVi'(fR"&k)2!AI+'h0,F,4MN$XlG`aTMJ8$cm`Gl3L+) -bh@2L#La9K6&iq$Pkif%cT2P0!A%G&6'ZiDDrK(-d54Vf8+!C'E-e8!6Vc@UNZZb -pB0XX"A@eI86qdL%p!iG+[&N@3`+8@XdpR[lM[4A0k#30UVRB$NG$$9Ii)e1QJ@L -kqD2b'feB8"q,Y,[%UTdCI@,9N@b66M`45I0M,VJ89*a+iM($""P"+fSiH8CE@4b -Bbja"&ab2YXkhm8R`T`9U2Hfm4e%(KHY"'%-5XhMQVeYmKIIVkC+A`LVX&ha) -%Q#"MDU@R*C*fH%LE$`YFMFA(B(`(afre-8DY@8*)9!P(rXq9%@!NP&$!a'AjbDj -F'"`Uck@b[MMFTABEK#pGDl#*@AGUD@*Ga0p8#l$#i%GS4q+8DJii8b35mlDq-5U -&58#'Z(q$jRa,0S2SVTTpRm+iq3R9Y&"iA$+!eL&BF*hU35M2m4f6[6Dh3iBXDFJ -85!TJb$6&V34%j5,`@SbH!RQ1(eEVP`2f[aXSK$Z8bBG#m0J"6[Y1k&FT(j8UJfQ -,1$2TImqhGKP3r4jL-3Ummi$a`pVlRKqZKaemI%G"+#'f5mC#Jm*#&BX09LP#b%9 -,0SNX4DV)JXeq84QZ!q-4C%()&AZIIaSZU!V,6bc&IbI6cdCIS@6lN!#+HUaiaa# -)F-ESU@"!"@h8S3mUS*!!'FR8$qiN$3TBe!LZ+`&1'!qhle`fi-P1CDmKrNL5Rkf -+N!"PJ)G[b0#9ZUimhSDIXMMl5)#8*-I18'a-rRN,Vr-XiSG&Le-NIlh"rrAkd(` -+Z'"G8N!p+@9P*,+H",0d%Lcd8IbVDJE-lV@C`VYM1'FQ&p#*QUeiCP6!ikh0UP+ -1P`h)YQA!40Ef#8`H`Pf1ImfJF6@cRGf4X,j!bq)(ki"bU*VJE[40FjlVYSi8I0* -TX5CT!E3cH@BXdqajSDbVp$!2E`3f5a(*RmQ"c0Vm+(j6fPlBVjDM4,UKDj`a#hX -%M'2Q,Vdh'V(f%faA3V`pAPB%*qU$Rr1CQ%-,"0XaLaBYCM92k1$h(Q9Tpl9ZQr! -j8@"L$elACeV++VFmcDUeMDmr-3H+(1&h8L,L*pIbCRbBT++6jadHrQ4Ib0FrE3e -blT*[mkM,06GEXET[$f$$iR!9+ZN"D$RRZFV$rScX@6BTNYj8dFLSY95)4Y9DYYC -Fib$hfZ!Pb42!QPIF8RR'YZp0l$aNK(l*!iq2fNe4-!V4UB,cr[(8BHGSMlZ@1)c -RH8i+6f*RqX*qJY+TQXVZV!"f"c+hCkG!IG@EdZPeD%eY5!cHbQ+BTiNd4"9a%RS -+K65V&(cT9Vr4e$#RK#d4Gc6DcVMRKJEX$e$pkMUC&r`TmK#6Z*cQdRK%EF3DEQ+ -+"MDQVXKT-G,16X`2fNQPYh,#[A5G"Z`L"Z(FrU3"cM5kEKS&11jD*r$lHM&HGrU -mLd@$$3(J[h13!%U,CpmY"9XK0C5*pG[S#U#G1J*LQQC!*Z`Q0%UH%'dj"Em5C[8 -!b,*k3XBP25kd(T2XaYd``cEClXHYT[Y9!p14bqibY4Z`"X)8qJeQN!!`)RX`pLD -2*YTcNE,jM8KVc@3%1lYCai`)&pLZR[A`ai1@(1ma*T-A3#qidem&KC*"UeqBVKe -MD4('e,aF5(3'A15SFBRS%94q)'#)h@0rNPT1h$HJB,644iIUR@-8J5Y[5IiES!# -I&2RE24Q)@Rd#q-RV(L9H$"J3B4E@9pSMNHRQfQc$j4+2(Dm"*UhMFp2&`3*pme! -a5(3Q[U3B-E@L(HVDcbN4SN5e[+X+AlNHjT!!"XeJ%PR!jMFP[&r,"PDHciiUTZ1 -56TJfD[8Fb!(ii!$hfd'NbIL"a%"FSmLGmIKK$,C$30H,$Z3)T9km"*(%`GN*3@6 -VAD[RHcLbS-a*cb'1rD04)piTG9FRICKbN5c0`PS0&)4rc)fq6kIPm'-&ISJ+[IN -(@#UYDQiJDNhe&b@1VA!SQ)-UcXq%+$J4ZIB!iGRTBP04A(X*bXqU5AVpCD893IH -JpHEb!flr@TcM%pqJQHlaemRJhjk[4-jaqRNZjTV0,8I&*Jd"U$J1i@3,!RYACZ6 -&(h0h3lN9$GK5ZZqdY(c0F,1!+A%!Dj2hk,P-Z4kN%VV5)ELf1[-N8MG@6p9cYm* -XN!!0HY`3kUI"'pk9'TUX`AXYX!(X53(j0qph6NP@6hea+GF&P3L1*q34@6`1UcK -DRr3!J@T&!4#&EHBLj,NL#'0ClXNJd,IT"VkDaYl1fkPfb,%,f6!G('E9e)i4ddd -ehV9&chmV0pUDE,%*i6"D6-CH%2!P&dbBQjCl1Bmcaa8TR1*cT!fqrJNPH1+lk(# -E,NaTlJcdlJhj33ATYarYiCLFZi1d,,A8!a0Ab9N*MQeIFI"frSR'Vki1Dj,[NXl -@3THQrTmAQIa0*fe$K+JIDZ9X*d,qKi-ECj%4D$'*XXeXd($R,S4P6NNaMG[2(8N -r9),AFki80kMCHIBr6VrhK1NPH`@cdiN#[,p"b&,c-34XkI`!EY1Kl4XA+a*$X"! -bkkNj%&9q#iDNSe+#cB013qk25$VZddL[KB5MZDGj!Y23plP09UPV9PlaFDa[&d- -#TU#KEFi4+jVScj18'$HDEJT"lDm3,`%PfdlXqe3krK06fjkGiNd#$(2%k&EIh2E -El1ppZJbSB3q`YfYVbpZ1df%T+Xr#qiAfp'3fQdm`UL&0mlaB!hN-DGIcC9kU@Mp -C&0Jp*!8d!+4PZN,45S9+9KhSbqF8r%8+[-T3H@1@9MhHX#flX$Th4EHSciL-Pj+ -JaQH$XdhIfb81$M6A4*95L+5b&V3%qK!"6GUC(DlMqrKAAEA([RaRC[QlVrPDABl -jh0MAKV6[XP#FKGBjj`PX(*i#$')&j1T2#L82P44EP,XdKE@F!Gk80L9cCYG0,I2 -X@M1[TE%j4QYd&TcZlJ'0A%F4I$`0`+!"q,50`-I)j#,9PB`$A8G8jcaHI@@+FKl -V-2-`!ZQ1H0[2hSkc)#d,3k-JZVBSPedEJ&ZGdYY&F'KbbbX@C,Q)FF&UHaPqAce -$apP6QGlFBHY,-AXpe%c@#X63!&K4&#G)6h849rYlUUVGJBA-cVkb,lEQdq#NHb( -`G[,&%V2MT9`T9c[JE,D$r*Y)AG(NT*GL5k61TIQR%YMY,4pL85EiBaNYDd9(#[V -d2ffMd,HZPRF,MNF),)iZp%8Qr!2!08h99d&PB(Vp!P[ZA!"HkY!#Se6+JcAiUhp -@bS-&JS1Q+h4iEXR*3YQ1U)CV&U$2#Z@V&da"[R-H3r9"ia'0Bj%m,kjBX3cF9'i -K%6@0!$'6P-ZP`$BR"mT9TEU6-ir!HZblmTICLT8ZJS4d4&#q`S13!$,J&jfbEBf -4Z"l#FclcTlZ@[KdXE*(L[Q-*0VD%1$Y0I4AJ[AP3T3A5B!i,E*hlSE8,@Q,#KE# -qV%0,QFck*cR'fkeYBm8J&elJ1,CV*`*Ie"T8j6TffZ%2dQ&BVXLh,*X&TRXh$VH -QEK$ANh5!G(Bp*$,-c065!#3eRa1h9l#3!$T9cZT!`a#9!kmFclI0Vh2EGMJCeP* -&FT+"9fYGS)r3hTeBKRSIaSY5N@L2)rqrbJMTX4ZCYTmY834H9HB@[*Ne6r@c4MV -%frBY`jC4K0K1qTqb5#pYZmEZIe3@8H+DJD%GECR,%S(V1kR4TA$+p@#ZHTBHND! -HE1CfSSl$PVKGrjkX5QiI)R(1@T,FZSGm60iIF5@Q+6D&cJcq*ZbI29CP4QcSh3& -+bL0D(Ce%q&B)SN#LY,CdZ8'53[GmVc($f`H62V+b!SP'EN'eX%!5q'ek&0)+e+- -DlYlDTC@$@X(%$FL'SdQBX*FCc$Bb@3p)jS6A(QFhr*lM&!Vm#[`a-l-LYq,+8#Q -4+V)UReab$@P$MI1bLARYq%-62C%M[D8cDL+$bFI#qE8T,icriAURi%h`h'Z)rNM -G)QN81G!hSe%Piq,QFXRml++(!LG,&fS5*`ld"BVIjJLTi`3e45`fBI#rKXVM(5A -aK)FCSi&*GVh4JHR%1&E3Q$XiT19'T%PciDrbUI6DJJC4cd-5kpUN@IqcL8'#4VP -FNFVM&1Xr(r`Tf(XbT!m3mlQCj)''S"&bTFdZ%%)FU1%54J!6ZS3ICYK*$(C*IYc -jp6)@AYI!T5*XD9JN9!hG@-PI!h-Fm-rjcN81fUlU@"hB*M++XDGlIjDP6DIZF4S -RTS!X2TM8ZFK`30!kLUT!@Bk%jmjkk5k[m3h",`aYYi-$Ff[FZNKGKPG+[Hb#FVq -kmKq4r5[ATA8IN8RNk"Krd-YT6lPL(p36Smlj&Q!%EPVc'r!V5"IC"+JPDVf%p4L -Z,h3JfTd-S0L`YQJmK'ULq-IlUSMq-Ukl8T@j!$[5jQiQI92RE8Qp5kU0)ebY5DE -c"Qr*J@6bZBUeeeTd(Jj3DreJ$ENR'*k!Y"C(q)C(HNfGKY0QY4T4j4!-HVINMQZ -3!"AEC3kfcEdQ!MNKIhLHPa-Xbc8BAk$FKmP,(6A19lfQ,445FkEA#l@RD%d!HVK -mm@FM#r8cK2aZPT!!h0N%[4@)@*NKNm8L-f#pB@$66a1A(HQ64kI2A4Yi0I#J$S[ -aa+C1TE9Fl9'1JQbCECb&-$2%Di+"EfPCd3`8I96J44l4kHHp-J9TP4!kr`d[S") -bJ+U1L8fETli*e#mHl8%hBB2S+,Uf%3q-Yc@dhIhC"lTJ@@SXlLNR-JRJbSTj0G0 -L8LA%pc3(a!-eD3X8eLbKhJQ9"mFE6Q0MJV30a4dBI!LJlPJh+2044,XlLLX0*N( -pSFm(djPR"TBb,I3jNG3CrM"Sar!E1KSDHeZ'TGe5UlK8!A25-@(L*lQ,ZqXC00Z -8+h,0ql&Q(r[Z3CI1V'30J'lIQX#r44(SlA#X-&IhU'$M`$V'13kN["B,APXAPfV -a4%)21R+mj4m@D-kMbJ-,Z%j*Z$&CLDRrXe003YNZpq%%rd@&+4+h4rd`T!!m'hQ -q3Z+,$P$6lH`I3h'9iP3'jN)LP"Qa,4PK)ELp5bY#-1k(VBfefY29XUVR@h-L[[2 -!Al`F6e(bKR`[GS#)"`EF-0G6N!#H$kb$bUa&-(M9DTqk*6-FKS!(Pfc`c+,CSKP -i8$RrVldDh9UML)l'YXFQ1%P)FN!p0@B[Lk-k4@@Z1#r0l)$eI-ET!PD3!0VUrfC -%R(LV)N$IQjE(jPi6E,C8A,,V+DiLYVPbTqN6mM#RJ6+q[*5k&Y0T2)E@GHeHF'B -T'V(%IB@MY"P4q%'CYC-B3b"0(i6I@j)$bl2I0cV`P%TS'8f**+HkILT0ae!AJ[Y -`AmRcrjdQLP,+4rcF$mSmSi"4D"bR[bpRC0)b$HDK#LRTL0c&dL6bJY#lp)fT8IC -0Cr&`m3Z(0)EaVC@8pM)@0!(@1D6A,kV!XP'P`NQ4r6,E,[rEGP*rFeP-kL&kVDe -XcZZTZ,VI2(Ueqe2'D-eMH&&a-II,[9G$V(AICZE!AA[Zb0l%U''B#UdPGU,q`(I -"L$6VJ'YYH@T)`65eGQT"lR-[,Z*dYKaFIjN2HqF8)FYLDYlR*#q)!8irTIR[jX) -"N!$YdcRVJ*cYh(G8MiI,9c8(F(ZALhIXeT,"@(DN"[G@,brcVP3XKY-Y'r4l4+, -@4dRUCZK,XN3KIa@f4XeX0(*Y(%hCVccUbX'JT,%GeZKUDX!f1'j`k[3dP,&[D4[ -R0kdDq!ApK2c9XTJ,a8RKck'AVq'[Kd2b(Fec`2'%E`FM0jhG"U`+eiQam40Q*'* -ca-CDmHTQNQT5jaJ4"PK2J36T21k2Z#q3!!kU)lNU!TlTM!9S9%L@!JQ3!,PMSdF -X@*2,15Gb+64S0aF3!c3raQr[$p9Ii"p340q"l0MEdGdJD5B-'U9-hfQd`6!8p+h -+#lDFIZC6fkF1Fm169YI91aK(-"@dT6MmC"*IqUll`&fQcceFaXaRLUZV+HF,Jl0 -rIlQNZY(E6`j1`(cE`Rq!60m*APYi(JAVjMbq*HR+rq4qk3MMIiTLmR#0XGckC86 -6AE*b*[h0)dfKiUQ%L"ap`EH3!#lc-p1p%-HhMU*Aa@f%a0QT[&"Z"--IXj!!-$j -Y4QpZX9eZ9aV+6B6NJA-p#NTkN!#GjmJlN!"60IqL*X9[q&Xb*8'c(2J9S0l-C3& -6d$hjq"kNdfM6THFcTP8[YjD[IPpQ*Y(EHcG&hcimiAQ[Dml!#T-YklUcpFK4Gbc -NMaKF1lEPG"mBUi1VJIYJS0BSAkT*X`RL2(2,,QX!N!!9NLUpN!!*,aj!LpS,#4C -V%9EBhS8rqP`YcJeFL5GNl*E#Ge#hH`L0'i-K&L@8'8kXGXM6VPa-MG3FdB9f`rX -1p6'J[)PMMB81#hN+!P3*9C)A6fTIbjJ,XLkK3rN55b5UpdIe2+04Qa$jI`1I`dN -$fFDeT0V)Li(8(%Fi9X5QiC,YCN#lK+3A0AqZV-3S)Cm(Kp61!Nk(c0+5"2M"'e( -S8[[R[X`E#MqSlpB9MBqJmU9r66)m'#eifBIQ59$$J[qFdUQMeF9ClXH3!),)(jU -A`ZKS!'(KY!SV%8rrbT*pjj2qMN+4*C0d(QAR,LHKi5,EF2KrL5ab#3UKdp[e&c9 -$UbrkRZGVM+,GADPqi!I@8R**REfk#8$%EZSiHIja(QG,[cP*BIA60G$`i('PaCe -[ICKZL*L#cXPqh'CH01ahc3Npl&"@hL,#c$Rpb"hc-ID688R$KGf'C+50U6Gd3+k --[eRDXmFV%2[(mpJ)JFiq98hRA)0LTrZ)%NXIHf[*$mVJ6HM%H#r1,J8399$a+"F -T3LQUAZ5Q,RmCYQh29Z6l,2P$`#dpDQllF',UP[[F)LJ$E0#*D&@0UZ`)D8-f$LH -%@e$,61kSCdeE)TH6Mr(G4Uf*K2Ch%-5c%@+NC!RASEYqYd&9+S@cP(k+6'64(L' -iYjZCrlIXePNBKj!!!jA+2QJiJQUKP#rHk@JPlbFj,HU"d'C2mMIiQ-F&&B+I4M6 -j5CXZ&)J)XV%fPrKSN!#YlT,%Y5&`+![dTUj6C)b%A%hBUCHF0I9%J)LR*a8Serm -`5kdDPT!!529B2h2PH,-hZ%5b&Y$)1pcSIp4(4a+-`l0`)$aDefECQk4+@"TDQDr -phhJ85(UU)mIlqDqG2pfR(Y,AC$(Y0Rb"TmDUjaVI1+kSF43"4c+#h2ZdN!$fh!% -"hrX4@DiBpIL9E98MjmHQB%69"d'%hpE)2*4#eXk9f0iQ1e(lqbcpC@l5(fMR'ak -0+PaBC*palBSQkLp!-+Ym$0a0DRTJM#0GT-Y,RE2(f($$[TDR0bAS'"Nm1eY`0&V -Ca)h1C0IhAK$ITim##i6RF`*9CK@%#%P6&3d(I[QZ88!Dj92%P5d0LL!1V&!&!BT -QeZcI*@1*F1GP$I62Eh(QQ#XF+3CD,[1`AQi@3ESA52BF6)AiT$G%hMl*[DrqMc* -b[+k$k"U,b%'[@0rS"Q@F'39q!l8HqF&ZdT&Xf[q6M)TT(XrVMLZal6e6f#-eD'N -jcJZbRl%i(XieMV4jA[B[6L4AQ8ikEQEhPlI'3Nb05U"h*+Fq")MH9A-kKI!TkUJ -DLkcb(Ve"X!VVFc29m,kJ(Fq6eJ#FSTiGjLP"Y)mIf,!LmQRZD%Gd2*khULeZf@5 -#qQ1*'NC80!&fp%FBSlm#KTlTVe!hFh'EY%J+%6NE6'rFrS5q-d(H5XQLX(kq"9T -XliR4V$QrT,c,+Q+S"h2,k1ZjHZYG"@QeqTQT[L#(iQ5H#MEJpZL+,G0K`V1Pjai -Emh[ZYHJ#dbQh-mjIV1i*dRZ[*q,#'Jp$5&GimbaKlX`Rm&HkYKIFD0@CHiM(3H! -8k,SZ)GUrR,06Yj3*prJdqUpINAbE$j03,MM'-&8!ID#FkY6YV8I2lb9V`H''(hi -UTKPC`e60IjdBZVDXdETQfR1ik3,EibSK'b98d11ZS"1a&TlkNdEe@cI0NM,e[a3 -lAfFNhcqq8(hA*6)`E1fmqe,d,irFS(QjhPl'U#B(p)'"G#je8cXQGSAVar[6GJ$ -fRB9CJ&eGeGcK(p0J*H6,TdS'6HMp1#9)*[EPN94[0P4R!e-d3pfN&'p[qVDA"JM -c1%@,1j!!"0CReMYkFNlN1(@,eZ[0-)pFl9N)N!")aE6XC,UfDr)VVk%5pR8-J19 -NUE"d294HfaqYH'[Rc$11I102NN@'NV&rbpZDlQecYe-9G9DEMEX$CD#XRYELfDb -HEdG%VZ5,U+IhbXD8R8YER&J+CeMKM-c#Ah-T!L!j"QF9XYJjSPXL6i@j51ABrYU -qRU(Qk+mSHE)p,q[MfEpepqZXr`lHjPA[Ead1HFe$r14e6cSQRMl*HSKhKZcj@,1 -XeXL"f`FG+)!Z68jmdBeEBBMRaaQVc1%[(e[FjK0`[l*rm6)eL2aE*#MYF(!cUK6 -Ri8b`P0C#e2$h`r69C5Gf`fSdLC36HaVX!eF$1Z0!P,Ci"NdXPf`MqNc#68C-$0[ -B+93T,jrTmd#B#@#QIb(jQmb-8"q))PpqkZqmB1M8i"p[TM+cm'0CASSd&2$ebUj -3f,9HaS*@RI26E8H&)3GE2FPH9B4'Gj!!RmLHe(VDP0AeBpU#QH&*jaBKf!m0Y8h -8jFK""0Y8M2d[YmKH2HZX*`JVJr,VTYP+A@VJK'LMU[8["-aQ#UFp`JTc9h)e$Nb -`K+H'h0A53F*YR[i6UBa[*QaSb"l[m#J%i#[aC8mA@bKIQ$NBI1TBI3"pJ2mpdmT -S!FREh8@9&NFP9K3,1k4`qK2A-"4L'Q#$[Z)jXr-e'U-X$mp')3VA$D)-#Y$dMY$ -bKbA*p9NdQm+e2Z*4K22,"EB!qfeImh+rd8!LZkdKcpqIc0DlKHb8iETE,SCb-df -Mp"8bC@@QR$br'c0L+6*[VLBErkk[j"ler#m8q@DmPZ[3i*,2k!Lhj`qdHC&T(UU -DhiJGBdbHXEqQ4Fm65[2Z-[$B!G(Qak%@c[MCa!qdLJFmQ",VB1M)FE2PBie!lQ# -'-AI+J#4j64bpNl988Cp25TJZa$A"Nm1,8!DJDdm-JaKirM9X[B3@GXYMRR(p4YG -a[Be'hlp5B5&V`Gc+m5+4C'*)S+Zbe2P5%GS8%1TJB32Y*64M`F#!(6XdHZk58CB -hmJ&2Nr`GD60NZU*qRqB+@HQ5#feYP1K%,GfiTj'5EA*35UY-kPX!pXF6mapXp&j -*eG8`peY26!l8Zi[c+8mk(Q3-ip$3A5j+"NJGA@DaLmDH*%J4Tf($R+P+mI",&de -dFR-1$KlZ*eU@8lH'JPCRdk6DRZ@0L+FJ+95P4e`Ar@-X"F%A[JS(V+)K5[Jm$GA -8R)iABA-'eKadHSZ3!,aT'8!SCR(D!15#'iUc[$6rX*VXZIhANI4C3J6[fP8*r&' -I,Ube+mP,X(b&CJ0kCZ('cbX@N!#6(fM-4$&5BNe0T(ljdIpdBR(TQlH29jri*ha -#%N!daV4U9U5IYEQ6`-`ri,I12@3q`mK0%*MT0@I%ICD@hcX3-B)pIp#rIplri0D -GEdKBdrZepXRDjUV@EeQ-,Nba@9,FDEL[1FAdBiGXp6q$`UF3Me1&FEbF+Mb@Yf" -i&a,m[$*m!Sk43e55frpJ9h!RE-hb44Fp$ZdR*`KRqB4LNIC4B$$lIpTpZ&0i5Ck -iraU,K5J,GjD[U`V8!*jdY%U,mCi'M6XBRJr5h*!!!Y*8EajiHjCM&HaAKm31Cp) -HQU3`!QNUJ3'5pU!$[dYk*2[ArM8TkEMr4cJF9PBp3I1FZ'0Re8k@@D6-85lF"DT -lph2mfFmM89hbZ+3mj([KA39J*$Yf,rR!EX`jG+,-`pG4M(9bM5[40R8Q(Vf'5#Q -Ri$24hZc4U@'SdC1pVSHN1i$@1DXj2,BcDSkNY"`ZP4DYJmSaG#*1%@BDAjX`MV' -mNm&PZC!!%%D-Ki4Ba!i-rlh(HZ4d2[Tp+rIAAjMr@ifXBC!!8F0qN!"&Q-IdAiU -*dr@(pmiAEK2H[ehY%'Z,XS0pF((,(h5V+8SUJ!8Ar"5N!GT"h2J&#eQBEK-e%9f -9XK4eYTPM@191p6*a"6c`&mKDKheV)pC@DHpZ(j!!&b0kiqC"iVM,-Jic3$L"jqM -HhR,XB3Dm2KF8h-V&$XhiP)lJQEeXHPC!0J00ei(,GGE5@MU!0mmT"NQ--V9B1RF -MfiQUH)CBlNNUZ`8#PjmGCFTFFJDUS`kd,MB3[I*L4*&,H0Dai6!4b)R`1PM0`pj -l[Sc"pZ--T+!TLrQ9rXdlrpKX8e6acEZh(k[DGe*!!"FZdbCdMQ2V(Ipqr)bL+FF -3Z[FX9L5)#1Nq4!rPjaS2kDYiTriq*ia*eh+QIjQL[%C%-M@lj#E*81#TCa#BLHa -V401DpkbX6S+@Fm($Q'Mj[r5cG`[bF8G)6*de41R1FaKV!HQ+2V&B@mS#BF'-,I% -'ReB,FAJ,iKcdU@U%&c5!JEQJe2-6a2cMhr)IdDM%R9-j29mTMPTFce#H8"53!)p -@Z+lX$cFfd,i'AjBe45a6m&BXS'G!IL@4)RjSGlT-#a)f,l1mc)8N4k%9EJ)8b*% -U4Y#GfT2[m6+-c&e13`erElPf[Dk[aA[)#6F"!FQUQlFp2SUrYHB+"[`9VIUUTb' -L%dBIdP(S*be`$0`DVqK958,)3Q6M,9"6$FS#S%p&221%5c4(MQkjf[h)#H,lCUC -PcYVbhkl2XM*dH0GqYQ*pZ6%Z0r0GNcZY'jmE4YAPVKYc94j)NQ-e'3,ikRPT*m` -5m3(PcUVfN3mBdFC!lEpRFj9S3QD!U+K+(T(ZE'L9dHE"cGK8Zm@r)2Il%`5MEJD -%1@RKLTaNhL'i"pe3dqI+BQN@FHh5NCIKpr84Tjqr3Hl%HiJPRdpG*!9j#c(9Zcj -`ZmI53LVd)&1e+)[3GmU$SkCMbm`cJHmrdiEc2KN!AJK@NF`2",Fq5AYF8#U-Kr9 -aU6qX[h-HQJkZN4G0`D[Hc,i1&2Dcr8%eHA-+c+m$)$Ml8A9XSmN``VaV23N0,1% -+aCQ5A(DXa@C)HC,b'Dfr[EH#A[lNKdS2jdAeBjmG"ri+Ch*Ud9B9+AP-c*12[r5 -b42ILaUrBSjG8Y@dqEj9rG05pJ$qY`2@K6F2,Zh2H0-Mp*M55'ljFN@N@#['%e'E -hDfk5I-)G%XTF99aG%VkfN!$(@5Q9qBf-2cL#cEP,3Y!Ll6MVTh84V)24bMRS54M -QZKKmbBDkD"51262MV+@,$(0FTD-1D9!2,U(2RX+9-Mh3Kr*HEYj9#F[4@jRZR$c -Tr@rD"b)+Em8P@'DcAIG,2D&'aVFf-'lKl!JcELhi`j,V4Ik8p0F)"@E4IjN03qT -hVBUC(P"NF,R#F4DN5'rS6I2S1r30RIC9*kpleN+J&iCSj&24AL8A-4S'VGmr*V# -`P6rM)4kd,(#*(+$''QP"qhE!fMQ-e(clF%$2&#)rJfESm3Lk#ZZ2RP@4Cr*0E)+ -Jea*e4q`*Q85NMSacR2d-LIF9h@E+laHm!r`VlehUT2#,4LmU8SV'+fda@d1)`T` -Y6MPiq8X&&&&Sje9V9[mhT&UZ3kih*BXqN!!BKhX5UTh%!CdV(NQS`0TbH1Z,cmS -+H3,J&GEeSG(&,Jp@U4K#TYV-m9G-c6B5J+368Uie5!+3!,@&p!DV$8RaQmq[b)c -hh3G442b3!$f9R(baG@XR-"FGAiEVbKLklU&#TqX'j!Y3Vk5CSGE0cI("GJ([qpC -&qG-pYiQ&fM'9EM`NAEJ$H-V`+'KFYmQPKdAaQ2p0)V)01"A'DUZQP"'*5kda$+& -Gi5j"fFXq[2PrMAICAR9#GR)#[JapDMRUbmdB+h@KSkNDJFhP$DTTTp[BD4%`@R+ -@DbjAH@#PF6RU3fhIa9$(jl%e%1'C&,Ek12@cbMN2Yd[c%h49J))"rRVdQR'hEfC -`If*`DV*`lVe()kN8j$Q9@R10S4NaHYY-X`dRZ)%Rc-pefd"rK+l!Na@4KNFFqaL -*'e*6+ZY*AP&FKR[4LS%"T'i0RAbTEh`NP9b''Dd@9Y*r(jiN@4e4q&4,RY(iq)k -1ELAA!b%X0NYf+iYlQ,ZHFfiFEZRYdL8pD--p8K'e5eAjR0YLfQBpTU8(AH*pMc2 -4ET4qmd&jNXN0'Zmip8EHPBhd['"4B1ArSi+FG03i-MM"$RC`9k+rklicBF`JpM' -EJQI#(rTa$BHV)4aMX')SbiPHXM22D)NJLpDb2Qe*d'dlR0cEINRGqUS@Uhe1hFj -)c9cYP'R5+)lAe"c#+h,1jkNP$2+%cZ`$Ad+jUM!Kmrf8TU)""e2@(+SADI,b#S# -FC`!E`9RXJirj,4bEp"mUZD965qlLr!'fbLYFGMX%EZfTCEA$XH(`[RCNlraaN6B -*Te%*X%A[F25a[SM5AeN&T0NqkFNTLq%P1"8fpKHUT'(Tk&$$P-M@CT4r6c%)aD8 -128SJ8KSU*%3FG9PKlCl3LUhlk"`GQTBL@'*p,MrDa,bZE31Uh4#`,3$+2k6dpXV -[0U6$EHe`1M%fK*ea'+T-MSbB%llTBd44`bd-2pj'1*+`'a[eGP!HH%M"K6UG*Zk -1$*dM1LZ&S#-aJC%G*9YDDHCF!JT4!S&haric+++EIjLp+1dHpR+C!#L(AeAjU*' -4DH)(f#9!',$I%dLPK%k4r!kY,BqqMQ9$(a)GF@!`c,adc,BRhe)C&R3iaT!!c5U -bL%G*j"[N0r8TH"ak3e8Yk[5jG+[DqfC%Y#FPH[k2!QF@JkapFmKNTfD%%hb%Z1f -B-hH`mI)"9pF880a)8!*A%%'dc8[QI['%4$`3Ua9ed%Lp6B(69-LM%PUGq#-#B24 -iFE8%#6hf+eeL3)6A`9$EhV'9L8iZ8l)!$-9[QjV,Hj-1Spl'Y#)J5fP)SCTq'UZ -kZSVpbe`dZ"3Q*k!22Y*2(B09SkYfLpU*KlGNXJqc6qGaM#$`q&CaLS[)$C4hK6A -2Fhcq[83XLpDXT0KljTY(dJDr&Pec#Z,iPk[)%X*lb,#L"HqlQY-+qdaLbLcD0Yr -R#DDbi0jSG'h+DeN[bfCf-@6jH64G)6Z%0-Xa"["VVp`pi,K&2bF16d@d3VSY[Aa -'"-,9jdY(Ij5&hJ(Q8b*#p!CSaXar&ETlk8aHU`@#@A[Q5#@H&(rcTL4%"ceG*05 -F6m5Ke'F8RKEp%KGI4lbPl8qAK"hh'jJ'T6ZIrVJ'0!)A)5EQf2#L`)#,$Cfh!2D -R5*kaXR@F%KJYTZP8!D&8D&rNVq'VV6b&`rJEm2h)JIVIQ2ZP02aP68"S1qaGYSp -JB-UZPZ5akGpd!0%"0aaMbkq!HqPD"JG)akGXb6k#5Y-8TaP-P"+%c1FRq!CVb+# -$&0QHDjrj"#'m!3rKCZISG1$#5qpUT8VDDkPL#,Y#j`&Xf&"E+P2I*QUR%Nd9B!m -ZbdCQUJAUFS`1*EN)[[Ve1-KF1ILV%BAVG%`R"U8B6-iZF'keShpP[RAA@(XDrp, -a(PdXTE#iJfRJMIKqf5$F@$)ccC5r'UAKU-5'j#De6!YY%YI2a!kldJGl#VUKRqk -Aar'S8,LC#6e9Ea,Xi$UmC-C4jP1e)iG9chBZIj*8F,m*MMYSZ@h(&N3r%1Flpjj -pFC!!kK"TXSKL%2fZU+"Yq6FAmkCr-%Mp`ffiA,%YUHjPKYNVIDSH)#FbeF%+f&e -C8&*RKm%I@CkRP8FH2+TPkaHA6U9V3S02jU0iRE-T20TC3Yc4fD"c"E)"`'!PAql -dh2aFRPBB$fImX%iVfB4KiYP(*Ck[aDGQSG$-$RDbdkbXL!"@#UMCaKS[JX-XUaL -(40R(Jj0i&I,[JJ'k6FTYa%a5#5C[[,c"Hpe39`%q4"4%$)hT2d(cQ"d6)bU[QCB -K`0G$Ik-9&D,e(m$bJbliD@5fFU8pN!$IcfUMDRi)68R2`f0q3a5@F6r`LD`(&cK -!U4SI!G5NpTR#0!YhmSa&m,,6[B5+@p[qBmeM2LZD*eZB&q)r#5qZ@`Q8REP`N`U -!1LGM)U!9FZURIk2*$0q[aTTTFmF-GraqA9!!CUI6iI&S"*Td&,N)2Hb-"AqSY5A -Kh@Kj+kE'RGTeGAX@JL0&J2Z!aLGc83(q01Var`3I,h!D$@+)@r44!l99B4SHk,T -'C!5Z%[I"ccG,9eq$`A)%[M6AfEBq0[Cd'edQX`c,YZcGG&jK`UH,-m&ph5dhE,G -%USe'&$a5(6f3!!(CpZ8f2!VqZ,'kG-EK#-k)fj%ZJNL,!'1jp&j,qQ,CXPL#5$4 -4eTPja%@kbC!!"i`4IP#+"CafA8KkK423MV8EBkLkZ'djaXepbBJDprF43ccH'2, -m!4RLX*Zj0jcFIXMGJSSm(@b2[FVQ9r,*GB0`&+'dPeEENp%!p!Urbr%AYFGXT'C -mmDh"6f-mEh9q$a-Cekq1hk[R5Se6Y5'J&,GDL))KC!SIa)-Z'Tj+&l*bB-C2PG' -#+*3MjA4Jc2T4qRdf!b2*95aQ[b&(l54+$K,Sl5!P$i9#A0G1-##@-!'@"a`%ejF -c`Ar843!X9r(IeZGBXBkGP"bcZ3j96Z+Q($&DJ6A-AL[G#BAh'ETl#*UYM[H"8+@ -02QNPfjFiCYBp&5&hS[AU$$XAIm'p9mjSe#r!C25*JP)1EZm#ljM4-1rfj64GBhc -4)GVe1"GhZ'IBaMcqVE0-)-l-k8Z#N3l-`$'E"GG1fc#iZPmD1V06!hXQXRr[@[l -e(Y35-jNm6)BI`H1HKdHXM3P-PLjRiFT8X(h&(8q!i4M6)MEC5h[$#2!+81Q!,kd -2PQCjAURF#[m(aXjT8rB`L8X6"a59q%9"#R-MB[ia6IcEcXSUi2M6*80b-I,BEbI -*V&*r6)!0q3TUEJ2G&4T+NT2N9!$TVhDT!!!k!3Qa@qT9T8c**&r'HY4jY0qa3Y8 --E'c)FBEiJG@Nd!&R'IpK0j%Q0'L,@XZ-IhKVfpX`FYU&)IIA03`CVhHkXp$eFj@ --M1"E!Va!mJBVm$S!M[RLJkGEmdkX3T@2h$AM@Ub)P5Y"$DhHhA*h(6,V!1hmR'' -a4(0lJj3F`BMSN!"h"clIkIbep5kHd`R&QjrX-,d(,ma@$+rYZ`a6AcN9pAdAf6* -P$$e4-%B+LcjjkbJHQr)J(,$m`$bpcKKGR#Pi)lkM0[4V8$*A9lf0ffX8-m9T)U- -jcAM43*8&q`l(`#lQ$NUST0qJbFUcATKEb6Aj$-c0,'1D3,EDE)Y2!940XX+eTeA -[p@XT%(Vh53kTcAU%LL"*$IpDC0VC(jC!9FmmLQER+'CK)RQN3DSA%appa0Y$eiC -LGkjRSP4q[ZL"Kq4jc!+fB#GK@qRqTEZN2be+`F&(lfNDSRb#1GYMbE#m!+BV4GP -SP'5qf#MM1"`dL*f#P6"K%f0kKI+%LaCmlc!hfq!P46Y$fkQaS(EADi6X81#a"JT -(8kK0a,Gp`2S-E0k"GBPRRdbadZS,@bQR`Qh*`)fX*U)p3"eGQX2"2$'0i8,SU*f -NR0HA`LHC&FdRi-0EKF#&$!6PceINpVC,AL8*0a)(QaSBAE`Qr#6fKkcjT"XJmZL -KU@!SQ*fjE%iUC@mI[(ZX95QmrkK9lFakD[6EID#4fPd)i9aI4B--84r'bT(RD&p -4mI(RI$-h*pT$R!Sp(SMAA$T4X4Jhq4lSZI`MQPFj2)KDPbSb[*Ff%*,S(JaX"j& -ETeL9Mc4$QZkqCD59Z(raG-2eb`U$$edIL4#&[USD3ErJA[8CQG-PC"[RfDJqc'k -QcI#(L8EP"QQ20M1!lT6ihhDQEd6ceXQ&+LcG$iabe-9Y3IBFE(Q!bfXi)'U(9lr -lE''bhdR&3A&"N!"E`qlp%V2Nhi@bbMDT!HmM$"JaT#8!$3H8jpbJD4JQIC(!%Ki -2MU69"A$mI$TRhF,JckTPrKC*frU`2Z5'"iYJ4mdr(ad-8(rIqjZLSRkSrhTk*eX -TXh'j0)l,bFqqD2MPpR1a%1Y3X*B5d`Lf!QBiXD,IAkk(JV`#Y8[[NL!ICqVX&CQ -Dq3JE(J'9TUP3AKp)r!B"ArTj(,ef(R!T5V9mA-cRQ-I"JQ@NP$Nr&+2[P+DhUIB -D"Sm(XDqdejKS'B#H*j@-lVHDa6A#p5,NE6[GX0)G2URUEQe!b*2CU1K['H493Vh -9@)Kp(DrZmUK[rejKK,m*(!NA3Q'(VRU@"d6l!Lf91mjqPlYDI62DF*eeA2-XeS& -ZB+-)+`+`TaF,`Bm5cai`@Kra@Y3EeT))`@)S2kqjXPJ4cCTIK5kP46$beU'QYal -pb4KbMK[m[kNlQMhTU3GQVB&c9Rq2!E[-8S'B*DNMQ4B0DlUr0!eX[XA(Q1YIXie -IbX5kRNI1rJka%eFrNLiD-m*)pNGccQ5@`YDYZ5A9+"!q21(%bEci@bGR4(b0,&R -6&i8QraHpf(AG$R%b%XR48L,F"6RE"B[C)1TiJHcE5G"cdVG*GR!,P6aUmfVBFD1 -9j@KMQ#D8+Il8U96cEVmC5$jfR@CD"3%eT2PVh,(&ZG+XU9%4V3ImqC0K&ANE2Ue -UM%,rL[i3kAfLc@pk"dA48-i(@k'Bp3NepB$Gp!p"9`H'!!QF,'%&fjEaHBH+iKB -dN!$5#QXfmS$@LpGqjc2J)@lr04f6-,$))UQrXT5HqkqZ#af0C("IIXhUX@-RPK* -Ri$"@RNU)E0E9"!G5eLq'LipVVM2'1lIM[0-d"k&Cjk9Q*pTM639"Vk,0Yp4[0Ec -0#YXK"SX*lBbN3l)kVlj'j#Y6'Sl-kYl,Y6)!YK3%)FRVT)r!NSY0HbB0%U%&pVP -T[eh2!kYeEd+QEVD"FcjQ5`EV3$jIr9!+c1#5F,0DHY44jcJ$5rZ2l!Mq'bM0L2# -%#YC8qade(5(X0jeEJ'H$59DcLBN0MeGJN[mUS*Ie(GZlRE*e"-YfUI[dj*KVQji -5L)(1lE%-Ir)bkq8C5i*j@plVl@FriVRbNJp0N!$N0%LEkp!lB1f,,N*bN9D#*N& -QjP@4@A9&"ZcCDE5EbPLCLjNQ($&Y&Ud4VB@b)MBFrV*`d%5rNea`%U8YiD`!ITI -YB,*5!)N(r*GY$3d@ZjHFrh(i)l1kFJXk)Fj3VGkMP!k!@'djZ[AMkV0M59q%Hd0 -0@)NcMYmBKM$SA1IRLQeR(@SBacRLiYbP-[[-3AeKk+Ac+Jb58VD@&V&aT(#MKB6 -T['d4Qb(NETj*J)Ci8@%5%+,Glr)Qi5HKC9K-Ti0phaM$G*!!8M#6+qE"LY4dNJh -!15F93Q%8BmA$QIV[9kP,`8K"f"PlBHCPNJrXASa!K1TM(iJpHAmJhkYjM%mN&2b -#XXlI&,LKXeU1er`e3Fm9rG$rA@*+i5VA914biMB6+,9X'HDa2YeJ,-Q(3X9HmET -53TCCC0qPP)(jmBZ#YE6,DHEBq$KCm@f#d3HhUH&NQCMZV(Gd-l22bEX801@E,-N -ETj51A1'km%IQ+Z8S1TAN96VB'r4CV+$-[G%mih%P,Vq*9i(T8Hfq+"!NXfLKja+ -$a4DdcEhlUM)ILA-,%QS[,Fd[I[arQUSa8JZFTlXKLRhh(!dJ)DK[!,9ch&PDSY, -(KHcq[$!`bp@N9mlk26M#[f1419lajA2(,4B+%mXf&[Z8[J-fQp"TDR)RlJJETV[ -K0p!HJ49kb*6TPSRErqjb@Q2`I'r*rei*[SlGi[!4ce2kDBa,#,&)$VrQd)Z-bST -Pp16EKU[YHTfSi3@NeDEMXL'#b3*+0pmakBRC*$23jXc1qM33XS%qc+VaehijpTN -#A2lR5*UTNMKLp10`rFpaHIJd!403kPpSf,T`Vm9jRp@ZmqUG1SiUXIQTmSBA1mf -&,50GINpED)&@CfD2V6Tp&$R3Tj9jM@Z-!a2)ihF9*-A)rIIq2j[JXjNFMb#$Q[3 -dEKT&AR9j54C9+QTL'N,(CUD'LkZ*#+SXCVf-c%E'FTmiRDm"31eQb&&mNIT+%r3 -1G-Bf5Y@6XJU)cV-Q%#251@0A9ZD4AdfJ1L(@60m-eL1drCSa0iRUL2&4Zr-Lb-K -1*AVE-6Bi3e!Rhb6ipQ@CrLedGT6S+56UrFl)NEX'jCI82e38bdSJ,BUfG4[5jef -EY`rmq2idTe6dH%Ue-c(LXUiHE$##@a[hlD!ciT'(Z'R#QkFE`c-c#)(1NLFA(%P -(Q+F4f6LdIa$bbYDGE%,lRPC3XUpHYq@b%`6(9J'D"kT8M*Fi-DiS[K#eBeF2J`k -2m&AkI4"U1VKB!NP1CAf&QP,,HPR5LeF&%BT&iiXXS*Ja1lpK`df&LKZif38HpIm -c@0mLI!lC,X(Ii%@Bf9)d91r(AZUj!ppiappr9L13!+Q%-R@1Q,!'),q4fqX2#`! -`mKG3PXm1ZpU!hd1d4cXKFBC2&-`@KS3I``d!X4V""cqmCkbhYjfJ01$JKadEFY' -j2QAEA(,lPRLZi!X8)ZI`N66b%RLB6l[YHCh!cm9`%($bE4+$STB6RJc9ZAU!iKk -J#%9-c,"kM)Qa4crY2Uid[Tqmm#r4`Pd*qK%a*mSdeEZ*fpkU&N%qpVD0bL#PacX -HD93hIlmCc9TUjiK8&Sd[!QQT"`hJI##d[@-F&9l#'5UlBD"BH%JPC%EYTT+c#!H -(iZjU2656M4Jk3ITQ8)m![[DfdrD5l1(DUG@#aYqSX)lN'U2jerP#[Rk&iXqNDS+ -[cPKYi0Z)@%D#dCH*ZU)&+1mL&4!m#a36G)S-VY`NYDl!%$1RGD"RZL!T)`4lYjJ -,2D8$`,X*Gk,HhC@1@dEpR1*mI&riJCKMfI&'3-Je$QmPjKS$%DYH4jGYV)%*R)- -@Imlm,!Y@U2+%aK"T8TKDfZ'X29,mU@Z3!)*D%LI64G68Yf(JEQ9JVNcd`+q0lkY -j3[GhYbY#kA13!-6pPAr@PQ@i8`qXXR,!`N#p8jHG5dcIc8BRLm@Ye"#f'#Z+$KD -TU0q9402lZ0)rX+LD3YYM9&pM*V"!h+KMS!N029IcV+Q(81HM81Q*,4bl`-M'Vr- -T+eQ(Er,kFdHL%@aB6AXB**'&q@0bV6CcNPda4fkpk3iILBRf&-9jTNk8jMEbUj@ -T8CIS*E#Db4h3Q%'JVQDF+9"'l8MI+eJE41G1593Z,1@-RV-IdLercIa(hZ")a5G -+Bk-+3ac*k!(XEG1*D&M$lf(8N!$ANLDI3Y6ALYl+Hi2!C!Ubp[11!!#PN!3"!!! -l!)#dSNd[Yl'dI`!!GPJ!!3)8!!!",`!,'$B!"mFk!!"4F`#3"!m!9'Y6D'9XE(- -Zci!!!%#b68e3FN0A588"!2q3"!#3#S"`!*!'3X(8L#ff)S$m6EUH,rkT-ZKZ*0G -%`0YV,P+pT-#I)P*H3NY--N(I,I(SC*Zi$a[liHG4iD!a'X*,R&ecKS8SK,i9(qJ -QbK&CPI$M!C9B,f$l0M8(RKbAI(M1BMhIBUS6B9PJF8r`10BMC6XErj[-YTEHm$f -MLP++4m6Z6GN4ZQGl8+hflZl1,6D@ac@le1K3'X0XXSq(@1,cQ-)0,YiMP2JfB5A -,%MaH9T!!c-D+H-8IpcmKLN++UDLQGH#*eSJc)VpEFXG-AHcZ)!h(6Zm2QQ%X+M0 -i&CR"NAdm&Z-rIeQ'Ih$ZQkr+6j+Qq[UH6RU4A@cQbp1426MJJS`($E"&BfJa9Z' -a,!k2dJ6VL,T*1"qeH#NE'X-hE,*02JRl80ff%l",VcEbKAKGUf&K0-L89YC!8i0 -'SNkZ34)J(l2'JSb#9GJK4a1bUfCB8P3#"[Mj[2YdjdFlVA$@'Ccl4+(9j@R43Qh -BTAm*V2($Uq,T!DSXVclq'@E))EG&&SHQ61H)cGEC*ENl&SYqiAU!0&INZh#E-E6 -QJ5m*@6fLAH,AK"F#CrX*f#PPECm)b4HAIPfFG-1P1q,J98I*-BJQFC&DDeiNF)& -G!+p0lXhr#MSH%BBr65),"@Ik[fdL,,)jIK0VfMZY8m3I"l0aXV+CYM30Hl%hVCQ -A'a'JX6+G9V6eUcmj%$68FBj(k"B,R,YHXGIXKebE"LeCI%bX$UYH",'5cd#$-CH -&a+i"4DU1(lf@@kMCIHHI541f3cZTC[#,lQBFT"C9GZiA!4J@F+i[I-6rm+$m"E' -6aLqF5+6F['2eeB"#(A8MY3-YKbI3hM`aLPrIJ58"'+hl"5!1TfPl@SY&&N&6U!) -@1jrELT!!lLqD+`9ACfGl8%VddBIPeESq8TQ1rJ8KI*m9#m(5mM3l)32+N!#,IRG -a,2m&L*[LcJ$EkPqqFp9e1&2jZhV3THISZ,B(1,f`8Bqd@1JIVcN$XYeRi$dhBBp -K'E)hVJ$@&"1f5Rjh+bT%"")ILCT0bG*q9F3!%X-(Sli-#9m23SQYPF%YJR!8*6P -AA)9q9REY6)Ue"TT9Y8CZefNbZ0E*C@pcTrUY[l'%r#mjrp[F%)0P!f-pPp-"HMD -d8fPb#4+6dZVXL!KRT%8`#kfGh5l&q8*mUQk($03TVc'CGR3PGjL@!k""F3mi!4J -0Z"*rc!HLYi,X&`cRS5c[mUJaIdBQaA4,pb&c`5fFX@HQI#-CK#'T`D%9M*mbGqN -rrCe`"QVrMVL4((((+iUG*8"TH,Ybjc`lBC9Icf"UT+2K4SF!ZI@4Lpl02"8j*CS -`2d!R'XN-@2U"ReEYN!!,ipjdR[)Z5YQB,c6P0Mj'N!$D&+6`a#k*pr,Z$rkU$3T -HpS*+2KK%LHbJe+-Er[Tb@b-V'(#r+Q$$9k[rT4a"piq@hAiZHeSP1,X8[#%ImH( -iG6,Nh6KK3RYG,E(j@+Lh)*i@K0q[!ileX$5D%JiKME4AIQKDLjL#[6DX95LcUhN -0heKdib4e$F(BaeaA#5%I6LDV`2rC,l(V-UC3ehQP*Sm-9DYC!SN"@l%6iai@J$k -DchSK*kid$mAeD)SNjL*+b2hN[kr8%N-(2b#3!)&H%"M2iD)1Z$(6!aII[`!,U2! -(p1BLiUj6e!E0ChN2P,P51Ik5@+iRHEYL),-@Z[qK8Mqkk[f9J'R`(+$C-XY,Xf1 -JEqQc(jBjdJ8bKXNTm$2G#pRAGYGSqmm(-TI-KXS&$T%ha&alm2Gi4M6MceJ9UH[ -a!GrVBKk25CfGfh36aALIYb5r*djAZ)hFEfcQlrjh%Xl3YST@Y-!938'm'A)a%#m -TVJllK$dc`5UIeRNb9HNF['`lBp&K*RH8$&H(&,L))r%e3*r+NHdfb%SDFqJXIEb -k%+eH5dH,IlB#D&9Q)b$Yp60Ql+825AMfU(iIPDE+'bF`"VNrBjAD!SAAMd5N6T' -dS'Hr-8'Q4cGI#`6V+aNa+(['k,L'fN2P,(fY)j'CVhAGUPlLKH3LJ3Fr+hVILLm -m'IY$'D6bKB5e4dLTrfIr6#$kf-[dB6UR&+&#Id!h"S14)i4%"&Ffh@K`IDql'R` -Dj0X@UQ38[IlM3H"-`LKHG$KlJY1fDm1F+#Uj+8`aL!#TH1P(a6m8eC6cj!JrVV) -TiC6ClE1mIpf#LJY$!HL'15JbM3!1Ujkr[*YhC$V2lQ8&9*A[a"Uk&1!SpfMRH8p -0ZL5Xk%8(Q3Rca(I1Ep[PjZ1`RmCN#ZYkEVJ2QMITj%!iIdda[1qYX44NR,r,GDK -SGB`jL$C[)C[@VbLU5kH2B)%b*Rli)kYplCT`"2fR5URJ0(Lj50qqJ#A`[!$VpS( -8$R*8(P)&Aa6'm1ND%1lb+NS6MAI`Bp!)beCc#b@$3h)ai`2!NQrr0JJ684$,)E% --X1YhRHj+U"feJ3(R!IV9,fRf1,rFA0BkKFmGSI,ABfVX'a3G0aa#`k@iVV%FpVe -X5EE"X%R%5m[j61GBD!6r8b9BQM%qrP#eBNiH-SErJbT"hXqHF*E["@G2qb)qNpU -ij-,Z`GRdc*aShr*q6q)$iN6GTHR0hdmp0BJdp6e&[N"6!XFMk!2RHf(lXBL3!,I -S4PHIJ"RR,,M9KTrCl+h3)+-N'N+K2Jc$'5F9"*S*3#PKC)pPCMRF9D2q#2cj*EM -YpKdD*mXheBh"+%D2kNq5@@JRJ"E+UT!!jq@H3b@IUZ6A'8Pqe)TB`G$r#1Y[+(V -I"'#Hc[#de&[@8jf#Jiim[kUJ@[06MG'$Y*kqpm`l+GqkKV!9-6C9bjmTK-Dl8G9 -Xf"'cJhBUIY4QhSS+c2-bP[Nd'KQF*'4DpBbVP+'4DL%arZ`lVr&+V"&b+62-eXG -F-Z5"RdD5(+cEc"1*!63,-0#P"(@XjYS3[!PU(a4%BF,qYqq0e-jqVjYlBG$1$S* -9IeE,i(3qf#$CRiH@+B66aFpXG0QT81,'JpNdrl5KBi)lM3#BLR`!k0I*KK*jF*B -&dZFZFpcCJUVS)jJ8KkRQKH8Qc"YIqk`I0J2dU%dkYNk'VZ!%"V[D5YRjI,BM)MT -ce@mE$*)D,TS6bJFGLpafbI(dQT'&jPq!B1"eS5#3!+CDS*'J*E04P-f'VGr2-$V -$`("b4QJaE@JLhk`kHJDq*iGX0GN*rK!&YB'@"Q(4ASH$C"'p$bGLRl2'fEf*2Kf -e*ZNPE3YLdQ'Q-J(bN4@rYV,hFPEajp#qXZ*YM)*hAmZLN602VZ,cT%&9B9+fc$p -VpL8XA@5JrSDrJAZ#fQi4hGq`+-iUlMcr%4M&EiU,j-AE)F%CQ2EL@rcr%"H$jYe -"'+QCq["'hfk2+31*fqNRhr,!TXjcphc)fI`qb"LaZmm(Y$f(r"4,5F2AI8LQAZm -d3[p,p!$qLXH'dqK9BYNmA#`K26)`Ge,6!A+l(!K,jSk`6rp"qadJ6J`+1-bp)jk -Df%MF'l"`[Tm-em+"J3%6XS2`+Z(U5TADb'Ef-9L'ZfJ(40'5Kp'a%P*89P2$J&4 -eY[JL'F!l1fKkK2S2r+f,G8cPc'Rer&K[$-T6Y#PYjp2H@M)'mSCLR9LdhYZmUXM -bS8qJDYALE@m%G`IFeHcY@mD3!"CR'!!!KQ&1#NTR5-Lm+eaH5)@PT3RGrq8S$HV -kUJKpeM$Pm`%B(+%Ec*+'hC69KadJRF)I@CJY3FALBpP%KQRBeSCmPTpV#bLf6VK -!M&X8"d5e1"9+Y5q3!2VZ$Acj9j4Y*)QA4Y)A4!1ijbZSaB)ZeX(d25r"JVqm6kB -"5dLr&IefYQhJlXUa3f61b-S9F@6R6d(&mX@HkRiI6RbYbPj4HPUqB0&-6bL&dAb -hXf-+dS(e&U9*bk-8r2C*Rc4mckKqK+#0P*+9`81hUI4`pG[-GHkVhd#9#2"+-eT -S#cH[U&[FHIFFGbrYScDG9'FF)`rldV3D4bBRP,AibUXBVXcmTS,V,a*kD#-D04P -I8!l(rMRaNb303&0LH-CqX5+%JNjd`piA+c3[b--AA9"BGFBpHpGK3qdGrHQ@l*! -$D+U2L$m0)&CV"N1Y5qP8fHXbi#IE5I(+-G*FkNF&1149m*cd#cTlP20Hb,G))I( -j%hiT%SV`JbHFTFqd*8Br[M8A)l-rHI6RY-Ahiadc09q3!,EZp5+`HVKQd2r3(Nj -mr*f+RkK%4dRh)QXYfZriXkN,)B&0mJM82Eb-jIjV4[QEPM1")Gc&3@D0i5#&SEi -r#)-HLpmbLBqI[Jk'$$&md4(SqiEb+9BJHpFD0@0jr@CkX@5LMD2-NF("`jKCS0m -F45DSrjD-BLYq38QMiX+ZL(Y9RT!!id&%)'AlS),CX0Mrr!kPSRLA!&Er*R(""S3 -9XM0V*1Tr-&h%*6G&51@TG-9kP592,c[MPE8UpXjJJ*h-B$K#Mm$S2d,q+IJ#T2V -2&%J9TEH8Bc3qK9&ZHH#'1lCB2Lkf6SG*&eUbXqF$SIaPa@#Ib#HPMY)6QXF`[0F -[El5k&'$FdNQ($+D$CT+rFqH`[,)!R1Y$@#*Q0I6dMUlJ5-%NC!*(M#UE'MF5G6+ -$4l29aG-dr,EZfNUCK8HdB"*!bYpP+*eQ3qjeUrmfD+,#c!JEYph)U`,V)$H+$I6 -$TbZSp!i9V''&ZL%HKT8L"a['lfUSN!18V0(1&l965!kk"mHm+9KE%!TfAV##$,9 -G9[Cl4i#DU$Q0l*P+hl@L)jAheQ"Bem,B3XGZQAGA6'"U!@1%hEeZVLc)C4L"cDa -11@e$(B#5bjS[lrd`-fc,I24ch3*U9re(SD'q'lCSG$Aej'Ge3b''aADjr#N0lf+ -E2XD#Z@c$9rm)0Vi)P&-#rPKq3S(12P0Tq$8`$IhL6fAI[LXKi55ijb12Llqf0BX -Fj`Kj#c8dUE5f0R$hSjfbSPUi@6*L6NXh!-0Emj6-ZfD"UAd([!f(`TZeHM`P)JI -e*%X"N!"9U*,6*j3GHA'h'"i-f9i(UCdrV(!SE0#5""Gmma2@ILhNb'bDrBq&6L8 -[EK-Hd'K4mTDlYeh#C2h()XXf60R-)FahVVe--XfBKB`h)dbVGfd9kQqBHqPMjSQ -6KS1@XhFiA*E)-kLPEI+)-FeAq)P$,"L`BP'XhAf3!2bKe-QC$4"8)1C24R$5KDj -0"Jl"bPGH!6$[4[AYRdbA@d0-q+A55d#J+l!@qT!!,"'Um'I%m92h6Jb%Gfk2d() -b(1c9eY#($K'@Y*(4p-C3&H#Z"*,*lLi8*J)Cf(DmP*iBS@@"#SAT*S[qY4F3rqU -$!miA2Xa*A%hYbE(U!0MZ`00`h8%GM%V5bFcSPEX"4X"bf,i1[YPkN!$`Cq"fSfH -"MV"(Eqq0jYm$ApV!A(kQ6S#U5GV,NL%ff4dG-Y)*F-"Z!@iHKbXJ1d8R8k&0ZBA -6jB*5`CqFS(DCSIRVZ"MbM$RSeZ*Xf9NdKbAMHGD'leqe2iCKSl`)cf&dTj1XAU1 -C`[KB,Fqfk,J"jf!G&[IM-K'*G!**9UCSm@PcpMI,Z"$"C)*hd3+lQVYE3X`ZE+M -D9m8TH)'MpkJEbDX[CaK3$-EJlDQ*BU1862l0eQV"h#a2QfT#,lHC%4230MV'[!' -4Z%'NHUc4eBr&F,`+$+Kq[MhESCJ+ilm$2Ui8aI!"Fk6c`)JTDb2V84*8b!lNJ%h -9@(KRcp5cFU2kapcB&K2jXqik)P![I4`TiUm@UVCFm`(XP8C5l+Y&d"R4Hd%5j6m -p`p+8)J&a%lpJ2q9,fk(LfeGMSqKk[A5`0UJ6eDNm%%"UV@0Th8,Xc0qB1N2TANE -)'R`P%ar0V'SZelAe'YlKf4YpYUkHS!rei0eaPSAI*$kb#(c4iLA`U,Y%lH-@SF9 -@-2Q-BhLl%A"PijRjrhNZDP%``CNCjA"1rIB(rfDk3[QCDlEAa`#m'K!3Caf&iL$ -"*DCX%3@-kPr,ZH34,qUK6(FY#f''FaKA+2`+6d(E"F@TH(6HUAfq*@Rai)U5[0L -@C1r5ZAbLIT%8EJf+hVm@(!6%`@hJ90'e,X56S%RCbD3#dbcicV2bD-l!0ij5BAp -8hGee"Iq[V--'#!D91CVIR#&`@eNLFFTKA(`KZ4kQh&pCVkbpRP@#$j0CTa934E$ -Y3r+l`9&)GlS*,U!N&L'!9QQ05Qc(,DjHA%(LhkVrM1NR#XKH0#fGIF4akq%ipSG -V(r-qM%qii#4PFI`G4m#YmRAkP05j(S2N`NApm[A5JVMGI8SX*DBKZYDk$qk(&9- -rBeC-j0fXiPm'-"B%'$q"P8dGiLMRVDJjEPXS*qT4qA@+c#Q4e0UABR##AqBDAS- -)%acQia!mMd2EZ*8dI`DdJ'Nd-61FAdH*!A4Hc"5-@8KV2,Z&q+3bmm8*lXi`K,1 -&X+kTqrK#&XJAY(X1ETQJj@33R8,'mK$U)S4e(R#Z8QV81r1LLmD`I3KQ)SGrC@d -dR#+D"eR9GJL,a%6Cq4d&D1#rkRZGZ"ZRi2`clFX6F[#!%SP5C`Kb'j'Lh#%`59, -Hr9lRJ13*IRZ)H%lYje6Ab&XJC)[1$A-ENraX$mV&*CBMLMbTmL"P4Vc@3cHK26T -iCYebJQN(0398e*&Y"VT'#q+XAMPE3`K#abC``*+[0(9A1HFhQr,b)[1Xj-TbZh5 -J$,mbP[VcAljmGB3'&Z-pJ)m'RKPY$"Afj4&Z2(NHU2P[Z&NM(dA$!kC622H3!)Z -rmi6'Z64E-LTVmaS`Rk,YQmP#0d1YMBYLXmCp`B19@rG3$NhGf41#E!+e@[6+mi[ -PI2b#S111VDdJB$T9ZQ*TDI&h`I`XN!$"3Ia53LmqNfId3`5eSFm0%F-`%B&BQd' -Tc@IN%MkKIGb4+Kl#NT1qi-ZkCE0-c6C,MX+$fC&VVN(-%I[*9N&+*EGRX[&iBcl -`*6VVp0DiZGA++rRhikUBpL#YY,rc9eREk8YR#cf,QT3KG4G+C4$aLKPRVUIi--J -&98pfrhDRp5hPB@jNkj2YE8IGU,3JXdJA[aNE@D@ik+%cj&lL%qPN#&X)2UFYThG -Fci*Rl!MAAa$'$EPM'%*qAdGM@q&AN!#`F&pbXiT!di9SZ2UhjBJP5GNM#EPL@AT -P&h%"&d31iZ(HmC+VP&&VEm1l5q[c+Aj3l(6PJ8jM16U$G"'6Q9TPcRP6c6jHa,( -r+V')cLh(AZcNAJD1P&2h&%-85Yh,@2MCSLA3J5mY*J[T1-jIc#U988KG8eAch5G -0Id#2Y0`i*S@a6Y!SJSUUT,"'VfSE,A5(i@[!JGP6%9K25!N'l$a58kr%$NlAFFE -9EGi!m6X9hT)lL(!,,3LTZR2+FImam3kd"h5&4h@2R,lcfJZ,GGaXQb$8L`QbQEM -eRFM1M[h-&L'T0X98EZ2-p6DCS$p2kd)mjQi@m$)N)m0[XRiK,&1%"L#mqlNSTp# -UQT6#(GXaR'FYib[S-X&NY*f(lFA*2DI3r@f6fS@iSNaaL)hpp-M$h3h+804QMaI -6@UK%%BF#*&QQMl#V`H1j[fA6aL%T(,SCkR%RQLD(kUVQ"U$L*4Lm1ERRr#VpUh[ -8VBAh)+T8VeKqemIL@rD+VKbIDQaGijCr'rPicCYTR[P#C0VXb-LPKUe%-DB3[A9 -MC[S1-CUX+"Q[L2m[IqZ0e2i&ZEYdCBl1h@C[f*qe4I%fRG#S%8`[DIh6CF!aG`R -Z8D)d%)QpE,@G*"834aTHhFH&0[N@@%FeCNlaNUA+,ERfh'@(a9[SeNB*%%'bI&0 -,"IZMb0""BF5%5KVre,C#G4dLdH&2mTQfm(((d)KUBEK,r'0p+8YE@&DMl-1j6#, -HH(,iP`*hEe&DVV@#jpKqpJS[6i`Y#)'6[0C+0UXT9%%5TS[4Y#h+,K1GF@m4qhk -+!EYqa3#[ZQFKqakF!ml*6m0@Ge[XMR%i0&6U85T&dlVlG5V(3r@0T@ZU1"pd$#f -`ak'ERE86(@IQV&DQb6Y%FV6mD@`kZ4Y!a2"cD&PHY)!`"pD@d5"AA`'DmFZ9%D( -V19C[p4R6JjRGEQJA,j!!VRkhKQ4-ADHiAFSEqAK2V4r)I,'A"9cDRcqVMl3T$Ak -LTA"5SdZX+ITL5['9#JjQi$($6K(Cpm@)EQh'j9I#h(#f*HKNAXIA0Dfq"Gi`I&1 -3!('U`TmVq+raUpc,+,,1"SDICkKfCL0R&6Sii6EV("MLbe@#Sq5fMkRFB*Q$PBm -K0&p`3D9E`3A3f$Ckl"j1386Zqe03AIMST$D'5%Q5@ZMcUYb19pTi'6IQKf,hb1a -3RQ9rk(de3ZSL84C5+6@kU3mfJfTdk,NJP-cef64QLqIGNCd'BYl54h%T'c5F-3L -PEHGe4dHl8'NV#8P%Nf`AN!!T',3YAKEq9h*bRHYTl%aYC(E)-DK2)V'-J-`a9[( -`bi4Mk'RDL+B1"'b0iUQ#KSpae[ARIDI@e9pQSJ5$aVcjCS#S%@bS'@EJd9dUSG8 -+hMEQ+Gm$#5VUYIm4X0b9f-3XNJNmq%(#0B9-,0UT$L,eVpbIVFhGcZYHmb%8@l4 -Y))BfR"p-HG&f&*!!IH)8FmU`bD*56C5I4mEEX$h'dZ@LLPbZR!abjrIeSJ0-2d% -N@8-jd-E3#($"HLRPScfcMX-FT%#hVK5kD813!(14eB4lpY@b5Vc%rJNX'2"6$,V -*IS`)@cBmAD$90$[#4NqVh9`IR'$1,YqlfJ'5PD1#*C3EQ[,*CcbYb0-c-35rdbf -Eflj5ZR%H3bGL0m+pPpMZ(Zmi4+5YXZcUKDMGqTA*b"-64A890rGeq[ARNdU0KiR -2TZhJ9G)!CR5a`jM8CiSaKf'Ldm"Qb1*k4AFC+,8kIDAJDXC1$d@&F2P*+kmG5`H -fM"'jhf+$eB@G1T9+QdEFK82MEl)JL@rLNj3c"AEj(Tf)EQqqA#mhZjSpGJ84lUM --+cQm1+QYi-f3!$56+RaEHYiUcjKj50JNr$E$8k&q)R-H*PSN,4kB@)&2e063(D0 -`DXcc8#BP&T!!PUi!@,%DT!R`(j@%0m8cj5Zi3c*llFr[!EP'5[cD`QRPdKa-'H) -`'6C1pe,haqMjZ0IMV-f4NeaKkp68e668H+h2+QCRFm6"BUY643#j(CHkmUBe,H6 -pV21J3Bhd&0FQEkE-1imqEY`,34"R*ChBp'LKhhJp+6Em9PZ&R3K*FLQieIB3FjL -@GA)ALEhB8U2bRXbbM,bNIU4@Q-(aR&X!(1+,kCREfClCP!HFDSAapG4i@11a'm* -#BeS@PDK#2P#3!"pHHAZPj[*Xp3K%MaV*J+&Mhr#RSP`8UF6kEYM%K#IqfPi4('p --h)-qd,3ch'RTe[U4SZE%Qp[Zj#&Uhe(Jb0q[+`,,3U9J%H"[iai3C,`b#4bKZ(T -Je*9#ApH"eXfr!+Qf568U2(%2&EJiAc*-lkE*Kk9LLK`-02Za0eSTk)a0iJISVRC -5hUaH6DafGC9fBbN!r*31b1@@9e'ARiVr8K3)pIVVI4(IURc$6+TAaGL1"U95Hji -[q'e@[VL0FPQAMfaV2kXFUrB8Xeq1lkj+NM5L)ck1q5BfCbfpl"JV1kVK%pPFLIr -8@@aLi-SXNDNITRF+eHj4#mm@1Fp#+2#%Lcp(MRM4AJ`i$lakKmcPelb[h696%jk -%pp@R*J4pbl`'ILdb24f(E980,$-AKhfGf@ikqS1l-e&9`bE0L0HYDV0,fHDF1+M -6Njh5piKk['MD0JQ2RML2"pqI[NMclqfhM6XaV-S[TR`'ijF9Vi,dZK&iR(@ZRA* -(cf&,i,!*Z*!!SKj)V"Qimhh8)kBNmCP[VQZBKk!i(!2(i[cGdRir,b[J3pVHfAF -l9afj0$ar(3-Eq+8*KS)&kMX$4X-d@EPldD6"'41kQXY&'pNT&d'(eGRlZ*Q"h-! -'9EXc4qi((PZ`(lpFE)L+5j2B2a&1`YqGAF4iNBK&@m&3"1)838)cPeSQF,VQH1E -JY0r99QPafaF3-,#TdkAY&mHN`YHK'#P)%S@aMUqeerf#%D!Yck,h33Qea4f8@FA -bDM6M#+#1hB&kGUMk59c,33F(@(-QN8S2R2EeL*J`#49"MQiY0jdkq0CmjkVUD4D -VU9,Q3)0Ee')0PUK1,rFmJB(P4*BVCFYPQiL#UP@Y$5V9d*jfS"cCA6SL)T%d43) -#Z5GB([BQeFYfrQb&eGSU0kZ#GP(C*jUf+5NV2h3EQ6+M3N@+Cb0&3RhD#hF,4e+ -1h-ERJA"U6A22(qR[hAZD@f&j@PRhcJemDpMHjdH"4RZ"ArY6FI9%3eQ0,c,Dq"9 -V!T[ar6)J8TLYc3(S3N+i1S(hb4J"di"K[idYYY-lbB13!(A9192,cVp5dhBKbFV -)rP"%5R)"QmB$jVNH*,d0"+4MMQBbk)9MGr65H"V"2PfLm98FD'(#8SB8fRYVfPp -&TqHN!9+QCLfVpV(8QT@5Xbk@%%&@cZ2b@,815#Q-`!lT6c13!,YQ0pMpf%Y&Ti! -H2R()%AGFfp#QkF-m+6`8m1![NjBXaN10VTIdIc,&jGL$0mVFrjPRf+jT5af@cJX --Hp+@[TTc#-aRVBjVM3IkB!4)3Y6&a@4dKqb!U09k4jdM#KeXZl98")G*BAa#)FD -d$EJIlI3(YZadY6$mZ(mM#!k+A2f%$Vaa$F'3!%PJ)Q0@Y"!mA![a0F)'imAU&Bp -"UmliLR(AS"S#Jf#J+-rID-VUJM!AN9@DlYM&SSIT"X+ZhYjSl$b*LjSAi*PqPaV -m1)$RPN6h23h[953-@YBB&fINpX"%L[%D6M)29ZV8Ab5P2XGZCTN!'$Aq1-%HfP3 -R*qafH')p2+r!$C6r0"(0'"5L5`XH&BJ3`pY(m*SBJAV$XfI4[)eM$$6[C#Xe2T3 -rZU#e9A%&RmS2i*,56rG%")G6,mBC[NdUbaJccN*bLa*ZTFQjDffLF)d5eI["b-& -e4dc)l@SQlI@aaDa"m[EeT'IXpBH@)GZmmJr*-%BVc$X8pXiIXBJL(Gp$LmNm`VZ -)TGr#hPAe5[&8lh#kj5CMGXrq61"JLdM9cpAk8Af9`Ed&*f5UcT4[p(fXT%rrmZh -KYF$*iZ+d)ENJ,M&lX9L,(cSf26SJ6ddqH)(N@Dpf#BSqAUpV%E&6TDMf"RV`43Y -S(45B41X9*6)TP"KE)M1')C5(aVAMTJkhLl'e+f2(Dcb!ic5"Yl8DHE3*XPl"m@) -4cB$Hh[%4YcFH3c,aeh5Q@,F&iIp3bL,"fq&IN6)HAf1[hGC9B+48AH#FBB3!%j6 -(MPcF[DXHfE-Rjir86e$l*f@&TfN%HP`J&ei(Jpp6aA*p2NVRZBD8Y5LZBa4QNH[ -SD@&U*5p,Y[r&RCi8TKI(-T9FSk#L%@T6'%8Ji,&3PjFmLqe%$$$DMj+"YA%pm@9 -,qB9k#S[j#"UiBPD$([m+YZJT4r#4!E120eSf%USKV`er8NX8Vb#%KSjR6'b8&RS -l)*'`4L5S#IBMD-F!Sja`lIE1-0"Y9E&AHC+Q&9Q%6B3$1cG%i(Ti5Ue`d@8)J5b -Uf9CE1dRIbr,@"-%[%0[JDYGrQ9dVIHRa+kBjG1Z2!i@-McS-ThJD+5-KblL#F8d --iFI#cQBp'VHb1S0NTqjpbCkF)E)q$2bM"e3-"aNqEa%9PT3844q'iRHb-R#K5,M -MM[GlP`C2$TNbJY&Z*IdMk)ke'3LD(QJcF-pY0-P8-,6Ip`$*6fZ2e61%qPacC9B -UrMZ6(Z2hHpX(Aa'I0X5EQ4rea-`EarES0#SaM%,8F[jdHAKVM,$&p5YPDK5I0)! -i"B34KD`fK-b-+A8iU,UVqM&`kqL`Jl-`#&QkV41GU8#(9*!!ZTBISfm[6`E8C-N -i)$N*D)3dN!$b-EdI'Nad`RCH&1P*M4pk'XadR9S90r+)pITh+6K'4Y6'[FdpPlq -+-5FPRIQ4Gj5-U-aXPXS-QVr-1D)pE+CAA"ZkES8H`RU$QMGVR-*4@14GjXCI"$L --"hNkeFd*q9rR3XPDch5PEp4iqX'!Xb9C$ABST8ZErihbi2"@"IAiK)f-l-mTS-U -A-1'!idD!kplJ84[81rSB)j%&hJar+V1'KT[0bVlq*9MEjKlIAJ1lPlPCcDS#C'i -P2CD8#G*AT*j+5",ZU`U,h%J`NN-,L9RrTe9@[B@X6(h0'TTq&Q2b4V&-fEL3!#0 -PH))`S2S2B3!#AaN2cba4XkNEmf"-p%A#kjKpl*A&%Db"3a@jbNBdZUSK+dKiJA8 -I$*6-CEq,0d`Qm43fQAYV&6P6[YD(!*-(XmV'i%bG8riL'180M!FRPdEVQLqkMfR -)5+[Y4iQ004b-2*cK$$!"%0)mV`DcC9qifqiTNB31`%&KQ`r9dpaKIFCaecH8"1[ -46$2RjCA05r9"j(if(-PXj'c#4KkL)&ZeNlHRT'18bDK9$"N6-j9Ljr+U%2I3BAf -E'902T`L$`FTAI["J6G+lU)D6SE3`UIK0(jfYPamr4"R9Djj'f@hfR*!!+`MDB)! -!Bcc')QEA4PeCi$9RbA#aG9VQ1qjYQ4jeN@K08r#ee%U8"'J)i))eR@3+hkBDaTF -Uh5!d,)$XFQ@9Nr`$-ie%Q!hE)dM@riSKNl3'QjqYY+I,l"#ZMJY9XSQfSaJ)Q9P -T'(#QUP62)ejj@9efGAa%Z,U[#U@DI*iJ9GSpV)(XNEhTfbh%K4h$b348lL!c-YM -e9X(BbTPGp3*V3Mk$0G)j2P&4aIU"$VSR`d%rJD[bd$e'$5$6+PJD'*F1d3TR`k$ -I',A8P1DCM8VrPCL#+I"@@L@4Rc6S+IIkK#8&MUr0i4%@U["ZFGc6T5N+eqYR!*R -NG4BA-PYjG[F9QUr0'a`8["+Aq(`(8,`@Hlb8YI%jYC3AqBL2'(-SZ3"&3P#QjkY -9afe2iVE%XpiaQYqIrjePGUNYG$&c0AS3P*!!-h9JAYmMPj[@`[$4S5'Vm1X&-[J -XJ(GP0hB3lUMjX)Rc"[bQd*2'dZM#H#Y,1[3!&%F3f*R6NQ&&6YR63hmk[S9QdGr -fdbMB12'rrH1(iHCr08e@Sbi-%9[e*G[ArF1M6+5iVMm8QK"%C),DbmZDIeN%BR9 -,rmMb@,leJ[&&1Zk9,kld'jQPaeBej)AVR'[ArATJP2')ST8KaMX6-*pR2Ej3P'& -2C!&KkCm$R*%4!m%MpJSAiUh)2a[YmJUPIqkQPPHRBN+beZ&5QKa%FXUV&Z10[mj -ZE3-A@`$rEJ'-6dHX8+)mIlkL@Ab)F0K[6fKZMj)UXj3#JU5V@#Ph[c9V@bDEIVN -*kGXT*6pLH)(12GbJ9-SJ+r2*#MG[!*D-RTC-G8LBCMpm9Y[T1!-(6d1CfVa`p4H -1!YH`BYD`e4`1YhCc0jTHJVZ[plLPXp1P)*fKqYEfcZ1MM*)([V*`#eEPMSdQ9-" -Aq4h!QICJdm#Y)p&p6A-MakA8(V85ERl6bSTE8@Yc'2T@rcIqij5l$'f!I0Ferab -"PJ0"`S,)j&TlGEPeZ+X-!(%a@0bMJ9!C,(1NQE2d[iC)JBmTQ0CbVBd+KmDX1l1 -(XMF'HH!4@HH82@Q8DCIEYdUNZ3JAN!"1KMlQ-kPUi@RY[pAqm9k5Tdf1[[d)A1I -$R0d5MZ&cPi"Y26@prAaC%ZfQch)UVQr#@8KH$R*lCA!R@GGQG@R%k"PS3$m,NXH -92d*'bNb'b)BNkHZpTbFVh`D)@h*T(cC,DhVRqPl11E821%QRlU-ABfiVC,F-i9@ -3!'a#P5F#R--m4T[!SRVX-a*LfbpMePm+1IrLX+X,52rp&k!3!hD$r+ejFm26ELi -1i2aPYfjBZ'U[V3k[2PAhZDqCh$8)de*XqS3AM51ZiVhLJQh8&i'QG5al*Y)'`G@ -22$08jUqVM9'pebR"j129#Q@r4MH[IV8aUkKSF8ecN5Bfl3Xa+'PNa1B3BURlCCG -""T%l+l&l"3$m`Y)H0qeFC@"JK')13`6MQVpCH04-qmJP6m5UiLfFBFCR)Gfr54@ -`kb#J1MmVMJ6PE!'9eQ*8+hN*,9#)&pGlAaRkN!#'0iYq$lc$Tl1Sh"Xf`M5a0BX -ma$9,9ZfDBGfFqk!@)FlE"a@UBJ$(Nij'EKmMGHjP)If,0hX0-AG!3UCjMlI%3r+ -)Mj-lji5$LP,reRH3!-N(-CXVje1XD6B2Yj38*MdrG`C!pYTh+r*HBJB8pSMM$TH -&*CUSSrXV(kfqZ"jPQ9ZN9U(9&T&b4f6N)PLh`lCEZpK*[a(FDHS9J(eElGRhLUS -UHmHVf5*hrj'6j-@,@2c#jqm1TjUF0(B25BS6fkmFCF(@F!AEIcpll)Q)N!$@CR$ -SF+fFZG1C"hSNi[,$,8c1c@Q'Z(iQfIp*lS&+,`I&`506$5a+[SHDP#kK4N*E2)6 -1Z!1HBpf$kLXGeSP@1Y[#p1R8H@*q$Q5)`f%%GqrarqA$S!p52`e-`1bNl!UHkpa -lSUF%rq[HpeJ!Yd+cLKSkVR-Tajea%S5(I%FpYe#jQKQKRIe$)E9H1kqFMSUZ9!b -!cBC2UmKa,`*[bj!!VdPNUNNmj#)&eIJXc4-K#d'6mFQfML,k%"b'$EZRH`MHrA, -S94'R40m(mkkj0H&Vb6UP9h&eb'GM3!*DJeB1fambb4eHrUbMper+UqV4!Umc%30 -kjV#YTAUIl+rfC'096--N&U(G8SbYXhJll5jMYJ,Zl@VSPhDBIM94+GcGKGZpKpC -b+(N6-l6p$dSQm*L`BPrBaD"XHaE%QUL[1B"1SXXf4Z4iIc$34A*N'Td0A,h9D3f -6*5jM$,*Ba*Q)Nm3,(abY-pk6+"a6-1"0a&5IQrPll`XrR&iql(#P[f*P'AEYlb' -0H3cfD@Y`4TYbBlNr4CSRf&M2L'K9*XEa(8"HdPLD5l$`kFT[QS[4BGKlh"D%fZL -HHQ(MZRfVBVY-R*r!k(Mk`q%4eIi,hlGRh*QmUM6hQ%qQ2Kj"*f1-K'Y!qL@6mBA -0@[hT'$m!NK5*GdEaEFLQm[%ZJT8IDqY#qd43L)-U%JXMN!#-0"JVrq'l%p5JeE+ -pN!#JTa5'eN-"GQf'!fj'+GkG#9r@Zb*&2F`bF!UUP`BTJXm,kl,H!eeY!%X!fGk -#4KF$TR@S%C*E@#rBZY'+XICKV8M[3ES8eY`3@bhi2D#1pleLlIl2HCjM)04#cKK -bIQ(S`%i#TJ%86Ga$ej1T`&bkkk1j+!Gd3(LqbZXcV#QLY&Kd5dRQP8[T34#XGQR -#Kl8(Pj-S4-I`&`fY!%I@rmhFBlcRp-)59V'pRY[5VEQ6U-h%IV[IK$N9(Z#dUMj -EMJl'm55)'1YJFVHI5'T`Bb2CG"F9@N%dD`[B@",,[DD#b%qhmr3Hq#kL+d3rUJ2 -LI!#1al'fTQi[+"Mi-jC&00I`K*R$CmNVZ,CHX8A#-fT0qL&2h2)+E#@SlQY)b%q -XlKPYdMGbbV--XX8CZm$E4lj#)32ic3Ej@)mPN[)&d`Se)9VrM5&XSk[BqM88[,j -XbVY+!jlJ+GK9'fZEBh%VKaMbfZQdUE3[JF,YpJmbF2eI-Y5FKEl"9L64YARNLaL -qHMfFGJfFpR$VUP3KajJE8SP[$5-#qNm#T8a-GXDkbN)8hFFd(dk@C"`q)J6URS* -2bQ"!N!!0@@i0,hMVDk1qX0!"IRGJ#@Z!qh&)f$lkJarIKDi3r$`ISc[Q9fQFD"V -'e816lF$2$5RX*ULe18m9CV1fHLYFL8qI+a62'V`9I@`@!p+*qkHD+MH@`p)f8p[ -dE%KC`!G1`hSU`klE21$VSK5Jdch4%IL1dX*#VTiq@b9HiHV`0D6UVjdNYB9a(U% -HjXY$QZf`KkG!9(`DhXrJ0XriP[hB'U"imGMHdlN%aAG%&$rq((*plP-qhc1rMM$ -a*'JJdAJ+NE8#-lU&*P[d&,e%2@kNmPDh1JaqS0mI+1bN68i,CT1"8FlGLjI14cV -3F&#c),4c9lrRU68LY(0K9XlB"q0Db$4KcSF3-HmaZ(AUU@U+ar3)8a%jfB4fB'f -ai("jNpB80LH[UPF6laE[MmBrqIrcV[m"cQ%DJYr5S2&aQQ1NS-IP`DXUU50hUbT -Gq"@)&D&UkTQKhpR1bX`SifQLhb)&K+le1(S#!Nl"e%pK0[[[eV63BEAbU8$X5iM -H+rS4#!l0@$"PrZ*,4BEB3h$Y5j8I+,cGjY6h(d%m'IYZ,#hGMdHGhqrPejF2[%6 -'q!BXrpV#@Re'KKQ%[kKN"KCI6mRS5J[TraB[f@&ca-cZ@e8IPhCMN6A1!P)[PL2 -aIr"dqS",P#LMkH"d0@d@MRm[YL'a%fJX+`kYk4cmXTM@QrEHlV!Qf-FHlC&bZPX -+a&h1-$pSf!H0&D3AI`fE`KplUY`Th+A%ec'r),"fc[KrTe,4A%jQY&*I8'4ppCq -"l9)$qaNCG,(FHbGPEE0*i%0rSZM5Xh+S([bYAQ!IRGqk#@&Jm0N6@*1hd,-fb#C -J&NDDS30pcpN4S9lH!YH&CA'$3SEV+J9KD$6'q&[-!$d`J+VZaNA`G*0Gh6rp-Vl -1da+RQi8NL&9-Tb!U#pmDH3Q$'b!ZAT0U%6A0!8r2@&d8Xa4FP0lEUED8Cd(-8[I -9EFFp5)PGD6qb&+H@q#'lUTel+1!LZ8r4XKNLV"IkHG!,Aiia'2Cb'QS81kG@YT5 -c!TE4UARiA513!%54Y!Zp2FJU"Y5U($ZAT*Y3%36,f$Q&i#V&-XRf8p0d6Tl'd5h -E-UY)fk1A3&1DblABiVS3)I!XjV*c0mH,(PC2C43F&kAT[4LhNXYp64'JS(Z4d!R -H"h@4MihmIeU@6mUDre,AZ*5r6&qX4Z6B!cZjB"RE&lU5$&JES@[Z%,A*l6qjUXj -0m$rLj$MdlJ@Q'YM)B*!!TU"ffi-aKAYP4+pa5Ai8YLVL8D)4)%lDQ%pPU9qiPdj -"V1SC'*)%P-q`-c!5$b0q2FVVqGV)B"$*+'5YRM@RJ*Eaj1"qmSMZVGLJHeAL&`p -(XAl&d+GqbUr'rZkR(j!!(AZ6F-C$9'Gcc&0c,ZUmAGbR5BB-*5@)CU9'8,Nf#10 -BVjeY%(a1"-h-)Aehq2BbSPDXhq*lhjUMMf4*"PQM$h(aPT!!rb5LdrY+3q(`ppa -@c(XZ&&Hak(Y&f[P@@MA"*C'2@QK%h$JDq#+M5)H[VPH0j&5UJd#3!+U9IQA%'NQ -A,+)Q4#`&q%L!R'C@Zq4efb[c%d6[#VIf*j!!Aa6iJfPd&1-G5YmkIVqP%`[fhY9 -Z*bP+AQ"j-(6@&!Y#eIb16G$PieEacKKlNa&R8KbEbrKBprA1LFLqVl+ACZ-hm(- -GBc9Rdb!5)qhZ!N'G5$ADbk0[L[r#-%VXIqLJ(0R,jAf2ep0ZFcZF+hGAl0r!2N% -@NEEef-Yr@-Y%#PllBGAUjC'i[drp[aBVbPJ+TNj#-%!hT@je4@YRB2m8&2!$U+l -a%dKLhSk)(@bIU5l5k"C$Z(feY"#-X[K3YB#U+p"'hDkP"iBkK'38"8RGl,(r(kN -"cbT"KjJN4D`a!k&PCR3)X0m4*@X3f#eB!Y-[Xpq3!+Hb3'Q2XV,bjfRdaX$0G*L -$4P9E*iZAr@jC(8)$[4XekF'T+Kc'a8%``TE3dj!!lK-ND2V&-jF'S##PK-ilqdc -M)"eXaBklQ#E*RFJKm#@NKk%6j`QlYC!!i-dbDG$-H6ENVkG0SMFH"CmGQ[a*Mjl -"JqX`,5pGSDl1YFH!["CXMi)0dEc9fG3!NK0hN!#*(0m+f!)5cIP)k'BDF93Cq'L -hMFb)$B9NSjB[TUGIa)a4#icTTmN*9[K%[d+16R#iEA5@c,9KkX%YM,$2[mG$Eca -fZlpQ0(0C%NRNYa#F4+E1Z*XCXXaBVNBKBX'blMjrGGQhe5c)Y!A[5MH)%G-T4Q0 -F6RZaGe(TVN@mmcJ#fJarYAG+TpV$dq$%kR"he65&P%$ZNV,*K64jr3Q1&5p25f" -QebFrVA0eRG8r@"mm'ZEi8,85,96X(B,91Bm4J33Ae[Q%I0+pXXr8Pcqa8qVaPYM -U(U"pbTJm(@BdT5ESGH5Le"rceJ'03%'acRU4VbY9Jph'3bXP4Hj,,6"flZ&Y2IF -PYmqZhB5$k&ET1@0F`bN5,Hf1)LRIH(S'`(-L42G+XYlDkZAQUX)f@H05'PLh+-K -*,A%$YlGac5rjXa5pje1HJiF)#KKB&m2H$(*[rqpNG0iSaV9PSS90!RjN+)JYh&` -VpTTm5-iRNp-+%UPJPk#0*IK4j3jYhjTJ*+),Qed$m9,L9pc[9X6E!)de1GIS05Q -VD*&*k8GjLS"+G854PmKmMhI"Mh%cPr8VqRZ1&-G8Ii*TV3XFh4DAf1UV[k8pCf% -,RcXH*6Ui`'!qX[jEpk#Pe&Aj&(!I9L%[c#5I!,$0am)Qr30eS$5Y++T@"-B%BX[ -0NiNHES&eB+$dK2MiS%-XPKU+K-lRPf)4p)%9c,X`(0+&cAT01+e81EB!j61-UeT -0haX6CG"`6$c5jMJbcrh#pRL0dSkL$imrF56!Mf1r%IfLZHrd[+&"r##bNT6mCV` -T"cGj3ZcFMQXVX1U%kVARHpfH"!TfN!"09c'2eD3Y5VY+)G@6##HSGKc&M9b-+MS -#a3#TL9$k$QU@DBeT(+mbLV9IHBmI1F$rcH"ak#2fa0FU%ef9!mqCTRGlY0,MENf -EPq)&I%(8(,2qXrrMF@Mfd[@('4f@6pCJ,j!!ATPX(dmXZ@UcCbCR8RS1c!KT)aa -LR8mGb%TT5&*(V8*lNff'YUQpG$##[DlTL'eUGC8L5E(35jq[,0@KEacma%-LXRC -N!M$#i+Z@*0i#D")RP"58a8q8f(*acXVUYV[+H&k1$F2X+60M"9*MrS+E,f8E6B8 -lXYM4F2SJq"T6pS@$c&Y*Q4Zd(5PINN'*UiY#6A[$,6BMkhefLZpfP(e2T@66GXY -b`3D%GhqT)i&ZTkf5PZkk'+d9@Qh3A3`CQbjITGX(T`r',4XLTAV!Q%rRL@8*fp` -%F+-!I5pQrT+$(hHT")IAE2rFS`Rk&KTIU')E9*Yj4`j0,RXKDh2iIq**RD6+2A* -j8c',ae!IIZ+$X9X36S1CSCa0&'-8&MK0kRrRN!#`hAPT4G19Y"XJ6Vf!p!Tea1d -lP@h'ce2$R!rKhJirU8-l$*jm0FL,jLa24UCPbJQ"SkE$qaE2B"kaX-SF)6p(1TI -L$2GXBF[V@+$8#lfB(HTHC[R(P5KqTl+dT`5Eaj&K*PCQ2ac(m#PS4G(F6#)T5GE -d,dN6b-ICDGV%"[V@a'UTCi6#bc39S"`&TLq4Ecr@VYE-CZ2jDfLL5+L%83QqR@T --r,hHF"$68he1L8'4ESEHpX3p9I0ZpV+*FqGmEML03q$I1@kY!G98A)RdM+4SJmM -%U&[C`0)Mp"qFi@*%`rhic#5)"N$#i*Z"[-SY$623MiH$"PkDm+%@4BNml1$3FqB -HVrlBca,HrJ!6a2QbS522e&#MP*mFhM`e%5K`&N5JZ`fh"Xjj&PQqQ&NdKEIi!+% -(#TBT%ZpY6p3qp699M6@+ZY*9)kJ!rCiXr0)+P"lCAG[ia5'K@kKVA&mc#iXJk&H -HR201f5c'jC(4%$33'BH'9b56%p2QFr$HkM6h%8`+3'a`[9GD2M3#Y`GQ%MbU",$ -a"5G'X*@eGZPrX`J#e[Pi#aZ@e3qNkYd8BNiq$4Ace[d8ea#aL5qllXI0&XB'kkb -Sa-R"f#)PNr6QI6*8l"jZUZ&kqeZ%I8CFm5Q+5f[Rr2d([++NZ@iNU#C1-ikq*-@ -0d-U(2ce9+8ZXmK#fafED(&b`VT54-eX%1ajjZZ2[[aa5'3C(Y$LJ3YZ&e&[9JS# -PhPX(JSE9iJ1ICF5pI#X4`3+"fM1BD-Q4i"`MJY#@l[b0#RXZ3kpRbrIrYN(PrM8 -MLpmhke20T,$$3BVZrZad!e-AIFh[*![KUYU6EmdRqm&JJ(N2ZB4-"aSb[L)KE1! -b!h$FDhU0R`2lf35rkb3LAaeaYFT*ba[*IfT4QBN8mJ`*-M3d"[1'!%AJh&eQVA4 -%%NSrrd8I#*!!CIi&k2M*A4U1A$cYZ622"rIDHYY1T&6jYchA1&b0+G@1G0%`5S# -*ZD'UJ14G-$`Z[ekNC,a9dJKfNAeai)aklk49TJXH-&TDe!Z03rbCmql0D1rd1GM -dSm&SF+rd3hMFUlVbji!'VKX4p%)FeEe&X4PblQ,9f,fhMa,+KYf*HK%3#4*,@q1 -)MVI5,`k!Ff!#Q)mCG0Gh,TI)HhaHX-LETZ,3%[Y$"lb2$E046))j-P&f#XeHd[* -hA3S&5@LI6ACp'kSa3c`iTqJ,4h*2,`$J0@$3%)'6[mDQT(EkEYaN0[fZBU)C&20 -i#-d)Aj9IrPa&"JT&M46Dha&5TM69R*hcA-Q&D2MSbMq(X!TJ93lBN!!KNDNEBb- -)&DR,A'-06I`ZriNb+2E+9[b9KFc6A,iYq)Jf9r4VZ%E"#-l"lqRjU%Kl%aA4f6J -m6)hLeBV,US)12q'Y5VXm%08NEfSmfk@JlETd35-!rR*Q&GHEJRE,[X4Z%B'jf08 -IrBEG&qPlLXaX[(3VY+0@dqFSZ!!m'Y-JCS9R()!b[NSc`pZ4Jp1,B#e%jXfA!Ea -YV'T!2eKHc0L8-j%+m!M0"%ea&Ajf0C0U*S4C[TL%L[P+TchlLm()mK(kZja4YG1 -1p#TC4BLX023ceKU!"KKjb,8EUA0k@4!6A1PA)VVlAbC!S4XXP0!CFaMDFbdAJi$ -3,#)1CZHjU0#F(4365@*VG3`4MT8*XUr0A@2Y3+VJZiD2'PVIRmcDadq-"chc#VM -N6*'4&U9h2AT8A6"#%-"(9Z@raDk%UIDE+%'FC5PGrDRH5XQHY5i`#!ZMq+Z#@pK -Z(dpV@#G!*4e'62UimDhKh4Y091Y`$6KY[V(m(YmT1`aLrbYbZ9Frd`B-a)kED*G -L)r-K[5!XYk4'LT!!Ma,V%!Tm,iQPHTXS*6R&YNY5PZclbMMf+$&VN3'*N!!&QbG -qS"Mi6rIDK*!!(+"e-6&mqjbRI3A(2i2SR&@EU!QZ$`)PQ4jKMGAe#,hTIAm+Y"N -qX8XTHaP,S&b$cBdkY81(pqC+P8+YP43$'Xp%kfm(mpfNAa[-VX8!S#NaU`fNM3G -D)$9*1K&p4F$P[UH'CmYp2&L$QaD&)p5))P9$43I[h$FR5fRVZeAe5jUVCRFlbc1 -UZ)$Ur*qQKdipZ9DDcUB%cPfIJbPP`b)lXP8HGC5%d4dMG*dUpN@@bMPAjIEp$df -XLVNDTD1+a&QC)fpYE)ba8'6IFGL,@2,&T5+5ppi)6!UV-##ZUbkJ&L,#rRS55E! -8a`*kCD5E,`M,`6A!PkYXKi[RRf@i[[a-34%i2I!`B5jcqUC!V!fiZMM0Y#k0mCb -M9R[f8&#EYHPS(f$iehFl-6`dipHR3EYjjlL+GkHll%(bi+80&#c8V`cbP)5#i32 -rU-6p"0SY(1j6MP`D@@JbXM,0%2f`li1Qi5iDjKrr5%MpQLF!'ZZ`P-MUmU&k+H2 -MheZI[3&$9m%9kf3A"If9rbpklFNbG$ak4-RT+E&`G"8PS(RXRNVEp*!!MQM[`+S -*P8V4kcSUel6edp"%l@3iKLi2M5B0C+JfLLj$ZPDl5"EQ+4@er-iIc2$l6(Th2hH -l-qr3f5G@TXjHRfiVrZ3f)p&5TqDPKq5[V4@`&99m(0CDPQ#)4M%fD$,A(('b-R& -hB$8-'YU4M[9BrcfH43G)CVCB@F$ECP2d6SKU#K&mPF`83'P$S[r(1-UX03H$@'A -)c'$kCTJjFYiBYfIq&r0LhA0H)B8bpRfHZGJ5)hla(Bh6Y4!h0e-&-!qVA3EUVE" -iaES!GjK)pr%Q4,@)X,IlJ+U1%dc`,bcqJDS+SJ'F4M&@'X%ZXRS,5RB"d&EU[r' -3!!G'3!LhZY03d)2QN8293'e40[G('&2M$5C(MZ8RXkE[i5cP)f11VGCL"Ri)GX& -69+j24A!k(AKNlHMK4i85N!$aafm[2HpYr+Q-8rMcR5T'U$#Q2e#!YFeN1kUb@*m -Hj6rHU4#XAF*6ZA&%rQACa(@G$T9rUm9+)0[SEZ@em$T,LE3)CTN3(-[p*E"(C(B -1L"PK)*rDR[P-eI&%P96UD!,akle#fIeZ3*pL4"S(T*EM9)ZKk!3hIi@q!KB!XdM -&34SfQjm'IbkSiGF21qC`b"*J@cbKXj2Q56362cj$b)SfXEc2Sd'c66mCJ*i%J`F -T(i"[a+K1UeEQLJLcD2K&Q2Zr*#9G9Zma2eAdGQ8q6MXDf6mZfm6)aF*cqHpL68C -V&HQh8GPeH%XID%P2YC9cRbjT*86L8bR8fFX@!rKLFQX)ljm0f"BA'bZM1!U2V9j -SZLK&Q"#NiR,mH9+-lcA!c'D-M(a)fSH(i"(f[GdA%42XN!"K"NK4e!!CJGh#NBK -KV%5ccFK"6bJb%NT0LI`"(DKN'RFUEK*K0L8q50lV)YKrDKl0!bY$B9Gq1R"1RCq -aE+`0(4M2"b$Rb+56K%$JIA-c16p9q%EU$[2b-AFSLeFIRHEhYFaaYT`HjFTR"rU --k%"p1Z$%&h3F[dhN"V-c,ZNaKYY&pPhherE"MaHq50[dSc2Q,I&F9q`8'Mq!5iN -[c06RAqa21KFLFQ3QcNpV+K**R$a4'NDdL)L6D!r3rpFlk)B`@V[NS2$q4$BB(ZR -VSkm&a'X-T5Krk6ZaaT4r4DhILdHQ9"B2M%lp3E8cUL&X!fC`0!0kKYajL9bqCrN -RMAF,6EeZQUhH&$eCCSB-qKPA%#c+%rcV#3VPUr9@Zpcrd#iNb`V-P6GR-*[FamE -hmMjNQm&`[T%q0NaAjc&bi30XRfe&*M(dm6*rU-H'hl,kFN39Bf+Vd*(3'G,!Dfq -+rC!!6143X3SFEj!!M#CE!6kq)#dY!j!!eMpYC0le4j4`$cb[*Kq+JIl22(B(cDB -JT9NT#c#(9bVbld6#EaM!03Jk3j@#HSK8Z'mQm`H`Y,,)`q5E1@LKVhIf@Ip2Rq` -2Yj2B)+!3Z1Ql-dA+!HFb!H(0i8RkG8@qS'R6b+"iVlh1Gb6QLZ0i"`&E`plkk3J -RF5Bcd#cY$5rq("#kM0PX1G'l-QFZQ2[Q-K`9cqeRqBNe95F3Iq"(L2e80QY11Jm -c91S00[)NqN6TdU'aUqMPaK(jqD-[U3@J"[$E3XSl"pm(+)a5R-'#S'PD95C'C1# -f'4c0HFU`4NA0Y&[R$@KF5$*@'(Bh2NkN14pJ&h!)ii&GR*E)!eKa%c0S2+TXfV[ -"*qpJJ,i+qL4"aA04VPbHJ0cRNS%AAN8qJ-0@QcBY9B3[@Sr#b0*bRR8Bcjcpl+i -%p,2YadeC!T3Nqk)@d4bU3E'8mR9HqCS!@Ke[6Y4H"`a$cJRPP8-DPi0Ib+kC*LX -,N6JcPSk"QU,fA"$*,C'91qfZ@hXmBM[!Tj&kI9K2bC,DbPF3c5[RHQc'lCK'"CT -3(D0pSG*Qfc8!8jB0(@$VSkQGYVd'9mB-B`IZX-AaAT28920)CpqJX&m4063c"4% -0SG3!9TeiNlS1XdTT(jY8ASLC-3f&cJJC)@Kj[,V1iJSL@m!VV[e1c+N!C2YdT2) -%+@e1'f0D,+E!AZi!MZ)MJRI4R25$'0Xh0'Ya"3)a"ce1*fTT[@HR",+Bl43-Vbe -erUlN$&PRdeTSDVj,0K"PmUAa4C[NC-TNhdTeR9Kmdd1dha,HlPkSbZCC[mPel&1 -E0edhh)%Yd,PA!TQDkE@&TAaA&hP+mqdS5)-bdK8lHc[+h4IAS+U5q#I%A!L+0aM -ZK9MiKBHl)$!0)%J2Z&+GrCT3ejKKp4+bD,15QLMY6L@caf&NN!#1Ke)-HA6-Y!B -%JAc5a+4#l-!YIR*kpekT($5Y%1NS+Ipk6CK(pUa1UJpYEK0%T#$VrMb',RQ'lXH -dVV&AfaNVYLb!cCI2-59ZQdJmX,2Sfp3bU6D#a8ADU1UhX"RlI+!I-344i#l6i$p -*NK#)#XGdCM'`56VfSJj(pHQQP45p-&dU[cJS,`QH#YjBPD-A![rZRpJ3kGAVfRC -Gl,a%iAR!`Rj'GaNV-(Tr8DD`cfF&3q@jXI2(pU1bIij"3,AB6@LSqf2Q!MhBb`j -!+X5jBU!8A+X312VVhHFJ1m&9@"Np-ELYBEJ)FqYAF+NGJqj@(f$G&pEdZ9'e4JT -F%DRVI(X#d&8*0k[U)bVlk-FrP3-rYAfTRb0VUlRKBk*jVG#&T`FS*@2F8Z1@F&D -*HR*`H33[8+1p24@[l&(X+*T$Mhd9+[Hr1TZQ'#MN[&V6`[U"J0iE3jmUb&FkKT3 -JQ$1bmL9*RJ1lh2"df9b4%Gkf&3pSN9q2r0-&S&4&+3@pKKce(Yq48H#fM2RPk0E -eT4PBF)iJ8R)$beCQSK,bN!$e9-p2U9XaDRmX)q)6'ZTAXB&),KK"Gh6P1DdHYla -h0X8S(!`@jhK-MH)HRFZA#-MJQ`qKJZ+p"@[,hX1'X$(e#pd52dh#[HBTflV`jRa -akZNrG'a(Z`8S3ZVJiUib!K$9"hZamb'@"fj8CX!qM#E"i0,$aM*#-IqQ-l%[#Cr -C'LZ41M$HHVI"YCU1ZXj`ji%mT(*8J)3fD1bJ#RP1I`HTV0Ad0D#0)$d1Pd-)'Cd -5#hS1lCe0FhmY$2GD0-bK(d$Xr4f1!kBB6"2MFFIH@((5GcK5&k(6$j5CS)$j9dl -hf1R(1HK5MEBTqJ$@Z1&b1RAZJMDMP)DJ[8)Zqc0ri*384P0!3biPH,E16*Dc4`U -@Z&R+#p@IUC*qMAJMP*BHMLI1q'd-k94UUPFhFq4H!VR"L%e(Y8Rp#m(mPa100BS -SL%$El)ihVZSUMVpDFIeXY,S-pd!*&UC@m(jY2%Pjir8CT*pEL)jr(ECc0ZR@(5T -aSbIP9!ffdRL[!$SRI[)U&LIhL25dF-U[a#0c9@'SEY%U9FAP4&K3831Qb(TM"c0 -SCH+SV2'J8,EAAP011DR(ilTc%GQeHL,BcAPXmk`AdVb%Hi%ji!P[#Z-4k0NP3Ql -JVlk,@bm181bTJD1#&pPjK8A13cJ+qFpp&FhQJmNj42b"'pfM([9mN[VJi"B8hY" -%`8'fMT@5TUQhU-"ASjQB68@8&mQrqEJ!FG#bfF'Z*5bXP["dH!4Z+EjcN8dMr3M -6IEl"b1iHrD"'NZ&`Md,Kq*2V$MV4VfV0Z"Y%G(9cE,"ETfD9X[VQd-r&A393a$" -1k4hr`QE,q,94qD!6340-m-"FF`D,Qj)#e1YpV4QkMNBSJ`K*ESl`mla@cTIeU04 -PiTPZp!(C(pr4MZVGf$l)dhmTF0GG#e&Xk6ibmIl013M-beBE[3rCC-#U3c4m61V -PaAf!VMYkA@B4T'*'#IVGcI#G(fYF4-!*IQP2PZ"QI*(V&KU2-q4)#Z6VMB*pmG` -0rP,jla$mV3Dmk"+),9l*48p'FQG,RR,4SU2j0qQ3!)3+-K*-2&ZfjNHcC!J*BPC -DfiY1Jj%mUPS99iNerZ*`V`FbCVpcZ!RrMVVi`hq$Z8ka`KAle%THdKp6IDKA9#V -d$efU'A86"JE[cZNj0E0M&h[KfAU"IL9H4KT6je&(bCJqIl0FEV!bJr,dM,H%RfG -X#Zr)113#JrKXL$SpeCSLV,3"#T&,[k)YST'0AGJ5M"aT2l6lY"m4ece(8k%d`ki -QHc#kdZ)4Y0D2#NL,kaeNj6!irPB4JS$,HaK*F3+EY2*RlDe,[A8"ek!TS`@N1`$ -QPFUPXeMR#c-YX5I'H54,cciF826#mq,ErTF#!i(BN8%(H5IGdp,#R$!B`I9[qQG -kma@93+"F,CQ+d'M8q8Al11!jBRA)-9*mKkI)jiaf[kk9+9BA`J(+#(6[Ue"G'&V -F`JGXc$[QX4#V"L#qaUNdr@'Zq9U+Rd-QYG'Bph`pDbG3N!!Q"[q)qiB(YkKSrHb -(GeZ3!)A**`XhJD9EI["aG6Sjjb)MYIkh5kiY$$c*V!jNI6TTjbpU,iVKi"'jLM, -2&ZC)!h288,bm8+T9@U2QF4'Y%ZVFDK9SGQ4T*QYUr!))18+ma-A*9d&La!2YCl$ -Yc`1lZHIrCCe*@S&N-VI+kVH8V)[P4I%LM*!!`[UMCj+ZFmF"ETlX&'8LFTf5%CH -1FIV",6dKLGAdkE&X'RSPUa1h'`RP4QGNL1q!FkQqESQJk3#8d+-c1r,Rqk$"*8B -ELTV4r&'C8$pA8Ac&eKeXMMIDcSK4NGQSD$kV2DQNCU%dJT9*6[K(45'ICeh2qNc -M`5	MX%S@VRTDL*e$Jim"j'GdLlJ,jb-q`$$)hh!'1[IJi"`QjR!+[N[r"e$al -`Uj9CaGiDfC6$Q8)RTNjlHrbYNF%Z69$9[J*4SCI)1R,IrYB'IAp6$GBVh`Jh"R* -#f-+,'&LkE1P&*2-6B#Cpq+lN,FLD'hriK+rh0`9b0+jHq%!hFmlri(c"8ZfZj)0 -c`TcNd&K(jb%LD6dN4`"cP8R19-[),b3Z'Z"KqGMje3*(-D+m),qLT*5mQkHB9Q+ -i6qDb'ZrT5IRXNZ+bRLr`6)*bh*%e(!h12M9dhI+C59%rM%cb8EbE"mENYr@j5P' -Z5MaDmFbTH!)RFKa%5FG!&B("Dk6U&DYGIcKQdFjrE#f[9`P`f0H4L4fH!qcSJ[c -Yp(Jd0[Rr3Z+p'DY2IPk[3bcNE,62E0E#KhlGeD+U(%"c3LJ-4)f$h)8fF+3'@a) -NLSd2@-QGQ8S0Rjp&dd4BX5mPVDdU04#,,CGfk3Um9,jb4L9)e@5dJGE5%hL#HYr -M`Ic6,TTqR)q#qRdmr#b[dp2qIl[L)UB-+VS)BAX-j#AHFMG,RF`$A0aB1GI8F5R -GTUe*$8,CM3ANCqScal$-SG(),C%J!eD(d-G%8!D)FSaU(H9P(L@''TkiT2fMc@F --SYc0"L0N)A'&-c`D5G0-Uhflp0fP&+2,Fr[2`#$9LVU6MX%+MLEr`B)Vr3`4Q'q -U"#aaC%Tk`3,VU`Xp+`Z0S2H4eI9'ch,mGm'VjUeZ$)#X@A91l[8X&jfTM-,9,I+ -C2F&'B-UFK)SlYmf3!1qqS*E+[Xb"Y6&1&`I*b%4-cbl1(FTbS4)bG$-icT3f"13 -N9H*GV6qKhBqL[hX'S2TQXcRL32e6TU!1*-1Jd-Rq*d2$lj!!c81p2h!p,rT4d(Y -I-bKcTS+(r%0LJlQL!!iM`LL[S$DLca@ZI[#U6ChrN!#S,PJ&[pE2D0!fj%R'aXc -8aTREr6C['4J)bD6I3`$[#V9KM"U@fYfdhk!m+j)UH(0%rV1lRLAZBaEi9T6BJ&0 -Nb!HdVe-CKpiD'q"LE,6E@A8!`1ZYMGEr5@kJd$#5EmJR'D-HQ`pdAYjQ&DaR,59 -YTZ(U5jc0VK`LSTdM`-43H3&k%&V['IV3"$R`VbC*-&-h&i%bC*S-j'kpSkaQeB# -HmS1FrAE!ME,2#,0J)ZVAMYQ0cHRh'pC&D0[jYk[Y+"#3!+0(YAK(jbXj#d,)ELQ -03r'Lq[,*0%i`2CNqUb!%4$)I8X#qS2AAq+8liEMD-Q58I3L#XA,)90X$3DkN5fU -Ck@0C`p5"-S(S+@"9Lj)H@!4YpqH8S+&[4#qh[D2aFqm8P-Il!TlhbhSFHAcXb'% -"%Ie6d1cKMe%994HjBZ`3TVh$hPCZT40T)CG0LZ%,S"AN*BPQ1M0i,Dm4imqY95k -)$1h2h3T(ff3YQ""Z"prJFbB&h5'VLADH29#@A1lbD)8R1#hS2McaAS19E$$f65h -R#f5kbijQj[9BF#-GS6)-AJ9&dqa#fTmD0S$PIQSG$1r6jFj(MfL'N4&RQ+ASM4d -TJrLfrZkk0A#8f2hP6@cd##2pb@hM+Vl84+-NE2%lRmrLkU$FdQH*9C@BZfp*IQb -*F1*)j,!I&$CXEf@iV4%%M6+*'cQBm6TC@SpbSLXDX9DbM(jfcq0J[lZDX3435(G --96QDV,pm'8@9IU#NEEVB0F8GRhN59G@EhKEUY3T#"c6NE,*VqK&@N50`p%&H'[4 -A,b'2kFCfMLJHaYkFmfCV,G!r[f(4b*aH#m$YbbS@f@hrcLbi*6V+AR3(Pe[X1@8 -k)A5a'1qkjUGHUUVq%U5hPLqBCr2LMfDaj2GaGJfjdmKJ1LH0C!9A1d''fHeB&l# -T*+pdKQLIL'He0H,a+84)1mQG#ZIe'9rZU"%j'pph`A&`DrBeAD#8)LY`JG-$TTZ -N"%0pfJ"$XfDVk'*aA%3lZGU[Q&(X0%[E8LSPc36)@kplX[#X@LHlK@HIc4G`XL@ -),e%miQ6Q1RHj)kRH0l8h'$BFMV5#Bfa[Y*jajlJG`+@3"!%!!$m!%,JMfqki)p[ -Z!!#`3J!"*+%!!!%[!!mif!!+VV)!!#)U!*!%$`"8De0SC@aXFbl2J#jiE@`!!(2 -"9%9B9%0A588"!2q3"!#3#S!!N!G#`G8Kde44CHa@Aa`3[hE5CGaS#)!896!%Pql -CVCrYURDGQVlm$Ape4ScZU)EUBDP48I%b"k%HcMm09(R@U,dNJRN`a!*6VHBFVAi -mZmJi4B[%NaSkQ-b6Decf0dR@i",+Vi(Jd9$"f2b)6PkZ,,Za3%VYSTpE-5rK%+S -DJ*EQEhflGQ4e1U2E$!CdMQaV*ml()X+3!%5,S+ISH5%Kj[L-h3P$KqV0DH3hENe -ZhQqR),'HUjf*+1YkV@N)64X$50L!PJDYYUR1Sb'6Ta8@H('UUF8'11-A-,AZNlj -[A&8k`&pTiNS@YTk&SD"'11PY969@L3j)Sb!$kM8*dKTKdhaL%Hm,[Q4V-r8h9L% -rJS0m85eXHJNN'V["'I1+V,3pc!eUS!,*VbCS!j`[UXCB$%SrdRbq#,cAR2I"8-f -F6S@r'k5kmBRFb!h0)G6YP&h+(4a(rFi290)Pmdjjj*PR48#E42V[-KM5k*Q664! -m-%K`d(fU''RKQ+L3!+B[i45+&Pm`b2$HjQbEZ`lCDLLr45RBdRF"bB$C1%Pi@G0 -`00&D$ER(Xj!!$"95M5Q)[!b#FecpDpJckUqda4Y5SZ"6T*@'CkV`RYI#XdVdIlj -i90+SB2*EXJVYCpQ!X0UPr%!Q*-pVPl2b26%kNi%LirNF,#Pr)eA&M3UFAp%pHE9 -3QlI9qU-#dmS)dl+3!16Y[H8Ara#,K*eM*R9@j93HLX`L&X23#SJQm*4T$H"$)AJ -aIMXc8C%ER[6dFa%kQ[CEL-(fRG*YH2-,pZFh#ZMHrHl6FXjKQJE*d%k0r&+RZAN -m&65L`K2Hh4'92QP*@qTa@c"TKD'*cpqED*!!lJBHAr,ZN`IZBEZc0NP*DQN52&c -2VN%jG8Q9&+dI&m#mp4Ji,4Qj4f"Q#9MF2E0p5m-9Y"D#**%bGD,,,,()G0T!S$r -e#hi6T6Ih&G(ET"-[(")K4(J8fk'kMb[FDR@,1p'3!1rE`GV4Z"F0*cmJ2E`m5Si -H%4A1JDj$Ph2h'cFq(bp)FT`EqhG8#D4q#*+%(K0#aNAIIp+CERR6M)f-mLjHYZG -NreMiDK`*b&)FSk5ad)rr`2"h,X&DIT1A4J'THM+eDDGR'[SAiNZJaje'e"UNdRQ -HJ!0-(e0aD!5FKHZDkE($XkY@SZhVp)B'#fG"-l08VM(e)(J,4l5+8STSG-FjQ5Z -#Y[YJjCCP2`KaM@!F4BU$BT%qUJYjc%4`6c6F'5**#ZA!ZQ#@3N(3[@`#h-h2b,a -PJ'Z+@%SU#r1YM4TM"U&'HIad@M-[(G'1@GAeK61[@61[lMJlLHIUZGR1hXb@`T` -1$BZ5&fXbm!lD9,#1(Jedk,YZ)KPcb+(V+SqR#hpjrKq@Dh9-G-D0A$V`49*cpM" -U(kMLLfB+0Va+[J(ZL5ZPm"Jrb9bfb)#+hU'mIU'lqr2N`)jYCDULMqEPTpNhdAr -Y2"A0-lPqS"$)9"5JZQ9XL)krL,mCie@![C,V3#a%3&XQKf[%0`,AR@i!M&IK$`H -4e8(&ra%mU51$j0-PS05Z)"@5@Dl3Tk-B0cJ8j`X!pD0G",8[FKXrQEp,RJ-%mX, -j#ap`dXe-l2aHU-,)6a*X$Zc9KqTld,0+JX93MMC"$N10h+3JciU,eYJd%Xl1mVh -ENZhr#14MN!!YIcEBKlZ*B,h$bBCR*c5*#hmlA02*0CfV)kSh3e6RbZDq-T`piQJ -I$rjGjU(ZII1J0%fiT582lYqUpcbqRl!HDY[%!-Xq60&89$FSAH!iK+SBdZaa*@l -$@AmDY2`Ah&2)M3AGZ@5R"KA'p*YF*lYXL[S,VFH0iX9HH'#,$DLbTUr)[ieDCmF -G)1-H2r1kkbi&Kim*HIU,R&-c9Lila!4h9R&15KjYqS+Pq3"rP2%1BeE(b%&UBPS -&j+Q+0)&X*'3CcQ[0(QVmZXp-`mN%F#VAT1&jCM+U&@&qN!"E2c*q[Tmf`KL%IUp -!cBU`-caFXUa'l$[ljSKfZ(*dqU)c(kI2hAl615BTE+k2k*60ibU)'+M+69f&-V& -[L20XjQEU8B#CD"rbb!,qZm(3!LP"Yj`F@(p[B@D83R$),(e1qAMc)qHNYNHrNC@ -L*$Yil&6jkj`TbKkHT!&@)5Bj%L"YKU6YH1IDPTmc*E9Tk(MTkXN)*bB`h&'Be2F -NXEBAkISYE`jS()RYVITkEIqL-PlJ8,EfC1DDj1D!MC8FBIX0V0EIaAq*3Z!cd"9 -ARf6(Mf@(2RCmSL1EMQ@UJ2Mp@B5*Rfc4&c5!1m*B5&+ZlaFR,E$#cAhc(cLG!EP -a#Tam!PHL1i6(jj5KDE(V81LGNAG,-f!La"+(b%d"!B9!TmDM'mlZNZ9T"ET!!V+ -3!,``IMQT$'2qB+!N!Ie8-bUS@cd3YK@5Nj0c4aUe`ZrVDhkN3G89Q82lH%pM4+D -E*pANYl$"MaJkV`1ZF#L,aXAlT,XDYRDeQ4fa9(,h!rHCCY(!d*NAdY*ad(*DF*` -1Qd4KVk'ZLBh0A@3KIJC(+RfacV$V(VMebPZd-Tl*8!8aD6R'YQa5Te+kXG!5'ic -CXarBV[Hiei"FdTjaj-HHIf(PE6U"r5V*-$,G1*`mScih$+p6dKbJmi1"l"r+9ai --58-rXJmfXHSq4Xp9b5er$5-pG0++X5T"Im0ZAcY2e"RVFL,a))4AKpcb4G2GH2a -1-q5MFh2Y!J,6C6%m0m4iZK5VUQ-(`aD42UC9U'"L+ka-aH4G-T!!2'A2KAYmQ[N -`VFTif3r%bc!4#bBlMYbM"DBirraQQYm[2j%r1J#Q&m98S5BV#2kqZdZm!"a"&0% -KSXHM@1DS+JilHX#Y9dj&bA'fcQL&8#U(JN$8'X")+$HI3Prb&Y692%a#bi+*kU1 -3!)BebTcEBZLYJQL&)TP2LHKJPM2"mCXP(#VPXMZHK)CSk9EQ0ccKDZF!Aalf[9- -9%5&DM$(S99m3Gq1!5[*Bb+alQKSdqjQEdGcHjF8CBN)-!Je#fm1a%d6K,M"bqb3 -6M#a0X&LfE-(eRmAq@CHK[FQIR4iSeSGacdMJ(k%Fqr3lQH*53ePH@q8#EAh93B` -@RqH&ipI+"%KSCEBj,Y-hSXT,Uh)#$*1QYhdD,N8Ka`23fL!HPJEYm+RRq`4I$3& -AI,PSAA-Z$pcb#m)8HN[*!3FGR%fE''HP9b%c8bC[FNa,059clANaC88[QTT9P02 -F+A*pipeL,h*V3"CPr1UUkmfPMa!6TaYjEC`mHClhY*CK@Q1Eq#QE"CUp#G&XIYe -2a&VM*Mjed#bMFFEd590[qj`,3UIb+d+ik(%U6'"c!E1,jKV@lACXqSQXU"U['%, -%8KqM&HkLk,Sca,1C-6cpI*m4GpU$qNa3*NQ@9raqPQK1IEAb*hlFfBZYi5)iEJU -kh'p3U0CE"Ad68!X!PLkM,a!KpZ+(6JK[,Lbc6SaT1'%ZQXmH5BCDjEk0C0C&G`F -69F'd8L6Bmq-e9RrfG89iXl35r@G,QiHZ&9#1*DcFBC!!%KR(Zb"r"F)N4bZ#iVV -)R43'CbiK92M9lrhe'P(q+U"++iUH#H)b*SG0`0ZJ@K)FDR1,MpNb[bA$bPa)`jR -X*hm46ppU(k28YB[K,J$2Ue3(5N(!dZFe6reZ,eRYcE1j*`Qrr#2%d(MRH3dp5lh -!T"j5$CMZSYF3AhLBjBHY'LepUJE3iPfjFa@@%%Ia+Hl-X+5`CEifNr(DQ+GRYCl -!4J*q*!*Qq(5lGPhA)(p,A"@IBPph,+9reP-%kFQVrSaEbEd-6drj(e1PK0"Hb"f -MQFXNqmBpiF%*JY[2lAr+lpUqC3XVrl!$CdQV)F5#B6)peQ4mcM#jF`3)a"5$G5K -LDkC)mGL*+f$0"FTcV1hKh5dP'BL4hV6111[3!Rek%D[-[N'1@QeH[-,`lT%JkF! -q68L2lTMENaY`L,UUerdmYUNKrBqXHUcIEB%EY#MJ-KGdi)aTLKQdZ8RJTHpY"IP -F"p,Ji6N4RKeME"j%YPCp"GD%N4$"kdRdk%iKJEQEJJa),AeN92*-GjJS%&'XP2% -F%@hEBi00DBfD6(I6+hqY0JqZF-rjP(rN8BIQ'k-chD-M@Xc%8Fk%"32&Ul&9%CD -TmSS&1Jjl@0*P48Tq(k5j,*3*r)&e23jU&L,PXEkZ#IMYjHB5aVc$"cF)V+FQXmQ -ifc+XEUiDMD0beL$DL!kh-5lM&b*CCXbFDC8!RYM"Y`"#*d*Qjd@['mKfNSj'2N0 -N9!TNF`e8VAJZQQ,,Z(rN!l`$hA!0*)GhZpS1G&dBak5#j-"8CA&@j'GHq5jZ-f$ -jcZKmVq`jPK$r4kiZe%-6[Me5*S,bJVieUUHID*jr60A+ia,!2")FM2E'1mI$mK* -C1*rCZ,AK-"lpAQ+UFaU$rQ8mk"(,aCB$3*&#*Q3&F1*)cLL[AFj'4[#lRpa@hba -3GCl1ic+0RUSKb+9Ge2P13QTEeE)f![3[lR6e%RqlIL$YY58*FIH!TX3MZ%+ZT8E -*YPB'ISj5Z6,I",eFi"!mZ)dkL,(@a2'8-qXNh!R'Rbd&@6U1VAZNZP8#L0%IDkB -Xf2Q09dScFadjZ4&ic!4S"h'Q6$Yqr4Y'iT!!V[`VaT%1P3bCc#8B&AhCAH`#ZIM -ZZ)C8N6*GL8B-ISYI9eM*eq,S)26SIA@9N!$rQiZ5%kfi2'dqcP,NKH!)$P2ifcl -%FEh4+RbaB!"Fr8hVr,edRKEhN4#ipAaRD9Eqk099#!iYY*!!'d!'IfBhG`XQrVr -5)1lkHEq#)NbfC432Hf*3U,"@8&YrrpK(jUdZ!hh'5`q"`p@T`[5qF9!6&Hpp*D- -I((jF,A8I8C,fi%ZR*%k5CQB&DQe[blZ'RI1[IlNpUlmcGl8j(q0m&4PVK"eNVdp -aC00I%AN0q'Z"cY5`jPTY("#R+k42#khi5(maU"U,19r"1`hcf"9YCT*L,Y*kkpd -N6EHTKC9,fZ$FU"BhC$DYIQ#3!,qPIYh1)c3JJmrPHUEL'1)#U9HdMKP(e)TPfa! -rlr*C1HfQZJia"pBdDL*Z%@00Xc2E6@5f55Yl0lfaR1'fU$hpZ2Vkh&Kk(FhmqP1 -)2Bf'Qh"8a0QE0pQlqDlme%3FHA2F`UTkjmd52&10JC!!(hhV)aSUIE`kS'`DjA' -Ca0`(UDqJ4%lm9E&4j@*4#*rLM"E24A+3!1X'qNpebXVj9K'EqQDXcY%rm0B4KKm -Hrb@G1))-6Vm#jle"EK#EHHmX2LHc2mKNF21mXYHfDBL3!-Bc$,SHf[A1pNrFRF0 -')`U94#*(rV8'T*m8CNSj3+a$JZ"%b)#($2T!MhKIDSAY#aJ3`3idqkN*Y&*FXT! -!qH(Xj8SKarTpe*iHcApZ#6ILPE@NMmfhFB&liCcjEdI0iNL&0YBC2`MH,RjbAkA -KbpL,MR+i+chEhDBiT86Ue-D,Ce8iX$bNBB4%4dbY8l[FqdVacTjT13iNADjZ"(1 -X+L"FLR-%FdSi2r)YFmGb'PbcSLd82f`!K38A4MXH@P9XrZ6CqQ,FUJJr&#Y[1I, -jeb"IKf33Q$[R99ChQ5%YS`)NN!!dcKfPe,`bP*A35AhZj&h5QVPP2p0F'0rAQEX -CPHhqaI9FP9*GC)k)$qk-+Pi!HT6[hh(0hqFp2IIjpePJ!llX,@UV)&Qk`9)cj8M -0rpJN!XElGm8#5PBmr&`MSaRj*0BHZ9F$4lVJhaKr$,9bH6)fNSTQl0cqh&V-U,c -"FE2f"%Gj)kli+fcDP2*aX*!!@5X5NkeGi@)'P`,S32Add9PMk&fc'Ihm5Uaa(+[ -f[ZF)A&Tp1XSq#B58h"KYk$frZDc,BK@CG[eQ@Z5P`fYJ*aak+Pd&Z8jl8)6cJQh -3blK(9lkD[f(CaXZk&M$CF@8!-T3)AT)-59#5D6kVIL2Ta92+'d3-EE'FQDpZ8[G -jY"XZeT-"i!*(DEHe[MC8-6&[VPb(Ifr2ZVd(6L#86p$HV1[21fLfRUjd9bC'YPp -Y!0CmpD[8IqVMJp(hdQMbH[i)lBV[pGdMcL6(0"`6Deee(eQN2CYha)IIe4mB*4p -6`K'(CDp3*N05&LMDA+llPdD$RSeP)c[QGPQbPXP9"0Jbb8p*Zh8PI%jFI!(P'0[ -k'X`VBXjB9@FMSRZcH8DjqUAR@R504f+h#l&BbP+qU'kNUJXA6#mN8j3j-5U+ILI -BRfI'6lQ@XA2qrl%0,&9q3`lVNY+6[k3eEJ)5k5pP60mqjXXM`a3"R`@B5,(h22F -UV'%*-6%jdGGdM"em&hp6XU9d3Qj2jUZr8)[fP*+Hc%G[PCUPdVhaY"Vq*Z6)D!- -V2TpQQbfa*E%Fr'6E"%NNYf$dM*5RXXSVUiI5AM2Hk3JQG'j1ea1LGf+l(L2FhK! -Q5XbTmmq"[JT#'3#q92*VdmCAr$#RP*!!ZQA4F9AD4cl@P4BNNMcarCJ@1G`2a6N -4L2"Hd(#$+L@*2&0Q1BDTlEVF9@mFQ@)V*0V8R@4TJp+,RYh[I)YZd3'N938i&ib -BD-J&6!%T'',Qh`#YE8LMrHIE8&2-HrqIlQFBTNK9im30#r0NEbYTl&S!DBkfbZR -1,epCDGTPX9lG,!%mdGrIR)`cRR$11m&M0KrF2X%6G-j*cC%0'Y4(hA"Q+%lq`@2 -YF`S-8k"aX,He-Vjj(mSmAY3D*3PE,F4J`hA8LQ%CF"l$Ldf5K'(8E-Xh[@iqBVZ -@a[R%q5&!"lNK"GCXRhifED+5486@E%XHAiiQLScLh*UF$6SJHTM!)V&+BPGaNM# -@S6DD&hii10c9CZSY'+eTp`0IP5NGlQU#Q&2jp*1V`aQ1j14F3Yarc%4q"9ZhkRI -(U1DVFfqf6MRm'cmk!`KZj@-0aPTr48)%KBel8fac-h5[kmU5QYE[le$C-`j8&4J -AaG33j`-,(29TPVjGY&$aa-(cT8@qQMrAfQ1'Ni`SrQFU4l0F8LR$HD4BQXAVCSP -Fr0'J*9P')e!'!d,CB18RULLc'kclZb)aGM$GkCDp2iF9-0*Cp3LDDLUXGkX'"Mk -aXr(jrFMb2rq&*$UM+mbX*"3!U3NS(YaT%,V(SdL8CT[5aDHh1N`YFp4,`N5c,J$ -V1iTLj-Y%N!"26qGI@4!c[,Tk9(fkK@bI6r6I50j2eYQHLH43TjTe0h3)IB-QkRP -G9@RrXH#lhMEcGpKk(D&%#[bTQHEUAi(E3V1e*L8bR94KNF%EGa%Z@KU0!%K+9M[ -Q@0UrZc0EdVfLG4XEjc6jbBYeU8!8Bb$JDpCCjHNAIh1Bhm%UKm!D*fG+IX[*Xfr -)2YC,ji5IVb6h2VdBj,rX8qQYPIRTCmbfd[822j%5++P*'6+dj9a*2QSrP-6im#I -kcDAa$4F89`PkJbhTYpcH[pYNLR'0KYCC*HmMZGXS3'aI#(+*(@QFe&0Z&,ki2Pr -fJmFDJjf3!,mS03($9d5f6ciFiSfZ(%FT61*Sj'e3YVUeT`,&(b&S$2'-eXU)[ra -5LVk"ZX!kS9jh'd*GhNTcS+C4*U"H+h5&p[5fe4FaMiq*Crf)IIim&FddV2YKG'' -l#2EY-kH@@PMD0`CXY5N8DqE$Y(`U5a[@i*IBlbK%HCC"(k&&eF*A3j8Zr6E`5J$ -9b,Q8EaAi-NHFNBDCJN)PLak-e5q2Y&b2hXK(33cSaLDh*d-UX3UN*a`GhBfP4@S -'6(LM[Da1d#DlPA4[XeeeAXC[F2U0%ZK-k@RSQ99AI*a15!BdU2"'Vp-HhLXQi6q -8dG`#1DP,q22L[69)EiU%qG3XYaR2!R'XZNEi+@XC80b!`fGU6@%R+*q40N"hFUq -G`-)*Hjr!6AFTK81*pcTZV3HQM3e@jB2dmT)kM%Upk#UhH2beN!$UA+E[j#PE$28 -aaJ+hKM32'q1LF4AaGa@"(elE%2#VP!!0i[!(U`f&TLcLhAZ#D6bYUHiL%QqB9)N -iHN"5)QDB*$!F$L"TGaTpAlUS!%-VdYKT5j[Vp'd[r320IdmbK*GHG,@BKqfL4@i -qQh68!JHMkQ33DaT&Q&T9[N*-F8ICh*NbKp#CH%3N!G`C$*aKlUQ&QUm8I!V#F5B -KilfiR$LD,C!!pBhI6R&#B9$KIb6D"dk2hDi4E",EqGBKdFfYJ@PF,r'XALT@A@V -*G$kpLL1B-$0Lfd-QXV0dlF#AcdC1`lPfC4lDTjiS%h$dp0ejYf6iX[3mdCcdPEI -pV[(@UYJUM'jGr#Z*"PE-4bXS&a2m+M*#10B2'CH0[0`30l5,cGqR"29Ec6Vlj8$ -JMGd(ED!DmSAAFK&,K`@FVH9e"-f)&ATrD5FX1ZYLd#BU9,iImU-Kdm+Rl+`[46T -p,+P%TPIUeTF-rhH$U%VXqTEB2fSbAAmiA%#&THG$MF$Q9U`cFmAi9Nb3!,K5la" -#K@T'NC'&lXRHkL,i)CEI1qT4-G6KUa,HG#8q$KR&Mj&,k$`j'SUbXeAYL"aPhMK -lNmkMHmT+qhpG$kV`HD2`%HA(1@#P4Vm@5HZ(#ccdXpNRm(a69-h09RZfNA2Y4"C -aad$*qYah8Kr%U'iA&fcE+T0YUSr$LS4DQdD!DUEDml6Ta)FGlG6ep[lX2qli4b9 -h5j@f)1GYShX"Vm+RKAjG,ck)rMVc"r&*'d@a44K&fY@$XLCG+YpX)E5p"!Q(`AH -+GkR5*+9'rTMFqqh!hQ8DZrZK,Yh*!CqekSSp&+TPkU)J)ZCAkDa"C-$H8rP,QC6 -I%FrQ8kIpJ+*JE1#mC6cp)CG)`#bD2J9,+[[$T"F$A**IHaZX)RS[(BqSq$pTXbr -JbQ)bRlT*Fi'AC%4q()Q&VC[Kp28Yr4,&$2I5$K!R"3H)(*6HNFaH@jLGMG[$U0Y -I'r@G$2Er('1eYh3rqm1edpUQ0PBEIIMa"bkrQ%F9,G3&djFU-q4hAq2CMKPjqbF -JJ*CD4*Lci)`c4+NaJrcQPmih1*jpT!A2"(pljHP0BdYImr+Z'(m,-&IcDIN$G"( -6BI#YRM3mR(i#LRT)BrMEpHD#rFD8621QQ6ZRI8e*qfH"NQmGXZ"m,@h`9G8k3LN -@LSED*%$,HP-`5@-e!lk%$be"C4c+@U&SLrRM!-$19U'k1#LG!JIhq-Km(6J0md( -B8DD[B!-l&E09b208H,ldK4@A"qZPapHjIHjHDLkErV6qL8#DjfDJ(#[#Ed(34N) -%"qT6GcE1HMYIl5Cf1K*m3"lp'BK&2eYI%"4eHelV!Nc2MUKLk9'80%@l3'ek"ih -FR4Q+AGfd`cDG[4cr)"$6NdAQl*!!T#Rm@EMdiF0FRlecpjE2S[@DdQ)Uf0LaS"l -&"N@halU`FIZ91HH'1hS#PEf,!62@I%GCB[&d`NqJm-9+GbZX($'M(,dVDXPA(Y* -h`S)E,lXC"Q(Xl5#''0FQ3l9(-k5jRmbp0Kc2#44p'N3Yfp#GZ(K2Q-B90IdN+$Y -'-0"[GK-(F6k!q5XjjRN%kGQ-@0MkMD,F`6-#8DMH1Ji9jJH0-(3QIQ*QZqcP",2 -BfT3)#ifq+k#Y1T2qTlI0il)eSh@rjHHp%&DX,3eU[+&)3AFDCSN+6G5YHX(CR6% -PM*%rH4Qa52(cR5*MSN'8c[,(P!YM"2-6IE%d!HA,PA)IqMQL@'%Vl8)r0(-aV1i -aJb0YK[&Cdj!!--U&I&F!fN(hr5eB8TC-8U`BAq9X1IPb'pQHHNql6`PGPJpieR' -$)GKZA#Te,M%l6mHek%cr,JL)iU5rHMb-[qiPG*1AHk6Qb&)Zl%6AJ,TpPKHBb$c -bc'-BN!"@YR%&m1'`c0BiFp$UlB[rZH(mT12YjN&X&KeCh*1(-6il8I*CCMh@U1M -aSdJ!fF`XT)"hZ-+M"M0EGA[$3apMDkr#TQRVCraS$bcP9AI'V8$*"bC%0Q3VJ6+ -@#2IT0NlY""hd1$HK0Qa)$Y5Q4,2MSM(5C-TH!@Sk$lc(Saf5$U4`5C@-fdd"+aI -3(f,d9P$jdD[5`cSU@5ZMXmIeYL!G-Lp&Vj,Bq-SBRI0STZ4q+-%QeLrVe4*A+hS -ajjaRHp3i''RLf035d(qQB9A2G*M5%m'IM%f+qGEZX5IPlALdY2@Lf&,EhrEFVZL -LS+Rf-"4#e+-kZa"l8!D0h'lcc5B$h)LTFVJ2[#0@&20JN5k*aiXINc0k$GM&YR2 -amQ,)r,318km!P!F+B6Fm&UkqL$)q[pBXm#0PG-qC51$ZfqVE+fECrELQ8V!Ca&` -(UD[8b'cAA6!PlP19e(8%Ep1BkEdhi$033JQTMXKHlL9k`l3B0p+KPrpiNC-)PjL --N@bh0')5GG+$Z4#[SDZ[#EZ$hfR#)KZ!f$JJ%D"HrUPSXZdfh+65a3CCH`r)4Zj -(p3F66bf-8CA+dX52qQ5#MFYRY[%[HZVBQ6a[51eGPia,1eRVqElB2$S0CXD6VHN -ZHcie#@UV5V4jSq3q"kS@4$5`S"mP(M1Rbq&+HE8k"8L"AIYB`8K2LU`Cl1'8j-Y -hGa1*19h0H3a+p"BIml[Cq#"F"UPfSGQIN6JTiYVYRZ`@VkN"S$4CcdhA(RPi#3b -k2*J4QG6iM5@VZSBY5Me9aC-)pQCLeZ2&Q9,0Rb1GrLj3&'DV%!5*6hC!+Y&%rGS -[e2+"6-SSk-Z92#APC18A[E"bqr)phe!R@VPU[XppDmLC!S9f&bR[dFpapECkPTT -ViEG+p-96FGmD&T8Lib3a0b2i'Dm3K!66Q#`@rPXBj+H9)qCX`"SPYH41j4JFPeI -!I%&bJrkL$ZH!L)aCSbHX%$4LiQl-33`JfNNKDfk%pS66FX`,$,S4!kh51CUr,"9 -p#Vam)J,)dGBTI%cAi+@Ae[b`Y$(5dP'TBCMLB$&IeN@[mlj5T!Z(QpL'I4jcGUc -aIQklG*,Ldbl#``#f+e3[cq-5CASklPXY9B'5a#dp`'#KhR5`DBaKqU6f!@,'0dC -6[95$Ubqc[[8*NNTj&&149d+TkEil'Z9%@GFqVr+cM&Y8IDm[UN3aQ[d@d+m4)@, -H+ZMR!9D1)'1qBUY`Zpeq1CX"JLN&K*R#PjqClAeZe1$k94["&RXqJ@E5$9AJ&Zh -6e8I[Q(eDYk1pj@GYLRbReTKk!@(H$lR'B68`ajajPVkAl&Y"@'r+$'b)3`f"D+$ -`Q!-@Q,dkN@&YEfmmHCPq-mBFVKGN)5Ic4)LJi)C%L4cB)XM,hSr@1NFL@mINT#R -Y[NjdL'1,ke!&"!P(eH1Ua9!#T+@a!)UA$kl8UTH3!#8rB,fUqN-"aT,B#mU+)MY -cmZri-2PTkBKc!f(M!F6BL-pbGMF482DVNQjM5%1SapjDJZ-5&@&h'D9H8be)`)a --Vb+(a&e&1iFBZpEf8KJ`Rr''"V%61if)AN3mfVX*Xp(i*m8i)&j0SDh3-qRpGa* --*cUr!6DI(293&B8q!SbG)TpedIeqPDm*E(hFpR6%IT!!8qi[%X%ZMda)))c$GNl -AKmXE`&('6)A0j3k"Q8+h6FDBA0k3!!ZJZF-mVV'V8$%C[XBV`FNb5!a4F*!!GVH -ceQ#+r'9"3Y&8dU2[)Z)QXGKb-Z5"Zj'BYB5B`%ZbIN0DC%2ir#d*&95EMI9)r!e -iVLmkC-MBebd6%%I0fe2Z"6R,dHXK+IaQa!c+m+Y%MpKr!ck@L#HQmQa9Nfr8f4L -fQ,Dl(-A)q`#RQ6XH!BIImRDIUmGcGE)#mc`@3k0K&1)f39NH0h'JITFHj`%kUTa -6ZYe`i49Si4$Fh5ec`*!!kkkCl4SDM)X*""P21l0qXP@Spk0J-`T%9T(*e36EUi% -1*UlDU`SHDfBYZ%Em@*elXabrXiYRl4Y3U3i@3f-*Z3q#[h`aVm4b[,P,+1$lR)U -VYpL#%fN*a(X0+li9B4Pm*hG!TC!%!3!!-!"!!*!*!3)8!*!'!5m!!+m8rj!%!*! -+TC!%!3!!03!!Y[&1mlEa6[-!!!%[!!%PZ!#3!p-!"EeZ!*!15@0[EJd!!GZmD@0 -[ENe"3e0"!*!2J!#3#3(Q!*!$J!#3"!m!3X(8iHr%)(JHNZXl)T0$PMe1&X9%h,U -"-`j,RCS+U(NFRSIR`'$MA4ifZ1eNp(bc"k[8Tf29`V5Ebi-dlUp1aif&(6j6c4P -RTLP1eK5a-h2EPVY&cfClKmZkIGS2aXQ*%PIPjC5M%Hph@9&a(ZfDKkIUBkh$)JJ -i(L3&)ZG6@!#PN!3"!!!`!%!!N!N"*0%!N!I6!!$c'rq3"!#3#U@3"!%!!$8!!,G -D*!Qh@L3*!*!$d`!"*Y-!N!0b!!8$j!#3$NPMEfi0!!%Eq@PMEfj0380633#3$i! -!N!N"jJ#3!i3!N!32!%,"e(hUjNKc6hS*X&!ZqFG%dkqC`#&3,a$2e2#TXr,m"`I -TX2aa#U@1B4RRLq-r1QJ#9qLYrI((9&L$XA)2,'LECK*f+UV8Th1V9l2ki)&%iL5 -K5Q'@4Y#J-DE$2UC8f&-1bXefXah+kUPMMV51KF1,@ANmC1b*FBUJTHU(L9(UGP! -`)+@3"!%!!$!!3!#3#3%Pk!#3"h)!!21(rj!%!*!+MM`!!!%!!!'253!"MNN!!!4 -X!*$cI!!"!*!&D3"M!(d!R`3#6dX!N!Fp!'!!miKF9'KPFQ8JDA-JEQpd)'9ZEh9 -RD#"bEfpY)'pZ)0*H-0-JG'mJBfpZG'PZG@8J9@j6G(9QCQPZCbiJ)%&Z)'&NC'P -dD@pZB@`JAM%JBRPdCA-JBA*P)'jPC@4PC#i!N!05!!%!N!9Y!'B!J3#L"!*25`# -3"33!5!"R!31)-P0[FR*j,#"LGA3JB5"NDA0V)(*PE'&dC@3JCA*bEh)J+&i`+5" -SBA-JEf0MGA*bC@3Z!*!$6!!#!*!&-3"R!%8!V33%8A9TG!#3"3S!8!!F!4#)'P9 -Z8h4eCQCTEQFJGf&c)(0eBf0PFh0QG@`K!*!&#!!1!#J!,U!#!!%!N!0p384$8J- -!!(i08`U6K!'ME3$X#h)$Y,)b+b[M@dhH@qpUpkCZ*YH!-3"!!`#3!lUe$)!!#@N -UrZ!"94)XqdV)@`lMjA1kK9'1XMr2MrqZ)$NhV"Vi%FU'0AQ'BU0RDr#XAMm&lZ` -,`,#T"L)i6&Fq[H[,VD-C!m8F@8XE1!X!N!0D!!%!N!9G!(!!F3#X"!*25`#3"dS -!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfjXH5"LC5"`CA*QEh*YC@3 -JEfiJ5%C6)(C[E(9YCA-Z!*!$EJ!"!*!&D!"k!(`!YJ3#6dX!N!G)!&i"*BK18fp -YC5"TG'9YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9j)'&bC5"ZEh3JFh9`F'p -bG'9N)'*j)(4SDA-JFf9XCLePH(4bB@0dEh)Z!*!$@J!"!*!&A3"`!(%!V!3#6dX -!N!G+!&8"%iJk9'KP)'CTE'8JdPi`db"YBANJBQ8JC'&YB@GPC#iJ)&"XC@&cC5" -eFf8JDA3JGfPdD#"MBA9dD@pZ,J#3!bJ!!3#3"D3!M3#i!0%%#%0[ER4TER9P!*! -*RJ&H`!)$k!#3!p4"4%05!`!"%Je6#TXN!$Z+L)S9caE3Fka%E"$e,$pr2qcAREr -RlXi-TeMBB58U@)999@,P[r%%XDS&#l*P1diJqC!!(`&8**Mk0Eb&Tph&fGe0dXK -kNVep(bj$h-@Aak8,&[Q01&G2PI8,*$a+MT*"[ZKdYI"dDK@D)Mi&jNl(,(@,TA1 -"CHpm&"bi0FV-TR9!6`FK$%aAP&QFVF'lCA-L&paq$(JIm$a!SNrM'Ub)p-`20hN -S80Z-b('VTjc&BeY4ZFc0eZQ"Uj3hhmRl$1Rr92r*E3#3"$S!!3#3"9!!@3"N!*- -%!Np,!*!&!`"%!%J!k)JC9'KTFb"KFQ0SDACP)'Pc)'4KE@&RC@3Z)!#3"%J!!3# -3"8F!@J"E!*3%!Np,!*!&!J"&!$%!k)JR@@pe)'KKGQ8JC@jdCA*PC#"KEL"TEQ0 -[FR*PBh3JF'&cFhG[FQ3Z!*!%$!!S!#J!YJ%F"!&993#3!``!)!!)!+)"(!##998 -!N!--!')!NJ$`!CJ!K999!*!$$!!S!#J!G3%m!)G993#3!``!4J#Q!,S"eJ#'998 -!N!--!#!!#!#L!4`!J&99!*!$$!!S!#J!VJ&1!,9993#3!`i!+!!S!-)"T!#)998 -S#J#3!``!+!!S!*3"%J)!998!N!--!#J!+!#0!4F#!999!*!$$!Y9EP0dG@CQ)'& -c1J#3!`J()'C[E'4PFJ!!"$0"4%05!`!'G`e9$8-L%K(QAQi3C#dC4'Vb4#3,%&Q -VTLBRYcf,M1"fjmK*Yc06mTPrGlr[fiSm'pr-Yl9!NYA1l-RN5GLq1j-4NZ9@j)Q -Xb1mIN6q6RmQmfGCf%8N@%l)h,FNL+%$L"rp1@BD49%3iU!XlH1)RGL%XdS$Y8-@ -K&RB5AKr2MQN-Tdqr@5Tb%b2*lEeNEa2deYr0KTa,b#P((lQrdKDbpHCeqFBN#8X -TDGMHT"F9Nj*A@5m3r1$*iF)A(Ra+`bCSd@*%bYh0[UE$mLb8Z8NZL1FKb4cpaH# -,'S2Z2"A0G593mh5B(ilNbH!U(HDq*03V2L&LN!#Glm-GLj)350pE&JffVadV0j9 -c-)PcYTmmT-U'cCf2[lLr"Zb,Dr,j*UQJ&eL!@HMeXIT'U5KXK+Zi)G(%4'NH4P' -P*SBS*l2%Ke)*Td69NE&*%bSLi2'$"P$iBJ#e%QfCd)!P0"&UFSY0QF0BUD3IT`b -XGDL,fZ$B!U8fSh08@--BYZrp*)$#,J2%1@+BZ'k&r-qa*h(XSZeGPi*0bi'TkX2 -@JbVR0)ahG0E&J(3EJ`[@YV@,-D*-cb(Q-Y`6mPcZfjMcBMp"cGLljK3Rb&aVTMa -i@-PP[RfUT+62k1U0klXYd-Kcq8@f`RZ!4-@X%K,E)89)*H!)2HGQk+!L4L(61rD -KE[-93T%lT4&h#Yj6*Gq@)$NpfZfT-bIQ[*a$ZHi9U@$-fpTGbR)EqIHh6JN-ELh -Ir*F2iT-R9S%)rHb*!9X*2'JQcVG5aT+bk)"66"T!8Hh@RKiMNZDb1RCPrpLBBZE -'f'*+5Z1k(+rRjMiNk%bc`$2Y2dPbk)d[lP"05[[rh(fm5+9i5KpCGN!BDPI(P8i -GH))aB&$'@AMak[HhZkICP"IAk`20U"30ED$cl3ANPB5bhE"dKJq'UT!!'MJ$K%E -f[#TaY#Qi5[JiZdp@*Ek(V6S2"5LGMGP9XcSTH`kX!)Q$@e`Lj!Hc!YeF"G@qBdC -pV(kpX(EYJl32qi0AAhd*'kUV,i&`%M,25lL3!)9HJTA-Hq-JNiRVb1C`%N0V@&, -9LJXedG30VZTedYBKmQ8[pD@$C2LX$T!!US[$LD0[BBPS9ake"Bi4i"NpQ[B5,S$ -!l!aZkDY"[CV-MSM(ZdcHrYqi$lHRmXQ0Uj1Q&hdZmV+6dc$Q@CReZ"0&fVV&S"U -a`C3d8JpM+h9[1peJ#QP[H2ESABrbfDQ9EXl,)rR"Y(aV,(DK,&e(qXHCLJYTG`c -eq9R+jqIUrhj)D3VcIeGqcX4Q-IlfpqABR&9R,NpTEKEkTP6FE&CkmZ##0U6Epj, -8cI&CH25LN[RmcjI[Q)F-e2@eAFBV*qph(["`34I,9E@$fDIYZ+ZVJh8&%Tl"cXY -,fjl%2ZKNB,XDjI@RH3*a"UE`8,`*ALRF`jGi-!Gh[Rked&R$@pIN$J#3!aJ!0!# -3!r-"AJ!"!3!"!*!&!qJ!N!18!*!$2!!&"#"[CL!()'PdC@ec,J46G'p`'dPdC@e -c)(*PE@&TEQPZCb"dEb"9EP0dG@CQ1JY9EP0dG@CQD@jR1J!!"b*"4%05!`!-3`j -G#kZ#*$lU%1prGjb%8-8Ke%4U9$M4)k"mV`1cHE"X35+++e)@+mTLVcDH@@K*2-m -fY,@Gq([e)E3@F+Y3`CU6#q4l%rB@IfqViqmTMVm(#i0NeC)kXl[86Qa45-+m*-Y -)P`SKT2Fr)CeBA(YZrId!$HEQ0$%"*$3M04p9j!kQI8Mr1XJ2KmNe8STE4UDQIi, -S@Rhe[I@qarqjqdZ#CYHDLRYFmcXRh'Fqe)[)rKRQcr8Z)jY$mqMAB4Z*`8GNQ$3 -LNF,eb%X++LNJ[Q-))Z%`N@8J`NC%+3H8XKIX1QSI*qQMdQDIpGLhEpjV%lmY1l+ -5fDcpH'C-jhq['[`3jSrETKXX9fHMKlcNER4riBTCqG'#)HTh9+c"*XN$@Cl+I(h -)QjMblcphCF`KE5hCkEmEJ'dKrURKM#aIRB*N3e24C0KHQ)Tl$%Br@CYXcVBTrfS -iNkeV5'3-b4AlqD@&QA@GlC-5"V-KqeISpU@)!9VF#TrPGVe3`$j(GLp+(M+%)bJ -Kr&Sfl6c(iZ1Y!9iHNp3EPSIpCePFTPi6XLqMR56Ea[SbUjGDGG,V$qpI@A3Hj0j -Cf4[JHkF,BhCr0'i62[6hH)6PrqmTD$jIpH[T![HreCf6"(cN`HmpTrP+(EbH['' -!b&!IJmY(HX)"[R"cV$$bkT!!BFkfqZ%`*Q+HH1mQpFh)rJ@qePkBpb0ELS5`[Fq -P*d'Lda$-8qj%Tj%SG+&FF'&0$-QD@&h34--"6@3i6E!+&5CN6k*#4QZTHTiUAUN -T`YdPZGKX@*2jFEfX5HRlGNQ6`Y[fJLBRhkjk5j-GMr1P!HBl[3'Qm)HHJ"HPEDQ -!T2NIX`%2j1DEYFhii,)JXp(b1Mbrp)q9Zl25JF%)$&*Jm!+$kJjf`(I`)SH&YIF -)dciHP@*rMBUa4$IDcXH3!-q&V(Q`BSJadb$'CXSYUpXb)Mq,Xi0GD)T&6U4-SpF -Ie6rLf`lAZj!!4!fm'%+q8%hL1133Cp,eVX%T8F2L###cAI$mL&00G&-%Cd*2iB% -iCf`MfF-jf!FJ1%J4[MVRbX'20Z1CcLbH@N1)6)kDFS+SqQb1EX+TQJDrTfh#kJ* -5aM-q0k+Q%VF[a'CXI#96N@%'546j5+F6eCZ`Y)TX2A,NUk)B-Ej,R0VL%(mE&PX -rq-#p#2e$Mh`2m[mZZU6[&E)M(T+mmZ5*C[*Naii8P6'D6(cbha3TS[J5ABK&@0U -BMc(1MV#HAk%1$dlX0f$d-%mhXhTHI(EKj`HhGF*SlVcm3"f0R8KeA4MGl##9e5F -lJEb)E"IQpI`h[mJ1R[b#0H)%!d,9%Uh1GmIjmI'(P'YJ%XlMTk6lU'PlpV!H4Gr -mYK0%M4LGSRTmK3Gb$BLAff+Tl2CbF&6Y![$@m5BA+)6!`8@ee[Q9(MN+4[41XU3 -cmMk'DQ'S6h&HI"C4IqZm$K%CM(`cNh-UZ['2M!%2")E[(Qeki1c3Sd5C@fSUeH@ -m*6B09&BcS)f1L@L#PQ*+KA6-TD%G95+1T&jmbi%QIa"&$XCA8%pjZ(#6lN3Mjf1 -EiJUFd@m[mhpEDRiY`BBack+-$RSC#LEPF![d"pU$S5L'jPlJNJjCi#!A!`%J-Ir -FfDFJj'I2C[Bd0UCE2jZlIl&[h22GqrIq+,l2YIaTXma5M'Br@GG*k@i'TkPPB`@ -qB46N'fV8i#e-mqY#FQQhm,*pdPaSPhIj$G'iC,9Ub5XUlPrMUJ4eJF&a@NLbIaH -iI1&RqABj*aPfCDA)c9$b&Q1&B+d6")mEj`"hp!LF[E!INQri$5f+0$%85TjqUk* -%EUa+@q*c!aF,QlbR+TRT&K*AHmBm`H+'b@!Ybe[DD%JNC+YK,rT32-h-5[2H&`V -q&@3lX4p3qFD#JN-be"TjPN2HL'*jq3e('@KA62r,S8m@)G*`Y9bQVCUKQ*,F46f -P#De(dpG(,*GddTH@hAh9Cmq89@fhA6q[&HaSDHi-`A&rBc"SL*VAklaba4[#Y3N -[eaKF#TAbf#jhZMBU6rSp`@$*6JDqIde3IqrP2-(&8*'2lGSHTLKVm%m-dEa@`90 -(@8HSq#r2kiERdSZ#C9dhN3qf5G9@i9,MEQj4F)61!R+`NF*EQ#T+d!MBVHi6(K1 -%BpVk5r4F!%DirSj!pl[YiQ83Vp(a)p)(#6++Y%mhNNJ2e#*CJ3JADBr0GlNJA$E -L+aRZ3114C2lUKK@1Nj`-Cd`A*&$Smk@bIplmk&rjj*%N!V4E+8QIVZ9DXkIkqYr --K5K(p'2[p%4qhlC$P5dE9Uqbd&iR9pd`'&Kc0*!!U["1F`I#QD4#UF6[J,+V(BC -CFebM0LLP5'&(NU-8pp2f1U[GXf#3!0bTkLKeI+$XpBE#8R'ID@5dE+#fMGY9GNq -ZYN`D+Xf6iI+JTG!R)B'`%6K'3j9)bMeQTe#4CN8`4!JVG%2hqIS((dfBili2!*! -$'JB!J!#3!`-f,M!28h4eCQC*G#"648%J0Li`!*!$$JB!J!#3!`-f,M!$0Li`!*! -$&3"8!'3!L`''!!%"!*!("%X!N!3B!$`!3!#`!CJ!!3%!N!F""`#3"J%L384$8J- -!!iS08`UE*!"rKN@`h6Nj%l$&$Pe,6NmGf`%9!pZaqYJ-9[A12LLS@(eX`@kXkXE -!2f0r925rrfq2mhC@'FEU!!ZC03eF9Shd`Bj'pkj6'Z`%Xr-S&0c&iM*#YY5j)-P -c#j!!hfq#GS,Td84dcbPjXa2G[-RZ+i@%-ma,@ZUD8SSG#ciIQp0r"2"krMRUbY2 -UD[qIAfl(Ujrp3rrlNCBP!VJcDU1#E9E"5#Dm4DYXM&@eAPXqBTZhKHeK&AhF&mE -5@NbNP,3#F4p-ISc$ekiEjSHQ'HT6frC0h3qk%'KDJ#F%b!#F!%bpqLd!rZS*!a& -r!2#LFZ%#%"b#J!'#BQ!Y1)Z43BcI$%,N%MVLkQ15c,dSF4p-hh6j4F3VE-XB!*! -$Gd&%3e)$!!#!$9-,@b!$!kCJ`kTUXc#`!5*LB$G,XGYCPD!JBX-HkYR!Q&8a#f- -UZ[HR8k`+#iPMb,ELGpB!8LMpiEh!JNUia8#RBdJbMUrCpbBL$VrTa[llf*mk9dm -STT%&(C'kJKQiSm8DVUKU*k42-JV[4Fi&!*!$6!!#!*!&#!!d!"S"'iJE8'aPBA0 -P)'PZFf9bG#"NDA0V)&i`)(GTG'Jk!*!'#`!,!#X!+k!#"%X!N!8G!$3!,3%BL!* -H-3#3!cS!!3#3"6B!K`"+!-%%!Np,!*!&!J"&!#m"2iJCAM!JBA"`C@&bFb"dEb" -LC5"NB@eKCf9N,NX!N!1U384$8J-!!,B0@`Y6-!0hFbeQ"Z`CdmT9aMFdilke99E -'2fp2lp9kYqiprq)E'J!!m!d!!1Jf$3!!#l)Y'i'Pq!GfCr[jjDdYFp0@cGpCf*- -4E6ZY!bFUCeRCbDlbH0Gh4)AJ8X4rJKJ8[N3-RI0#5DL'!59#J#kS$Yl9"F#6K4b -J',6dJeNIl`L5Cd'q)0q+c@'mi[eVN`@PK4)VLVPbh1Hj`Y*8H1AaB3%!N!--!#J -!+!"r!A!%Ve99!!!"!*!$J!!Ird!!)!)J!#)%N!!!*JR)!#)6j!!L)!)!)N!"!## -(i)!K$r"!)K``)#3Cra!S'SS)-M++*#BbmM*10!Bj*QAd-K*P)Cr`)"($!%!) -ri#!"!B"!!)E!J!"!!3!!)!)!!"2N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!! -Irm!!2rrJ!$rrm!!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrrm$rrrrJ -rrrrm2rrrrRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ! -!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3"`%!"rrq!!J!J`!*J3+!#N)#3!L%!L! -*#!)3#p!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J)!IJ)#!2m#!J($!J -)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J -)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ -2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ -2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!!!!3! -(rri!#!#$!!Z"!S!)3J*!#B3#)!K)!K!,N!!$q!JJ!!J)3!!)#)!!#!N!!!J+!!! -)$!!!#!J!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F -)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr -!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr -i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr -i$rrrq!rrrrJ2rrri$rrrq!!!!3!(rri!#!#$!!Z"!S!+3J*!#N3#)!T)!K!+8!2 -i##!!#!K!!!J)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`)#!F-#!J'ImJ)"U# -)#!bJL!J-!BJ)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!)#!'`#!J!!!J)!!! -)$rrrq!IrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rrrq!rrrrJ2rrr -i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr -i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!!!"!*!$J!!!!8! -!!!)J!!!%N!!!!!R)!!!6j!!!)!)!!%!"!!#(i)!"$r"!!K``)!3Cra!)'SS)%M+ -+*#BbmM*10!Bj*QAd-K*P)Cr`)"($!%!)ri#!"!B"!!)E!J!"!!3!!)!)!!"2 -N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!!!!F!!!!2J!!!(m!!!$rJ!!"rm!!! -rrJ!!Irm!!2rrJ!(rrm!$rrrJ"rrrm!rrrrJIrrrm2rrrrRrrN!-rrrrq(rrrr!r -rrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!!!q!!!!(!!*! -$J!#3#!G"8&"-!*!'"e0PCc)!!3#3"!G6C@Fc!!*r!*!$"e0PCdi!!rm!N!-(39" -36!#3"KaKGA0d!*!$!8P$6L-!N!@%4P*&4J#3"B3!N!-d399c-J#3!`&*3diM!!- -!N!1!!!%!J3!#!))!!`#$4P*&4J!$!*!$J!!"!)%!!J##!!-!J`#3!b!IU5!a16N -`,6Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#3"eG"4%05!`!"!3e6!Yc@"T2hdNE -0440Y!,6j0bkmfddECX*X[UX,hi6GX0[NhAE9eA9K!!NiTBMrG!Ak'M5Q0Klla*e -Vf8k#LE$6%2V!XqJ!D*!!aElq",i'!!!%!*!4J3#3(S%!r`#3()%!9#[r!*!DJ3" -8re3Vr`#3')%!92q3!e3Vr`#3&S%!92q3"93Vr`#3&)%!pID3!e6fN!3Vr`#3%S% -!pID3"2MfN!8Vr`#3%)%!pIEfJC!'9[IfpL[r!*!1J3$ep[Eprj!'r&EfN!-Vr`# -3$)%!pIEf9[prpj!%JIrhpT!%+rm!N!U"!2AfN!2mrIG@Ij!&Uj!$IrEf+rm!N!L -"!&6fN!6rIrCr+Rm!N!089(p@+rC8+rm!N!D"!&6rpT!$9[riphmUI`#3!e48UrF -Vp[p8+rm!N!5"!&6rrrD3!rcppeC8+P53"AqVprEfrrp8+rm!!)%!92q3!e6ip[p -rpRmUN!989(prprK8rj!$92Mr!!$r+e6rrrEf9[rhphmUJC!%V&5V9[D3!rrr92M -r!*!%rbY8rrEfr2hf9UXUJID3!i&rrrIfN!2r92Mr!*!'rbY8p[EprIG@Uk[rN!C -rprD3!e6ir`#3#2mVp[C@rRrhN!6rJIH3"2D3!rIir`#3#[mVp[C@rIq3"S(fN!A -hq2m!N!cr+rD3"[q"pj!$pT!$prMr!*!1rb[fN!2rrrMrrrMfN!2hq2m!N"$r+rD -3!rIhq2H3!rEhq2m!N",r+rD3"&6fN!2hq2m!N"6r+e6rN!98q2m!N"Er+e6rN!0 -8q2m!N"Mr+e6r92Mr!*!DrbY8q2m!N"crq2m!N"lr!*!a3Ej"4%05!`#)P""9$@9 -9%3!K9Hj'RckIP9+A1THPQ3[p@HHXJkd919ilR0"ecjZZ,P[Y"Nk#VV#Y"GcclQX --A$KHA-'"#b!1j!a($*R6`fd),X3[m6M2QjaRL1F40-C6ipFJAjmh-ES33mJFfrV -qqr`qEAmG!b'AerIr14e@0K)4!J'3""%"N!-43Ji!A32IQ[Ej"hUL-`Km2d5"rJb -ZdI4iYUQE[`3Tm6XAhiZ&e28rqjHmNSQ(K@lSkfQ#6r`iVi51%R'3!"ppNiMDBVV -e&PPM2LpJ(+*"mm&3LHU40Ie0Ta2I!E(6NmKV1Sd&"12cP@QJ+GX')Y9EJeDr$H6 -H,`GrpKGRmP13!#bEXSf"1qIEaTUh[$@iaYbd'mYIm@8%bjemf8Q[*dT#jjHGTGF -6*F&@[Y`*SR$2XV1Gr`B3[)iqlT-J)#BF!mrN18-Q*db"*XqIq-$d9ZHrJBj8$b* -c9I013I3G00mrlfl2%H2BSK"2V[aQr(XLJ*m3IS+Y18,qdhm2IfTqeKB%XFVLV!J -0LIqCqZ[NN!"M++XipJ#IGMNVq'*Ia'@Zre0pE#iIbXiNQ114SC&2Ba+$fJQ#RIM -'!GA82c-"bfc"+$+J6QE-GGQH%Vl1l5")aN45M)YY`T4rCDT3TH)rIjhk+cA-f04 -IfF3j$*[aXfAd#Ne&V[$T8Iedj)V%bPk-l4X6hfMqFD3[fLH#H8,PN@r2lqBNJi0 -@pqIGL4`4AIQImFqaqFqaqFp&X11(k5,@e[)$GB"[2AT(3"d`@mceeeYLZT9(L*@ -rFMQMYKmqBGlUiUmUp-GEIrM%PDe(j4`8,PBaG9H$6N`HFKc+EC!!qr1l1q*%0'h -YYpjL69*@L-TL(@Jkc3ET@%K,bNjT*8+Ta0chAIBL3ZcDBCmeU4edkBrm4iR3f81 -8(5LU1JkJXC(AY0Z",GUp@%D3!-QBE2[,'f+d'b4Jr)GXZ4,jimk$3im+-C9HAbM -8cpIjYh3HK-S#%2[#D,IjrSdE6ldY2$!)Mcc3&(-QCGFq%-%lDdBrd"3Rlp8(*jU -N!'8I"PX@-MqJFJ0Vl#C(elVC6UrXUXk3!0qXrNM1PM@b[rS8b2jq'c(081e*Q1r -D,,#CSSebGZ)lIp`X[#!lKa,q@25H[Ce!m)r0)U6jkFYc9-mi%*3SNq61qEJX3iP -5fer+bKaGJ3&RU&R&Yd(&F5QbFT,BJ$pkMJ6C$d4"`"Hq[*5,FpMPSG@fiFhr)"D -KJN',eRi%H8ePa*Uh#2'5&M&XV3-&8hmBJZH9#,CQpr`'&F("MV5eAJUqL*41(T! -!Ye"%5B'E)JT"'T%IQeS6D6,Z'e1TV-L!N!#4!G&CFk+l0Dr*+#IY6e*dQqqhLI4 -3jrD%L#AE!S,)fp(1Jkh#E(VrXrD!HHLpqZZ(c#D6UIkcZ8HPPf&(*V4(!LD6f@3 -IRi@QRYRPp&Nqf`3KYL!Yj*!!a,5*[c5EfJ-ThlMqk&f@KQFc[6A24N)[raKECdb -GMkT8*4iL`eQ$P+dBX#'Uae4&&M'aa5qU"kT6cAR0KjYbQiUXL"b9LM)SQPZDEFe -h)j2M[jSdeE1UCmPMaT5F9'6)&0kj1&%h5pM(UB+HY$Kpq!R&r'5FcA0L845jkTK -2'QUc$1CEJf[bQMjX["HIDBdR1aGrZaJN[+MT,6$@)C0`ciPZBf!#i(Cec9-!YKY -2I*UVqRVMT$aQ2b2,qNXG,V[I'+S('8qILIHTUc%#TYb-P&8b[5b2R8R2X)Fa"5S -ar9hRiZ+06qeG+aV(q'IT8hY9UXE$TVc'[UIfLQLMUA2aVXe!r$Pc@NKJ-3F(c-J -DbPY5KjqUcKNrZ-B@0beZRR[iZG#8,GlRHXV9I,dTVrNQ)SRJCbj8r%AR$2-e!hX -RqU$NqDC&UNI`8if+HE2U4E"8dmqq-9Y&mkm03lqkqGGJDac)Dbj9,F*N)reSfGL -3!0MB%#3*[d%%$Eemq!*q[Y#bIS'Ipl5XmpR3hrcV8r9pBPMB"TUIT!`9LiA!&@G -SIq"8Yh*ML+VVejLE(cG1VA%eEm@f2h3%l5d6$cGrBE69aU$JBFFLeH010CN"-Zk -Rc'NLp-CIJXK+ACF#a4QbNRCC+4X*3"G3++%XAh0HifMcaeDH05Q5c8p6&U*))ZT -f96q9X0!,9202'l*F$-6r,MK*c)mX4C!!RSH#a!'5QR2%pUUjITZ`V4&HFhh0XED -pILTGIA12a6E4UalpUpF5BZ02k9rT6qq`E$eL`f5Vf(L&rT9HZGkb&5$R(DrC!V2 -S3-KFVh0KiF2"bp[%aU[dVr6UcCDYafcZbJFI1AVcj8fSUZIfr6fUeEmI&#'EEfi -["Vj`JMePK!+)DHXq#fAiQkYEN6f()YP4r9&lT!Y)cTpFLL[Rh5C#B`00(jVIfc( -30-hmfI*MBelcHmZ2E3YSd6Lbp9K+mZBMK`HDlMCr(fac`IEDBEIjqmYIk`PXr)$ -qPAl`q*'YVmdk"P6kj-J03!bIXd#YE'i[Rr"aC2T(fq6)2TeSDDiHb1ECpiA9$XS -1Skbli4S!GJ10NdkG,N,CeL)*iY9!I8PmQdMZfbD3!$d0%M)b5#R#'QqAXf1kpKE -''#4'H3JjIdQ)$f0Yr[rPl(BcYYdKhfj3%,)NNi654&YNY,*kb-$-+&LX,848PKd -`eb3+B1e"Dj!!MU!UQG&UTL@Kd(aX9T`ZX3AEiq8bAe8`[hBGc#F9c)G@CeBp3`E -HG%CKjXr`c14F9A(car5aMUN+9B90c5KiJb,Bp%eT8UL&ZUN"L`$!d'rUK9('+*' --@mRF35i'10l5,Tkf109'rh5,A8De@8'C0mlKRpmR3RBHr2CjLG#YfUrTMZ8EJp0 -4A"[GB'k$Se*)bM*Y&bQh)%[&4krYQkcVpRNCQS@%D[2(&2@b*US$0Ia@*jVS3Qf -VNX3@ZSb"%pdaRRdEp5M93eQAD#KAQ2p"$NET'[G*QqfTN!!%8(D++2lTk'G0T2( -m'P5JM9Pb8Q14A@XdMFBe!0XEdf2Ym4ia!X80Bc&P68*p&A,HiQ%dCR4L&-fjaF8 -k4,ID-E$N8AY#$MSpRdY9N6T@J8,%L*rcB*)eh36+0cV$)K"439-5-+XYR+&, -8j%E%La6D"Pb#TKki0$Q80mc"`(A@+-6'0&FQKqMkV2YJU(l$iA'C-Uj"dNrLF!8 -1Z0%mAIcSq9Q#60-q5ch3I(1+'P'NYJidPe,60H#I*D$%m92G8+UEXQaq8@@,+iB -MXq+f)$+P&0RMFClj$NHPj*l!hX"6JmdhVHPV,ReU#!Ac`dY+8$$2j8Aa@Pi8#c& -2HqhT$P`,T#MEIVV$FU,EZ9FDLP*8BL9mX2K4)l+$[$3"0ipLMSaKiV)YcT9Ilk! -YUCe()i0ld%*3l3eMQeRTf1kPF@5Qj1pcdp%p)M)ifSe$CPZCZ4i!5V&#JAaVT-! -d`4#Yi)LD'++$P4!GD%b`5cVCTGUT9cIDiPe#3TH3!,9j`jd-aX95TNDUYNPPY92 -2,@iZYEI-b'Yqh"iP!)"8f[a&p5qXAN,qd65+,+H(,X+959YFqF+q@AQ"P8c!r`T --#0R4MA!dJN'*6E,$q%TY6''+kb4'Q*ZDf16EUcpkC9,)+2!3`#U+AmN@VEm!)Q* -!%[$+AZ2aJeQL#i)5*+Kp09'mQ*e#F2%daGZcjAA1VR)%9h2"ZH*(@X'%+"-,jJi -iThbT&%qQhDV2V1VKJCXUp3!82YBre2QmPCQVDMp9p64p)69VNhBkKZNJQql56MX -`lC@QcaK%E-+dQddE4+c%Y)p0'd43"QD9)A!3H,[rCUNa$l*P)CBI[$8)%Q-KJ(e -bij!!Df1ca,iK-F8"N!"d!1kl#akJkPFCE'A(8'N"XTl9,4&,EFpH!I!VLTm@%2L -'*dS,(S"Sf6J&!NNV`#""!-mXiI6CJM&!(A*2`@BU9YA#$QF"6(AK5#'1m1-JMYP --ZDTaIR#YiQ!,J%"CC3&"Ta9A%@Li!!GUHA9l'4YYIbHlS-54@e!#0p'Ya-,%,S# -iC5$'e82NCH1lY6&Fm3NQUP$dp+LUT1-&+HDd!"TFqkEM5"djQNQ&#hc2!NdMlf3 -A&G+bqCZ1h+*#bPJ#-6-0lQ4MTXkqYUCE`&$d$VP[(3"j29"8P#F#VXrCDf4,(B# -M@MB%lq@ZK-1S,2DL'BP2UfBJSUU+0T*j#,rGSh0S,YZf%EMe4&e+mSl,GeL3!&@ -q-qD4(CSk)XbMmDCr@AH(46H"V4AEm#2lRkL$`*hF[E!%"*'[k2V"51mJTNX)K'K -#d5iRRHRYNBjAiG+QfJqRQbjF&4ZKCQ6$EF*VMh)(00AK6C[m-ArqPFM3p,kFV3i -`1pY*(#'jVi`*QYTA"[8Be"FLTFaBT,)i@q#UjmU+iZ+kK1Ej3aNSb2)AU8SLK#C -3"+'aZ!'99ij3hFX9d3%aHjZr"!0PB"pSb#dUbK&&j14CClKJHmQqRU,#jRRF841 -LUjqhp458K)%r343iU2lfX@UVFdEdLePaK4Rl*8FPU`5)4%h[aMQC),P&cF$XNLH -*U'4D9!LRJE5!j*B)-NmJ6iJV"(M[mcCpJd"mS&9#6SRmCBbl)jEX#cC9Y'CENf! -X-ZF@f[#cUENTZSM!-9@*[4eQmCUU+-q2a5998BikQZXHa%3&&ML5kq11L&i!4Sl -)N!$KLZQZR1T)Ri6+FbkSl)!*&6Nf1V#NcMU`T-UFYPC0fk!U(f3m&cCpNk(U'He -fmZ$PEM!YAR+9Q'j!-dbBhN"$626K`#JBeI6#e#3b!&`1,,PU(9JmM'Qr`m8V,[q -"J$&MM@[*eA*H4qh#hF'Q2&b-,[!5`)j6('##Fk46*T!!&DpG$[%Q'NbIZTBm5S$ -)#6eL(SFE4-M,TlVT1)c8CFllGc34NkJBM4NA&rple4T-,,Nbi#Vd'TJ)A)2B'89 -4j9EY`VY!)5LhN!!UeH@G-pDqASNYl5Qm@,),Ri@0D9'%db8,R49SU'TL`R[#U&V -M!JU,(kfC+&kV(J+BJ!+ZDkfDLMKclRB["cmY3(%D$F(Ba5[D-H(Pdmra+RAaSfS -flHE6Y@cDRbED[B4Lp$`!eY0FK3QJGKlS8P3BL4'$df#f(!J3!`*bd`("Ab#Uk89 -d3(LAP'Lk8`H"fX#5NMFY"-`3H@+SY2$[MGlU(J4LEq%QU,+1M"""-qN3QQjl#kD -Z5P1&a66Pp(i1!45`*dFMmVka8)#D$-5#CJ+Z`J8pKCY5iXXYdP804c6G18PM[!E -6L%T#GC1dY@+0TPXK52#Q4f6SiFB$2&Y!e2E!FCj8dS*$T*`pq$Q+J`dF2"UfFc, -bNNG4a0qd"UqA($$R)M##Q4#C+#hF4-!DSZbSRP43k-G29#)9G1f0jTRkQSXJDXS -jc%NP82[AG**3!)dLC$'U'Q"1@@C#XcI01%N1fkhC01`mQ$G)`hBUe04b4+HqCP& -KG,+U,GIP,B5,)+V%bAf%#-b()UpG*hE(pLUMc3&6ccQ(+UeflU+L&qE5F8YEVK# -&d@Z3!-e4X!c6cee,bp-)'#ke!+$[!KP[LJP)bqmQ!k8,i-V@8h#&JSp,f*1FL-P -I++r+rFVa,+U3!%A2SCK+A5TlDl"Skk(VV%)#k-T+p9&MHJYNU8ZN%Lm+ZQH'$5S -*j$Tkl6&5-B,e(K3R4`RmjX%kD8q%[CLaXj1QPB%SB10&d&&LdNFTJYU*m+!@5*+ -DH!&3E!8J@V`&PmLpTB@M*kkJQ5A%HijHTmmdm2BV-@iB!&83hB6NfkpSZM(`*+# -q1k!q9(5"e43iSN56U@JZ98+a&@e-&lkaVqd2hjM6cma3BqdTD,$f&-dXjiSjC," -@,fd+SQe`!+H'9BXqLR5#4a*DLhc,a+6,afD+0aX+*j!!mBTXF5TN81biZ!#*`2G -Dji`Y(i,!*`cZJ0aCPS18aN"l4m"Arkc6(qd3UZ!KZm2Sae$Yk3MP4EfS[*ILilC -[`ZZb8*CcQp'QCDkbVc4kLAQi)r#pD"$-&ILilI5k,($DMZb@Ya--L51G-rj3HU* -E8J@2M)6Ne!c`N6GGj6M-+54h@dAe*ClC(1fFkdJ,AEdYB4X609m1*XaB!,$mj4b -RQV+j!2b[VDlC"r)*$ZH!q!bc6TKM[Z#Vkj!!hJ9$p9EAT-Z8$`*diBj24!J*HKE -GXeG9"2GPDNU[GCSF!&jbjAX)[!raUfch8-)L$0BPcV9L%"+Kf,MT!Mm5!M1U,8a -l-Hh$)LK#H1Q0GSP3`*UE9(F&V"(AUbj4aS99q,Z%Geh#kAZ9K2UMDIY8SDXRTH& -DG9GS*E)B[VF$"Ab$r1D2NDNkFFq%5$Uk3KG[ml4d"ECM$pq)J[KJ6`,aQemp,mV -%,IHNKG5L`T%@h*AAKkXVF(c-j!5CZ9$Z[L%YQ5mm4RpYc0jk`hRih3hAPYP(hMJ -[6J[E'hYl)rfhLh&M!+pppj`(IE%##MiJpbIJP(hiNrZU1ZmLNk"#9FU'SfAeBTi -49`%AbbL)YM#94&fX(GPUXfaMpld-9m[Sl2P1Rf1qXb@fDkK%b(qFLma&BV0`Y`% -eZ3aS2ZLF#rC)V(4rCXSC90ka[11Tjl()122l-rZaU#150KE,lFD$F!i3#rkI$*N -@QfmlQB&&B14iHYCY@*MbmSJKN!#4FMb2&R9C@0pJ6%F6L'+M0hT"(%35X*E -SKG"q!,lHL#[Q8hG&IhQ#-Y0M)0Pd"8jMZCXUB)Sb$"b)4'r!kZaLNEC*lRi'KHA -AhVApX-FFGF8pcZ'SDjr(UFDRbeQ"U5ki6)KB"Dj0'Q%1aL#C-N3*+D*cak9'8#Y -AjC,J@i05KI9#RGf()b,Qiqk$P&%q66)'-C``YhLFSZL1fF+qkq+2C6pHcZE'l#[ -cZ[eVi6,-c@-ic$cmC"i!MFV!AL@CBKk4D,UL2i[L4QF8Rf#HGp)P)9J88b*'M61 -j+q"rS3j*R6j!)"eZqN#1JfhTljD0M'!B4DBK9+2fQ&hU(cLX5%KAJBr2kAea,+D -Z(SY&TH'b-4`C5`,&1%a&(pc4J*`QGlq"*U"SZB'Da3$ma!Kq2J8B1@iFUBj&ADT -TpP#e)%2Ed53m-,3@jTU5e![!86q5`m!T!T0i13SMI2Qc@%McQIB#[j!!Ek!'Y`H -#SQqm,&T0jm8fA0,M#0LpeD&BU$T)SZPeSJR14IFQT#X36&6eA%55SqJA`p@r!'X -&XCciJ$-dF)B@cU#@YP$YY`rML[(UU,eLD$1FDdS46"D*D28Yle#L-8Pm"6mq,9` -m2lkfdKA5*U2Bj+hdLJFk++KF&Sq#T@FePJVKiBcEZ&*kU[ZNJ*ZJJ%[4k89'V4r -NrP)%C56HJ&R%Hp!-3f)cS9E([1V0)S$LYF5NCZbDjXGJ!0j%(BTP2mr33l(#!,M -Rb4@NZCU8DVT9MMX6P)PSmm"phHmFRZdk#8H-b3QR6qfjUckf5kf1Z+Tlp%8)%,l -E'S4ENeVe1"VDGpG1c4)J*d6K[,q9*`C"4T+0SS`hb"6QG$F19DJHI`I-UUdBq&@ -&A-![9M1F+QX3E-1UH@"V8Eh!$hk&aZb#(p(Khh#RM@SFVM+1%0Q!VXAeMr"V2GT -Ve4XQV$CjAD*35BYhb+PZ(T&"39KiJDZ"Lq-L8',CGG`*84+*-X$Z'D#,Q[L'Ak4 -$r08Y5(cJa58M)**jf$8Y#S5R1-*UIN98p4AIV%qr@DMi"BlLX"C&+4PEe6YdD"i -rp!+rdS$FfYA9[!VfL3eL0kh'I[Fla,+9)YJBUSeTJhqhhS$i*VGbC6h!)i%ENl' --E9*Y)dGe5MK%L45N6@mZGp-2)D%UC3-N3BLV!!Qc4Cr`,ZVbLEaC9-6H15JPpfS -DN4*HPA`K*IILT%Xhb'IViT3Y-@+,NpNL!G#F[5VP+dUUL!E@#l2LpLJ4(fLi26% -V$QFNIh4)p4-3PDqFNT,&PC*V**TH0i-jR61AkM-iT+`L93L[6K-lA3$@cCJ!)[+ -kkP0@*)@M#j[I(`2aY[RY@I(S)Y5Q)9@aIBSIJ6L@+'&f9ca@SCr%PRCe!4elD"B -)L$Im*4Qcq@JV!$$6`S,J3d6ii!NiT%3RkM"PGB3Tke0*@BmZCmU+5JTTqK3JIEe -H2DCh*H88cPFUTm3(e)G8Il+hD"RISUCmi5HN02Z"F'9YEm"KHhR++VJ@VpS-bYS -1!ACN1M6rE0AUfEi`A$f2AK1Z(JR`0TJV,aBj+DRNG6J#m!b-BmBGU@I58i58r*! -!#Qdb4mR4,$,a`Udm5Gf),6!j!FFap5rpI#)T6GLh'!-+8V%K%GcN8R@NGjBl1L3 -#@A4JE,p`p1CX5K1YNhpkIr3+-Jf*M&[$QqdmDdPZ&$iXTV"!SQBN%P0IB`'jVMG -['S(UiiVQ3p4$f648S"m3)e0GlNeH4ep1*,T*p-M#2UKfei3LSX@5&QK[ZhCQj&+ -XeGEAkRpeL8T9*dCZ30k6@ac2M1*ci+62H`15iiR)T8JI+TCEGhM0Rmffj-c&pEj -*8qiLZYKMdermHEFjlh@3!%!QqdFcNF93MkV%CeVmHNPX%e3km(S*A,X3m92hbR& -lLc3P%H0q-4HJM9UD`X%518l(H,0paqM[ZH1DPYMZ`#YNCc(Q(hVNZ2EJ6$P1%3I -(0BQ`9dY*$PPfP4V0UDRpd[&@kBL9CcQ@E)@B&PhFAY'qU'4ckk+5Kl!jN!#Rj#L -)9#"$PY35)`K266`Lf[3'b9r4L`k@f40Y4q(8ZNK9[$m3FfMCm[jp)@Ic-MDEJUf -e-P["ii`YD@"6"`d*'C(5%4XNm0iSSNIhi6pl0(U%,bJ4kXVSdG(Hr&'Dc-JjFja -2*Ke(l6l(%53L$HLc!8a1kjJp*bY$#PCIHp'4r@Bp*C2hpj!!Fm[ZcqS$I3**3lR -KAq`I1Q@Hf0dlf0rC0pMGeYFEi5krA-MaV!YRQ*!!f+U%[-5%6,6e6daqCk*ciUa -H$!8LJ&&HYR#cKBm[cNZ"c#M3U855[DTJVcVCK)DbaSNdM+Jm,b)`!TZ8(5qL%j[ -&FM4pfSeZq8CUCYSZ8XA#QMkSH1VkKb+6Sa1485&'2%-TQFI6-qA8R&cl"HI"P12 -Tm(#@MjpC5QJ@@FZ`A9iJq,BKLDYhcl4Bb(5@XZFJ-0U$#SM!UGHi`'i0hpT9UU6 -JPP'5Z'C($9aU5e$C3e@U,b3!iaddDe@0))rPJM@E-MX1@bKa1JQ8a&hH$AAeN!0 -(*M@p3lcB89faPN&X4CMB@Llf%lVZ"'88,1$J9"-AI9N[qR$FILm$C@TTm3B+@K& -#9(P9ME[V%b$`6aKR`qPmpfF@0"Mf"')fFX8Y'X&Qfk@Y8c#&b%[iZ@+-0Mer1,k -lhY+MZJ4h`S!cY#I`cPR4dX-ViXF,U4$pk@$h+4K-IeX[4aeCmf8F+03M,dZ&NrT -%hG"[4F6i$5Q+10SPHQ8MDc2lcHrhPDR,l$el!h5%6%0LfZH6Q)VZ)l9e)+["''J -ij,c*FBL1r1JX9ACL)d-)P4hbSbFkpIE,Lh"Z1"@d-ISaC"kS%`2C%[!LE38")%, -'2p6G1GKr9VZPqmch"kJ3pj1U#Pq(UPCDaiMqEB8E@+DGK&UMjLb"KKfT+kB$@4K -*ekQDkja41JG4-QabSMSUP0M`iVl1'EYf(Bj$PG'f[kJYK!*)5(1[dZdDj1FSd&F -Y3kBF[ji5Lqi421K4`ZX@%%dd&2J3+G-FVr%A+aep6hq'TY18Sfrh6%I)@G%HII- -IhJmH$99QHj-1$L0TUMU*aQYp!00qq!"9%*YT8-rih1#pR0(dPXhh@5(FI0,*@E' -JSLG1bB8GV`(iqF)dD(+$XEl&,BPbfRLNYKL1B-2,F1b"NEJd5DjY3h$[P@qdAB5 -JQ@Sh06paB4G38$Yhm'Kr"K&qM#+m4pKP554ca5"KmdELA%`Th2SJ4K,"0j!!3&" -j#"Q"8,kULG3%TYG42-$`%YH3!1%G#+MGGPm2("B,lX8@e0`i@L6"&A8pFDlDebJ -VieB3Y!E18SF4kQ*Q*!!ljm0)c[CfpNBQfLVE#NAA,KL,4erTla'1E8)MUGiqpXk -NDYI!E35dF""S&i#9ph[LpK'j691A3&F*qU,V"d5BFTZf#Cq%b!mN405SI#hk!Qd -K&8!S,IS(2kq%JZ$0""5'0U1hr-*`13lhp3j1R'SET@1G%pr"dH'TrYcdc*6Fc(4 -C!k216-R-6Fdm``@U#3bf6-,P%Mr*Q*Ub3*&S)2S1%Gk5-DmTe`$JApEd4VicfMd -i53X&3Q5XF$5F4S8HL$6#82KG'M,h$YhHhcRChbF&0lL!"F@i90$l6@6U&CrJq*[ -e+D(CY2JX2I##lmfC-d1m!"1aEF6#,aKR!4hZXVGNmDMd5bT%!KXTbM1Kb"B8&r@ -'3(pTX$Xbe'Y!30U`8c)-J'39,k+3!+KJ5&IS1dri10,EeMXa'AE35NPAr46PZqY -jK4KeC)P1*cQ"G6E2-f'!50ASX[8EEqZ'J-&Z6@mRhhLaqIj[N!$C*%H!J'3kZqX -GlMHTS*C-b+p'9UipY1H[21LK5Z(ZCA!c3l&5JHD$'i&'BiX6k2l-Nf0aJ&*[5d( -)q+F'+#,PaYQ[FA'jDVFf3[faQ)RF9Nk(Ll2bLN,kG-liPHL++em$#'JSlrU#1pM -eGZAe3$IkGi1Lm`HpU-+h#EHYc1Y5IHMdIFm&9eNTBSiMBY!jKAU,AX&8BCYkcrC -h5X'UK%F(LZb#"UVbpG9'dC8ICDZf8l@S0kGM10MEfFH2&9&5*4iB66e&aGYH4DF -G&J+XM5SCf9dk&aIUNDUlSYp#H&92r-ek5YMP!0$"LdJ*26X[%"H*+9lF8Q)EC1` -8&40`ER)4JF4FEa9bR%KeY6fF'4HqqCRMf0-cF5bk1k`)4Y5p#1@JQ8*A)E1JXhQ -q39PiI3b)3I%4$9h5*1Zb$DrPU&f,%LU9Y`L-r2A'MVM4fh!S4hU9J9H(CIIR&Qa -fP+VG4!e(SYla%NFrmFP,@Al1HM)@f[DU2*9[X8T1B$lp&[CjQqF$)2C5Kba-56f -NS-)RSIaLA1$Y3IBqSQ`F4C+qD*a#aFZ,aP'U`)3q+,1+%de!1AjRSUG1paZ6%mk -c-Y[Z-,pJLLG3)L5QN!#9DZq*4eqM6GURV&0d%!639JNiP#el"#lfk#Y0A!cb6)h -KB[-%A$&B88b!#,pq$bN1bZIJf%iH"FZNLaQSmc88a5MkB9C4A(CKT@8m$VD4F15 -NMQq3!!9fE`qpAXQC1hJbjCd5NXUYJ8AQ,"p9hL)6iqQ*@k0aRjU1RQ2Sp("8pR6 -3"D%HYdc4pKU20VL8kPA"&,$4S!!pf+,8!)'b62fNZ&'eZ[i6FR#-@!i,+k(M*j! -!eQ#f0,aVS9ka9%em205Yq4c8`[l1XpfR4V8UT3!e"IFJYHQX[)l!",[1m4)9+hE -CFHKT@RLX"($"YHUhJ`PdQ2AdNGRm"6IrXrD)V[I'2c+'pQea8L"3p"P3i9%p$1H -4d'i5[c*KTQjZCVpm,`QRkL#k3fhql*-MA+Mhm*MU,-5L1bj*&#G'kXJa19bN0$R -h-NcJ'3j))1X&"3JjT$mM05J#02'KB5*%%c--%d'DD$4-H'PL(KH1ETk3!'cXQH@ -ADij`FTAP(4j*(N8NA6V9UCNBZVfhFc6bZ9kChb"PUSNF8iibUm+9HAm*8fC9Q$, -lp-UmrkB15CRq5XVdVe+CIP,QM("P$NU#H#0LG9@bb@hLjXY@(kN4jM9S-#m$mcX -F-2GX-3$QP`FR*NF48TN@p*8pUB&AR5Bb+jIk9G0%bp4X9fkDIP!c-3DJIdm!%e- -0Cr-L)#bie2I%i-i)pa`"iS83&9Mm&j))qVb!0`jE1-XQibTBE2''E+TqN!"Xlfa -XQ56kDDRD*N#VAKm-V[C2ST(GLfUqZh2h"!2*898(rDbELLJ9,ccbfKd,HH5Y4-& -2Lf%HH5LL(cK-N6Il@,DK+[G3B@2P$4XL#k"`VC8+$KDmk`fQFe8UhVicS6%SVNK -[2Vbc$&4[KG3`5+cMKBA(ZJj94b'T,laUBSLf-%56U+B+&H"&PQR`J1#)Z9PPHpU -4EGr0`6!A-VD'2h%p6Ff#,TVbSb%[IX%V54f4,ZP+HX%#9RX,YSbA%K!h1)lM1MF -h(`5@QbbaqDb*8H%B$+pSl91X`15Gh8R0m*kiT"DY-8%YI`Ze-*hdpdiDi&K%cdi -di8Q)'SN-4r9%4@6)l`H`,8Z[8'JA@lA03$H+G*T#mISmVTV50QkMN[TaNH%'IpP -hMKZ0&h+GG"8c""5a1JX459+0ZHP5!Epe$-UMcBa4X5`"8XBhQMTd[h%XY+-#YJK -,)+B$!bq-ZA-4XK@E1RV3"4G%64Rp64eN%YX%#CI!Ih@pJT`aa-JCHS18'VNN#Nd -K5C3%*KP%m@V&0m!ER33#-d,'N!#@N!#KVl#MK$MN,%HP[A+e5VX(9G'SeFp!X"+ -JA+(I#*Ul(USH8@&03Cea"I,DLJ9A-Yb9))*M)5@!)J"!CHZ*aj*5d#Ne8M9*SJD -d6@8'jNPBkaXB&HK!%T&,5kYDhm$(*Rbm8Gj"cIbB"'`SA!Irm%"imaq!4$P01Rj -"#bl3m3YDV'U3!1RTTd*a89+XC"F0aeC+6FV+E($mf%3-KUENGrZ(9Y#5C0G'FHd -i[cCU9@X0*FLZ8XGD*)+B*2jA965T9c2)F1@d$eFTH0d+"#p5#JD`X9VENBP0DX8 -QZC,mR!cLCQ)VQ0KNR)[pQTSQpH!qM)*"qdbB4kY`$dI4!%"*JYA#a`52-i9l+V2 -KNL*L-!#S2b@&-rL8A65&LeVj492m)Z8P8G(+,[(%+J'$dJ9IIi4HKJ'LPH'`pEY -SC08AlC`HIY%(fSdB`$h@c+jaH[JeIPa$48'5LBl'+[40U'GQdi38N!!1p3raeK) -6S0B')l99L5)bmCQJ+4D-&1L9A+8AKL,cirkKX"*c[93`[QS92&S4VS+&r*,95[r -eZfaUeCF9bq'AIFc9EDKr@E)6'lV!S%3a&G6!h#r5a!(K1*YM(hmekK2rFp+2K0e -$NDTB"-1j'He`k!J4Q,DfI3S*11a45[Jp@M8kG%!9Xd@Z4+T',id1aBJYb0N%CkZ -3!"+)lklD6BaqBYapDII3p,0j"(Dfb&8f0c+c&!P'9YV'&%JG%2Z&c4hTE4M-%[i -&(M4re9i[GpVPLC!!rZHNm+ITNb'"FPF4'!pd",S#Ji(4`-Q!-E!RF$N`,p!8Q"j -i2h"(B'1J0&!B5SBmSIE3TT!!+D3*h4[+#Kd)eB@q#VdBQKfU$pd4fKJU$48'Nm( -aB%H`+cJB(!hDJqR"Sm'&`GTJ3h"QF'j`Dh#R0q49Ha2H6Gj"lkMAlNhh([A@H"G -iArI1m-laAZ[Gl0hPpVY(h$Vh,,IC[GZGi8ja@paAhBqi&lRVhAHiRh6[m[Pp`ck -GEjD[clIEGpjh`(ICYm$Ai*[TQq[EkYYCjLZE+NZ8fFS1Pl@9R5ilAlDrV+TXH9P -efHbbqV*TC6HAh9Hfbarb9rK(r1hq(Il$ISGrYrrN9+(i"ra8M6iE%f9f0Mc%KrP -Xq"SI1YM`Th`iaSBAqE#($ErL3jN0(q($&MDmN`qpE&K03pmZ0UcP`meXq#)IhX5 -'Ar,Kh@ciVhci"4ZqaBF0E0M-Kl9Xf-5(#pQ`N3q2XH%52NaM`m9mH)i0AqI$%fb -iL!mlfI"Y2R5aiFriF!FErT)2@pP`0Km1Xq%,I1KR`qNdG*H`iIrQ`iIBF!BI2Xk -'rmD(FpR`2rK`*KYq`SF[B,N92aC5kQkD)J838`0R@-L'A-AZBfc)PHT1Bd1Z4[F -jKDKD,LUI-8J)k`hJ0h`iaPjb"EPlf*!!4i&ECU+UY+)U'!0AK&Z`)BmLlc1-rDI -k,AJhXUZ1FBBlf(!q(ll2f1[`Xi#ccfELH(4iAe5)Hj%c,&G-r5ZIXV!Mh*Lm+@c -))m+ESEMJ+'H2++BZmLQABZS$2N8+q!NTM`Z4&3a,1)0H!G`-[AS&m-J1NJ+QkC8 -AI**YGaNIAXZ'cr(K((E`(rP`"K[bJ"9mR3fjq3BA+&#B4bJ%,f2j(Rk@FiBp#UA -8FBBXaC&MI1Sd%mN$5l#0$EN4"JmVM'8CCpr''(M!$UjNL(1&"09Xq#`IKYM`EfN -BfSRP2qX4#ch!KLrai6@+DekLDd,[+DB@mLPP!(L%6p8UTVl&TfS88r2je"l&e(r -bU5b'eXrjeIFbKZrLj`TRD'--A2QK``a4(M%K'f-r3NE2f8N"Ib$ceaYe++UimYp -S+P#LQ*V"TcDcBa5C4rM8YBSTESk"paA(lZ46qJ$!83qmU'$J84pBVTML35CJ88` -em+PFYVfMA%L-$Dr`BB30Mr"K(aYHiX0CE&M(KcSfr*J24pM`+Kp'fI!$'SSL0Vc --Ke[BN!"(1dH0KJ[jm(UQJLp*qB5Xd"H!h'6%#f`iM`qAXH%hqA!q'riR(k+,'[% -q+bMfB[&2V)JaXJ&99aP-Q963jl-A92#dX3'*FV%"AEQ*(5"$d,%Ahm*JR!d)%68 -E8$AURASrmQcNNJ5Fj)P[fcNimb`Pl#@ATE#%dj58+N5*N!#mGNU%b!'BQ4b!ZH@ -Nm,CTNe'2`h0L0(JqZ-"VN[i&Cr2&L,F("cY%J"qYjNIMk"6['Zh4k@+"-!Z0Q)B -H1kH*h5*GR"HA4D0i%F16BLD5)4c!FTV)&FI%#6&(I),"FY(!*kH*qF0MiNj5,"D -e@"c&iX[B!AaHM+AMXbb@Ldp6l$`qcE'6q#b*RF$RpGKZI(i@dq$c3Xb"crq1pH( -c(l($q(`5km+R2VB$RmpLfr#C'@[(jrXa'CmjX4&m2Sa0i9-BUm#R11E(jl%B[+c -95%,T0LXf,B&lqdk+N!"1#qiY#m`&@2FkYP`(YqfD`-eLIZ$$`,@"RB'YJFf"dY" -+84hb"8T##&LL+E3b8!2!,aTU%3fKP4KD4,ei$UUi4X`9'`2ca@C4,,B!K23(21K -c5!lS`'3,Z!"-QJ2j!8hJZ8"ei(`J"U!bM3[i!XM#!6``$iXM&$La1)S&+C'##5Q -a#JY5ib%X8V!iKX8j,&l$JY4BKm9T,(j+J41,+eL3!"S[B@(#!Pd-"TCLm6%@T-D -V@(4Jm3%@#5aU+("LF4',&Lb@Bj(%iL8X3PJX4'5@B2'h@$b$a9GBh)I&GbP`BM% -ILjZ`3*HEiJiXjQ(a)4EIT-#*a50Bc-$L@eM-aQ)"&SeBr!D,@LcH`S)8X!J,8X$ -Ec)LqB%EdMpb)rSNEdGhFL2k&'p'eh)LZi8Ed"$HL"lJ4hFq0D$-hSYpb)lU2'p' -[Z4%pa)hSB@j%TGb)rX#0k&IFL*lK4[3eEN3lp8B8p#,Kb-rJeZj6MiQ[5blVS5d -+`eVZV+!1"[MJ&5HDpcJqMB[k#4GeSej8D!C%,@HLhQHLPLP%(A-Q)-V-"lIb35Y -qf[(6JamNY(,+-4Y%lZ,Eq$EIaU0m'b9m'p[j0JVij8AmFTAfmX1i[*PGrZrXmJj --@YMN[l(*BIj"JNeNDD1i#AQ(@j!!I'BV%MK9SkYUS2VB*Bjb#)QmJS5Uj58Nd1U -BT)H2G(a1ReQ6KXrS+ITi*JdI-df*'Mk`d8GFTQ0LkmX@cYccXS@rp%XIVS`2UGX -h@JCA1M2iBL-jUI'$,dS(4"@1TqN(H0AfXZ9l&QF+&r"rRI[j`Z2X`DZPB$T-%lF -m!@Bbm(USUTSCkVmb3feNKVUB'@S$-p6Cc&"rb3ae1M28Rh0$IBiEkJaZU2r!$I@ -IZD'qa`heapa3jh*$[BXEkKhF82r)$I9kEUKriSEkhcb+Eq*4I$12i[r,ShJMMq+ -Y2)Vr&irL*eN8Rd!drF'ZU4a*d@H&H2fSFaYI(('ZT-@ArqK-dU+f'TRH(JMC`XA -qPBYpR)[p#a2ViadK#8AA*8K-car")T%+3#B3+hNh&P&lP,Nh8I)%'h9h)KdT1%E -1Rkh-%B3bHJE1`39prM[Ri)lq#"*demU1fV*CP1&lEI5FU3mGYIQ-dkJB3GFpIHL -iai6N-4hLX-l#&chY&NVUMXl0(d&LH$KH&ab$!pJbkQJk*&502&(kE"Tk"AFb2eB -GJ[#dD+jj69()RR,GKh&06j'hVFF[#ZECFJYU%rl4)qPVRfMQ5G1e)TeH*0&[4`, -'BqCkUPM-DjcHrG0L,DrN&L`50YfLJZRYL`TQNaUT1YHlU&*@T%HQa`P9)bF!b4Q -I48,0HEN*U2&DC!+3!(-SUEF)"*!!(c@Kql&BK4cmed3V%T!!bF%lXC!!(IU%D3` -dN!"FaTV`+SN%b'V6ZjbiJfj[H')U2#DM9G&C3p6[3E3K%pc[[$I"ZQf)H9[HT`l -[d&P--,&fTX@q"3kZKekYbKI'H2dKqdkmfS%Z*,ebk,'k+SXF-VY-,LckGIdhrV- -ZqX[h-kENQH(rIRChjN-J80X-"L12j5Lkkd*d*+Q,-(SJMEkM,@h(6jZPlLU3!$L -eG3+G[lhUDUh$`-m(4e[Vd(e60!FGVP$RL0qZbqq@(HM@"4ePmBRcqGfa)QR$hmV -1cNM2cRjjachSi1Z'HdiHcmM16%[00**riq"qUI0@l9@H$48rAbRqlm)N#dQBP1# -%NTp`pY49XUGe([c2"mmI,iGTL,Jidil1J`Z86*8fa6R&kJTXkIcG&"Lq4EVVH&C -@6LUl4N+UTBpB`e(AXJj*DYChH!)N9Nimr*2@eMTNa5$KkhB0SA+L1mG23`N9C8G -+G)J6)SRC,"hPRC(id6&%Gf9@5Ibd"9VaYJd3Vj11AUIidGpCr1KeLrqAKr6L#m4 -kL-HV`Q,T'1qS"4dTj+p)p(iQHNC"G,e%cbJi,"d,&dS&"K,lI53DRCl%4f+C(+K -T&VA26iKDZ4p1K5ZI0iX&Ub(3!9'LYBiqB'V&JpQQT'f@A,0LC1"iV#G",bkC5iH -PC*jk-66%G9155bm81m+c9TY%,9XXSm@Yj*VA5%Y#MaeD`!p4eh%@L4fCY,LQm$b -5ha44`FXQDr&`U`9iI09)*cSdJlYUNB,Cb+Xjmr0JNkjLD0qREkJj1U#NT+04e0U -p*Jcia"5kJe`3D43,IU44U5BEH40T2TK'l0a35MEQ8a,a'L-p6'@RqC`@V8*pKe[ -i88%)8*T&+"8b*U0ML*ccNFcN4ZHJj%iVPZAMmA&)[1N`DhL'lq)5**AIAXHFlKq -#@9SdB%'QF!6+jae@5Sb2&U25@%N2DQ&GJ,&U(dlL'A*Q5NT1LR`K9qj05aqmN!# -9fCpV2*JqQBkAH8ZA%S[Z)b(H3#Q`G+QfA(VMM9l$ZVpE-G*Qe$$e)8Q1fUE[XUq -Gh"q3!"#JA&AZS+lIfcY%lA5`C2'1i%QjLGZT8N(@2Mjh3G'dZ#JTHKPAG!ZkQ&[ -(PEfCG6@a(0dG),%[G6!JMT)JKH*,p"d2@YFTe&kb!V8r4*Qe61epA1fl&'VIaGf -I$@V29kKpPelYX[3302m'+$cer2'8MQhbQ3X(-V262pSJjDX++9Q3!*4"*P0hb$9 -`j4l(`qjQ5JNEYTIQ5mK59b&'RR!+L+efaDNcQ5P+b5a,5-d69fNcNpCKmkjf$L3 -k4eT[id8$3"d1V%5Y3CiS#KRXFP#[!!P3BQ,SH&Hl-+UQ8aFV(6mD8UQBN!#9*)3 -#"R8jT4Fc61El,*P[Q%#!)@'C@`D8d,N$)F&8iGHVSZ3j548P6c*9Y1K9)623GRh -8`5lfKfeL"cT`iLL[GQNIZp6i0lR8%!88N!#BXUBqlqE1q3U9YmGKqQU1S"4*-EV -+S$3)5L1R3%PPmTX*6H)#XJ%[+V[,Sm*E2m%l[Z9*KJcGjQQVJRCd,1JPTbKdM4X -eRq-GF)p6*8#AVU"+UR5"SBS5J`k4hffA"X2jh5K3ND3H`%cSiTc`lKKjN8+2A[A -+P"JqJ%FlqT9Gr['XiLEK*cIPmUV2Re6VUdmaFYh9*`lei0$*eMT5KZaJ(Bfh5L+ -qI[Nk0U`A-X*958@9Ile"M4QL48+h%T!!)@A2Ca&D8MA+A!2p$,QNS4"Q+TmK6NG -JTPEUc,D'$*&9aBU-BG&",bSIecIrC,rk4MXHdUKm)@Z83b2Fia`HHiPbdUU'`%e ---"VrqJB"KP1a+!G5&dXJU[kBi3&l*##r,Rc6US8V8&5&DAQiNK69d'D&DQ"Bj9r --,QJ2QeMmlIQ'aeF+E9*(rM#Tq@5Z6RpN#44aHf`3lV0TP%`'R6`qd'SQJaMSTSS -'"N[UYr(UD59RiP1&#bR!8XFbhcBbK0+S)6JZ`KU#84b"%J2(U$')kLR+#ccDFY+ -`AIk!6fhAZ+d[@9m&`eId`,2q8TiSjcB#*TN+1U8!Ji++"9i@F0X"b%AP&KkFef# -6(GaX$["Z9R9KL%P"f,)LNbAhLYDD&88(SMKB[iJRqr2[2V,F)JF86&%bjjBD*AM -+NdPMdbPb`j&-Efe2$&e%1T1*Y5hA6&VX*BN*Z6r-*-p,P4S[T0GT8B-+9FG))@G -,q3X+,N`KUX2P+d3ec"9#fapAGSj)#'N(%26E1KkSp+CGSVq@NSDU@JbA%ZL"4&% -E+6$S,bqD@IlP4I2SFR2H6li[48249M*[UA2jpZ`rIc%FMVCSU)bfQ+j%@m4@B%+ -E'0V[-q0T+3pYI66[U&'UFDj&UFBrUe&a*YrE5+,i%0!XfER0-2Mk[BE"eeC@,[, -RUX1+I)"d8T(rKhRAU9ab[TY')U6L@9%!QDqVU'D&XD',fM595Z'ZYVK%T`@Qd,5 -"mp494A(H&4BBG&j[dS)0KK@TdX9PkXV&G1%AUdfp[YV822f8e)Qc%[3U-CGAeFj -0eeHek#CY[DZp4mHPSkY(1"jBS$B8b4)"XTfk+@fCAT84D[HL`kSCfapT&hL-ZRI -kSIcZM!J9`qhRb196$KU-GAZASVKE*aRXpU[DJ,41B[ZfjT8Ki586MQRdKA4XF2U -K9*0Z0C%P$bK%XZ*cqjK@*!ZBZiVd)T8*h282Q99@0P*h@3d!JM*p!),3M'49$#r -1YKpY9e3b8L@arD61,%G45E6`LJ-A8N96XSXB#CKbd'2'"kPc4`Vm*6BC(3+LmF+ -,$5Vb`AbjI6Q[U'4qe6VTXUrI9dj9GEZb5T!!*@3"FSdU3#jPmBdQA,r5c)%%J3B -Y"**)"U6D'#B1REj80VqLDa@ZB,`l-A*2KaYB)%diMZ@-@j--R29dAU31c*bK+mp -HqfbNkVPMH8r+F#AcTPAZYS"AG'Y`B%DJ4#Gd!+TEfcUQfYdcUM6G*p&ek,A,TeH -P&ZZ#mjGc9R4a,,',p[EN9kMiRhb@QTm')&S13RfHm+i,T-HJpJ"Fl5KVki&,Eh5 -E@pH"VUDKp[R(5$N05(L988&Jr9G)b04@CJ2ap+Y$FXXTG*rif1*YlZR(6UkmpPP -%NjGG&HfmQ2$L-6hS8)k-2(8VM#U+4jZV$3mc03$+h)M819%*p!$b#8hhrX"lMB, -qH)(SeMS8j@3HDMQX)h0pKff8H!2'9a9qIEX!dF-[0AcXJe*LeLdqeP3qcj[+KBU -Q-LGe+*V+'BUQFU'fU4b8b"-6$pmiLQiSE1Jh#@TkV2PCS+S"JXrK"eh5THP*j4H -Sj5cEdBD@-h-ccXJ(Fc26M*QTkCNC@ErI8*)&+l+J%1Vb%-TdmD'kl4b'ILZ[SLD -TLJS$ZhM9j8Id460mY%6(TceDm-0!XKhQK(XG&ArjBF9I1#"U%,Y2DY)45D)kV)K -B*&8GIr-VT+-mbk#&AkF21[l1LbFU&lPrYQX9'hYZa9G3pfSdV+p40Yr+Qjaiq(U -ASB)0UqBI,YQS''a@$+k4M[jT,2bSSH)ZILKFe(DK'2J9!ip#E$%*L'ZVld"22Rp -XIQ!@,F+VG#6Ii#Vm"C&iGi#)e@VR#IG4B1r!NEi6hAKUqMhiS@%&Ef3N%'M1)@J -PH0"#iJY4cB*5Kjk8)+Rj3XkCl*2(cf6+pZ-AXN"`)N*6DPEQmC69!`5Id"pBZT5 -G#!m3(!bk[M5miIZVE9+&rX$#p3'$(TK$)XTVT2l+AVQCL53i1l346SQ8m4!i*1$ -h(l@S!q@pQ+Pi`36FS`Aqq4BS5Z)`8p8L20Da%!mD$b0q-c,bMR#8$D!ADe#dVJE -B1%!m$2'QE3SR@@cE0bB,l@3Rl`Te"MTiFe(Q(FLE5)U%!M5%)V!DA@hQVNKPP%A -*(hc(0fF,fa`5T@QlT@(G2&"$i9Sb-'+)Nr*Q&+($&8-3d3G@8`[)V!'HT4!LJ%' -,kM2F[$6DL6YNIhih*fT,%c0j`jfMVChm3QVf6RdLU&ZCqB5)rQ9K)AA++UV#*MG -MdULF+QU4!NI4$UimRMaCqr+F4#SS1Ra#HfA"9Vj*2FZ8G,aJ*dHN`J#DN!!T'KV -5P3SaG&)C4Kb#ZYj8&#AUmJTZ,F&QHp2US1Z+#MN1V#!21*aN4Jp*eT)SHAFKQR, -*%%T5a4qb9N5U-*!!5"3N[(%$#FmS9LpbYiF9ZC%QhNQ0IcA6RN,41-)b&-Xe8MS -fLH0fkY6'6k5j969HU%*mSNj2%,fVAX'X*0V@Vc))DJ(MbN3R42fl,0((BPADUK$ -C%16#,f&NSB`9NldF0ACrC2(2MmVdSej0TCi0)M31'jMc9m5XIiJ%-Lf3!094B@h -K'5#5Dd!dM%"3LG5U*8`V!I52K"GUZ"#Q!UkDm!Bj2k`Z2k+)R2I3i*0e+b#Xk6G -A8EjC86@k[CLUd8+rBU"@$)55F*!!U#RAG$GFdBX,G#Y@Y,jj,@CTQpH'$4G*64J -`,#l`Dl60l`*Aj5TY4@LUdPH98EUH9kZ[qfUH#(4+bL,N$DlG'ZU8[jLjqY"4)Nb -Uf84d"B'Q-N'i[)KJMb2!jQl@%LAeei$BUqNfA++UV8b3!+KmHAPJS3%Ke3(&&KA -AU"D&AA2hDNFA&mLV,",d@h[jPh-9e@JK5m4F5*8l1p5L80R5X!$eFS)+erj9&QN -D6GhUL"5p@2kf`T9AC+p8e6#e&heBcRDl9U$!UA+feX&HGLQf0PbT'(5Y,UbJG!@ -4F@mBfUlV3NqTI'A9[&Tf%BM[#BA6QIcb'fh#UlZBZ24Z[r#fCqX-i&581T6(G@% -&@9KNM2e2*H+BV&ke-C3Ab9*#DriJ,dNPZY8$fBUL2c`59ad!bJpii8&)pIi+#+J -H1YjDm`TB+5YJ4@68$51ldKpmScbJQNeGr,e#RG98ZX5kVPfIM66jaJ@1"$lb5mT -($T@*(UQ"J%iS@hN(eKf"QijZ2E60r89$PXMd*Yba8+YE$Y8F!H(r56NJGBPQL*C -@1Rj"S+YY'r`*(k0+68H%"*diUL!)Fa9+V,TE&iPA296GU6F5qqiE,#0K*#diRC4 -AU'l@9m%Sd2G222br2L4AQ0pZ3iAFq[-j)(TZ&KSXKQN5JfS-Q'Y@`@B8p%RR$K` -b%A%6VmGPhJ4RcDYaBY[H"*!!ZC,leZS1A[U+h[,r+RfklS'VeTN,UGP%&MPjd*l -pS0k[E"0j&@5RTabrN!"q"Y2C"XHbX-eXIAqp0e1Xhmc@rd1E55eh-kRDc4K!)b# -fHq,KadT"N!$edN*6PeqAL#6UfL2dq+',rr5Z@5`P02"!E%`!E3rBVY+IPi3reFE -"(B*SLh01G'mSXMPRZ#I(G5Sq$0R6Z(irA8q,F'6cPHJQT#N&`P''F24h4IM#li) -`P,YaTU6FM62A4lNEcrmjPEY"KJ$PEY4)bYfS@9rPFS6rE-TG$i6ek#ESFTCK`Up -PB'+PDrQPpi4Gq[IXdT`c'hMKBeIrTKHZ4b'M[p$djbNZ1%*rTd4Sd`d53T,1ekH -i#%IVce%JV`pDUeD@fNVG%(BHI#3M*r["#aQCZAT*ADRT[cGQJR&S-&ASRB%mA@` -$IFL-#V@2$Um41cc"&2HF)`k[ACkeKTceLD3Z#qV#QC'KZ$NA2CGIMMRVZq@e('D -EZ'H$LVCCCc*cde0q(qD'V5IhM8XAEFHI8P&CP4``NC3hjXa-Kirala#T3rpIAV[ -#,I0VShLD'@A4)I,3853qDq(5M3M-23j([`I,LF%(+3VT)@qcV1LbD5J!d!C*$Y6 -m$d2!3l"+X`ihq)AYKrK6YZ+5U25FV*`(-e2+Nl9+89[+%AA3D&bK+&idH2QMELX -ii%TrU)"a@#+j4Y1%*cM(S[B5-(`#)RAFFFeLJp`,CmS4+CR2$6CTLSM-Qr+1RlR -Y`8T&N!!mmI!6ipbChDFJ2C86Y,kV$&RDLbJ+b"dI3AHTV(lCFYIE)"M!LIh!U(, -kFqf,rbUArEmDbQIIHk)bX[FAVJqbPRH9f1ki*rYXCQjQ#U`U05FM-h9r1M"(f9P -1J8aAY2jCVNJ0[i,!D[bK(A$L!J!m61Dr3RFD)K63&DqXb)T6%EfDS96mRkT*CFA -@+SbHq&06bd0NDVd3HAi&TD%"$id8T)")P2im"'41@T!!!%9&38%GR(Mi[LaU"Z$ -b`+U$9#SVAPFXkYIPL#S[51P&SB[bJaBGq2+1Tf9RCHBkdmpR'dU6X+M5&f(&",` --d%-iLRY,9E`$6LK-6Bmhj3ijH$`!$jK0XTSD@!`!kF%Peh9"C1L#T+p6@3be06K -f21["ilmrNjfEJkl#pkm51qP31`kKhpbF$232YNTqBa$X!f!rQ([Qr!9lqLS`Zk" -"(%Ci0#)J6XP[`d$`CdpJiH&LGP!KNlY+#AaR%@i-6&DjSZk"U*b$k4XS5e41r($ -r94j)eHXEA"H%*9[D9%iJA5p6HG#JhTHlHpi'X))r"Z)L(KH)2bI#+rq`S5l,1r( -I-Hr%(c#%H9b(B6aBVQ')p61-"cI--"lF%-0iX"c$U"`&QmpTSk$`Ea!&LS)B!!! -`!d&%3e)$!&D`$e8,,#N!+Qec[jGh@9G%A&BL)U)9%G(8M((-'%IIppepbI2,b%c -06%(1,4J"`S*QTXqlZ`)LRXh8'M1RF4c(DFbDaM'RS(%FTm`m[aV(2$HH1b8cN!- -MT19qRJ9F2(I6I2r[ZVl[ZmlcAGF&'ab""%%3"%'3!%L+C%3VeYA9r@Ep8rTj4l$ -i&@M"-f#1`jb'k3V$B8*K,X0dJZPlX-ec+UE*63K"8H6*hDGbXi0(@j,U0%2kK5( -Mmp@lkQ3M%$f1re)YTPmRYG-mdLbM0RSCIdmp3"mRcG'+T$ck)1P6EE6d@f0-Y*R -29'FB*G'2m6qSMp"h5BZdE#QGPL3Yd"kAPKU24QIaa@ST68pk3hYDqV2a9(3CIdf -GBRLM$r+TDJ&05jUYQD6"aZRS&qVi2HUrkHkNJ9UPG)D'*0f[h5NpB2`cqL`IT"k -PQU5l003$id6d-@j93icbk$raSHTYG%G5X(CFDU#8T)He2G*$a[24qrK`GB4a+[S -jIUpkNKj-'URYPqBD1G&lq6IUEKU@0%UVPh*TIY*#lC!!0-mi('hKN@SR)c`kUSi -rSbE6[j)kDcZNCZU6p(GYXr4()bJkJGqZCP#rT,pUldKr-r+M-rP2DRpMBr6Vr(G -U%rdPUDr@+1fLRNNrehk8AMAHMVl!HkZI'cHMEr![e@rT0dRGYB[5*iBl1TEr9pe -#rdKkAdZ6)UK(dSGDM25$X5QkPIG58qPbdUelY-qN!FCAd5[j1E@EX5*k&Ap#rCk -H61UL,CGH0VC&Im6rSqkNCj-kD0ZPVG3qk4AY6DQMm9EdDYj9$6@14'rJep@eG#8 -T6&XMVD1V5CHd,k4VaYI4khQEkL*RdRP0Pa+0qk,MH,aU0j4S"lGC9-QQ*A(0)YR -3p$#8rJE*0)i1d10dJQj3R9%ReifV1e$hH0f*1M*lDJ[c!NA'Q1*PmZKa"e4lmBc -4ZVEDV'X56,3jML2Z'UGVc`GdVE4BefTKXQ!HJ4N0T!NG#cV(`93#-f1-bcjk4Uh -,E[!mPch!4l[XXV!(1*!!ii6eF#`KF)AX9$!I%(DFX'2BhKQeZZD"C+03Ya6UfMK -Cef52VTQ,*52k$Vl-mXI%P8%a34&T33Q@2dVfVpbaPZEi$@j,3r+H&bbhfHmmLH! -mEP%cSL`*jjSb,9rp'1-1HLGQ[f9$C[+TrCC'LeYV,EFmGhL,l958B'TVbScj-HB -8XVcRQ,#`$HlRPZ9Pdl,l-S)XQI%@06E'hC5Tr+p!RGV*qBdE0bd'pqMF8#f'a@- -a*,Z(d&0%G'JHXKM-@MbUc51ZqJSHc@2Sh+0D22%'#Da(e3`2j!Y1b-%3M+Laj-% -!aXQiG#"aRGM$$8I&FJVhX"eL-B8E,VB8dd#a3CUKBKAZFGJp6#"R#U*RKl5UC6M -MUMlQH$'Y9NXrchSH&k3QHMKbF8jFi9aeSNmQeh8,0j&!@VJU"P`BX0KK9@jb*6) -'-R%e[S,4`EQV3J!h+6D"9VR&TCQiNPLahH63J!TP,'+hHTkYB&,Y1&GXJN89+cK -#fC)3Ee'iKH&F6LB%DkYFU%69kL@b!CKGGVq'Z,BIaV6hbe"iSF9X+A6CcB9N-8Y -FZ"V@86@"8I&[0e-KmP*,S3dp)(QK3qc5a8EX9bf&NQBZ9*d3B5Dfh9iSHLS1a4k -c)PJj*)&$%C)Nj-aLT0S+Ui4,BTQiUR8Va)!&qhLeHPAm6!UL*YCK&L*9SCTr498 -Sb!X9aQ8afrbDJ95Lm#fD-%SE)a!q8@N`!JmS!MNe4P)`F-d9,mijJc!8&NJVk'H -`8RCJJhVH,d#FqrZL609i*KFLVQK8)B('5cf#&C6VIRDffbQ1aq[Pp'rQ@X@UGU( -GGBY4TDh39,9C+JUc3KZrI*5fJG3,SpS983P!CS-N44-Bb5``kV9#k)-"JB-8Xf) -c#aB3#cQG+R+l@a)lmCY#0X"Z-PaF8Ca-[-)9KqBA*pC4l!cTAkG0UC!!cpC401b -1&lZ!mc-+P"fb9E'bSTaRbl"m9SAFke9EQIS-(FVf#`HLf[(+i)!b&SXNqUJpV%Z -5DVI!9Ja!MH[Si)d"&P9--VRLr828$X%QfF4!#B8-BXCPNCJXa5kKCNJ5Yc#V#,' -1mibR#Lq@J!iQS3d@FrSAB4JQ3f1Xm*!!5S93PdhX9e!cE@!9H-ldU0,*8E'D)l3 -#Ji3QHLa8k#&cS6l!6+)$i#rd@$#`L)(`S+,%#Mf+6E#+UJFfp3SlCP[K@1hBSYU -a4@L*J30e)C6*%I)Ff1k`#CN!CE-JfL@a%M1-(f9ehLp11(6')U3*'4AU++L9(K5 -[Kid9b,R2b8BZ*d-jl%)2Qa#+#U['3jL*6"*c8Kji3Sp*BTl3"$J")H$U*C0($4- -(j!(H!hIRB4X%a6dUSb%1&#IM8+qc(F+B&$3,lR1bNCm*'BIJ8[`4KH84CH"`XKe -#e(Qa2-(PBJX6lprZJ'T-*dHSAa'UBNJ%QYK4I)@+b+$Bb[$aINj&V)2-46jmUN# -l(qmNprG9IM)1IimQQViV1DM9M@m)KqQ`cd$IjBjVbJMDN!$C'Z[qbKd4&2@1HX9 -R4!ADV+X1Qq"4dHrXZ$3"Zq"SVr"5a,i1BeB[G+*pF-DXk8"I3(ma6,#ZIIp*J9E -6!)1AU*VMUVBU"CdM-+Q#`FY(UYU10KJh$$+V&IeMh!Q@mY#J+T@KaRY((GGD*!P -+[,IHBEbh(*dG-*PBjk`kB19m*5VjpFd4qE'C#HZEd2$-$)T3%kZli'c[Z+3Q0lT -M-cGASB@Xfb'V(cVGaF"iEbE'mHM2KTQVDmXAUApjDl8VbKd&8VL$)Rb*-5P+d-* -Kc2%@D(0ba-#BFaVbDM$'Lq5FpC!!Ge(9hJT@%prUN4U4[cNLb"*cDq*Lf0BjMGK -QKqQ'VHQUYM9DI@,VNI(DI"(VpLR)&N2XqX"aDb*m1*N"dC(S$")$if2#Z%H"pV% -C*N[A[ST@Y6HKjjYR#ja$)eQ"a'INEfj+hKPNLG$b'5P"riq2JRmGc&CGfpC(G@l -2C,b*'8'CQpf0JYQHc`Lmh[Ki+rJM`1Z%k3Vq#&AERURD$V-YcKe4#6ZM,"Rfr16 -$qN53!+Tp8U$iH*(MZLp!I$`F5`a%"l5H$6HqSk[U6%kEU2+#GlDP`$QlNTfhjFH -kGqBhlib)bY`Fa%3CXiq"*3k59X0Nk&VbBM9aHfC9J3h3di)bh8GM-f1D0QIL25J -M2h2c-3LHl64QGcC#,)k*TH'U'K%6P0Q8A29eca)6#ZSi+JDhmL1B9&G66'Z81lQ -4!HEX5'0f#$5C9D"0+i3T-N+J8-JZQ(#B4L1NG@*,D3VHSei*LJK+m!@TPZ!eECY -MSQ!hVG&K6'Y&abi'aV5V'+1b6ZX'dpm)`EH2N!$,"HG$ZSjYh8YLhCF%bQNMaJ+ -8dfSFaK42J6DP4!b-+6PB'ppITZb(NBb3!,jBZbG-G-%c)EdHl'Qc61LA@UCNLV[ -DL8d*0DC`jTkQ)$e6%Y""HUBJ260mA41%qlLQ+IfCDpS)30fi&DDji&C)T*!!q&+ -Tie0G9DY1,61Q&V&9TfCKe4(S`"p-2@k%",GFY8BUd)D@q&HGHYbrkNbBAM$GB@l -(1HVP8&2"Xd-RiQpD*RYUHf0U(iFa&38ep5HBhXC3V$2dH-'!SG+,F"K6KaY6Jl( -rY3*Y1X40Vc@'3UfKJ,UKi3AAKNDfA'hkIQ2kF@0SSc'dpHU',mCAaNNVkr6`PT9 -eHU[$Q!iiRQiA!f-kbQ8kI2PdP-[drXE3d1UUQpL8(l0c4e4-%'TaFe464Qb%)#l -ErbikLf"'kGVV(94RIJREF6iM2cN+A`l+RFe4b8&Z`@deh[$Uer+[6T!!f$IUM6I -1'N0R'd-""N-M&6j#i5X8(Uc`AbMm2`Tr9Z%r+Abr`[qUm2F8RX1`II$kTr!5KIp -FiFmSh+l`@)8rc,Lr9hLc`MFU2&lKQa5q@1&1*V%E#mq`m5k&rd2KPBa29[K#d3E -Q"8`SfLXZKGY8mEVTB'GC#Kr-a)(lGB8IB(Y1-Y46#RmEE3Z&$m(l)C0lJDda6q( -h+Vb0(53UI+h#rkl`q3VIS[!3KIGN,I`4E"c0dV0(%DpcZjR'AS9(XT@Q+IbL`[- -8IPhKhc*"lCL+53Tr3H&r8rKaTNUM`Kp4H*V#Ie6i#B9rTr"I-Y3CTKa@6DjDVjB -0VM"&XIN*KEqLm$mVr*,#PbTmS-,raA4UBk5rMHRd)91S31&&,,8+5bF+Sjh#cbR -m,BA2C%Y+6)-%KAr##L"Ei4d8EPAi6S8(&(j8i5UMb(5&peGi9jCJP1AMM1jp@GU -Q+,b6`JH`ihZCVU$qJi`klbVm)CD'KpNDKeLDda@q9q'V&,j%i@MbI+c`'`Vr4Z' -pf@,$fImCTNS$)`d5Xje"c$T'eUX+Ame+#i[GBRTJl9HV3'3$Sq#2,*&h-pB[&,j -5i5mceLf-q[XBiF!k@q%G&Iie9'I&%`jC$(TL@6R0B8`@*RS9+im(&&k[m1F9(UE -`,eN#)-+Qm,-+(k68289FLVCd#SmdA8kGIETAkf"ck*'C$AdE8dUkVTja[1HZB)r -6e5lRpS5jT9f@6crlLAY3EG[k@I[lCBc-HRREiU2G,pB8fT9hFc[[Q1mpYh*+CBq -)JAPKDclBehrMm1cf@aH9pli3%SL2QecIThP8@EF9Vjej2fe)dG9eFdlpP$NL[F2 -f*FFq[ePR063ekI!c8I-+ERdflB8I0Ydcj[U'hqlj5p2$Mh9mk`qhrIc(1iV2klr -HqmHJEjjqm[Xhr[RIf!H@AI[k[C0rIHI"4rrcdG,IrqEEZf5EiaH(rT@mm1#!VkE -qqm1BZdGI@I[TmlplrD&(ARRcZcqpq[E3FBRhrA,hhcF2HqU*9AqqmapElMp`kBZ -2RrYErVf22lYc`BN[EjLZ+8hZPfJ8,dUBH)kj#-jS%AcCSM!a-"Ce`aLqE&%(Q"l -'d-'UYRN(A,IN@1RiGk@[$k)*(0+Lb,&NM)Y'31D3!),%lr+B%#ckAEUaD!4H"C! -!,haA9Y&"GVPS$MV),VmlBRb(E'aSX+T&e--8`@3,*iGF"YYVc!ARDd`9qG4h&ih -[l%D0CG*-#6RKjCV859SYAI-M3+Q[ma1#-QKV8%6q&a%*34&X,-4pi*LdR41I2jj -KNF2iEMik0@*J,$CMM(aUX3NQakM"eC8D0,TV4,iFU@V00pA,cFI',[$D*!SXEMB -@TcQ-aH[4[`N6CY4FRN6SqHCM%fQq6%4D1f2aG+0QCV@%Dj!!i(pjB'de`62)@&T -Se!aqBX+A#TphMUAeaP)dj*H@S3rD,R8CGp&DhjH5T3R'dNcMVY5*YHA1953r,LV -'r5Zd(*IfQdK"q"[M5bG$'8$+d[PLB#`&G#hYJ[k3!!*Y5Cja9d8$mbl@`%5R%Df -peTI3l+Z-r#frJQC,YSe9Xb8SZ58SY5ARa-"BdJ&M&rTpB(SEGqfUd)aAD"CDF#Q -NpHZSC*q@am4H%jB-E0Rd@&$S-"EN&9aE81VEC"%(aJ),cP!,&TbY'"X,MN!*%'S -"@N%,-SblaVp5K&Be6-4HTl(JR((A6)Grr@l!ifd$"5`Um0(NaUL)r4CfG%N-GVS -MSTVF-Hc!FUa+CepjLbXNRDZ3!*3Iml1NB"GHD4EJl5I5)JE)b0"(IPPV,1L2,P) -8H86A,Qi6(5mZ9QMfFi*$GhjEkkYdrSY6fVq'fEq'fBKdSiYLLZbYDfrh%Kd[$eD -GpSY-3XH@p0ML&eJKrTb[q)UcDUSm1Ci!,fUER`ccm1Bp,kkD$20@#M*%SU8iEbX --2K5m6D,M*d1#i!!C@ZLDrk[S@Nd-XC,CQ0FHh5N`D*CH@#ikIQ+XBd+kqPI`,l! -MY[PR8hTq`*KIVQ[IMLc3V2$T9N#L&5l0'UTUq5K1+qUV&9A#L[TU4E@`iYA0ZJX -[lEembl8C[[l&,9IZ-1DM$Xj(-Fl[VQXriMh#'Pfa,TbJ&Fl35MlV$SE"5j-edVq -ZG3D6rXU%kAaaT13,*@-K8RX6E`9@N!$8LQc"#P@XH2@ciJh*#Z#fiJZA&CA8LTc -+#RGUlBTP*GrLUdVYLbbqK8Mc3U4jiIX`lq*b+li"@B2&kPjZpL)I['Y`eG*HhZ$ -P&LmAZR6eGM"9[jY8[*PBF,8c15-S+S)16q#),)IYBhZGX4a@*ZEiR`AeQM)h@j, -cm8dP)MECR4p4EXQd(,1m%l9VCdc6KD#U6bH6VY,LDdIedZ1rb6"d44fEp(9TEXm -+ph-VfIeMDe!9XBljhqV#',E+9Fe0-HB'-qLI1mYKc*eHS(d$p$HPZUCC98hVjZ9 -iRj@mr!K'kldm&E(3beHVfSd5,`r(9BpCAYjiRfdI1@LhFDM`0#k(R63hR0jVcZP -8bA2-1H'98UkC'cGZf#HbqUJ%apJ5-HUL`hF,!h"4f+2F60Y4Pah'+!$1+2qAaNi -lla-j-@L@M*`r1FeG89(mS5R6AH@3!0SU'+T9''%-Sr%L*aGS`c!BKZpRYYShrAZ -kMNdQ&I"K$[pHBaJq%!a$NfAB4TKiAB[(Uhpm!NbfUTfI#r-qM"fQ4(8k8jMJfbG -4ZKVH*lS)9J#!$d-p(6C)eqcp+r4Vra,E99m9"cQ-&(bq5)&M6GQKDk'9AYl9bcZ -T@Q)0c"bBpM!+$0c[U-q01UjUcJjH$MrPA1lPPe8YmkUUfBE!c&(2fc,rCm"l2Le -)e!K,HCIUqL'%q2NXIVlla,YF+AY[GcQd22kCdAZrZ!4ES2AHri94Pq,PJq'DMBF -[1M3[6PqY1(feaHNX"bk9IQCdVcMYlRXk21Y'DTe4+(Z+!q2-Br*'ebiV1Q!Um"i -XIEVXUC,(XKr*HM6pFF[Kh%-jHqYh0qcCprcqNkHH1re#jEr2r[2-RFG[+rr6dGm -I1b&&l8K1#'VHh0LdmI@-Gc,c@cG&a,KMdlEXq[(#QpXqfVicI1`-EermpZD0X&P -YekjfDrpXBZMeX#[SAlTmkpb!,NpfHk*VarD[[2bI$XpfHUEc[flrBjqrpre,rpr -eqq[RArEkSFH(RrchrArdr(R[9l[rj[-[Sj2Hr8@lAdrqjFcIIK"kj4A,aiQcTdf -C1[f0erjXQ9'hk,[&5jFXL*`hIq(FkjF6EedkeqA*!8pd(0cej3lrH@$)rF&hK!b -YZFYD4rp6'UL+`kA(hAGN`jUeklpHpdAUCbZr@[lpLP@VhlTlUjm)BqABbSM!0E[ -0H6jqf+IIm&RS2c`UCIL$$iedMVMRh[2[$4adGha,'[cdYjBdq1P[2M6iG0ClPMR -MDI!(AaTm-fTBbX2$(aVji)Kl"pmcm1j",@J`bDq`qQHmL*qiGME4Re6RljfHb+m -PEbHI(hq42em"i6irbHGA*p(BIe@lM3NN5lrbVf9UI"%J`B6+QLIKPmCb0&kM56I -aX3LBN!"-RDZS06'k9IaFGD,-CC4N-38`hFY-BbL24P-Y,D-L62ib83(ZpML)ZmQ -HTM*kLNVS-FUQ4bL,(U9d6!fcd'(+T8183hZTRRC6!qfKII3mlDH6Z,[L146h#jL -AqfrF4r42h*Yf*afRfkLFrS5ja,qRBjKBKS++SKf86!N84-fdQ4UTL6E5kj4"le! -QjH0'Zdd836(NTPK+SbfdLhkN#r3QED12D$[Y4+Rr[`KiQbl5Yh36mpV#U+k0VY& -9kNEYk9P+T&#k$Z`9mU-[d@@k4HGS!(@K*m(d"(@PMQ"pK9kQre!(E1P%ce"RqKI -G6RqN2[4hkNYrSIld1qT(IkA2k8[U46p3$rU3!$kKrp,lp!rU56qRh[3UGDII-)C -Sc,kLGqNAe)jq6C2TPc56INXI3)mV@19Mr'E60*T#8fNk[8'[dCpT"Rk,k$YD6%Y -T#5fJ5*T(mfNKcBAQPj'#@p$k(00h!26Y5)1Kmm[3p6rd!!fKqbQBlU!3'NSeG"G -CU8lj[`m#+QCA1-K&1XA4IA5%0Y!D@N[Vk@YD4ep3+Re'+qNV@NlId`TD4D[T,GV -D!J6qA`5-"`(FG+@4R@cNT2-86m2S8rS'f&RN4cp-SbL&KY1$p"#0"0-)ZSIZ"HY -l0*!!"Y(Gf2*5)2!6rHdP38!`4&2Ga%$J8qM`(Xh"Ed)3q!0q%`H"Ek$Y-1Ml-$3 -@qMi)IHm�`$EHq'[K-&!6,@m6Y8flMJG3MQ'K(bPV2!44LG`m)()Y4QX0"1"&- -F#aG%1*JY`Q1$4FKfLT!!EN+`T'YX8-N#fj!!(Xr#C"BL@CJV`Z0(@'$(MrGRB4B -,)d5`P,+JX,#D"DX)KpH`d)@&%"&b%eL)CQ'*#(Xc4DM[)m,Z2"E1L0"J&Z&%*a' -NXb+NcKEK+lEjUd%L,%pRB58,&eRSaF)L%Ei[BS&YrVk4K9!@2Q'"L9Le@)3hfl2 -!%[EQjb*XBkTX+fGK1`X4)Rc%52N4)mTf4[VYM(cE@H+hGfDKK`MKM#MKp5b`!JY -RL3r[c3)MF6K60-V&`Q84GR4PJDQ9c!k5`ePiQB@I@'!N5'C-#5B@@#)6f)BJPZ` -J4TUJ15``GB-Bk$6[&k&a[JK0TePJfjTB!63aj6BbdQr-BS%aE@4-'fqb`)Tcih3 -4-SkcN!$+!P-dJi&A"Q2+B)4qTeQ%r+-X-#$,pk-BD1EhC'%+#`aS@XYBB)4VCD$ -3bTC[hFS#+kV@[Lb`cDf-P+d-@$Fa%QpbXm"8fF3)YiQ"a5C@Y*Z'La$"LLf#JA8 -%+lB)"XSa,0Na$&aL'$PL'2RF!4BB@Gd-V0fXXVPC*A5c",[lXF")idjKJ9AD@%E -3@!X,$&"L@@*L'8M&XNS9biSfPUNBqaS,E(-D+q#d"KBBZG0fX,#,KA-XX%U5aXL -4aUTPfK!4YM#PYl#NEQ&*hF)+D8Xh&KMKYV"Nla,,m&d@i@NXZjKAf#@NDVYkb94 -E+&0rQ(D&XP&D+"FZKh%Ab[*0Q!r351pE+"F(B#S,j6&(#q8m$*DY+C5,qK6+*4d -+j82E#ZAG10MG!fC%SGa`$!B#'VS8bR[+BF#`"m+I6i!"m[REBAV#c)5C!C05+1m -R,"U3!1A#5&N1R*,PNM4ChKdYbmrhPqApdfAj4*JXUd@bV'6)XYjCPZq,Jh(,mK' -6,'m!``CXA1Z&k5(,kl0J9X)XPZ@[JIbkQbar!8'THE,mfAiB#([VXLb(Mj!!jDK -d'!L+kLl,1bl+FR+U,!H9`4b"!5+S6CDE&9RH$%&01'K&Cj09PL1JC%3cc%qb(0- -H"XTZk3S$j5jdJ*NXbeRR22,TH)rm*jG(rRfj4ck"cSPq(YQeh52VPchb+S,"!G8 -@bj4G,-YZQ(E&XUFrc)KL19!+d`rQY@,C["AQ!Nb2BRR-l'+jGP5aA03"CNLaA&" -B,"qF85`rA9mXPi3AbpPGLZ9(MX0!B&CHXCbZ`-b%'9iX2ei#FlPB2R`'jL)-0ZB -@`C6$""I,Kl$3S4d`@1a3CjMHaA*1*FaUQ$DB2M!3PJ-&pqE#5$$BX"H(HaFAbrA -,BAE"32(k16$cLqAG8'Jh&QT)+CEh4"6,*j'`NpK`mRdB,(U+B"B9bmp"NHFJr(3 -C$!5IKS)[R),T@5aAGLq@cd,aIiB@bfI#LZ8lSH$a"TK2LZAEc$")f'hlBD"%Z3N -''mS(&mY(Qi[P%p(&XZ5#Z3N68L`V5+4b&3E%GZb$@3H$MDi!$)MSJR"A2-bjBMQ -ZY9Lq,keB2J,PMX`YPMId,CEAG#Z@eqE!J-"VSF"k&0JA8$B9KCJ+iCqP&X[,)Ia -l,2jpHaJ3B3819m&3@8#Q5N!k`I3-b)'iJ$`Z,5#E!IhQ9TLDJ$aQ)mcmJ*bh$bB -$TJG-5%!H$FE4R`INfJ$-6CM*!APC,Fa+Q0N"Z3M#$`"a!%*-%'BD%C!!#qB'C1p -V!IRJQS$m9'T!cZSIN!!IE3[)k9-#XJ9#$Zf!53R)$GN"qIP5Q#%"qH64J(`+R4F -'"q4+-0eT#XJU&(8FJjNCN!"Gkf%J3#q(k3`c-L$(V3kJ-X*J`j()J,`"'cEd#mK -VHJINp8K3+K#Ir33c25"[KH*EV3(jc48"1H&-3'l1JpN1dbH!*`#J!5ZX&,U`G"d -9eG1ir5iq$R0EF2%'Xd"j,6kLU0V+VCLd@AK86-IRim4X6DdedK8DQA@@mR*SA"N -B#lcf&'k+ifZmL5Pdf*a$biT8@bQC6bND0r!9"Pqkqr)m6)$1+iLr2j6#McH3!-8 -VAFmV!bGC625S)Q4%-QE9PYQH$VViD9q-1*r*J8l`*Xj%)fiE&CGMGV0ICLKN6S# -c#Cb&akqRTqV*9+R'Vk1F0A5i6)hI5Xql+Eh--E&dqT25AGMT(&qejkl("k9+Re' -KepZK1d8YGp&6Q1fC6DZD+6H2(Ld6-h22P0!H%q%k2b6MXZR3[K$(0,Eh)d0FaK$ -TU'AdZfPhmB-1cFMefY[ji,$ZBPm@&`pTL5V`hF#dEHY(GEbr9NBPARSk@h9UjC4 -HJPBTT4p4E9Q8hU`kbbLGprBRE69E0Phd$+&Pfah"H(S4Ek-b[21i9#IrJ)T1UFi -X+X,N&Fh2C,XM@1cY*26TiJhV4(8P1C4RSR((UJSH*rZmB5PdEdNF1dRh19R[E8X -K5dNfQB[`aP@06aFESP+cUDb)$TV8@hP8j+8X%ceI5RY0H-&U8I#pr&[mRDd#,+U -JiDES&(Jl42l2bq6ENC18LF$jP!PMD9%Q&4cM0rL8#3qT,T-59LBPV%bb@CQ8SN` -kq*C*BA@CA"&PX[eQGC&-CN@5,BV%dE*)1JYeiVeKRImh,*)f&)QjN@UcD9`ZlPi -G[p[-*P$9JPSAP6Cm0H+G9p$[q5JU,e)((+Ikj94C4)Ij9FTZS)-jG$L9ZD2"STk -k4$@YUDLQ%$K%YGh!T(MFrYE9Djmp(PAJ1a5+p45Hk30[@mqIU91Yd#R+R2Dc&+r -pQ9be)Pi[+CZ!bYPHRM*4I*JS%palA%6M[$k&9IQ5*q%P#C1F0)lpj$*1cKkKV'` -U-"(ZfcY8kUUZ'!bdl9lE,",qFl6`Ri*XhEcfZD$ST2L`Z65XC$APPG#i)Tp9QVh -A8kM1QB9,4B&M`S0!q-L#@c@$DAHp3Yib1T!!+cBG3'RkJ[*Fi9qAB,CGUMGd,X$ -ChJe2V2-Amq!AZAfTA@b(AT%0fbP[6AAL)iA#REfKN@6*UUF!GeE)9Dp(i$'Y@EQ -q1#eLK')[mFRQ)NDiVPVU+mPVHUQe&rG3H,R3h&+NAD"!598plBLUE-((RcZckA3 -flFQQA(a)bUC5h$'TX"8`9q@bBZp,i`GY2S0@Rm&bRm&aRd&@Y5$G@544F8Q9e`l -&iSG,0e*aGP81l%GGR""PDUa'e45F&bJYem)PV5KEYEPS6,Dr&('K954CG'X+VM- -fEbB&XKeD"9+l)eJj[ipUc95X9LN9MPY!+JBiaJedZ'&'%0I[,6F0ekqAi*0XV@p -0U"AYKbKmXbV1Uml+Eb%V2jbH5mY+bCY&HFGT@4CcZr1&dL(LYCK3aNHU-9V'*kK -MTJP%PrUV([!QAh`*1VKKU%5+0fIj(Zcheccie63DYm1RKG-'3BUphLFP+lI'fE1 -U%8LiC8+%Uk0apKL9jG+M*F+plLQPJlP89%)(c95QqJX$j#8'V[j03e0p!'dm$Y! -fE6)Q(EEJr0@PRjj8qQQrp$-YTCpfK9P+d)aV3CX'I`Bb+IlR+66-'Gj!P@Bk@8, -IiS&XCQV)SLB[0AMTd%ANJR5)pk8lDqR3$NV&U)3DDZPN,9A@1TLVQ-98&Ge2a(F -8eZdT[U+`lY`#@`daaYN&YU'$'6+k`"CLqC@fG(r4LcLaTGVYr8U-[XHAF&aRFSQ -fp4JqLiTU'I%(#FAprZdDr0[%b)QDF+KSUdqG&[@Z6N[I4iHmkQAiNE0dS*C+&AU -XK%Tj9dC#kbLrB(6RLkp5j+qG9A9h[ZTXR1r6CRj113+``@epd%"Y1dfjkI4d,TP -+k'PcPCTq2lHi'T!!aN-1i'8fjY*D[EJPqe,p"ASXTpT*iR'+eBc%h+3IS1iUF9A -YkqD,PJU2mS(5qG&m#CQVmba`IScCp8Bl848M5ij5hQUI()dGBiDeS01`%S@+Mi0 -1&GJ)88I2)fXfMIG'm%#iSlkUaZ,PTF4&HGi**-+4Va(,c5Z4+'rjT+HK,(20UK5 -jTmpT()qVpLi6FcV`FRQqq$cQ3dj9Cc5LG4-hJ8paa8H9mT6Uh'5)hqZ@m9l9Z'# -4+Y`rPqEMDd*Q5)ADe[h5afi6jCYSiaP+A8%rPP&U%IhG4+RVDDfAi[*)VD@M*VV -65j8PG,)Hp8p8bU1eiL#ZPYE@8ZSqHZ-B"9A5aPV+Vb@h(fVE!EVkLREcB[(9@26 -k!a8XHQN!qA$4Z`"8U1LG%eq64Dq$q*4-)1'XlAKr1L8FVKKPBP614VT@'#pk!N6 -I&9q6@EGrPFK-mIQC`@qI!QG0,jqkp[pAD1hr4k%f##eiNFca0EdUjK0TqFQ+jYf -1QlT1UpTAh960LeYD[-d`p[[X,@BHJ4@c)F)F%dkM91#[6dq3!-@G%BU%@l)NTfL -YPIM"GUlr&F%jGfcc1hb@XKc',I$+pC+L#9UYAMpiPdk!,r&H5a'lafZP(8c9YFr -3[[SUS'S(-9rQ)'B@(6aANDLf&YaUU1r'FcVU!ZV$I'aS2fPbRI0)0#QZF5r,UeX -QI*mrRjU8(VIJ6mjQ8lD*LXj333Q0,N(,c5%iCM%fmHdKXfSNURHkejNb0N+e9"q -dUTMY0H'"DV+9jV+UkX@XR#kU9SVj3Z0#GHh8,PA,bX!8Ida$R2keYVVXDfe9Ae9 -lp#KQLkISfQC-hFR0!4#ZIS[4m1"XPG(Ni#ISI1+(&@pl!5mk+LAZ%mD9("'@Tl1 -`NS@,,24LBC%)haHaF*D&4J6Yqe!GB-UkQ'jT@U&U+rUViZj9EG9L(6H#BV"2GEk -eQZ1Z@GYE2AL8`rP@-)mU9*aEMh!$Gp*ZM4E4pZCCR0RI[)MR#EcCAYMqh)9,3*! -!E(mc"2eYH@+4EH8kV[q)jEIeB@'i#"pPLm12MQ'a8PAl+%29$PK9qdF3SAhdVQl -rD$B%IM3AcdRBVQJ(!"2EXhAlpNT)aAdEf,NGmje`Sk*fB,*Uhhi1c0XlBq[f(N# -&UlDG1@"blNcPN@L)lZb1E6YRL@dl"q[fm(T`KLrARH%*20bMD1'pJCb-TbD%,q, -K!38AP-3$'U)X3%9G&LJY+N5hlkL&P"d@)@@(5mH9*YCGM2A+9AYb'64)hSFYb5i -ZlQY2$YIYb@N#'bEXbm,q*'`da#3[&J4)-!N4#@Ge,F%&-EQU&P5NDd(T+ZiSdS, -Qk2BJT0iH9!0YQl0dHr0qE'dqaTpcf*T[BJUBV6Q&Rh$B0ZrJKad-F*E03#2JUK$ -D1&RA'N'bCGe9He-@"$5GeV8QV&+l!ffDQi+RU3p3[B'+!mmJm'`dkrD0A86[G[5 -Q)bNEDlLP9V'phN&XH"hb4MHJY@h5R4RK()rFd$+FZMe$E-QiA8HcA,#p8kVEhcN -+h$[`Bk04rc-hkPSQ!$C[Z'V2R)'66%"e(ZDPjD-KNSI#bMqUfr2MF*+r$EeQdEZ -Jfr*C1[*l!MG&i%DKC`8e@N&RVE9HYlHka(#VX*N#C`HZVqMee(%Y5j!!Ga-$qNh -P20aKhj5!XdeZhElTCG(VKGlRSJG&mZ,%*5faA%54MJYDBPG%QJ#HL-kL**d4Rl- -#MCL2ia(L)#D,(F3FC`Fafh4R6#-QRbMf'!'!-3#Q')#Z-fDZU$afG`"BGlTZG`0 -dRHieIQ`'`0TY%8GGG+HlRm"UlZRJ5K()B0dHD`ClV)@ailiKPce@*$Bf3U$Mr@J -"6V'I#maVIN``0UHCG(YDJqJG4fm(H0*fLD&6GkE0%QTUD80dqaDKe4CSYH8)J'T -,Z%MrPM!G9lCBYlIZh$+CijCqEFX)-I%@VJ[3q52Q$)l$%c8Z,!G0E@m6#le%Z,K -0K'pV"I'q&Gi(RmC8,6"II,9%jedaVe3AAfF@1V3EZ0A$Jb-1Re-B,+DDkMDY'jF -G0NaFaPEl1YeQlbp%fB4!Zdf8V`fe`6B%25GUlIN5(JlGcYYe@la`FTMDU0Y#+d8 -hY-[AcXI1m$U3!$2lFphfL"RH5FYDSpZb1[-kKrCS$ee,amh6T4Y9Cqi-2JpmKlE -"Z8,ER"*GbeQ13Ar9ZGI$&cBSfZkMZQdhUbblHk!l3Y5c"RLVJf@U[F%0E4VJele -i!@fBM-llURe21HLpCjZ`0iAY"+BplGCac"BeCDJff3db1H9f2!V2#I"dd'fHrX" -S(Y`[G1"f95X'43i)HTAUYN!r!@Q"erK#m*T6GDIj!XI$9CcQ([a3VD+03Dj3"-p -6LlRXbp"m+EUUfSTB05h#4-iLj#8&H($+-U6Vi!add,4i'RFEeGj8YC*`2)i+b0( -`&GPG"*QcTr"$$YXMamAJ%6II$B,Pi9&@d'6d4NaH%+k@TeXiZ1cT-`%YkFah2ei -#M2Bi2N2J`5V*+!j,AedlI!DlPQ1QJS!"jq%Ch#K8l,P&)%-Z*SrRSVD22SCC#m& -#dd0EGIXK!Cq(,JJVUXkKhVSY4j5M,@He+2UF0KcPp-'L16-C@P3rqpjFS2G+31r -G)G"lfrKQKlChX@kVAbi3pEZ%r2TqZV0q$UZKpB#f[$6-LZJLA-&ZiB4f)c21JbY -Xb16c(,D'&!#QE8m%#YLfCcK3fMj8kRe1ATHPD2X(klD6E8,bbIFj@Q%RJhAE+3D -ITd6@UMd(PreF215G9Qh2#6hYTq'ME+I4KR*STbrUfZP"UL92YEe`5QakJ@Rh3Np -9'i0XYa)eD`amd&R-`Kd$Ara2e,!aI96Y6"Jkje6YcJ[SS0510qLfimbr(TqKfiq -24"*Z-qZffjJHYiQm4#XhkEEb8)%Slmi3JhAY6ihBM`TlY&QJMZ*6URQNDMXfA!$ -bL@cGGZ+8+-36AA@E*$)m6@T%9`#m6HSXMU5"ZUDL5@VZVGU8VB*&ZDVE(#c[FJ9 -BU"GS&pSRCN#`#ilEG8k8[@X+FiJZNAATH!5''91-pFr4fD8kieTjH+RL[#q0Kq2 -4(8H+4051S%6-+e6RKVim('@fBC!!EPXM()bf"ZfFY5)VYkeGai*E,,N@V5%c@NR -Vd@Baiakk,blUYLpB1bL9Y5P5SG)i9*!!cc#aI4aUjr*fD1dFCDfICKED#iIerAb -Kl)TXIJJUV-THab["hNF4hjc(+DV051'4$Ll(fH5HF#1f3*cB1NjN$6CcS3!@FbX -Ee!L#MYQ)QSZb'c0IGqD&L)D50MS06i9$&KJ)%h92GbjEbD2JFCE0aUHl-Mi-EDJ -$YA`K8!GUG+GT"%-9c'8SlfZkGK![``&-a5q&K`QJCT9KUR-!RjUI3U++RDU@MH@ -+YkV14clJ#e%"Xd!,$qEf2iVRGAMJFG1RS0-C6`F#!(QJh5'dPJkK@HI*!GaR#lr -BJ'DRh+SkpjeP%Tj('db'H4iZT"!ZiL6F5#%JpC4!B0,i#`#TbT[Ll8Leh@N5%Zl -XJ0IeH09jfck@)GlQpXI*V0U9)hmhFJ&plk*qfRkI)Ic[-EJ!!q9eSNB4hqh81!! -BEJRq#FmR`-h"BDV0F8a84FG-%9cV4AEKQU,Ep*'L'lGDYaeKl[K)*)##Y@[Aj`V -%HV3a[XB0Y)fUE9ffJ*TeZ)9k*F$L&'le9EA81!HZH"BfZr[@p-2[mS`CdXS+Xhc -'M"XGDfTU"PP$V0D"6ZG8Uh@)X1Lr)IV"mf$[(ALM&8`e9QX`3`krF6l8DMd(4(b -`04M)N!$je[&r)6@I6R$mMIqNKTe'KJJKLd*B$,''Y'1pTG@)EaEAe$a3`e3B!K3 -dZhqZdaRLG!kXi"JiTH8B'qkZ%D,[UDQjafkh$kPC+)*!,I$h'11pLqhXEh$0r8j -Vc4$r%S1'3X*`Ch!&dphIER4#`0de)l"pF%d&q[k4cZ#DJ8kVN`Ppf#PS&9)c,Hb -Fe6NA%Thf%B`XGl`@HRQi'&FK8[alr'SZB2[mbh`RYJd88U$m``*p$a3%i[l[a1J -KG"qShVP3p,kT'-kYk!ak@$"&9LeA3Dc"GbbaAPKqde&9&#Mep"lRHi8pfI'16P, -M!1Q#X1HNeekqjiG,mCFZa8Ykr+AZGl#rpm2#`JB-[4b@q%ITR5Zhhp2aqX""Rl- -JZ6[1NAD1l(M2b'($T+dX**r[fL8XV223i-X$VPdIf1&@fp9ZYhTh[A,pNl!`UAR -+$e1Q5-N`S3p23IJGJR3Kc1Um+Ze%H$)86iVGpRE%AIp(rlfp9i"c66!$pprqZB, -FRpl`eJMXM98hZLIpGXKVm4m-LVr4+IipK+XhRl"qE,eae@QpmF1hTdCDjpjB"H# -imD(6H[-pqbclC2Xm+iSib@TGB,A1XIlDrZRPP(01P&pHHHa$9b6P!FR9mm-KG`q -j@rV`0a@G[bFqmdV`S2k*9r&629HZ5j0l$T*5T4U8ceT45(mG)MdV"8PEZjbAVSN -bq&CBQehDBRr@6[krfb5Z&UNjK0QmmD'KciD'GR[Lh-[SGPhje`'*eb@(X1Y#TG4 -3IrJ`Y&GScm6VV`,p9ZJRLCmN5Npm+Dhi33e)dk3Nb"XRCGV#L066E9IDK(`!!"` -4384$8J-!,[%293eP44%!-@AZ3lpYEjBjAm,,$2Q'N!#6[)3jadbbiC%d4b8Z@4, -R-T+a4!RFI-R8C"2*NMA'019kF$%aK'JKKKBXPd-$TDIaq3`X8+XHJ3'@`a8[0r* -mV29i15)8T)MPYPb[f04prRl[Zf3*PR,[kAhq!4ZQ*q9"%!4!%!#L!4IRm4'G$Lm -qA-KF8)PNK!'qrQI6#bh1aZi@2YRY$6j1PIakU[aLI1'41jh[rIf,p4#*3eUE'RP -f1QaCD(,k902TFL3G1!DH1-f%9(bZ(jeRSipam@1B@&8)ca,l@K4#KqjM"FhS[%2 -lm&%YIL6%$lq[$HiadFdM1B##IR)i1IK19aFh(#8A*#XScD"+5+5F10cV-!jCIK@ -ZH*QhAMX5qZq#8!%jU8C[qH#CpDP@ERNR%&Ul0d5Z3pehHhXG'GH2l`fdq9BkPBe -lDLhcZErlar5hm8,hMmr[jp[lR(pfD)06rH5H+b($6`24R%"6fC39Ie99C-IPPpb -p(M6hSfECJHp"9V$K`0h9cJVVU0'UF$Q,AT1KX&pTNN("C"PHVI&U['*&IV`q1a$ -+jEhEii)Tk$QM")IDp)RY9STGB@d6`m1-M$)#4rd11'bKN[8l`ME9AlpML+ZQihY -mX8"-hG#NK0YpCP0qh0[iN4cK#8p#&[KR(U%T%Y@`LPKC1Im-4D(XhDC)lel2DR@ -$NUBQ'V++&4MAaR4SlZB4)5@9#DhmXj'`48dJD@A9"T'mLkNQ`eBbP`3MNjTJ)"9 -1(56-r0SESjcIEAS$)J@QmVT9'CmhqXcK(RMVJmN+DMJ'TlaFUj[PJ$)R)'keH$9 -aHIQAIE&*DIMrH1'8RRA&NediCr@9qklNPUdZJ*YFU!r[k"qE&9,(fq,YKZ31ZYG -bYI0C(cV#mRJU+I3jrk6e@U4P2IfHD8cI#ZIh!Qce1E80DD`H*,%kker`QG80kK@ -6hC2`pSE0fX6Tc9a!d8X*51Y@(K[4A(C-bfSl%RdDDphP[G9+P)TIpXP)h,@VHe- -4II$"CF5F-`5+2$4*2)+[)ZT&XLmXAKUZ"$krq0*)F9TpU6ijP0m'*kJ+CX,%@c* -6`Dbfqkc)DPU2PCqa8USbUD61PU%a3("NT%HG2I*0$KaA5)dKYGVVL)p&2DD#!dX -$S68&[AYArAUi3Ndp,iFF40!jKdG3+k)@0A9e5G@N-&)4&F)9eZhI&K4GLJB`f&F -mq0b+ja8fU1cFLUZ98S[AD(AQreA@kPe[3[pkm6&X6mA'RhVEI&C[Tqr`I4G88rh -$Xr+4SUP)4V54PT&N"4))'9a'-G3bJP6!&kQf&f%f'U%%p3'&0U,NiQJ#9Y$&FcQ -ZVG#e!pq%+`!mB53e(&1$J6C[+I4P+3*6rA12I!Jb%S3N[VC#14"ji0G$&DVI6)P -U$R%PdF!5+K$*%q5QNe*JDQAcAP*%eApICR1D!6P6ECjUVe8effp(hM[be,$2T#k -)YiCl`hX[Yh1N8pAeeB)%9+[M-LP8CfP%QQD*!5RC3-J$SYlfYNRT#%2&80ZX,%q --Z6"ie%mI!JqJ)j35$SCd``5AZlLB8U"da)Up4Q%Fb35@3"#)88"Lr$X$BerEmR` -bb%JQ&"V!4*d*J5Q2GpFKQHH%N4J`mClqH*1k[pImR"B*T[*RR51C*T[((`C`mS* -YGYiN'[`F,T4QB[SDkIe'5NeD#L2hpY@C-'3Rfdah[a,4lbE%33N-5F5E6!"+h*! -!4N'+"F2rfPIRlLmHSL[Id3pa"BNpRX"209e+06SEBI4Y-!T)*-EKISCaf8E9Ai% -Fh[d5*Z"GfNRDA!chFL3lHE$la`$'9QaNkijq@N`(M'6MPMSFV3@VXZ)M9+e*YB( -e9'T`bfp@',F@)UddZ+9ZKA(,aC8ZA+I(e[K"'Jlfi@$bZ21$0$TSF'kTD8#([G# -fj49em)1ddkM3"SX44*Q3!""Nq"a5JcYp-pkEH5KX"VTVYLhK&L5N!V`['JYEB6L -189US0UD2m#`0D1lI3+$D@"p'%UYqNK61CjeBb)A&[5F@F[qMB*NDE,PNFHdIE,R -4mXR6MT4JF6hY-"qCliFkq,@*-ika`CBpP[pB2pM5E(QRlSfa#XYre,da(&cl"2d -GHq,1JP9[M'HPr-eGU[8VK'2JY3&-+jXl@)@IN6'lakaD!3E0a[V"'CEH,Umh8ES -)U5hRRa3)2S0EHq0HVjA5ZYK816RSfY8fa"2RKpJf9e-#%B*KqGC1G5EUp@R%K4& -DU0U4'8Z!IDQP'rp9RI&Cb'b89MZ6dGND9e1$cPCX@fDmXGZjXIN8+MGH2hV,a[I -Urcpl9BZ!A%[*Za05S!0$YD4`[U,2HGYmNieeCl8PPF[rZ-6%QC'1B8%Qd,F(L+b -*Qr1#Tq`EebcXfRMX9!FQ1DCEZp#bXCQQdFjj+JT9#LL$'mrN+Ui###e`fiVXDUZ -`me[Yd@hkU6rGfj3NB%"m'ilSlYDf)pa8%5Hh'&ANeI+"IJaZU)U@91b'STJ'Ypb -'3*Uj9U!aQ$4E#ZFS'1#3!)dmZ,A3hCpZ5H%S'F2K*pJNFK32kciTR&jX'a05P8L -GF`dFE9mLiIN[A4KZI2mCBY2Rh1HQ)BB#,U&dRk8L6BcdH"G)k8EciNPf39QkB*3 -(pd[,)#kF-2'TIT!!&X"e&*0IZP,h@6J"0ddC,J-@`@CQQQTT!kRke(cHAAS6Sp0 -d5'S1J+`iC5Yph00[)&35%Lf&1Kd*LN)RPVmAYL36,5F4'&"!fi#Vc%+5AdC&rNI -S+,EF&Xf"%GQ[dj'cJaLd4*(Z*%Fm'Lmc$Xq0AL6@9F&LXlL`a5PUGT82Mh-b9"+ -`HBM5`ApmKS'K1Pj0V!N8Tqc1eQJ63dTlPH[!Y3q3!'J!%R*c[Xd-qI*GEdrekb9 -K,P+A5ilb4R5j"X2KR9(hHp)c*Q'q,iVQ'i&%VUpe&`hK(8dm-!66dS(1-pX%da* -IfKC*,Q"N`X5!q)[kf`9d0*Q%q"K!J12NrXQLNcHcl6Z)ReeDh[)#$+T+,%$S,VK -M$i,&Ye9B5'DVMTNY%D82CT(*krjD9cGkl'!@K,h&$q)UZUHlXh923A'bRUT%-ia -)(N2S`DILp@*kCM%-XqMh0$8'G(q%-"b,qr'bH+3%UQ(+-rU'%NB@D+rI6"#qJ*U -mA+T4!9"DY,)S0(2rbS3EG$@IHNfqMS%Vbhie'9Bd&NGMQ5Ar)GY%a059A8D#C`S -!AS'3!)Y*2bdU1[2kKCpI1K#JT8f(,@Q,EH-35)fYTLk2NPSS,He&9cREPHfRT8X -h,IY`-ZBVmclZbimqq[0,(Q'J*YVMdi44SAB1C)jd22kT1QH9BfdQr5h+E(lYESI -DHIc55'a9`GVAk'r4DpGNhPh`T50$`EC3UQXXh$P3iqk29LFV,$HMkekZ'`SXJ,1 -ZirJPVI!,ee+Z5qN,@bN5,R(GATXaeVfiHh'[,D2%T*lI(q2*3HGk-0R8Yha1MKk -)+"$J6UKRk"HhE$lSSFf(5N#i4TA9k83(VbMMA$*&I"F*,[13!(J9YpN2)3G#d`N -HX[0+K%CpFRkr3K1G!00XFG*a&*Cf'jhKEUFcB1TL+0DReE`cemG(Eh&HR8c&3&j -`9"SfTe@UR"#S%N5FX-bhJF3j)6UB5%h)1)bG&b6'X89J0adG-(A%`m9-r-YTi!K -ql2ID1)PM0[l8-"U9UYkLKdT2i-mL`V5*C[YjN@KrcP6r3S$6U3+P%RT'rAEUZ'N -S0EkK![Zm+14a'18QCcM$PX*9Q@2f,8&+EUQl@K`!b8+E-q$'))Q"d48BG!DS#If -jcNX*I`%Tdh9bD-`[Eq"bGLfU+LE@b6c9VQ)KN!#RRKMm1aK%Ak@UA&QU%SaFGSC -TqESF'@,pICPKSh2i1PGd#'B&dmC*-"%3+"0!eXeeAbD)'clY3Y-56&BjL%8[%@A -9kH)h6QMNVL#I(&BMeR`Xp(f6&Z0b2YVi1U-Q'B(K(AM%k93(qSdmp&iH*h$!'I9 -R#@9#QlhCZReJ-$DC1#(i1h34+',pp`TBa0JcE3"C4-G!N!!S!8%#B"R')TY(PJJ -Gk)rb8+YK`#&T`1FP!cjhK[dGI24l4Gi36C6&YT)#,33-'hqH6kINd)-EG!G,0Y3 -rNF+'EY$Id0r4KPkpdJheBb2(eqGL8qImjcB9SNKA[("-k0d!FXU2"0GAhTAp[ET -kDS-hCVrPrDG5Ap9`LiZ)Zf)M-ZD9A#rPYi,K-&q4RkkSP3hj&KFPGh@kaBjS3MV -d4KBl8K8@e`JlU(--"@F9C!MEXSaMUQ!PdG`h!S3FX4aH%H00"S485L(N-03bM4f -%#RP[KqH6+#pr&8$cAIHZ$kprc%eeE-SXqbmFlF+469m%2384i[hkpB2[emZMP8, -'G'T8M4&!ZlA9!Rj#Ajh6kDUjGC51MD[dh868h08bBjbN$UNDkFeAMr"#RXGITJ# -SDZR3Ci0K0jp*QpBSPE0G&16eT52HfPKTbCq)b&dkR8FS4,"CbUj9'c),JrGX0YR -6@p'93b4*qQ'3!-)$r@![ih-@'Dk"'JTM3C2bJR&c+5H5(`imG)SjRmmY',hPI9F -CiZYQ[ch[0HhRVJ)&KRHfDbKdlbYR(2T9!Iqp[ej6ULTFF@r0pD8AK6lq)LA99,* -!$3AD$#ifh5k!+f8)G%+U5qC+GZ$P)!*`P,Z-HCbkQZB,ARir`NjNIXIAr"YcD&1 -(E&Hi%5jDIU1kJ*VARqYm(%liAGi&8*A0fYZEiDCmd-B#E5,bHYiQKq+e616EjE2 -GFBiUaV'T9Z2lpIIRRq24K(3i[PkQMh)N--V4YAQJ8'PaAmSHL+%E'4llkK8K$S% -kUU6%`B3+AcQZ&XCjG#KP(f,,([c*+b(G340H8%3)9&@ACiI'qDSVaG0i(Q8(Z0i -ia"ejRhkcX*!!!deVmaLU3"9X2K[%lc5SP`,eh#qUCrN29-pbK!ij5e36Jiec53d -P`!ec,&pr!XB(A8cU51LUA3UKP%""L'db[5U3!)LFPcS9m[Ip%hi1"0(b9X3h6I* -kDaH"qiidQCVcer6U&qHb!T5&&EH*KNT14Daf5K$GN9E,$FY,QbNXchbjmK+@pqb -PS`IBdBZ-V0i1E&+C2K1TdV1SC'V6bqGTF'jL63%0Am5'rlq21ea@+U`Faj%l(,@ -F%K90kmhFNQDeda)S'6qBPmGp*UmFMAhIcN-$&m5M0100bF4j8RdQL2lc'$9-5LN -NQX0jl-VhCAEFmRlcGDlc%39'fq+!f+'4",6b"p`e9VYXjjG*YB[Ze(I#L!'Ce9k -'(Q%cL#249ViIC*4pPq)`"(EQ@NSc,Q,*)J-TNb)T,,`b+A[6i9"0)LN&TjbDcZ8 -4XkNJlYHXlLh`l&,0F-RYcTUC1C!!V[dYpMdTM'!jNM(AUL%@NZU)Tl3ferCiUrE -mA!G3l9T[k*iVQH`c,0a6NqD)#SDMNG!pVfehK)-dLETGRHeYkp[p5%IKq%6Rc)D -LR(k2jf44cXa-ZrZ!HdF'5db@'d`S"&QjZ`'*%VK,bGRHF4[RC6P3!p9RK312"mZ -@I9L%4dc8cY2[,[Yd+3m+TUeF4YSbTTU2IqL0q3*FIZ##qPNcA-Fqfa%HL1cBUdC -f1)V@qIbEpUkk-"a4+qr,R29GM"HeUYJ1-(*j,E0DH'a5m*QMbP$%QK89!R$2RpY -lB-mM(f*5[fN,&c`#820*eAVk"L4'j"I``-ELap@&&$a,X)&ERN6p6+MLCmeB6YG -3(@6JI,dp&kJ)pjF!jrFbcT[f)%BIhB+EZ9JJm)Z9j)*cpmFEeq"MHGV5DS6CYGl -6#A#fCYQLeb0peXK5E!l'h(hD*4)#00!UelP`FF($$jiaS*dM*F'lrERXbBl#!dA -D('5#V8J,jdj+N!$rk[l(AL`jQChY55FdaBE&`[1jr#d56Kj*d0G3)$'&9$Zm%N[ -llYcFSZbFd3-dNTMC[eSRP@ER&18Hc8R2034q+j+CAd+"[(&jr,$N'(9`*!+AF-9 -()%P)3,Pfh!3RSLH'4ePd!26eY1#bQbZdZI(h8$@,'AD#p@'BSbHEEDP6A$*)Lf' -58RK030UhF$FIJ-@C$eecSj,q#M(MBTk&a!+B4E1eeHc$)eCFVG@`MjhL4jqiS&f -X'0-fXSpaFF#`Z-!RINa2dDX*j+&Tq,I-A,QjJ"hif985Z)LF8JL%-2@XBHX)5f$ -X+bV8Jq&93BLY%&**(R195aIpXf,KIE[aFY"V0L[-CJ86+jKBSC-91P(iJc62BqP -j46hTlHj#YZXR$9XMTBX)3C%BQXmRe0ja"FQKTm2Q2pc++C`eJMBa`"eC'rG1),! -qcqrEX1&@hK4J!UeVEpcrHXeC+eGI[p"VAf@'d3TP2+"YFfA&`hP+B59EA-X@4l" -BH,h'9iHPADXki3L2C-a6@5*`2im(*[DV2+qbK+hbCXhV04"eQ&,8QUEk4IC#aTh -UKTGk3+MCR6Qb!@LrAmhJ3JQbIeqkV6YGfjYcp-$0lEP(M88-VZYljZHQrmLHRTd -$H+m-jaQDqY+"MNNNq)#Jb!G`Q5QeCfFSRa+DfXTYMZb%'[NE-aE4DMAbTN-UM-l -MDYL#E@UbZ(BiiKVmY-+X4b`1LiYYq1i8R!9U6#US'ZNMI$1IZ1lGNQ%+IKV*f9! -bb&TeL'1Na(EZ2*UaHb9hbf"ELdG"a&"-+*lX*F@626k$NY8qjBAM$-+MU($Nr[1 -XSH,$cdH['5mELdJ+bR8'4BYX,PDd5$d8V3q[9lJV@"Dm-43,[4Uk&0SAI#K5crl -')QDm-RdbZGj8q`LZLBF,3TDIa$JHUr(h08JUK1BiMla+bf$6lA!kqLAbrZ9,Nj4 -'DedTJd4I`e5rU(3mdLT0!bB#Ba)b-#%@5DlDUdiCQMH%T#'F840rQFG$!8`l#+D -kFKqFdrLX4Q2HLm"SK$b3!2K%c)4VrZ)bjDGVIMqATX,M-"ep$Ehj8rhCad66`%1 -r'C)C#Hhk*(KY*C8P9r2aNXU%S6*3A&PG-TLV`NLNH(TFarZ@*'KmFRImUQ!!q'` -!(J9A*[3fS0S!MZ#D(`E!(cLdRQeGD+9E0r3@a&6VXC3f8la%X)qfKQh()KTHDV$ -Y0-,@["DeAGbbDYhYf,*UI'Td0f(,k!'%QkJj@JTSLC8#66,NR0rTNcmHiT!!di# -[d%294*8,Mr`J4J-'P*frl"L5[APLm989L(Kk%3p"A)QTA5B)(r%4eHje,lX9,Y( -BfIP)L8%8%Dp!c')%-YE96$0@3c#B3k8l(%Q48j9L&m[,3phX`[rF9G9-lXMq%B3 -#CLNrMT&djh'$L+B`%Bfk$55-B4$$RA"#U%b-JGJPQCD($iV1C%S5+K"-mkA1FC[ -$Z+RB[HY)5X6-2MNlZeGEG1!jch-(MKTk3`JRid@&-bIe$b3LpY#MXH6UK2"30YJ -[UHV$pGLSlFbK[BJU4PDE("#N40Fa9ChG6b6"D3kjYUa(Ej'YiaM#jePhBref&+, -QB9Xidf[#ePIM@R[Si)8T&!r5d$G[5XU-aA!a8`S5Cm8[T3d`2)ClC@CQGhC4)Dk -3!&-dbDAZR-4TmcbqMm[QHBJaprDG0KKfFhTfh,6EU&h*IZ59#&2-X2[%%(XNi5) -5dNdIB4h+)KMp,Gabq@EHa3@mc$b'Kd(,S(j!(h8)63dSRc3Nh!65bdUfiM'*#-[ -4l-Q-SKdP9(mXh2KK'l@D'L`Nr$Ap'bCd('D"6'%(`(8'U')6Zk#[G@FJp)QS#e' -[#ijQT"GdC`b25Y)I+KDj-pfC-!0Eq33pHNS$@YmE4`T06bLXIG&Qp-8E"4Y2'+G -4N!$M6EffH"JrS@MeiENd[GM9+3BQ(m@)5A3j%TllI$hr3-F!`!Qmkh)[Yd"jc*F -lZ6XUi00GPDM"*A`##[($L-N!!APa$b-Q'i@TH!+%61,(bY4P08h*c%D!GqNVMFF -D(C-Z2*!!kE-N&F-##9dp)mR$$)3-BF-p0+6+j649,XGe5mJ0Qj5,"diIJ8!qmBp -&21(EbLeRPa$#i!@%JE$D*5Xm`%KT96X*l'I4`-#"K4iSd+h'Bmd8I)-+'1E9G#K -0M`[G$56c@l4!-SQm*RHrSGPT%(NC-NPiPRY9p1,mQA,HBrNlRP6KPVrVk"(",`$ -15EirQFjlZ!f[!Gk&ea5hi"APjZ6R009PiBfCQ4cL*+P+-N')aibR"U3bdbNeT"m -Afbp(F`l-*r6YBS)f"N!aJAimASCAM0*p6+@I(qM(jR1%)C8K2IrLX+f['@TGP!h -91%!mZ'(#C)3HY[H%mJ3i)CG"J2`8VYIB3,qRe85J1!)h$6kmRk!jm&ZUk'Z)EP* -0KZEpDc-cf6m#2-5'm$`@Q#%ehiPCXfL-jK8E)h(BC!C"8633dJ#3!(f-MQZ)k9' -4+f0V@1!G@cR$'Q*i914)3qkQ9*3*kU[CamaNZEkCe25&-hd'-hPhD62CQj)-V@C -6XCN-cdLKJ,mAYfTQkG(*QD-C'HN(CQEqlf61C,Yi$AEP@E6dq'61I!1UP&j#L#i -YfEh5*DTaMl@[J5e"BmViA2E4R++V,0NT,DREV@I[$'XiFeSi@l3[!6'iJ*I!B`X -Y,9SbiRfl&mr-j"E&RcX*lM2aM25P4c0QdTFZ!4-ZT4h4N!#SKCY&$54j@1hSEN" -iQd`TACD`faffbfAFl9P[[5!IjRC2L(hX&$rb2%fU[8P"d+!Ek9&%%K82""XmVN@ -0"1DBHbQ1IhL"d$&b5V6mFN%m*UCUGbZD&4pjeXQYr#A2lANmfU4'FK15F+4TY44 -BhVR'S@fqaZ%,iZQbPcbVe!iehc!&'l4,HTNdRK+@2V2e3V6&@L15R-"3)K`9M46 -8D#pHbUk53191D3'@lL`qCX[G,1eVp64Z1acI(&9-NH)V5Laam&I$N!!r'0#&kGX --"E3Ic5d5%4lSUGe*SE))kd)J"S8bKZB1p#0`GX`3rQ9!1cCJd$N'ThQ,IT!!T9L -jYFULEkY8I&UPiT+KJX3,28C[P`5a1*eM,2K%`Bq-8-'548(UHMA4NN-@NPM-BKF -GkkHhmE"Ia&@3!$[RVK,#Y4'ipH@F1AG[I0["PK38ZaM*m&Q@8,ViZK0h8-"FU"Z -0dB(qdJ'rhp"4X&5`UjF(UiDlXJBN"!f%eT6"Y46'[fj4I4e!CEqh`iZ+@IN(3Yi -)rU8&`Lk55!$cpeUT#e2L!X31&B%pNIfFKBLdHq5(d[iapl+GKp'KUUL-S9)`j@H -I5rQV"'k@L*HB9J1MfQLL%-P`f0ca9a5XfH8Q+pca'S4$QUFbl6GS$kYrHI0601, --8aHfEH(K!i*[)3mRLD`&,%85D1@Q0%D@aP6K58$X9NHk+"6`,2j9KYVjC+Q!482 -)!"'!X!'PN!!hDN`"(S`["FS'ie-SK1+Y30P'J$@8T+N@iM'1j6F-h'(M%AFr&N3 -mK0iK6`V"YiN!MJG[jQ&HKQDRQUa!U%+C*3FGT#aYdJe2SMX0&`D*3%8S&6UCN!# -#)FPPL)A(J'B)#MJBkPl#'pQRKVfk94-*FY,f`LKmBplDiAZLEM6cR80elj52&Mk -alhHfdCUkTh%@Fhp`b221k,lMhGZ2fcj%cF4M(efdeB`QE#eCSlFqAc[kj*rZrA$ -9RrpfejQ,&bmHH[r1dEZA2AVXZdh22*krr2FfZfhMSESpYUX2,EFe(+UcG66822h -G,cHh2(@miBfIAYN+!!"(DN&%3e)$!(VJ%&80C&B"%$%elNAr[fh1-9FC-ZaLV2i -bPQ84RhHKLEA%i*JLbl"UTU@'FQ#PX&QLXN-mAJmIElU"2'q!jP$#5HQjZId5QT1 -U9#A2HbKI5h)-d)45$YHN0!&+%mSK+D@%FJNPKSTlrrjq[cf[K[6fHcr2rrIc!"Z -YTbJRJL!)J%!dcjH+4h8k[-6P,8i'd"qrJ-a9XX3A%@"*9MiG6"K')#U9T-H5N[q -rSrK8*6e3YQRQpCN2TE65rT*pdNPT[mcX84KCHP-9P$&ec,!jZ&eApN%NBIKkqY& -j)8R6&E0+@UKSp"Qq3"`r)5Jc6$-[J!8QJm0L9JDdi!)3b[@Fq8X89QD2G%LHM*2 -)H)kDKJ+4R$UKaU,-SPH[2RP#K%aRSE6TPBT&A,)(r*&L)!R9#0!*0RqR51iBQmV -$T%`M)V`kjNrX0bCq2ceJ0IN$$JaSPkk)d2aL%ESH5Z`20Yp4T$dCl&MJ+pb#aM% -6KJhBRdNhA"Aal-TRjdPG,LaK@DmXkl&F4-Yk&bk'5-JeK+Ck93AcXPk%-'&$l3R -GiQI5(4d[&c&*Rpf4kJ*6eH2kXH[(5R0T8-GCBR4NGUGmf+$8&8MbF@$CR,)emB( -cdG5jpU[a4G!KYIZ3!&#YFiAkNmNN-kGY,$5TAQKU+ehD`NUAb3a4jNeQ`',`UC% -ZI(lb"&M*PBH`U9i%TLeA$*AC8K*J-H4-@N044,JU+l10p5-G6(!Pd6TG3cE51+r -S6TUGk0*VU)m$55ceBG"H'V6CFP#CP5RDQXCc3b)jq"p5ea2QbJaD(*U`U$AP"S# -5`)EcJj9J!Bj0RJaXDKMLL3Q4DVq,YeKEH3LLbeN6,K$30p9@mVCk5Y,j3PM-$Kb -B!(UprrI"`@+l16JS'aRp68bSNR4-chIK)XcJG3B"m"U*cDR'`HBd#h'UU%GBES@ -C[`KHHP`3a4`cLqh-IQdrS0@m&)TRI`eXE"2q1d5,5##I-LTFTVSIQ'+2MJLM"Y( -pX6T%8iJ1a#4%@a(pBU`0d5&%Xf0f4*1)TXG#)d#3!*BAFi1+!dJ#$)kY)*3T8$G -L649@QK,l`B$V!fUc5N2cAldH5TN1EI-XN!!ABeZC*CrkAi3QNZk"@PPY5)JIUVp -Q'R3f$ATMa!VbQj3KSrpMQr$(($PA4A0-2kpB*'2qP-PSYcMJ!DNK%(FIdMU"SFe -CIERa%3J4`SrAN!")IJmCIl#@pQIZcG`,SDG0-bkf5qZIQkSVdk`2Aa&Y30hqXA' -Kqp$-8Dd[XIml4BHfBD*m+EfV46PmN5AU#fkGI$55b@iU9[@"YUBk9Gpd4AdrZr, -jF%TNTJIm6rDTHM3f8f2cLaUEd6K%M8-[DKb5kQ33F3Jl!8UX*9@RRJTBQcc1b4& -jFSpkbRe&A4SQ%$0+k)&5dK"T4P%0&H6Uh$D"!R)S&MHK)C!!41'GCLJbaU9aR5l -rHDF#!N$)a6ZcZV%j3i()iNKr4*L4H$0XNrbXmJ8,cQj-5LpV2h)j-NkE6N2Bp%4 -Ac[(&YNC#Zh)PIdBZ!PDcp(,*4kkEmQGXHG!cc5H&-*fDZ+[m'9XHFDT!dLa*#m" -a'1SpRa,$lDcpLZJ5SFad-0HrBa5HLi`#15!qPJG1H#Hr""3H$L$mak$U2rK,%HV -EaJL@Pl5q'Bh*+k*G*!**83b1LP$MED[Y(L%&((Jp"99[IVl(M[8$RCKJYNei+K$ -(kq%BG`0-UI%JL`LV8bUffT,dL2DBPCDZ#*8@ila)KdJmL![NjU3!BT8-pk(!b!Q -ICH,2[dp%@@#4"rC0R$V-,,6`H@ALX(ZL'4-e9d5#96+VG)`D9Tk9Qb3d19CI-N0 -&fFB,`NF,4Lc%JfC[X4T2VXE&iX%NIi!NUM`j+0N@j-N1QXbN8[(TjmmRla-A96e -HBfScAMI8)E`'e$Dm-Y8@1&E%eABJfhr%`P(e&&iPDMCH4PAlf(f3!'[1iG@MMZ- -98irLG9deif95ac#T9ah&+k8fiP@RAX4J(5UVcRXSfDjH#S2TA+bkk2-qJpPPYRe -@JqhXr#Ld44YrCr"H93hddF44Sa#PG$%qb%8(pDSAj3XSaie"4%JCc)DLamad`BK -UaP+GXZ6#8ShDXjZhdJ[LDk"(e1dfUiFa9&E)D#S1'30QI"`2AHI0K3SFUd0#YfU -h1940"l3(@SMd53a4'#SdaRIRL9#S%*m&SIZ#`IcF*mfKBCPS3!MC!B10G$(e&#H --2*ak6KQZ98NF([!qp5rbJ1TIm2NVp4NH-,miG2e*XhVmb4l2*3`cl"R"+qUTCe@ -J$9%-+Q,j8*k!X[T2VLVGp-CD,UVP`&D'E+KSF6PH38$8hAY`K@lcc2!B)jbiaQ- -8b9E6QCK9,YErA0c)4ASmZ"!0ISM#CESF"&[pKLV4$,(k(HUmCNc%4(X9a1TY!20 -GmV#eKh8VQ,NC&lVPVl!DH`Q,iEM+aJM%EmN2iAhjr*1hp*,RCLl%Tq9j+Jrf53L -(V0$0JE2$LXMqPlH+U,6ri(B4V8[qilj8adB8RIKTaK$,CjmmM!kCqc,hMDdH,M2 -ei3Sek$C(fQqrqGri&iL2!)fdKdeA4%FJ16DH$lHBGMf"MKqLUa8r$[cBmF20caY -&I#Z+jVD!#`Lb$F&8`m(81SmrJ6bUG)ZD")+i"U,m&4'rP*r[E4*"$6*SH[`d3h& -!L0Lk#m%jqXTpb-V2Fpe(5%'b$9E0Rrm6Jme'Xi3-l$`HP+ljCebc9qi'0XULi6J -j#2c*1N[i!5)G3*EhLD3DabX1P)QA#!(Jp"5BQp8@[)BSU,G48'p"8"r@[81!e#R -mcN**&P[!mTdD'+m&F1PH#qVQca,4Q0k**)eKG(b0N!""LT!!34f"G+0k,[2)m52 -"jSfqf6lM964%U6P&c5MJGR0J+m'V9ReQ0hA!UdRpbpqZUL@ke`0K1E'$cIPl*A2 -I0Y@)j'V8[6kMN5DmLFmkYH45FljhI4%e[CR[6CPaf$i6J$b@-X9M83dF[Ja&mh- -,`jbK*[!--AKf3,d*N!##bP%$Y`GffPQH$`E0G"1#4NPkS*QATD3d!!E1p"Q0r*N -bV*qkFCmbH"5$G`Epmh`(*JhXRqFF'!(B3iKb6e#0fZG!G0jpA*8S'bcYIMqTiM0 -+Re(q0$UNJD`MMf9LLKb*PKal*PIUZ!N!32"1Q+kUd3"BeCSk9FS[9K0BM,b#4Ge -m@ScL3p*9)C1*#AIk8JFhHY(3U*Z2T8CGeCfqpHr1hSG*RET"kY#*)&BFlEK@TAX -RGI"0hbd'TN8SC*ImIS@ZZ0U!,#1"(UEiD+$"QdaDE(rp&k5'"c%3N8%#'9T0ZF1 -6L1"jc8N%"T!!)J!)6d"3AqiBHVN)!D`YJaf[CY0V'lp#0i`LY(HL%133X53ki9U -KB@H4adPUc`A4,KjSQA5SfANS5'Qr@D9Em50d"[*BT&ZZ*)"G'ZMEUY0*rKQ0'8G -5!bDV%`eir0M1e&J,&BY3f3BFFZ&bk5+jcb`haS-*MM#DQ8I"$+KVN6%qXKkAQcS -+F30"1m6&2GJ6LcKS1kl0`bFAj-jJ'TTCV`E6C-%"BN0Bf5b+p)$L&!+a+&3[G[H -S0FL%lifDqRkU0V,$$[qRJ'#PaD214EUd8,@fD`Ze&i%V%6,L&D(LU5C8`-%UG*@ -$9HJq,Y4#eAJp(#S-ei@ZSSX9BY2&[QfK5b`@cfK%4M[d3XNJYM2j#HKEQIK"2a2 -&R36U1j`%4Mde,1*'%(bEjfb3!!B@a5mim%dD@,)0,%dD1+B-,%dD@-,!fKF0'kG -KEp#JcEC"QbF01U3-f[cL33RTKi%)&J9BX'kM4,9Rjc5rSl$'5Kq%Ha54Iic%J5M -3!mMQZC5rP`Yh+YCETEV3X,0S0MCE6P'2-cU*X)-U3$T@!%fV'V-#PI@5i`f+(rj -iZBL"!NMhmaD"BQ`k&pQ'UfSF)Z2dIL#eTJC%2iHJhmDCDJDk&DGi+&bb,@E0DG4 -p(QMHM5PU,aIY$SM1((#%lPDF&*`k-)LR3eaZjq#`Z`ICAKb!M(1MEMU'XX0Y$4R -R@,+T26[RrV55G,N)9iVYB9f1%[4k0"i,eYpQCMT`0RDL'!&Q!aAa)0C`i"`,"*, -Ti2E3*D$E&Bc#3i@"CJ8T$(dG'39M'k1+S)")G49*a!iMbrP$2Yj*@!6ajFaNX5A -UH4$qH+$%HB"UG"kJrZ@&$P",h!HS*Fi$e10!X0V*"d`J3BmP!CbX#Cf,K5``ZXJ -aJef1S*!!YMBfL[#)$ZbDZUD1IRp62$YRfCD83@T!3L%6+@GBqqlNl'Td!fGA,d* -*$PDPm+"!%md[&kA-Z$K[32m04TFKS*)jF%BQB5Bd$kcb5`GPaF[PB"!AITZZH&E -Ub$q$cleS2#H$I1K)82ep85b2!3NrFqb0%%PZ"X+)D""a)2)8)NP%(YEGK)!Ac$r -'))KK0[-(XeEaXa8,ldQpm`I&UGYq$23H#2kQJAmi`c1XZ`CRL!mYXcD)3%AEF"S -E$MGe01RPKHA*-8(C(+XLjYUEp-aqATSc*SkR[bK3#h@c#aPVS+Ihr[L&Ekl$)-m -JD#E!3'PRXN)Xl4`6#*,2%2Jc3k89"Hmf@a'm!m@RK-L'VkIhqp%p+lYbHCUQ5bj -1XD8M!2`Mc"a0'CK40GD9P4ic)dJFZA@$Zi!eTH*5LI`cc2"EAMc@&BXU3aeT@Sf -P(@0GcSNBLSF["VZf,aDM)YS91%q&U-[bU-K21LUbeU1X,hJ8YSlYqC!!)*Ri'F# -2!6mpB+0ST2h-f+h0d'@#5GQ!$R2"S$5!DGJQ$9"6PQi!6ADPUBF)fmJ4h3"q$2M -*C$)hkEZBZ8!J[1*H!Z!)LY6p-qZB!BR"kSMX9P,rlm1("2%0#LcT#!VN"TTk3CP -k!D54%#4DJ9am("L!D29bm#"%&QE'K59UN9PPV&6!pDc-D'fU%pHGV!Yi3QB"*CS -T)h1C!%Z+fEQ*PeEdC+CE-Vk)iF"S#U`aCRB!4GM%IJ3aU$28b%J3VqL)KJIBHY3 -NQ)9*D$dTLjahq5)!8FP[#D3"!bqSF21-M4&+RiM'GAaYlLlLr3+XaABN+G`lp6X --4AIjH-2'T0aX-AJ5`X'3!#cHbB*GLIG1heeH4BKLT(!82pRi-4S[6EV1J@$L,Kp -[i*G[d`Dd9&30%-+pbL,cA6lMd8QG'NY1'ZXQ,EB%*8be6PVf"j[[mNNH5lBXXiJ -ZMUYMdXZ*Ki4$SfBF*,CD@)l'&Pe`#FG%KK,)EcIkY4pTpeVA"**K4m$rQMq`c1% -`q)C#"ZmeXdD0Z0P8(Hj13+X1Z@2'XB!pM-j@G*iA#QbPcQZFRHZF,+BCl'3lS[Y -kHZFmrIP`&cc&i3J1e$L$+LA!cBL3!2Y'4"r!mTaJFSEaKJJNqcXH[NG[00EeX`# -!!Ja*0Q2`L5lrQR[dja%),CB4025$,@0GFL1$VY-&9eINc(J6iT@chY1i1pKY`lT -TM)L1XQ)!bdE4-Fr@9)5QdU0Je(GmBPRdN!"JALbid#VMc,3IQ@P@ANNHbMjAkBU -3!)&Ze"AG2-R&'Lki2$[RlP,1f%3-FYBQCTHCm8HlF+!"KIPdh3UjN!!lbYQL-I[ -#M*HcRN+"F6-eF&QeIqA5`#rq8qM4e'V,@MBc%qj*bNa#b25c%N#Y`dmMILi#a)B -8CC!!`pJ5E%29J#5pl%Bl1MQFRb4Q$5PCDcm(r)lcA#5`LN1IQ6S"4qq&iehXc-m -**QH!daiG%h,bfIYd1Q66K,T6lL#GH1X,XG"P11YecfB(picEj3'ZFN%$9@KBiI% -T%)d3-jeS-0*eUec+H+`!`Da9bRJb%a8H#V#CF&!r$pNK,"8)[HJ-1ZEjUQmJ%pQ -U-1EM"fTXM2N%rMIMIaXbbmeJ4iC%Uj%M(BM%j3AAMi'DJ1Lf$i&&fASmh4KfA3@ -MjDVJ5"YqV2KTK@+K%dlXhhhKCN5L8%)akNKNjfbVEKVri[lErbC[N6H)BU31'd` -jYbGeiF#SP!%4,m%S4%4R02)4SSjjMkkV+PFD'AGGqRqq-B&-#3`L#DiiTEU('J# -JiCm9c,%)$i,Z+I`NL0#r+ZqE-!5Mmai-)9N1JDi*lXTG2L[rYqS*AGUi!*J`1F@ -664d"2j,c(r[MhE-KkR`j08$XRqX!&iHKm&dlJmcAlM@C[`(@4&KFGZ6j'Ab-VCS -1lD'f(`S"*UkQN!"CZGqkTEL`6a93%5Dj8JJ3dJCm)-q'SCJPBm9J"5CcCMS!rp' -a+q)!-R3()PI%H63H`*(AqEM31r`CI&pQed#!AJ''qA8Xj)*CFjfB03LD6QC0D1Y -4,SUL%&jf,N$(32)SC369,ED!T%9@,)1#8KB&TH1#@DmP##,A1BKmHm#`hHK-%%j -@*5KHj1#)M'('*8H4&f`m)bUef,(Cmaamq!I%hSaU&''jS5KYBN2!(US6Ia8U-fq --RG*!jK&h!*(C%`Jd!b@mh"PXIV"Bf1N`#CR3FB9pN9!L+96MXjIiN!$YDD5L,!( -KZK'I&qNc439EJJZf[cZ(B6CeSp)p!KF*L%-$ik-%JPNRll!m,(N("X224@+4CJ5 -B$Gc+J!qP9hchqjU%YNm'IUl+m+D[F1X0I'J2MA9SqU6NK'XhD`kPNV`S$`LPP2e -kr#Lc4"+SeL3MUaC'9L4mq&RG)LHcbUkbECDCTahj*HNb'PH%Y'Q+N!!'GJT8YP# -"Dmk!9I8RYhK6GXSThSaX)L%J#mLc&cqZEl"#I4c$)8JDKXY1FA%"NE!1Pi!J4!+ -3!#`)fG&mcP)3H[U5,!K092NCIQYRaaZUH0&hrl[9l$!lDT8k-Sj"3F2-4hm#1K9 -(1"Tkba[b8L@3!)GEK1&G+E6$*eF+H4fZlh+(@2jSlX!p$Se&3DFj+PIkDiBkTq8 -ITZF*8fk-eGe#ABj0X-Mc(QrK4KH8,k`JI`p0-d#BS8"b(NMmFk(QTP#"C["rrEJ -A49D4C[b$bZrf`UfTL*80d[LYcb3*PCLQIe!Ch8X+lE0"4a'62NmD(bQFd(JdU&, -6Q$4qk4H&PNd*Ce9!&*26Epk-qh3k!AaP2iEUPH*@21GNG5M9dH54(5@iS,c4*HQ -cS(Jc(3U%GTk8p0L5ZX"A[FQdKjQLVA#PL*P5IQFAGU`)k*hUlSPG%*AF8q8T'&S -TN!"[S%!@#dha3$0PNUB"I$S(rjAF+4iL*[TKG`CFk&(mDm(!d-"pD2QmNpIpb*) -Ul)dE8"df066*iXN+&*V*f8"B'')*)dM6SCJIb6*e`N'5FY#&IjKZG+!c!rJ3-Q1 -EUFSMXUPVR`iQ-$+!b&3MF49JIdm'GNd(9!p1YX"'Td-3XXEXmZAijVSrIZ'Sji( -$$r4G9V0clXN#m+(S0[80Yb,Vbq!J3LJiXh1qDSE)0a6G@j+1!N$r0khZ!FH3!-) -LdBFEG3q%r1*RaTE*MJ0K-,*iNY@RD6F8!F`fj[ZiJNFMR0([rPG0(lXVSR!CSUT -SC9h)2(leA!X(&VfT!mT5IibVG6C`"N+h1$YRdpb8S55G&jb*#U"p@l,(p-`DfI6 -P#$IE*c3E-9!E"LpYDN"P!$J@2-e94j&jTFUJ%0EBKDNTcUL%,V%,cXSF1,E,RH" -%-"-C-DJHG&[Kd)),L5heF2l3HH%HC!!ClVNX)#lZS-il))BZ)9E328"'GQB&X3[ -"2-T5a+6,DMd)HbX-"m`G8Up$BaEcKjMBfMhDRRPpKAc)$N*F1l#C-*Jq(B&B[8M -X4q@p*HLS-3h&%KU`caQ"A[0*kX&Y3S9)%CV4D#d64IMaDIZbHL#-Bm!&2F2jP(c -R0Af4*$28[q56%a"CJN`+'$h5rUL*'8jJcc&+CA'q$5T&1GP6YSk'54he8Ur5%8i --b%3QQ4hhT3*1'(bJD2l5F6KIj(aee`4f&$QLJ4AMH&YmFpfBripIS))h$8%"&HB -f2F#98#'3!+HCHSCEkjf!PmQ!Yh'U"H!GC@6CiR"d++"R4e5)Rh'@cYJj'IKiQDG -a*cL-)LRUQ)'b9HUiQbSC)D1H&Q$J@1Ek-5VZ)31im3&d5Q2`Bb$6p$!"0KV@!R3 -,0$d5CAqLqfFdML#46$fhc*`i05,$a`P8TllTUdiKkeN8Nq`NjXA#5$"@LDY5r1D -a$#M%A5dC2GSq5V#qHAh$43bkFJ@@p9[@!XSZU2f8J,$q09ElmB,&K'JE0[(bP-# -BIEJG&B)#M36#pRj')'!S2(hp"JHXjPJE#+dMSXc9q9l*imP`'L4bJ"&`-YBkZD2 -*6"e4*FbB583cb9@FQ8"0$4C"TefThL`((R4qGRCG9k!9JrC5FMZ2pGU1IAZ8JCZ -6q`!kPfERE0Ji#Ga-82UBf2N3!(H8!&92J(U6UR"beiLQ*d@JZZ(,NcVE+BP-NSH -"&@#&bN@-+$E-CH,+J,YK[KY`0hc#J2ZP'ShI8Kb!baa91VXX8)3@UqmVKHJ3#4m -Sh"m`M4,c$-TC2p$+NY49pAf!5c15[80NACHAGf'TMUH,R6`)-RiYF#**2QP3hjH -6F,4,'5$RXTUR`LQ&R8`d+@B@&+6UK0&i3#BdL4LHb3,',iG'C8C,,`XQQ(#9"R$ -)9iYTZ!-%e#``B$i'Uk"aU9&@*%,%4JBelChmUU9IZFYRkSR&&a5$PEJ383P((9F -Z%SB!I0c8!G%e6*[BK-$BM'*),q'JQ4FJhVl24,0EZ,YeMXU13C`G6#MC4a409i5 -VkBVSD@TJmCBckCaeK%"afTCaR-i&HBXYkrKbqX%#"'[IB"F08c%+!5$@D1r4Q31 -4$eSL"VFTJ4HB2M$c#@c(LS,6JDVMel#"bZG((c&`)PKQDYc1HVU&cL5hc2cHk#, -"c`@bp)$j0Lim&YGIJ#*J*YcT2hhPUR$TLS(8jYGH&6fkD4!#&JCAcM#kXm@R+)2 -%fe-UaPYF1R8#B-+&,E%q8I6E'TYULjCdcb*3YD*"6TC)+bFJ-Z[GPA)f(*QS1'r -)b0[kjX4,@9a)2m2Bhm&EYNp`6b5'(LG[[XQ-`-0UX0j8lC6U51f8i"AYP1SV8*0 --#FUL"4"$MVKS-Km(5&cT3f22P#"-E441UBDbl8B`K+be(JejD2#aii10+EqXbF0 -$+&-GF[8$&YhAa-$m@!CA69CAP6N(@l@#83RrB%S2@#Z,&`"a!+KEkB+G*J6`30Z -9`LRP8h,aUTqbp`U'Q9+1`q[GeEV"X1++D+`q(XMmb''G(kCUe2'hrR4lF9#0R(# -c0CN)lJZZ#L)V!*)iTNZe8mVIZSCAr9[&3QEhSQ&9*V%eL4b16rPD0VEQ0KU-K63 -f,E#Cf6$%D&59T6)j%TU2b$Ej`l--bE10#`Ji9U'+El"M4Q-rh-18,PrQ!1iqJ+[ -#-ZX0`FbU6#PJTh!jqd%,Xj9$"L`119+2bUL(F"#'Dc%k(%2cIkJ4R'QIbQ*)(fA -*89$12hClPmAK8BIrH,UlbU[XIKG'"JaJi'09[f!A,$m8hDUNIY$*JRH!&9e$8C1 -Xb14Ahh*b[V6,(@Bd'ZVp("LCjCaN&6pFjr5-KTrSBD4eCApP&X6DVJQ1cieFD8b -`1bP3@DZ0J3RP@&DJQC+&QTlS2-k1TPN6%aD-J`)q-,'ASd#P3pQ9%-5d6q8&$Pd -!TjLMIrf[@4p"b%CdGXkQ0'60%(9Fc"S49Pc+iFkkb8",e@D5%ipK!Cf(IRi[!fG -*qUdNS4b),j,*PRc%KQ53!)3kbMi1FJ6l8eQ4eIFHQFVUrALGq1hHkhiYR%DNMYr -ZPE)H[#Qc53,edQ(Y'BeIfa20@Re6K1dp`K`lIPR8#lMD&#@b1-ZBiLcMaG%@GYC -#SP`FID)mI(IhD4mY2rkl[6i[9qk!5rh&F$MAPcTGXNplU+3(KM`FYppK4UH8"6B -+-dcXp8![#RYQVi8J0pqCJC!!Y,@CZK9iJ4%""9krT+eah2[a1PpYVfiq+Lb0kYk -XYQ[L-0XabX+U88mIpIb"bK*F'I!e",-M(*!!dPB!C5l+%`J!#j!!)5KP!5bPC9, -3GRjSfmi2,EEc3pYfiYM1$hNlB!+95UG,UR5PU+UbU+3AefM@,EVp'MDf30,+'e- -ICA8BLjfCk4%Y+B,58N*ke*k8Xp6NS&(fZ#pF%KQ5HL60H(,(AXZQ'R@0,ra-hC! -!G)JEA@D$@@jHibXiecJN(HCPYp%',2m&PdNV`B'iMPqAGRZ2"6(KMVmUc!8P""G -l1Hb@4-$UA$hI8')30d,D3iCImfG*5BNB$fAe'YlMci+5!R%dG1U`iA2qV#q"le+ -S"+jb-"Z#KDNP8l&`cNaCV6+B"K+VjbG,`PJm,Lq@@LkHPaFAZaFcAABS"JU&EX6 -eX!6%(9kQA(8ZNMh-ef53!'pdT'!QSLk#6#4-U%LHAPr4fDKRcV(6[YVRG&[[r&( -FHmI96qSIm%VYpBp[(ibdrrA)AYq'Nj)I%ip&rA01BZ+[3)c51lZ&2qlGr[R[6fh -b5[&,eTf$dALjR4-iGI#1D9)$1Tb-0Xc*T3j*h64d5-Dp#5RiTBeHU50[eGE"QSl -b0AGA(I&YfLI&-6dAdmr5G,XZ(p2YFHqlEfaHFCGAmPc@EaZXmj5hh9fjalF4#YP -HAl5Kb"[Y8$SiG*[3`4(hrMP[9F8'Vq3IHIcH`C6rVr[1qZik0Q',-*DPfil*eVM -hm*RhkZji9fTiflTLX,%"9krif2I!5DQG0YUZE$5-DNIG)Kch$QTk9p0'9p&'ebJ -ErGbfd628S99AK!kYFHr5hRp3DD0kfQLEa8E2f$BUkGCKZK6hrXShH`0[P%MZ)C+ -ICC,60[h+p)4Z!kBRiYjp2FpAF!)4dGYPSU1#IpPkaC!!!'dB%BAi%GdZG)c%[6V -GApkL,DqL,DqK,A1RGL*rqaam8*FDh6*dUBPl2cTqacZmE8U!Z*)!CcJ"LYJ33iH -bEBeZ,MTSiYllEUk*VM8"cYJ5i&(G9%aqDrFq[rPfj-Qd&%ANcNB2VTdMfAP5 -b39,BPD3Be@e"ap'ipp0rkrZBYVq+YZp-LR@F&)f#%b0KRh1D1ShVGU$6H0clmQ[ -*TpD5(!hBYTh*LiT%TA([SXiR$e!b2-(*m%Xj'H+8B,NdDA(F@f4qhEcqAFPqk6F -ihPkqNSq2([cl0!@%9bV$,BYl8qI228IN(L*b0a1j2k*NKD1he&k8kr1b%d$Fpp- -&RaG[mS(-GL+c95(c5L,F5LBFKY`Hppl9j2Kh)Zm660jIbZ59!GE$5B&TZq,H8)m -eiqr[5L[TLL[P+a**1`K8lFU!1q,H$4rFkb95$K%TQjA0V1-NBbF[D@A45EVNTVM -[YhrrfY502T!!d%iNY")*2q*NSZhBLml5e!eahe1rqkpl@D%jJB`V#5KA+S6F%[G -1q9llAC-*5BM$!K9JDRlFZrJl2cM$'b*#VP3)Z8m1(KD%A"Ih(6TR[AmYK'a3!Tf -mmDPaErFrrE6Mri+3!02LhV+rIVH8%j!!VYKJ5fSR)Cd*8a6h"Qk&eM-KmiC!(#D -N6"b23Tbi3XDjFGrhk`Ef-"RVl5!1Nr%VFP"r!e2ImXV*V&[b,4FK[9C'HMrp2MB -"emAriB['DFUkZ2I-2brb8K,[TL4Z8)MhDkRK$lkSRkB"!![rrep%1I"b-GFB0aa -f(5E#Y8FEA[G&1fJD%Q,ThD0f)XC+*NEjEqkH"A+FN6cr![,5*!5-6plCeX2"Tlk -9Vre6T8$i[5rD6P-faEhl(rMrZSPBZiPB$ECJX4)App!d%'V4(rBEQ9"mTCTf3kq -VP`J9MkjmhAPa!2!lrc)h5!4B58Mr0dkNEb-5NM$brllp(PflPDrp8`A4r-&*T+e -allB2(PP#B,1E`+E"LGjrlp`m3'[,AcA(R#5+aJd(A3ITfTp,+rr&H@d%HIrH[h8 -3mPK*S2mE*ARPDmXNf"$hVYq5rbe#(N`Ncdq26%VBZA([[9rkjYd8h(C6F'Y`&j@ -fa%@Jl*U49mSATf4E15RCC#)"1+GpjG4Y3X`V#G4ri`Cehc(P8L$#iSHL285Q&LE -6r6C!pje8L)"%kD[6rC'5VSf56Qq*,U,fd`M)Ve1eq,K[eX),2hi!!Hl5'YV!UJR -SBL@QfQRUpVL[l0@Chb*Nd8!Nfqe'&VkcES,FrXXc8iKN,8bbqff)`THVN!!$5I5 -[pRAA#%fd%CV3@k+*D!-1pG1KZk"kq1[Lrq2[48M`0C6JUpaS`RI'$FV(F[rp35* -F!a&ZpeS)K`"fDr$Yp*p)1#48@Xfp1bB6cSNHL"`bi4E(IGp9qka-Z,`eK"j@ZG' -$M4`!kHcNQJmSN!!e%'VBVD!'5i)JS$fImICT#K`Y($MZPj&$R+j[#rK[h&Mq')2 -35"ZZ[a*AQd8Em&YX!#"8GmHGIf"5%-(L#X&1m[9"-)m6V(pjpZmrBP*38[U9T$c -cTCYI(46qH`C&mSj"BBHJ@6V*35-j)S+V)2)2EII1!HY@fiI-3G&6AVp`Y&aD9H4 -pb[HSd2ECqb#XEUJAPe&r"1+ebJjXc)5pY1UDldl[h4mGZRr+ZZqmDp3c`jFqLU6 -9ZrCH@[@Shc!R&FSmIHld0#m2R0$8L,[hj2S5Th&S`jdRjrKUe+LQ9Hck+1%jIRU -D6jRJrGfHBpHLRP1i8U-bS9brjD4lJX(PF['86%b*((31SE8B)KMqAI'aI`cfAeT -9[K*G[G(92rhSp2`D-FHAm&jDPI"Ni8T43r6KDZ&Xq0e(*kpKHM00Khe@C`-M'fj -+H(JEdBIAfCT`52I*DeR(N!#ekd%@%H*mfLk,6!Ha8q3-V'L4@5YUA'%Ei%2XYA3 -K8M,XMbYC)&3(NRcZ"DS3G01pJ#T"&TrHfHk2Ek[M'UAMcFPAN!$@Z,08ML*TM6[ -EaCr1$"Sq(RF[IeXGP#-G2MGMSiYC+P$(6PQA@TfR4MhPAEZkjjbYm@`kHm3,&`6 -rC6AUap+a1[r'BhZmEd2pZRd[JPXV"cITmEGbJre&Z3I[Rck3!0,B4E!rkYrad4c -I`IZR$TbGhbULIYG"`d&HH%pC+!pM-#a-Si9)4r6aeh0jJ#pJ`A+!2ddDi(0P3Hl -qDlPl[+DMc[rlBpV$pX18LBY*(6[h4M[+Z`MT[5[&m4QR$qr!28Qh-jpG8VBFH4N -Z(ElSKYIAh9jL`4DE0%&DEcP"9im+Um6-B$0e!+*k-%DQeqDT&`i&G+@eH4r0qUq -r%N12`+ZX%kB65RmcV(Y@U(JY%5'm[LBmH*8*2ej,43GHD5+1PdkdMl!$YGiB5Hb -(%i(GB@9PceXYVPB+r-PU[mNDf`D'+"Zm5Sf!BB'&,A"Rc&FZ%Ld"fkT9BG(S&V% -C3kl55&8E&9BIe(hk*Mm8T@G0T"i*k,[B#2*&X2MK`+!C5JQSrC0FC4fUb)Y`R`M -*3!-Q4TVG,"UK*US6cEbS#KM!8bESf$922!EPlqKF%F*")6TNQ!BI"AX8lV"fGL4 -,LcP-YE1@J)Nm2`-40!bLi3Nd*&hb!S`$`9X198B4JEYNl*cl`%"f8(`36E&ck4* -ff@NDccT8NSA0,qPH+X(&3EI%lB+8kV+IP"h18l,$H8EIrE1qaUU4*rTQ,@&h8'- -0MZM5TGe+f'Z&EYD5kfeDA!%"%kq$pmpDXUD+e@R'1*1YHfS6Xd(p"YQeH*'KX$L -Vqr[dLVLdVLb&L(jANlLS'(-X"j[d90SL`h"Df@!jXr%'2i-LLUX*LINiiRUR&P' -U0X5-),&QV[K[B@Zq[G2Tj)%"PZ$(iXM"$rM9K'Y"TG#YU5dqC5M+m[@MXReaLD( -S'iJ1[ST,LX&F0RQ*b"%SqXd2&Q*L2C6k"fL3!"RiH'S35LKFlc1kEK`JXa9%C5E -ZXX&b9(&1T%i`ST39-Ghl1)%-pHa+#V0Bl5"bHF,3K'h"G9SQ$60jYl*KJHl[bi[ -pV'kZIH-k,E*a1E!bhbKJ)RErL!X`*CP$51ClQH5%!,P+NS#lQ,ll*&MpADai'ra --RXE+K*H,%LG55Q"-@qaNj,I99[aF*MAm`!XVZETeK"aCh+lVTk&1rC!!'dd4pG@ -!#a1qVLK9aq3Z--%k`P&8GDR[@j'f'#cEiE6&['3S8"GQjrafUNbZS*V*UPNY0lQ -(LE9#8@0RiS6BGIVbmA4P1T4RS45j-B#B-BGNJMZ)F'l6#$-"hlYQU&r*UJ%fE** -RmN(*B69jf26!pc,GJkJlPF9a9Zd`b"#c'3$$9BfTHqA6[FlVbX0p68Y1D5Pj@qT -#2KVZTBd!a15NU4'B3R*[p4e@LF5QIRZ%ZAFqZDijH'N0!S,kDMdEc+JMBUJb-E$ -3BL0qf),iGLG4M@aIr0XQUGMbNdJkCRD6G'QG*8NI5l-Bj+DbZ1f&51S'*6BkmpX -@HG1LALC+%jXk9Z8ZE'cjYqF)TEB&1QN`6%CeUBA"1%b9@j,'BGZ@DVNYa`3M%aC -''k4*4KXm-+U"J"l32#1lZ3iC8iTD*SN"V`%ifmB`aER)KRerqaUaQ#f-rX))dVK -pSqD`P2bJ%fBbcV&LX@Nmml2EjDaqkjkCkNS0)#Me*6*(e)c$K5"@F"@c@%'b*$Z -!ErFCrBk@PiZBU98$pDA$`dU90S&U6j%ARMTEY%ec6M@1f6[%UTmdIB2Pp+5Mii6 -JTBc$e8*AIQ@J-LJ0!+J2i[VP(!fG4V6qT6c48*PhKBe9kbVITSCVD$M08FrI%6h -,d3iVSRX`q3H9(r2N"PhP6@T)S'%K4q1h%Ch0dIC2%AdINjXVCr,NeEV+'G5`!!f -IFM6j2+,&(0@2)PT&PhK6ZF4Ve'"!`cb10Rb%k&b1fUFM@N56TbQ6hl1XFL!jfH5 -UX9R,&3)GDpi#,!JY9caIFc(%,S@hlV98D%C)b%eZ"i)h`)QUYM+9AEQSe&6Eh5H -Vkef&9DH-@6#%N6,PhKT)qEQ!e#N&T%jha939Zp*AG49ANUSZ[94B1EhU[+Zb5JX -e9@ePh&"Be3ZecM)HLJ2$bKk6J00[r$Y6CTmFIUfrYZS8&M@m''"c+0-R'%b"Xfa -8-DDF8&4iNNYb4+h)S+pjbj[bXK(QD)e!eM6kN!"!YZb4Je!&V8QXrJpI!L,S@kH -MB*c$THjd3,pcMcM0f-%BfVN(,[hqe)R)LFQQ*"4K[h'YbUTQ9P1Y68R&4'`2mb@ -KT(*F&Z@#"H1XI6b-Dp!IadrSNSMZMhSP9HZl!)-2NTV&ND5NRZ+)A9*,11+3!04 -c(,&+kR'1K#8B$%@NYHqR3XVdfVf-U!VRjI&JDj!!Q)q@L(c[&PrS0)XTdGGVa#2 -H'U%pPR1'(FT,2Y+HYCqP,RI+cL3#CRE#1pbAAX@%*9$KLbGUr+&)M6m1"pDpaNE -YDARB1Q6(0K`,83@m'Xf!H1SBIXl@3*M22mY'0$RVp[VM8R[''6K@6Rr)j3mpe11 -2`lebQI-JJ%+4'`84+Lm3jmJ!rcNiiU'C2V*0(0AcK#X&`PK9a)R49)[11H)'&a0 -341Z-N45@H$Y0%E@C*b2##RlTLVQU+*-VpqXi+RRF+)YG9&1b)A'ldB(*"SL4cm* -JK!k)r%1q`KZjJIL#bPPlURGqRBSb0L*#kPbUDR9AjDb2P@PF`4rSj8IiJ&+8PE# -eP9$XVQXKYam(AG(P(N4@IV0T%NabjCr-6#Fc9Rj8hj)(Y$ETPB+"TdJmF'Ek4"- -m6M&P4-#9iC6PPYQS#JRN1ES@Q8!`H($GA3%YiM6()V&*PiPGb8M*M,[-9-MRS(S -P9eAM!4*`E4lM3Y3XBL&YhiZlST!!f$2CT0'BA'N`b5iHX6T6BGA8J!-"HbSIdhM -k*A29HmI6X6`03DLfq&ZSQXNLA[[J)kE+#Q[!#QF4N!!5(Gk6#LZXf6IKS"A5H2V -a`!+&%#4J#X'19-,Hr4ZTbqllV2akM-dpp5X"&pXT4dHr"J[S1N6Gp(4"L+@TB6N -M3mIhdPA-R'&jcKFEj5`#98&'*31HJ%68`q@q(D*`C2+5+i"V6ZYq'qK`'Ll[#,! -61JkJ`P,HJ%2H3&"dQGR&)AA#+Fj$pBk,"P)34r9`%1ZNDh!P%KL0%AVh`'cDUU, -"f3d9B@3(DqXcr'J(pqE2Q@SV'J,MMYUUE9c-'AaM`S8P)Ldl6La4K1VP%+LjUNp -KeEEZmkLFUEGpRZ#(466C#*LfaG'&5cG54U644RU(E2kHYmMGA)pBZ0UhQ@UVTJG -S!$41arEYf6H0c8j%+Lr3-%PX4DYN+C-)M(CkN!$$32TK)R#5$IYX[bdEq&RfLhl -4260aJMI3l8KTB4iL"$G1')NJ4diX3i!D-K3p'N(eQcN,I3ZpF2(HbrpAl-dr[G1 -(c1B-GK0V+'D6A4!3Y1j2lSj("cJ-lk+l&Gfp#hd4VFD+!e#%m!'6K`068BXKClk -%kS"9dr#+9Nfp![1I&9Dm)K81UMMSi1eMbkJX%hN!!F6[!Q%i14$CPTe6Ck4Y3La -PTm[Z%`S*je`j8@&(TXCRX6K9FBlR"lKmdMqqr6D5DbBQPH-R$i!L%+PQ!9#dGfp -VUUf`@hD@HQ")[PMUJe'qVa"J`E8+9aU!N!$j#DlPSX'8!c"3%"01pBm[q`8qkM' -N"d0kQMMMG6`ljj(TbK"'$+((%+IB,GIpU!'JGFlD"4!!@mQP2facklF9SfPfQp- -*)9aNMTr&Xi&b)#Z,!%bb!%6`!!`#q-Ij0HYCRM+KfQ5p1Q#DT`i%HUJb4*`B$(& -L-+5`B&@bpLhmZ#@&lGE)Mab4Xph)'$6r4kQD'BJRY"#Fjdj%V,)j1MbDSl+LjAB -GVP@$)28F9qH4'bl9jRZ[Q#YDM-h1TH-qAR!qYU6*Bc&%jqd#)+2aVrd,1h3bD3D -0E9fa835"'hJXbQ8T%iiI)E"i#N3F!!`h6KK#5DX1Fi9m4-ZUQq%H(pGYVd8(hEB -4&5)YCkAaS*XI`(e``J8k,4beC!0X-R&K(XcS!MZ(Lp)Ef6N2A3BbpXAm$Sqa4Y2 -AK-!lD`Q+(Me(E*Pb"U4MR*&3b1mjRZiF2Qd(Zb8k$I@Rj)S43e34Xf95!FHZ6H3 -k$aFcVQJDIY'%&RN#3'NZ'@!DNee)Ki)`F9GEN@#"D[PmVZU*+VJ`[X*9j$P6Y#D -,hCMpD93T*%)6MV)"-XX#L60S6L-86jJV%Xk-BQcL8(SD#NDcGjq&fB'0,0M'U0) -b3"kX)+ifL#c-,bk9JdJ464HC#IdbLD36"R,-SB'UL4"#T1%+F*-fe(-QmrQT2#b -b[Th1J4%`3dK'L0*24j9"mIJKUXCDrC+jZ2I+eG$eL[0i'5[10HPG!@UkVer)KJA -NL1HN%MQQ0&3MmS8L',TUiU,0`aA)2EZ#CPj#%1d-a+pFpEaGFBl"!Jl3$3M1+CM -RFU%!jNhEUI)RVV4m)kSke"DEjPm0&34UD(V+kCkXJ-CT621"H)Zi+j`Aic+B0(A -`CYRjGr8"5R#KYY%!H(5C6"!kDQeND*A*X,4(*S0k6LD$UQ8bU0P-"JBCDRa'hV$ -k&i8!Tj9)VY*`$Sm%)e%(6erjRTXBS3fS@'0*M-X9j`"UmkKDXpkC9("RR8#Jhd5 -4PHk`5-5e%!S'lAiLS4bE*a)+alU)&#)d5S'd4EPNjI,CR+9Q8T6Gb',f4KN(J8A -,6%*fji@CrdpK(+%B&@5QXAZXdc'@6%-dJQ'aN!#c!dj6+L'J%YeF)+m,Z2LML$` -CD)5cEKe9FANR%%AKme`JQQ`%GT`ED!N0TqQJ$KaqD`I8NIakaaLA&a'd,Z+R%3P -ehX6QXb4%"b)'*0imr,b'kl1$H`QpQ$PNa6'GLPQb0VVF8H9b@Fl,e9j9fh5Em'V -4lH!XHShi1L0`cebBSq-(HQAR*0Jic5Dj'NFLM)mGQHQmFDIc,4d`&ML+E@3'kRL -EXF3V2@NlD[[5GS+9G#mMNUHZSLL-i"1$228q#q)33Tc%rN5Z(K0S`e$Y-+M3l!4 --E1046CGLCU%HE1%)1HC(')@`ZC1EJh!H&l+!rkH`,1$(-X%SMJ4-Q(i85H3L*QN -0M[Nb+S-LdkL,N!"CJ[fkSr`"Plm"F[k2+!B+-V'eipKD66!b`dM6,mJ)%5bQfR9 -IP0dbXh2XMb,BlFe#%,XVFk*Ce#i*U(J)9G9DBDLb%kLCX`C4b81&hl*!%J*+Z0J --!D5`f1`UV%LjDSX$3A[4bCLG*S%(J1$kk%Z(+dZF#kJfG"L,#CPpTViU#j2MJLX -J1Bf+)G'5L'3bJph8Jm)'CJ6!DN&Pr$DZdQaM"hCjd*b8$CK!Q#0$+BE-IQBSe9D -FGaB+)-B4"KqMDI*J2+8V!VCLJIS2rh1$8F"-iV%R3!%rk*@CA&6PZH2!Q+h+-l, -Cq0r)2bmGUNJK@2Ib`kf!3&BKfqMi8@A&HFdK+FN4ia"0FAib@k,%iS%`'jd9"YN -`-*+JHB5I10,eFcqFNEZiDK-A@CeE+"V[4b@+PL)#S#&8#rN3lUFEYIYXdkUdI94 -!ie%MA%!65h"MIHGXm`frTJ2U@6'%`2%QLVPErVrK`5mdB3H!D!HBrSf`S06SA06 -kH,P[@9,Ji@-dc)a'HjrRYr6BVKTHH,#4(JMS[&30A8U2ajZ8%q-H`DG6#L,SZb[ -!,68i9F`X"M5b5r'N!MKPcZ1-4i)GQ-(J,A#b8Q'+T5ZYJ-eISM),SR)4d3%63'N -&-"daJS3U8j!!,3bN4)!S'%dX06L4h0+YPJKZk@)RLS33N!"Ne,Cd8FcfF+qP[f5 -d&d19U+@r("%@8jZ9c$!J24!D8Ir@Yr49L&C$6Q5eG+(c%,j@8cZC%)m5)eBId-Y -S(-@pPP"'1dm#QB*)TXDaVS2B,0a[C84pH#+LCY5qb%K-,Z'h(X4Q*L0Y%kiDL01 -eie5Gp"dX[4VJb3YIK%32@e4&i+(MmY#H(!9j`5c1dM*'AN[,eSDmTKeAN!"APJN -6!pQZUV3KS0!f4PjT3N&H&b9dCq3PEbaYL"GU-p-N4Q",bf3%PTDS2CbQ`43K)c" -dZF!XiMqA+eH+!"3H[S(#H6+V)L9)c(q5`B!UUUFCl8j'$$kA6@$#h$Z"#92`!Nb -B!TN*dqKaXf&b&[*'Q8L,GmTA#RfiGQC-cS,m-cqC'C1c8'E'6'D!T!M!RKF6*KI -3B$Ra6db(L04Xj06-TJAGc*K'*c1Q-H-3YP91CTYc@VK+!a4mZL"!M%h!I(`%JBN -$&#X$)"TXYTp4M!J9Q2B&f$aXh#RUXY,,"S)!60fd9r+!c#D!iG-EC8+S(c1!SKT -T+B-6M0K[UKeHDT!!#q@88LJ[X"A+V6IGKA*VVP`SVa@-NGb"Z"L')Bqj,`c!,`C -f5h"qHP5qSYL+kMc49hU@IP*lH1QR$)B)S-9"-eGpB)E'dNmJTZ9"D9eC%3Q-Fi% -2mPP[#&5l2B5+!q(aMZGkiCLI[+A2l&[3@lM%#1E9JN1&5q5TMpHld*("Nif$9G3 -%fR$8!)l+aS3D$$q!53H3!%QqRR&S![K9bq!ReFlk'#EjUMRCj16#ihG+h3NChJj -!33@`d2$%"&dqcb*")b3'LU9@#`F62&+L9@([-81+c3Q+c8L3!"(mA-+R&K(T"+X -JMcb(5Tm!L5*Qfq"aM8m-YQQk4PMe95A"30YEpeIF3%,2`)CZ$(lQC'V*5Npqk+* -G2k+5X1QcQ&iZ6`ISlU'KVNGB*8qXAME`aTAqlAl4#%@VAcb"$Mf+1VZfJS*6plr -cJchKlV"#YhMQ5e%I0lJ#hImZSdiD%L`k9!+MUMhG06HkZ%L,S0*R$&@IZD(l&6C -($k&UXD+UJENVCY,)&a4EQ&N&K4[-pX8Z)X%rV5dFR-lCj-(0p*Lb-QA`lGe2ZJV -I'-"2YJ'4`5!QDieC33mk`X4jbc!UG1PPCjl"IkD(U*BUjQq@G9GVZZ#DS'G6995 -j'Bd3l3Z8CEZmCDG)rhJCYMA1C*,S-C%C#0"3,Z3')Ucb4T8e[RLV6&Bd`15k1`R -dHcN*('aib&Be5-NJ*a@QLF2#Y8,*e))PCl8a!p1)f6VZfHjNRr9lq-'mJBZ+DYe -MS9L[IF-S+mYC'3j'VN@(iqQacCDX%'3qDb[k%6"Z)1Y3@@(')kZ4P0eI4k!amfD -kVBMHN!#hL1T+5@6Ip95*$Jb[aiFX"ZS!`f2X+B#c@)M(Nbj-4-6lVhPMc9'$p*! -!Q!QcDl-"hYGHJr%,RZJD&*p`*'Ui8#!@L[IaQLeQ`J$6l0I39&KJ'K3,Ecf+LK- -,*94JeLf$m0S@$Hh`$Sb(fD$'Vk@1(Ei"FeJe$N9$cX@"3eL!US89*H,AYq,4FCU -+Baiq++DcmQ8J!XY8#`IbNY3"Mr(qT+jV,4ZBrErM"RJL'1$*"`[%cE8XAV2B+#p -99KL3!0b'@d!j2%fUV6!m1#K[r8e%U[eiX2PXfZ,r0X3!S"VUZLC92'X'@f#Hfh` -A+b8jJ2*3Bq0UeiF&iQ-8j0Abp0@Gh'#2`(Kl0BZ[8,dMLZaRHS#0fAQiQDHl!Nh -MTj1k(B2r`C@4i6USiV'q!a#U#YGP$aiClH*L4*l+,M6cBC!!i--H)a%V)b+U*cF -2hmXGRB[C16[(-m'+Xc!KCVXb*Jc)9aeLak!N$a!(UL,#Q-A(NlU`HJp0A'a$D'Z -8'IQ61TNXJ38DRYNf96p3-4l'$+DN+5+'Bif%$(B$D*!!0F0($bVP%V+$S`eH%1G -GcJIZGJR,*LjLN!!%1D&,F*q%QCN3-i&2@D#D3KR41ihF%5U5k*%!k)kY'S#-rFF -TDkTFHKe%,MiJLJ3q4G%,,bB@e)cV!X035Rq[1!X[II%T[&c&*AJp@(`1489@X99 -fLP*)ZePHF,T(8H#"Le4qJCL13kH#AA9+FB!UI10FXI8PZ%89Rf-e[,2"D(VKibB -lAp(5GpGbL$cCpJ!$0KS&JX@GMRP3SGC@$-"N8j,0[pUBd$#8FMXQId+a-##6!BH -2dR81&TI`85m9L+R&Ti)0I"`I05B@B#R3q(#IQ#SCL'$XPVLNq(&jLr*9E-5-8k2 -9cB,'d(qcf'kYlCL2P@em&pYp#1jVVcU"Gc"hBN)KD'9JB%S-pcDG3pZ'8iCr+8p -pb$NdN5k#`&Yd5Cr[lHI#p#(E3G@6$m)!+bfZ'VCGe@4a9D[&95AR%1`+fEU@kmT -$fSC4KX89`jCA()f)Di@2M[Q"CQlHm*J1&8D8l2iLcZiVQc"CE-*+$RL,"R-Y$2% -YN9d3+"296`MAiBU)!Ia8idGk')+r-0$V'P!aA)N"5MF048#*#fPj1L0Sr-c%crX -2Xj%h%ldqaUY"6!@l+@%[e1RH')KP!KL08)I9&PpRG4KABNZl3e*Y+M([6Yp,jMH -bh5Se6$d2G9TYm3&@TehUhZ)Gb)Z%f0MF&Yp,VMF'D'!Y@,%3c0l)I!N[*!-%0B$ -K0r*"*S"K#3H!Z&PpL%'5!cp%[f)@0`$)286bLr6`G8`RpF8MpX*f8Abmd"rXB*@ -K%(Sm6*p%)$b+[IJ3ZYd`DVlp,YfVZBZ-l14NPP',M&CNe%4%MiM"Kr-q(a@EkC9 -2T,f6Ji5-TRi`im9S5N&'HV"6Me-``L#a8B$+$`NB$a0kf-6!SrkYq0`cK03)5C! -!J%82EF+V1`YA0"XCkF+!4IF*"83(1BYK(dDfTG8jZ&0dFekB46JBV$X$`,)2lV& -9U5kch#l8dK$T#,LHBp9PaA1-mR'!ScXb%6%lf9kF34SRpY[c'r#6$hDM!3kHcei -TV"bU$2(V+fPJ-Ni(ff`61`kj#VZcm,2C9GPGMCpl,9P[!5MKrm*'e'ZqcLqi%SI -H6S(&Cbm8rXS50RXV'd1TmdJG(h4bpAH!arXlMm(SPIKCDI8f21kRZ@kF2pK3#c) -3[NK(cXPESBM(80Mp$Y5CC*E9Xrc3rGh[C1l*h%0rqN$1,Q(5$TIf`e$8VRQ8!69 -qQ)[(-C83Zc`3D!fLQPY!V`%,&Bpff'Z%Z0p%CUShc-e-ChHQr[BQ-[[S4aEjRei -M"kFFIa@cq%`RCC&r#!6jaVXpkX[[`Q!k(Xm08c!`IU%@`AQBcFr-B`HURj8@*ZA -,'d0e(Q@B!VTi"bjH@iQVHNBr2#C2jZ%,Na'P!fq`FKdkM+*$$ffdYK)!i8PqQ)Y -,5DCMh!(#AC&ckpKb@ApYpfBd6e-bhCr3TK1dk8jXqTLbk3lDG!HaN!"`L6[HXff -l3lR@GP-ZNr+@%F2h@!`2GXJra@MihNQ$[jLJG1%lV[,JPHZ)T2)@MR"'Q6*")Qf -M6"D29YkZa`4`[`c!23I!+i%bEKJJIJU#'9LDKX*RMIL"@F4R-r&6!S-kbmCB!)& -lfCqAmd36f)f"FB#ISGF-C'1!@l`[9Q1TJ$Ebi`6e%p3lCpd+8[cT!*A2ld#aEbJ -f@4J*+f8$$mj(c`1"R4mQeb)94e@N$%Aj@'*Q0-$96L3!H)-)K)Kq9XV9c"2lS&! -S8pK3-DRfM9`8jkA9afX,hmM9P8ed55)(G4K5$PLKi&d2P3%BF,pE(04ajPj-Rq6 -FP-19IF'i+(h`'KX&iJ0Za@RBdJR$PV)4KZ8l4TfXX#42C`CBBKp(q5(`,l!C((" -c,dbU)C)5Id5cY2r"+A!SFd6h`T`J'fB['ak#!CVe-%N,TXR[@!'UJbD,JF01@AJ -%`Zr%)-jK)dpIcmjj(Sq*i)S)EN-@Z#JB&Pp*JkQP`Up!*+`F!M$Jd84TCiQaD5H -R+cY2deC@mL19('jA959K&2Ae!NSF[UE4l1,AME@5@#m6)hDjLIimKH@ER@3&XcV -f)ED%am'@Z9Q@Eq31cb-`Y`,-6mEmNXHB*1*im[HQK'Z@X(q2(r89KPR1'[c"'p) -MI5)"0""5K[$r%5mB4YV)*&Kq!!aHqd3#N!$c'KadlKNJjdb2l+aViCcT4h@2+0a -4NYd2A1RVhXP1Q0hES!TbG0r&b!6Ahci'SM+Sh$-p+ph#JB$%#QI`94kH"@(cRNr -`Cf#FX(c%'KX"TZ0YcX+6,R!aCH+(ejJbKX['kS3$TMlajhJJ)bdpbCY2`+#X*'S -HimHFKBQ"ZPfj%"5JPSpK3f%8MV83H&L*U-f+5`Q%`lr$aDf*KfJKKXL3!)diE2j -GjBj3$dehGdLEaJA6#,(cQrU%l$K"(EN5[,!M!h`Uk!")DqA((GS%kE,EB4PYr*p -c'@dS)V8@4YUQGaA1HPCKb#59S-qQQrL26E"c)"jE$C2NT8a@ed)jb&@F[f@%@mG -jADQaa!PZrD[GJ)DJR1c[%aS%efXb`#dll`Bi01ETeU1jR%&dE&#Ba`#QcQ$0bUR -[&$fid-BB9e"(iBHF9D@!V9pl`+BJ1339@c-(bkqqeYmM,J+&0-X6+XirZ"",'X[ -++%)!a*UlmepL30Z#$hhh#K6U'`qLH'&fXc-*AccY*3K+,jlBj#'$L8PbS4XIrXr -UDM,BaApbaRMbbF'fX5k0aa*8&51M-&P*ACJ&kZGT-6)kT+YL%*pS-06CbA3YPJc -b3cApcZbTK8(e0q9!J-5ELjqLi$L!B4UL8cNjMH@Ni*fV')qm-IL[8*8Bl5L4HV5 -k,E&6pUS[(Zc,d'f)$C!!DpmS6Am68lp(8b2bJM,%(p$`#M8i)!cm!HE&V`9$-"A -Q0qS61"k2)#S5I-%fq9"-(qAT8-rPDFDA$Ni-N!$XAXb%#aEmiZG`4hK%-pj45q4 -S5@5!4&CESjiD9CQJPN'Yb30RjL6F%2RaM@&E"blqZ)[J,NEPXBX+XI,*&$NEF+6 -+1JKLSfc)$K%09p*""%Ti9L#N59fb%q)@I,a2D,U0rY3GHHPkQ*9c3p)2kZTAqZP -22XP(%UEBp#bZmGN`CrfhX(XBrDNX#MM%HVNj0Rcp%Plr'H4U39[Ck*,m4jPSaKZ -X0%f5VlCd(3-%1iM+3-8",KJD[$$'$cD!)@dZQ#"FcQCQmmb(H1KI92rU-rjXFY$ -LNe4"BjIYq"JPbq+Qm9VmNj[L$QSDN!#*X23F(AP8RXL%B'5*C(6)c&RAMcAM2rL -0R%JbQCC'U)YG*Yl5&[kN`q[iBE"!"[Q-)Y1bT)jh[`rh(EjbR#CFN!!(+0XZGbh -E)9qKE)1mqE*mMBI98*Cr5SR6'*4Xq"G+-N,L6pr3f*bNCE1r6E*4V'ECqIPTXmB -@")0LJRN`UZBB(A!UHC6r0qe@dAA,(iBD2$,K%D)c,eJmD*-HB!!`M6-#J"VhBk1 -,R9[PLRGeRS'mc!jN)([VHf(f!+BcCbCNShp!PHbJh"EX(HK!bD*pX+J[Rak#d)Y -(A%eJUj1MF(+#!I"HYm,&,Dc95ki-cQ$+4JV&Qf0c#@ca"mJ`#adUXm9XDSR*2"L -8rc`A2$4kXDk8rc`BrZ0Ji,kh1"r'VH%J@SE(0m2809GdI#Dpq+(%#@c`2!&$+4P -6LR,L$"E$DADFd4F!i`I&0IKX9$jAdDH%aa%AL$BT%fKHiLCAJ"YL)9I'JTlUd+L -(#99mKBH2c5!MJSUBX(360T*0lY9I$(!5hi5,CFKi(LVH69bG#B!%BiG,0c(c5Ef -#T'hM6fl1c[Q[I$JIJT9*"RUh)AK[a3r-Uk9YiJIPik18Jcb8GTYQRQIJFB(44jp -1*)Sr&N0)*K&VBaG)F[CDe[h2$VMl`I&'",BTdeB319B%G8h-j[J@)cFH2"MLiPF -Q&8r!cr019!QRKHIGaTpD"8bi*A(dBSM1GV&VjR2mm)$35Ilc@b)HHXJ$2j!!+Lj -1XKh6MDKF2b%)S$LJLP%&iRd3f*(94dU8Pl-'qYQTI#BPf4!TBcK"m+MNj3[iMqH -C@+L3!0&8IrIrJ%"`(GPN+-cjeH3BI)kb%6ph6Kc-4%DD2SA&2`!!-BP"4%05!`" -B)Jp9$@C'%4!KiqjKrffrPUVdjZqk[VQHj['jVUYkUVCk3I0%GP)h"Zc+!VeZ*V1 -cb*r(e[+3!)lVQlQ&%-)9lHHA(A$+M)K1McJA$K0VN[%mkf3HYa"Hcm*kK("k!b1 -%j9Q(dB#"*YdNlh`c(Z[[hprrph8G),ql*1mP,cm!&AGH*2-J-L)5)I%!%5)'AhP -G*Q-ar-LqCJ'NQ"c!*L')CV-(JC2-S[20R!1c&,&8JZr0qr1q#52iqmk#M2G`pEC -DKMbLd51Y3amCHVZK48lF$KFUBV(IrB)9$i+jGMADr*`4l'rh@haI,j*'%1&V@$' -3!$VG3"D&JAKK))8c#+3,I1N**R'qR0U+J,#d[d@@iSMNQ$KF4Yka2ZGiShr!2`# -`r@&r($qAeDh0F5L,bQK3@RaM-0(+iVm'I"EQ!l&N"+cJFTK`k@35*Qc#G2I$E"" -9ifAHl#RqDeZ%Lf9SP9)$-MJpFG4(,I%a,MkL'[&(2c,M3"SY[YDM,QA4,b@h!L# -Z%jG$)#S[5Y8d3Vr[c#R(PeXFh5Q'2B1c&p9G9m3$fZml-mS$RIS$fR6*8CIT%CI -aF6+LbT-UD*qdb*i0(EjQGF,3E#fb'F&d-d$N%%((G3LakR`CBrj4Qm0[*)ZeU58 -Cp6rXD9CVUILMYU@lYJ%jEKQh`A#VM&"r&`##-#p$%1HMj5%5b%2'aX&Z,k$'M)! -D@DbS3(m(PYUc23a'$(r+"[qKa90L"&8#+92@`D@PLaQ&*2"5K(&fK("@jrR#mUh -GNd&1A5$mrLahGlrP#DHa(%U`eCPAHiaN@cY!iqA+)aH94k*B'YKlIc6Bhf@%("E -!ZZGZKp5GMhkNDJAYqIZ65@@"Ab`iZmY)#PLI$,5'$C6$b%*1DM"$ZkfpXGehK8d -@#85Y+,,VLqj)JfA"Cq5NfAD#LLNRl@dR#[RK(!F6fFLNa$59Q#E&G(+j#d$#C!# -AjV$$bU$*'!cfcqq6UVYPj#X)%Ph-b2#+dp1Ke1PBc*FdU,!",Cj!+UX($1R$aXE -GV*TU[$PThAQLX14G[Y0L,"'`a[#@YY-#k+6ZSVbX!9+bmX8rDe&65br&k[aCP`6 -jk9l@[9$VeTUk@9K)h@MH1)SSE)KZjX8Q8XjV-J`$#MLkHD'CP5J(a36hXrM53F2 -5SiX,ZFVd!K-&a"[%e%V6ZQf`IPD*Na&-cF4d3N`RT9jBkej8#UXUKf,k,+Y2*X0 -G*(Mab-1+i+@m6SANB`(jl+1Kh9r-aU(ZjI!m&m2V&R8E95,U8dG$[-%XNKld`+I -L!EIjqc9)K*!!`,E0meDDcQfhB01Y,&iBAVH4cjNH,eq'J2'EFcNC&U$JP#CPf`R -HQ(rH*`Vc)G@Ib8R$Nc45E4dXEM8Ni%)Zq%PF[!q9j1+H00'P@A@'HBT8%J6h$!` -(B"+JPFd(8%&[QSP@!CBmZY$[FT8b+2+p*a)&A[8R+QCdKXSVA-a+SI+(-9'S(Vd -U&a19GSmZ[p%#SmIPTUkj!P)E,!4[B#U#BYLN#,N5e@r&%DKq)DpLF5(r5kZq2+h -LP0EibNkPkS[T%,@H''#Bja9@&#J+L*+KjpS-EAIQ6TqINkC3[6[R!Z-Il@kRi)H -CSAXC*"b8`+I+@%)+512ZiZr`D(iNfX3"@2Lk9f2QbENd&pm@j1,bRr2B,dAHHpL -6Z46&6m@P)(jFkV@V+*KR0Nk'5+e!A,'[BG2fM&4lMhe9I9TjYI,B9j8VP&I'XDq -qkPCHK@KVMcVZT$TiLlj`!`+TIj%aVk%09F1N["J+Xh0K#i2)jQ6TZ+faBlUdS1f -qEd`"k,*Yl5cFbldEUaTl0eETld,eEk8TQ`mJ0*Mb+r1,%1(`4KBZ+h-#M(-%(Jq -`@[@-U%9A@@MDC)$)%SXcKDVHj@dAT2VD`9k[Hd9jR6rBkkpZ8PjlMhN0#(EcJ[) -b41c'SmaBT&IH&)Nq4m&9'*9Q9iZdcc`,!U)F6N)SCh)jb)j`NSi)R`'f!da-%2U -"M`pKNQ9@1@9EBT!!hK1@lG"UH)N*k,d4e&0iJqi5P-jb&9c'ZqJ!p`&6S@-B8hh -MNq&*1mMeZl,e9-2A(aFE5$K,V!$K0'(5GQ&k@+`94G'GFc$CCFBmZY'+l,Z5`hm -E+K(QbL#%"R`PV3SK-625h`&J--SGbV#S5+M3Y"drjUr[389SEb%p2r@hBDX5r0N -TF9h$56ERf8(#Zl3jZTi$qkA0N3maUIV$!55eB!k4-hmii,26X9BkYY9SGdZmm+' -6e3"3V6A1piiM`,B[b%K@U$L4CK+Gc'U1GiJ8"5H!(11r2A"EQ0Tra5&HmDSi!(- -U,GE)`0Ld9T+CMC2*hBAaqG5cJKNkSU3HAQE'Z[,rhNHaXD,Sl[8L"$(-(q0cUN9 -bVV*b)66h8UaD(FF(NcrF$Xe9aYDTLhT4c"Dd&MBBFAKaFQpp+,pGcYR!S&C(mm& -B+&q1@e8RZQ"PQKKHjb+f'-ZE10cJJVB3X59@+G)UraIr,r)rq#pkc(p"j6m0r`A -`Rhj3eS)8NL@icl"XK[29`rK$d%+0`SSN@&!BY-D'r!q(&%1ZqBG$"cAN(CcDC82 -q,b`k'ENah+SNkHT51(blR+lJb3pM#p[qi4!HZ$L-BqBLUABTbq@d`C1rM5eB3jC -B,#1,NmrAYl@(X-$*AD'ZGiU04PS!F@NA)kU,Em15EU2U6%UB#Gm'`Ci!0&GZ0E@ -3!'V4T()E8+fTPVq'TFAU&V5,)69j-FTTJYLk@&e&!#a-L!,DqmD!k)Cb1j[G)cC -f([%iUA1YT-lPSXlPSmjeQ6UAP"G!lKV"f2mEEa1klIreRcI18rKG9d1TdIrI,j9 -d-bZ2['PDm+Ki*0&G[1+44cMerX,GKYJPP,@dlDQYUL4AN!$*j6#-C230p&K1V)D -jXa0Kif+CS!)aUA$LDV0m!r'B9#Gi%Q(&MdP8&Mk6&["`%YDdYmL2fB%MHLmN'B+ -`JQa`JT*[K[R&8N6L@$im5BG(eDJM,Pl4NNMaah[Aqj*f!QELH1dP"@kH3rV81TM -b*6)44M#AZT6kfF0PIrQp*8lU8J@1fISA,XGL-USLmIL&2#BKGi3RFqr+k#)+F-1 -!akZNi`%qI"GK,C,jH-P-cTCcR+,qEPk'`1kC2Jll+SpJbVH#J0"fhQFfiia%3"Q --[FpN,m[TS$qmaD$a#K5+hBJ6l,%-,T`J2M&Ei5Dl8RK5R*4MYdjm2)$$rq#6d@S -iX2`"j-aJmJD5CJH"5[*aUScZ"DRE-4PmrMk!'CYalaQ&4IJR*Z)6Ba+ZR4X"rMm -Faa&F&)!mpf`M*RFU%TEfXGJMA+"YjiSLT-6,1-$#NAr!RrHcpP3Hi48cY15d`Xi -`fi)rQf'"1#aAj6-K*E41$BHL5iY#8-[hVLH(`I98i+08i0I)H1$S4ae-bVh8h@5 -NP6SI!!J!$HkX[IL2'TG!(ReCHfqqZ0Uf"),H0S1$'3+m'(heFm5JhMIZI4IKq,# -G`6N!H@&M"Kqd43BbFMKNJJlaCZf1I((%FV"$USBF8MAd%&QLEd5qQ,k4iXL3!%2 -UKKa5Gm`KDr50b"[T'bQ1$MQNGXJKY8-18BIYJk39,r*`[G,i%"D*CfE4`XRQh@Y -hh!H-Q5($K0[,H`K&h&(m4&8$KUI"3+a$6DIb1Ged@'3f)E+*[HXpeTQPJYc5[[@ -qmpl65l(UB6Yq+[[cLjE8'"X`3ZVhB$SPF#+p#G-SChG2r0Q(2kX"#qlMp"FcNE& -pB0m1FCJ%X'81kQSIM'Sl6(NIEVErQ*0NF+p%Z&X2pQ%C`ZE9"VTVE-AZ0h[206% -FD&16U9ZX`(cj-a*`h`Sea`UNPd192FbXpBf$A*8a#HZGiXlHGakIlHi8ZB1@B$- -V0Z$SD9QjApRk034r4R(HGXlh'LkqST&IpqVGJ3q(+ep8la$8$F#!V84akpe!J4Z -LU3'P-b5(JrZ@8(3DG3)%eepYjNk!)Qkp5JR6c3dM$`Bl(,Uq*4d'%UPiVJ)!Vj1 -AC@'UllacbZ9AHh'jebG$KG$cpmR8V`pfjiN*lXiC#G$J*T6#IbFi$Kd!4IMCli+ -d!VDeim9*Aj)!V*0[R8DDpM354&h'I'2A`MIi*6VD'"DG3"%diFD,`MVKD-mJ13` -JE"[IASbmqU8l1$)lR*@[EKSHcX['*@3N#(Thq9I''HChRFr1El2-GF2-p`"X1&' -BFTh(cB(&#KNE"@bL0KF#cprRMFePXh,$`+bf'"`$40+!bbj-k#rplUcdE69#+2" -kF8R3e`&fEmTXh,d*K,U%#68"q18-'[-$Z(PaG+0D83KFL4cqNNK))%N(pm4#J$l -8m3FSjM#$(lM-$Ha!FS+"LXPLb[lZKUi&Qe,!0Gcpi"$&&kLK4eTL,dVTk&U'V8l -,@(C3C0AEG6L@PIAhmY9P4I+YHp8PSm'ai'8j-eCG4H69,!lDB-69YIK6``'@FIk -4%XN+IF!lIZ5`0''L,K)3a!f$,QFbd+HEYQl%CAcMBM-[JASIJ1LQ2,-J,SB("Km -VAhUTZY*Y'Mrmihe`9iE*FC!!Jr![LFlR%N&FV"bJ!-1UV6RT+I!#GN9hrDREp'l -RC8B)")%A@i@EC&9Uj!&-FBU&`q4KDj0)ID,DCk[h6!DHNC-%SLkrcNB)V'5XHLq -E0UTC,N**``A!`'SIUbjMBM)9b@X!K,3YRHMm!iScfrMhcXE1ar*JlFIK3JQMpYJ -*CSVi1#4-ZH2'Fl`j*!6(P8"DK$81)L!M4$Km4%EF4$`Z%ZQi8Vb4#-S0K*rR2-A -&(q1RU$K*(lZ+Pr0(eFe&APd&9[#R8PEAUBmR2N6T`dMLJdBITK)I`[5K)[%K3Kp -bB`%e!j0ZU5j4ME'!1mSL9jXaMG!dP@-'l(GL'DVYVbjcG*X`%Pm48VaP"3H)r10 -'B%XRM-lekrY5+XTd"aGq`A6RbC3Y&1l1IpJa'@5QVkeM8U*T!94`fdQ!T2&6$8r -0XTV059qc%HIdYT1C`adrCPHDl8IHJ"VY)MADI&RUc!EFDm+m%BpFYiNf*'8Y40( -+bY'6T'hr$ETbZ3M4K9!Kl$)@pT6-DflV#iNe6@`$*,Ca%YY8'M[G5f,V)l(G*E% -9Np!F*,5l*$5940DV1K,#1T83dd"#3#X6SXNQK&+!8,b+8(S53M%63JN*S6LTQce -UJ`0lTK$SEpp`#ijphCj@JiV)Zh(,Aajr+GClr*ZQE(VM5$f+BGjTmAIj*P+hf"P -f@Kcc0rJNj9TMSm2#h4i0G,3V8R4PYC5KFe,H&lJ6#3J0US(CaE#MBm@Yfbp5S"1 -T,VNpS8!ZJ#Lq8Z0kJ#1X!2dd*R,#T4X11A"EBjAcI#F$d0ML@(A0kA1fFjD@kPU -R*@U*eFCLZ+Pc@N"ZmMUji5fT9P)CmB0erk(!0,N3Nd-B+c8+$Za`JUpM*hM[GQD -A&-8A4RGMiBk4F--NeKRe-KcPN9SJKh9b@Z!+[A3UFe@"i%D-m`cZ*"j)#8C%GLU -3!&h&83m!`T)ha@[P%1[",[,bI[dLR[Khm*Q+c[lVXl%U9"r%%+!U&l'G!DfA,Di -("!!*J2#h"!HQT9C-)XIFjIa)5AL'[mhL5,Pdq"A-!!N,%02N[0J`B#[qD$9k6c8 -9VUV4SSF)CKX%c$L)3P-M0$%T*HM-Y$%mpLA*F@dT"4dAkA@4(Lc&4K6BeS!b9Y2 -K+Ib-b8ba"5a-d565`a[AiY,E6M9mIX6e!!T!DVZJ8Zjb9kBIUmFe&P6R#KZhh0F -CjS+*p'0f&JNN6ZJ#$"j`YPq-I0,0,LKbQq(bCb*VI0(q#ijED*!!j&c92[dc%IJ -M`BB2D1lc%-#a46KA26ccYVMiBhd`69l-DQ!%651Zb99'dM1""b$!aeDkf%9rBHC -YU,`4Q(8a2KESifdm-KTT`BGQqM#,iKRPK*U2652$bkYYh"eL)hIfbiHS3Fp$I3r -iTF'(C@6TUBCAcr,PBb0XkVajcaL1cFLH8`f,0[(+Hdhf'2q%"j!!DX*2mYGRC8i -fibFV%Icam6rJQq32q!8H3JI62pZP$cpKHGB2SrG0*$DBF2'2IH[1rXJDN!"YG[3 -EF5H*E+qQQ`QkfCIKQqE[L`ILp2&!J@p+(k'25b9b&6kfd32&p!#Vra%LqpYj5Qa -Z16hJS`IfL)@4&X%Li)9AX,ad8k#E'Z@K$a9RSa(h6G&)LQl1dJhJrQLBa&SUQ*E -'pJ8l'CXT)))q'!K5bNiXX[P0c`!BLYA-"U0ipKRaiRcE15C!"S$cf)'f#lLaRfV -B[edK4M+bcl!c('[B35EHcc"4H[r(&m!@Ii[%Zjb2`jmf((Q0(3d4,Uc&iKjDl)E -T,m1&Yq2#cX*mY*h""3D1!!lBH4+9RT3!*J63J)I,+4QdKiiZ1p9`Z*6"A[6L,P) -Ga9ae0*l`XY+k2F[`,iU-(CIf'DiX1`I9C#dJa0IJJ,6$(9G8T+Kk+cHU-ZcS0#[ -J"2&q8mH4*JiJP)SGGHQ508-Z28#'Jc5pCq@9b&@0&aLQY)"b544DBU&`JGjFK-A -01IQpJGJb1Z#h2Jdh+P)1!"PLbcbpbUBQ5#(B!H+X10,%5FMBDLGA+IlM*UT8r%U -NT2j`2EE+$mCj%YZ$4qU84kV%4iKE6%a&0CLiP&bhAe`F8eidiKp&edSK16$+AH[ -TY528YC5ZRS*3&lKl2Repj!&ZEJpfpDH[d+GCdG'I[JRfmPQK0TjqEH3"%e485[@ -%LCcq9Qe@@"@UR,r**mMX6P*S59*%-&GX2m4++-dj+bZDeic[ELBhIb5k*SU-CHf -c`d`b'lYmSk2ajlSDfUHM0pS,J5hh1Cb#!SL$Q!@Hlq3JllXS#0RTq%##('MAdKS -cQ)UEp!3h@10N!eLR#VI4B*QGbma[lbib9Z$BepZCf&-3NC'Gl,6ZXiTQCm3NXFX -+8Y6Nk'%4$G(#D3f16+1)NVr1pKrFS`f%del5"U#+8hrr*DNpmSBaAf3diT*rr`B -1#3qQ0kh@c+#$5*`53"22D%KF+Ha$E*JCGM5XBp8ekcrT'dDhUk+%bq-JAbBl-[h -d$$p8N!#q`XcmMp!B38E`!f!-2qYN819dSmCGA(+U-eQ3!2jfRh9brYK,9A0LG)* -*S09kM)0!Z'+-NrbFCRAf)Z&N,rMGVBrBcL!je'rK"2eSF1pI8F%pKH+Z"32D@3M -X[Xp!4$EHH(V"cNR,aY26+AUS&JmpTFiL"!`HrK)9[YPiqRDTXI&`24FjhbkB4N! -j@MjhDqpIJ4312TlK`fEC$DP'@8+ITLI!20j#8iFD@U,aC5#dTh`bGJQ6@XqX%GL -Y#jA"ZVUSK9YrHC*4"A"@lfC$R#6h"RDR0@"jhH,XK8YR(CN%6+jJ-NQ1YY0LN`2 -iU)82S+BepVF!5IkZ2&C&a9@(#UGLAcHi)BK)jeHP-@i%iqIBN4pX(X6[4&&RLJ$ -RC'"X-SZ1-bCcP%k[B4FICJYC@#!!PA!iDhC($ZA[rQ3J-0iprK-81C0ldi%NMA$ -G)RHb5VeC%%'!V@#6*rlM-U$dfS,SYXQ#RJ3q3CIm'KXAXfLLBBI-kHcDUBEGebP -Y,RdU-lPJ[RZ-HHlBAV2a(*b&Q2bdJZ`!NZkr`"8pFT+f$fJEA6kR'SDpep,BXF! -%+YIE)R-)fQYl6kUk-eA5m3D$(!MC9r*@I!A96"aT2Yr*abSA6JeHH,DF'$EG@@! -2QqXB#K-&QEZ-JX5$'8-8*UIQEk%Spp"RTm%165K1DR$-l(*iU85c-jQ&bQpQPCr -Z'J43dUXA,c8(+,0+"Vkh+-Pf00kja`iJ0bj3)bf#qQ"Nf$JRe!Vjl,b!B1(X&', -&0BS'm6iR16(C55#l%,,XZKK9P'NKTiZP)8l03%afRc[U@&3K8iK6pECa-f'P%F8 -H0#GPjALIhA"10@cCUC!!pFHj`abjJ)*!)L'69je82'CEGq1Yfd+0rd)GjimrE&+ -ea4rqTKZEV&)+[C8+c8`)2*836M[%MCH1*[&)BiY-6F[U(8-#P$T&M44QlLdb-cb -DECm*BM*QYRm2B6*3aV#H4Q!(,Sm$P@hQK!J$C-2#F6E5eXj"Uq`Tj%f'm+0`I"1 -TeGmKL9rPadH2q2!S2T6JS5!%9CHGT`YDp"3)1C@@NXS`f9R,hdi0e1&NaZj9&Cr -kQKI4c&jkMI[qAXmP4A#2U`jf"MZ(VSVL6Tf4T9*e1FrhRPrjU4R(CIjGQ!-E`bH -hf!3f@(b&a@lPS$ZHR$M)Nc*(CB3UEP'Y-i"PeEL5!,S2)d%$EVJIe[YlI38BS8P -XKpdGAE633G5!6(4Da8dP1X3jU9iaIQl)Q)%bb9k@C&SVb1"c"UN2N!$p9T!!r9D -$Qjr"PElB22)A-2Tk)`q'Ni'Y6@U5!XKkr0QNZ!eCS8!DXI8H928pE+f((!JdGaC -E82(a(e%Sfe$il+VQa-([X`+MlU8djbI&e5-8&aKA(mM2M'k`bX!$jH5d-"EEK$r -eHY)Il-FrSJP,)iH%k(VfUkEL#$ZDJmX%3)ZDf(X!,lI$4A92V"`1ZVYLCHbQ'b[ -"bjGM0@#(NJSM*L09KYeKDE`e1i$MAmDIrILcLiFmq#@A,KPbk8@q0#UiR8M,bmh -S6YDaf(XE00q%2`Jc1V!"Rc&C2A2(VhQX'c52I6MJZ#1D,S!pAIEGCA"@NM#P'Xm -`rc4LZ5F$J$X5Uf%h+U!6Ed&"m'4X'jB+*eTD#YJ6S&[ChR&ZE+Xb8e[H#p!cDal -m3EL)Pm'BYY2&[-V&A[CB$lDK'3'F,Z03KCZ1mL8J[P`KVMG"Ll1!&`F$ppMlNmY -*#C86%`bJm[GRpG""-RYG"c@cA#JTGB$-cd6$KM,4)"-U`TP31#UreLm%CYJFV0U -Fl6HLL9qCEcmfe!SeC#8bBb48N!!"&@3)&45V!N(K-+S5cAYU(#F,pJfhTZ@k$iF -SS[@k5jAaK'c0X2-+KcRVL95[SHkbU8KdPhC5MZh$l`UR3Ma3,aJP&02laT65A9B -FT$XXSqiJJpq!8XNUAD*4PF%2UG&0bf9*,0"U"YlC[%ccLV4+a@8%3BQZpP#-p8, -Pa9B8mR'S0b8"fL-DXK*m8b"SET4!Z9I82MVk%`KdYATh*JM9qJRqV&EpZTS-RP* -8IKHk!NMCG+RZQK,FGX`V0[(9iN!eS9D$c2*riU%ZiHL#D&Tqc`ECmTGRBbh#lC! -!#dT4[6r"`k["HVA1(!F4Dp'*'%*J-&")A&`hi-!1TMH2elp3QJ2XJq1FqBJ0k9X -0$4EfE4KBD)9$8+KaB0Sq#YJ'M34U$lA%eR0LS-%bf&JrGXJ[ICUrhrFcX-P`beR -*a49Tb(Y#lQK$h[FD*hPJI%&+64fJMf#YBJHHjm6Y!CK"LVI#D5[aq8J,J3+fV%P -U'bR%-p'X)$T,-2%frc83'bRhRG'BlH*Nmj8J8XeKE[c168he)jd-UHiM"dY85EK -BEV%mDQ1S&daI(SY#rc%5Dr1&AfQ&@iC0C6Ce'C`!IS*+lH3'Kh$A+eHh1DGkTeD -f%URjH4UT%8N2*MEK9`*d`$D&R*c)-%6I"MA3"RIp8R89E6q!lFGjFfJqe()QLNl -2-)60IpaAi+B#(MXqEH*2Ck,%a2ifYNC0dI3K6'8NTDL&M3QP-+1$hP!$M9#F@9) -,0P),YP-0[qY6h&RA`,%G#T*!l3ZLBh!k8@E9diTkf*LQ(-4&Im%APDq6JYJSe!- -,"FV"aL'rc)+*c'BY[cQ1#Za5&)5KQh'rjB88KFcmMJmUJEVi3"fPT)ASeRZS-`p -Pr-S`,)G9"fMiD1SFXT*6SQZ'0Tfh@NPeQ+3k8JVBpeQ!I6i#qciR3ZHIZKR#"$P -Ui(5QCi$#i`'#qel*"&9R392J2Yk`$[Jj&DE5#[D[hG("i"j#ead("rFL2RD5,BV -BfMhK*)(8dMi)c[&3-Eb4Mc%!%!0r5'ip!AECC3Kh4bZT&6r"qaG&FPpZBP9ep9h -jUH+5Pe)!EcX65Jabi54)#+`q'm!NNTcIc$#Kc("6J*Brbm+k[,+`k%qqM"RFIp1 -`F!`,ArQc,Ia+VE*3F6FP'$S0`-JF(-$3")"KYDB$')$#P+CH02M)++Q60Lj##0[ -1$TVM,mP`E!m)`q@-R`I@Z#`jC-i%qc[8-35mafp2C!,p(D2DFef1EJ5[28L'hPF -5Sp('il20ZB#MLer[r5[peE+1k8q-`1&1GYI1cMFHAj!!`H[Fd4Z26mZJTF!+%iN -!0*!!Q'#DKJcGCRG,J5kHJi-X94B@KBY3i+IYbGFcr")B4bl!DTN0VP50,P!2 -VP!2VF1!1p4!89MNU&GH2B[D),N+U-[Ukk,UkHrPZ#e6VGV#!&NUID&"pB"MQq+( -J(XY+'Ef$0V["k!"DM`@8*N-i9!3pbND6rRk2M+lP$@*,e+"-f9)9YV5Ah8FE"aD -H`b3*XV(cQ)dT+MbU%&bSjI$3V89fdGD#Y$8E05B#!dc#U`4TX8'dCY[e3[kLc!A -h[M0%I+(qMTa@hZhSf[X1a"FkI$m"98"mR&,Reh[Id9me3(b&d"@0)3d#55$!b#' -#55$!L+h2Em4[KX%qlm#fA)12-LbQ9'Q(8Vaa8BQT#[)B6+%U[+L9UK+PUU`H@XJ -9`HKT'I2ImE&K*p%(l1SB9hB1eGY`"aZC`8ELMAH`N88K#N%qaD!Q@'$ehf+h(el -dk2qq+$2q[LR9QQD-TaI#C$LRCm11EL2Hf,f`PhrJ'&$#30c0*+GI'#jA,r'(4)9 -#kHBbT%,#X6##kUa-E28i0pQPVD,)j$ZL1-4@pF@mBEGG321+5pfMkZ0`NQKc"cC -B`#"S-"YZ`,XGkE8iTmV8#KiJ,"YR-'l1JV!RqL-iP'%5a#5)53!6$C-`*J&-2[i -4Zj!!S5%&*KXC+-43,H*5j80$0(*BYbSTUK5D#fKJDV5FI@aqf5h2"&3ch,#-94M -kkCE2ZD+E2J(D-cEaB&#qH)%"2aJXYTedacCB"SGZXUE"5@Jmd$$4`)#4NFqih1E -hE9IJ'Q!bf&8&jV&Jj0GrKjPPT`X*DRqX8SFri&jh@53C#RjeN4e&j3k#)KQ!21h -LBEeDPD3aZ3HrfXQ$E,Mh(,%CB6aFldipBJ0T![RDbSrFi`(k8Kd33@"k"4a"Qr@ -%BI9Q2XaRCa8)dd!)Ka3e!&B-Ge@HIMXp$M&8&4c(Aj8A`0LpiSl--9KIkad[5[h -m)hF@!r)K(2'1pb%KbMG`&X4V)bKH'0dcHF1"C1d&ESL")Ep`f2T4)jA@Z++1#fZ -PD)JeF88D+5j3$2Ph"`eVeTjUq+0G$0l0"AKBU-2R8'8AX`Nl1`Y,B1q6[XHK*T1 -qVj(5V()q!B)2+0f)$eKqE(&B`+C9Q3cY-#K6q3bR'b(SbAN-3[HHF2r*"XCYKbf -d94H(i'fGKIbcH&LQ%2lKZ29qKKNmiZBl5(K11(""Jcp"S5&YS3e@463&B+I-*eC -Lif212!r"KH-GqY'm@Br@MarDYTfU-!(@*L9Jhq6Q[JGT64BVGHJDA6J1KSJCE(B -c3DS!JE"%K3!N9km53,+[K`NY[4UMbMEMj9VaNU'jF&T$b-&"VKK85MmH0pDEF93 -`!rH85LjZ`maBe*j*[QLVFM55aGAMbQ8[+TI9Ab+a8Ce6AVif5GY*[%4$K'T6H6Q -$6J9"I+m[Fc8"G&CFFKHlZDYYC2F[%iqe8YSja!*#Gi&S-6KJRG4q`%RT-!'1#9G -9N5"1VdbLL(ap$p)+TDr[35*&I0!LTS9FbE(%3Uk@NEMPLX4jqkdh#PH9E@-BYBf -(A!m'#aTT+3D0`fJ5bJaK5QdQf-FeNhmk,kdc!(%if)8)2X2X5pm$[A'%Z@J)Nq2 -&JTNd`8cf`M`HChALCcA*5Qf9mQUPfrPhhX+iXGbAqXf$9eC%MEQViamKJFkT"5Q -I02U0CFcf)U%,9U[R58ScKihlQAj12I-J3Md[8Z+i8L6Tf4AQdc8Bd"%-U'm'J8L -Ym4crrf9f$IRdMj8K(cre'eFRT6i!j+GhqAEQE4a@*3Bpj)9[MD2DfNb1@%'`PCY -,qM"%SC(d#D$j4EAA5!T9`afNUA2U-LIcT2%GGXh`HkIJBT'#'J%,KdpS8L-D%%f -LFBZlP5HF,#2h5k4Ef+%"BVRHakNaVZKT*-E!H#14VaRRehqH4DG80iHd@j!!#dq -i&aLIF6h3%er#')VNXrFL(q,2$EGm0KrjmjPh)fYrL@#h#F&5bVZ8a!Y("0`8dH" -0p@$[r8K22m3GI-[G[JF(%AXCLje*%EClV1$hR'S)Aq*'h8F*rK0Uf2l*hhNcidE -UB-+2G"Lp*2be*2)6*(!-`'PpL34H*EVJPeFS`TiecZY$0AUh'lhr")&(eT!!`&& -XArjD3Z"mkp-&rZ8`#E`'S(Q01rphAQr[jmIK+"!qHN0`%@Gcl*f"H`'!d&ii%I5 -`U+TfdZ#LCGcJ@M%-+3pa'1c-Se0Gd98qQUSN6)5A4lk"#X'XV!Bj+*4jHqmGMVa -(*S0E%+m80T12V$*-RXK$F,@Q&"*prQ$Q@@F[Nefi4+bD6)*N9@*jbq6(iXCGr(- -EEL#bc@fF5#j)Q"8ZpU0D0L[I+"*[0b-Yk&TJf0)$eIm$Tk4[2a$0#J&6lZJ64JL -5CNb4%9B*%IbSrZ"'5!T*`',,2A&R2a%cKf&b-j!!MCrcD%82UGP6$D&C%0)8f!! -(*mpHl64k"B(KKN3mq1IQ*f&drHXrciNUEJ62"UGIU#rY3X`!iD"iSCHGj&%GFD' -eG+&A-*KX*AGAA!J9MA`$&h)FFb%E1R3r*E9$aNhCJk'%HrQbQ4Hi,)1TNJCT)AF -i5P#!f$qN3Z8%QQ!!JPPEaFcDi!#MVBNKYTL"#Ud@3pRk3X3Dl4*$d[)2ZU!9)Ud -M4SVKacTh6MKaC2VGelj[8iF(3hSmF!mEk-B!!a63-j0QQ)F&+e@VX&,A%fa8c9! -fkNT%6@&SiQk2b@bGSi--3@hXQ0f[6kIc2+JV-8e0B*VQ&+DTC*!!68*('l`T-33 -$eU%`5dd*CURfB-`5&dB4#N2,-'Z%EX$$h2B)*Bl2'jM&9$jVp(QG#-9MG9#4Q`" -l`(c51Y[192HPXprk&`$dh8c+2'%eKHDA+IUC8%0&R2aU`6!%mUB9!M3"VJPia8* -(2),A69P0BD1U"YNS02j-dU!+8m6XR#B@VISJ,&Uemcbl%)*4UrBd8i2&-0a[SCS -L%d+jkk`BZTk6f#rH4T)C-,%4JiCD0R,#B3e$CVGlV+PfC)%I3NSij8RK11%L0qT -kS"!#&)AG58i9+*aB&@kEZ8ZQ&68$5@$KSkYC$38AD$$ET+HBLK++IGfX+%L2bZ3 -kC9'+d+)8SCq+81-Lp!mm86'R+D`JP%YE8b(23I-ac+!e8@"T$+(Fc`aKkj!!)3X -i(1+ZM3&T6eCFa4EI36I&YT4!kh6EK8cH0BA"K&2XM1cqS`mF+kqkB`"DSC,Ir-A -LeA%'[$ZI#EcjZ[l"0d*J&!qeB[*Jd38,GmD-%'mqmGJFP)TrF[l0#r`*3iP(hic -Kd`m+8UKkHLL1*JX3h8qV'&b$fQ-e&&Z@pfM2K0jm[H%d*S%hEk3GS!fQM(8A2rm -E''3hM+@Mq21R#9E0j)%Hq)&[BcMAf$TFj-A#94!jGZGC"dDRqMFBTYBL*bZQVe` -k1r-X(VU)2jIGX[lc'0b@h%JSZA!#DDQ,X3m"ZYbBi3%E2`YRqC93'4H3!,UkM!6 -AFXqFG4i$YTchqJ'&Sd(#qM&q$!b0C@d+L4`dL2[9YFFABZ[Ka0SbIICf8@b0Mb& -k'KVCJkl1JeQTcX4MCZ+a%$m'T`5k%)BB5KcUf8Q,3@$-#qj("90"fpa'$mqabff -X&Bp[JcSc8#d3P`K-Bdk1Iq3"Zfb1k1T@$*1VUeZmQK&$#@2"#9,Q)5BRV'!63`A -c5hIL*4,EcXmN&[A4Ll!J0%FY@kQrrM8lpfPT#ifdKH'M&ND(,%blS#a*@jJkGU% -m0'4KbTPS%NH[0`ejEDBGHb(Y@2Y4aeiDXY!qH#`2hEjm[I%CIK'P,UKr-M,iN!! -BI)6*@3%TD2KmcKGK80aX2*@2`-R"jAHdEqLBVYh3-DXCbI6"4hKJD,#'la%cc1" -"-l'+M3K-mX3#[LZ+QiD#9Z#%m1+9Q$*XX4JqPD$jf'-mJ'aNkfm%d`%@ae3krH, -9Cc64aAP!F5B8!"e#9f*i["jNS)5'$m&3m-2,)PP",#Df#a*#!r(HP1B)'Mq#'DV -brR(IR`Sh&Zi-LJ+&bT`SJmU%dJPHHhX)#mSAj1f,Lk+,,M,VY1iNA%iaLC36ZbG -H0EZca!M1mN&*mff['-EYKBk5Z`6lZHj-Rm+)"Um0(LGAZ9e%@&eJpe,%("Y[$`Q --MMV`K"K!&1`5+ZcY4m"aHZdBKTA[4e01+#pfKZ@$0,'efKIFfT`)JpB4HdrJL-Y -VFHGT+aS#PHAN`S2U4fXiX)9SEXcNe4`(*Xa%9ql5+b3[L'+5Vq'Sf!T@R(LBKbH -'SM66JeCKGQi66@%Ub3@fXQ#U2848dJM)jJrk([5h%lPTpqe0$f,B#)R4l(GLN!" -iU'Sr$`-[0[69%S)Kj#pjq21*Kjp-IjJCP0*&FQR'j90G)YJXZ(MSprqFrYAX-aA -5S[ac"!$""%PDHC9GTL*R"IY!JhKc+M8j+L"#r1-'&(C8RIVLNmYb9ih3fk@CF5% -'AZV4"e`DSr!'KTNbK5(cJ9k6"pR!F"Y64LMGH&1CN3H&%dA1lhpNT1jDVP6D1M* -jZ)jVlMiH9[ZZaGEKc'F!qlDGH$B[QLM4P2jT%*UD(*E5e%j!0%qYQ0TTfSUTPDB -'TUddG@*Ud$5$UC1Q18`c0-eLQU2T0Nbc0&h%G"Y0+c"GT'NHd`UD$Q#DTqNiTJ- -dRF*dR+BZ6+GSfSZTLkCpQ2E5G!61Cpj-J*S,bAr9-S'"MQF(T)NrG[baiNmVrKK -'B!Kj6T)BIF@r%Q*dINCKj+qc8H!I+lLJUaYGL9CI5JaTa-e%Z,XFQ&bZQdH3!*0 --U3,B"$$PqJXB[eDErN)RkkX[69mKXVi@IpB`@HI3dP1-fcEHN!!lJZ(K[[M0CYi -%[d,hlY)ArmZhE[rUk-@q@Gj506IiDd2hMS,NVSf&b$8J432L'QMU8H[qH+h+K0B -hKim'%U(E$VE-(6[i-LMc)%,e$U5iLTajiFVrXCX-P#'50UqMf2Rc[iJc#$kSB'[ -TXDi4JJUU,Ab*kZYS%[F1-aI968Xd$'Ce&eqZQT2"cIpaY[TkE)3ZraUr4KLrJ%2 -VaD&Va`5Vb-2J`fNp35")`5"TVK-+TGKZR*(1AU8"GGeS(!-D,IDamfHPcQ#k,%3 -mTYBl"d0mN!!M#)Z9&CM,#e$U$+&Uf-a))6"9NHA468j[2HQp*e3X&+,#NNFUa(! -r[UMMP[+CeH4,Jjq4hNJD[3k%4(b*3@Cba@P2R#kB5L0b"d5K1-jb-99I)ZC+9Zp -P9i+K+H+VeM%aC(0F$"Z#4'lciIXCqpD1`Me@PmC!MSF$DdBUKCf9-830TE21FZ$ -Kk1C('VUQbaUkCYNGZFIS9Re',`r`Xkc$YcLUZBhR,*`DG*XBXQl+#1T&T@bcNNN -'#ZQ1e#J&G9*FY!$QkpRM8[X#,S1'V0bJ*FN!&)8j28BA&i0"EXrTDBDVj,6+AI2 -5YGRL0!A,3#%FD'%J(c*CA1mA8&X"$!4F*$UQY3dGYm8$ERTJ+#12I`CN8KPLA-X -TLI,aa"%Q-3Q1V9r#b%([bYR'GMJ!qihJiFlLDfhRp1SU"mA"@Yf6XcVB'#SQmkr -6e8"SJ6lm1am1JQEA#4T$DM"$&8(jp8bH!hJ+pPbMl*C8LF5AbB'R-3m)(L*Lb($ -QhQ2hC"KrN!#8H3c&"QH3!,!R3fj5E&JQ"RHUi$#0Nc[V0M1XNj'2BH"qQ&U(la3 -YQX#Lj&','0lP4CqN,CV!STiLmj'23%*)$6VU84JEqfmaBa'lH98-')N+"eC4Q2R -[SVU"aK%Lp@pq,Rhi*$%iU5l)ra`Ub"*GN!$4'``9N!!J5a4"KY)&'Ee%$a`Mb1K -V*%L!6Y&C)FMS91))Hd+3!*c35ZQ#I,@cf$a@N!$4CK*N5JF4Y3q'#P+lN4"NL3, -&L*4@68+Bi9H&--fMK'Q('6Bjf35Q#Xrarf4U'3*q8dMFpN!ijN`H2h%5P(d1"Z! -C(5USrlcdVlpL39@@TJR+$N(K(qULCFem,*E'$l+8c1+VC@P,QfQT4NZYbP,l88Y -"$QRT"fP,VEa8(U+P2FV5jS-X[8e,h@P,HfKT%beY9CCDMc9),"AER8YEfSUPGfP -Kk3X[r*pdbFh9D3Y,XE!8F(U,q#G'%XBFeSfj@MGQ0U%Rdidj@NE'A$,8Q-8!*3@ -#kiaJBTK(!HeY93eK$S"dHVCE[Yd1Y[6Vf!)(35(ab0$"4kiZ-ZMhC#G",D2-'Mp -jA3Q6@X(X4Mh0!)4i!+U`Z3bDM+"e%0`mIjT"Q2cN+3+l@Yf'#&)m,*JJ"4dD(@I -YSb"'RL3@[j,r-5eC$hMAlcSr&Vr-iGbm%XkG4c2f@p1ebfljAS-MJVEKPXme'Zc -YKS)2&!9helXX3cT-NE2h"e$`2'3L1bQicZFfU['CHh2YAlM(lS2-E0+4hG2lm9# -RH'J1`CMM!U8I06&i#QeZ$F+BX-IN&006F33'!ra"$d8)d!R65k5V-*aF"4-*cbK -h,F-&*f0lJQAA2jRTRr!c*9MjTe)S$%f"EDYd))%('F2,%)A*!!+C1ANUT!K"bMm -R-8Mj)B!XFXb$!9r2`('&#YYbUU%f3d[Y[2#E!j`-%CHV(FAa$IqmNekRp-rrA%k -I1d436SXXp1Q9Y%mc1+Ch509kKe4VLN&S,Q)DlN`N"j2L(f)#9#2KE1pIrpmi4+$ -K8hR4GbMP&MELBLJcKQ25i)8J`GE@CMc%Jld##"l$[bV"+6SFZRjdF%!fIV$iTlC -ca6h2er1!1G&cl,pbbGcbTJA$)NZ62k"j-9`INCB8,NZT3@#Frr%MEVL#MmG!jP& -,-#CPXFRrh-R"AV19&2FFr4TG8I)rKmI0rQ)a0T+A[mkK2J1K'@8aQLC*VjDf0BK -I@SmjKSG*6BQZ#fJ!#6*b-c(45!30J!QZQ)!jYb2Ga)dI5`BE!kF2``8!!#-E384 -$8J-!9q)293eQ4!)3)H,Z91r"58kmfLZjQ#[$k#Fj,aH#(%fYie+UJ-DF*cfZB#R -MZ[%8lNk-r2i@N!"5amfF!5eMhDiD0q0f-PNhQdN6'`aLaY"EkeVMC"a$l@QXieL -EB4cUd&3003FPS[$hrhl[ppeh`1'Cp0PRRhPq!"eQ2L34%#m3!"!3!""4,j@*[fK -U`KraSeFSN!$5B481A*FXl*'maYH8V$&P0li@53akdN3GL+E--E2PNq8[P9Pl!Cb -c)d@IcCmB%HfQ69D%%KXA4a*(HX!#39VJCaFkE"jBfEKVS%`%Tq`3CDrTE`C@0Lf -QJGZQaXh)P-kiD1Zq2BBLBUrZ*)9pq,3#dkC$#)GD4FIA)a3XkM6PI[BDN!!*)0m -!`QikdABZ8[6&*"jS[eejIY+Pkm+2-@i+&Ef6CMDEkX4jG(!C6CSpF`b"@a3l3Xp -QMMehpCddeUP$kD4A1RNLL8JT1[@JNf&JAP[3j2j'%hYkSqcTG[ATh(I51Pi4RD3 --kqehdL+*I@pc%HM#d(ZB-S-VkMhm6-HbaGS2a``&ADIMjd3Nm@#Hp8emBZ+I"HN -$2e$LSRCF!U+dF6-'pQ$L88aXia2hi'Gh*0'qJclS%RT@qe%h3X(G1F)6@5Tek&c -*TbDQ9V-VNqTmqrZEQKJka"CdH4TES*Y@aKBid-PTE)&MHJqb"@hL9EDJl9%4p)( -iCE"iV,(JC,p`a50mXB38V*Y`UU9MqLJqD0JpTJ[ZKaUX0p4Mfb0,6iee!$PH9(N -qDDJBImaGD62LE@Qdh6)SZbkdcc`ce)`#MB3@F`,mLCQb*bEFBp,41!2PX`@fpIY -9l-M%VMpJ#,$dYbrXhqGEJLeiQ4K"NKHP*'Idp8AVdU0*bDL,&Lhk9NSdp42R@SM -15pPTC`rQC'JCmNT,5dNqQaaG*2Cq!3reAV(f5N&Qh8RV-)keap"L(0HZJ!QpK-4 -3!-cTX`lcaABF-KK#&CKPTi%[YQ51D5($'H-CCbM1-D'%iSMpX0NYNB6Bj!DldT5 -B"qaI&1Xb#RlK[)dZA1P)l`CVVi36jCM*6B&fS'*ZcZ!LSM!i!XB9r-U8)rcBF%4 -dDb'JKK&LXY-"8T*6Fl*e@RT@0Mi2T#GRTICTfGSa,IGXhCQ8R"0489-TI1"JPLi -Rr8`d068V94Q+CZZ5,bTMNUSSk+Z%H@9U'cA#qD"Gd38RRcFl5)@aB5YFYD3FpeJ -9UQT9,M%X3@@`@&J)m-#0dj&%3EC@+0h#(APer$)#3(Cma)fQZ9H&K435pdV2GAb -GrLFe+5aUma!)&`F(RN5iI(HPF)"-RJjh"Q8UC8LrS39EFbbY0&)Sb%2(X!i$l3$ -b*%$@&BL*`cT%S*4Rh34e`i#(2cmU(5aQd-De@P2Z,aBU`kDN)`+I@iPKiL0b&UT -ji2K-J+EFGcl&"+m"DS-3U+S'iU)TGdiT2Jj%LZDXCBSS$YeqKeHMCV$11bG-Z6% -62QlLLSM5jBrJF*)kSI-Xh[%"X0N'pP5(6FGCe"'2[Y680-p0$j1VH'"jB(&hbiY -3R,$JM`-CINPP!B8"JY60d&)cUjdLi9@$dhS#b+6'@rR)8Q,lf0YJqd,1pK9!0%Y -XlqY9f&lUIUfC!T@A9T)l&-k))*Kre-LZNN6)I)S*K6dNN!"P%HY68(CC5%#3!$[ -dippp`GbPKH*#0+0Li8+Z(pFmA-Jpp3ZjYCHZN!!b*"lkKiI0R9C,apFjbp3Y)+! -j4-q*fHLm1MlDm6iE@)m21YC"BJ%6&r*BUX)Ne&N,+5k,bfG6)(D5d2EeR8e+LQC -RD%PC+9V@J@3YbkbPRXh@4Id@@F`kNf8q`fFT)T[N8l+,K,HEA$*I+lk@dB@P"kB -,UN!h08VC598G-U)4!9#($'$*Q*-$()HDZ6&N,JpSNm'!"0#8M1AJl&S0F&DJCL` -*bUH83HEJ!Q+,AVLjDI"$3`X2qG$L!AlG9QPK&"ZE-mFbZME8EQb1cS1LD4J&890 -Zi,Y1X60aXB-i0R0`ITmH3cLl(T9,3%lM@Kc4Y2%SB#6"6a[p2`'3!!QL3((,M($ -@$h+&JQ'GV0pfKkYSRC2efd+ULRMhDl8%$N'SYBlBL8!"B%SdMS`k&(96KPcZP*C -F6(DcLIG310rY9M1MEC3rYF1C'@hpeCkk&fLH%NV'3)KQFX6,fqM!`KH8!dfM53@ -@9a4J#G,0JfQVV9hm%N&X6q+QJN`9B()488&RU*Nkk0V""Pi``48E!%T%3Dpd`1k -K&IHZh59#9,TUf8I8,90)8k3Pchi$@1*ejd8A18XBEbV9qqhaTP)L0A6Yh+5LA[% -hr"6!iSGmq%TBX(e`,`FEVRD`9kTYGEMQ9R(dI#ILSX,-0a&Z#5N&$&Xf6SdQ(6b -E(Ud*1Cidk+Mr!EQi2$&#!Z$NC9DPr5CXPEE,cbTYP9p9QJ[LZ!EJ$3Bq*lF-,&q -fQUUh&dh#5d"`%F,f$T5iC)X,bQ*3L"!Y8,$3f%FRqiL`Mh(fB@!IHTMkM$@9Q1S -Xb,i[AQ02698EQ+"U"Dbd"XbeQ`i1F(Q)LbL-!XVcXIecY*!!#JDam`amRL)'C#3 -dG4`N%SQ62!bB-aE)MHCQTIj%bmR@"P*6SYNjkFkS$SM#[RT'DfCT69*CUI)l5)8 -`221#d$2Jq@Rid,12+IBa34mG1US8Ijp2a!&9I[85#*YKG+C@)LG%d[&m9fjANMI -IPA8"fp[P9*!!ckJS+$C0TU"e6JAj1Qd9&02`l&BB%'UkmD6MfrM&fk5,0mNZY[# -,5c"KN!"GA)+I5TRL'f8ASq0R1qMLr-9#ba,LCR8eK!$+Xl,6I&rq"KLK`MT%f3j -e'G42rHM3QRZ-!6E,''!MUbi6RbN-%11&41G"0XN13Kd(*3B"!pa!*9G(+XeKCD, -Xk)qeb`HcdMr3`T!!rMBCV%b,eZ@N*&-Y+*YEp96r@#iR1bGCl*A*'Zr,R-dHJ0q -RLI3h5#%"Mr8jFC)BD[5BH`c'FmF`F!c&arY3d+DM[ZlRK2CA5c#SiDF2"9ShLV1 -GND8M!PRF"a-UNE5rHqdhGk#3!2%0%H%NSpj8ep4%KNf01b&-([UJd-5G1kaJ5X1 -VdE@pB`Bp&NNmPjNjKSTKplBCPm&%M9YN6,5@-Um462I9f9,Q0B)j'f-bjPcMc$c -HN5U$VG,&YlGb3Y8S,DG+MF)ldL4#Y4M-di,M-l32K2jVcABa@@ZZL"pLh4*'!E* -!Y%mF%GiEDVGlGQQLia-JIrC4F(&6dq3Y6#cmbd003TSk1Kf(PKifm)G&d`3l'#N -cSEejDN`eaI+e$9PZG,eT2pjlaI1PQ9p`I'hiUH!cUardrU(pMcVrFZX#E9(hLiD -ja[Ie$idq0h9la$VaUdGqIZIh*rrXb(rUqfhrYirY(acSf(ISN`[[QLk&V[Cm*c, -QrZEij,P[jIdSmmr2rlp6rrIC-r'cPp-cSQEGaCc$(ac-cFj+qZqT+FN(dRjFpj- -6Ih(d[lhpakklVpBfhl[jrCBrZIA6krrPKrrMfY,TcmriR`rmml6rqS0rrI$[h[[ -rmrr2TrrlihpmlHZ[[,Ai'fm8,AQRH'("V*IrBH2VqGp0r)GYhp[mRcIpCYG(Zrr -qXErCmGIE(klmhDTI"*DYH'(GccEmlGTr@r2,2Epqr*p+rqAqAl9qEZHrPhhjkDq -XAllbdBU[E[NX9PliaC+AjMA-RY2B*-P"9KTUX!2C@XB"AX#f#6IXRDfGjMQM8Q$ -9%4S9Gm$30cMS5,5rl4j,%q5SpJPH$%TB%`TVNTK[5G8I&SDT'k&la,BS[UjYYp3 -*EqINc38JPaLV)p`d[KL9dDJBlcQ-Qbk%lTiD-hZid`C#-e(J(KX"8RZ6Sd1KZfE -(lAFjS)Y4Kem0ZXF3)Vf4$`220&mmHl`@aNqZA2-*dBk(Y"Z6pf"XNRFD$hDiaic -di*!!l-&pcJFR!L"Tq,AQa@NLG0-XQUDFJ1fVmpN#bKMC,C(`5TLkB6j-HiiiLbX -0J8ML$`JmVBK,iCD'9ULd$m!MU)3F1E&(4ITfkNiL2NV&0Jm##5H4"5FaR!r'AdX -,#(NlZRE+*MZ3!&9!d84$PhX-drS`d)GT,f0D*EVEDF!*FVbLjQ!l$9TX"e12"qi -DBBENX+31&0mPeijj0@9#DJSCe#BGhmJVV)fm`QVi9!CX&K1`DDL-**CINi"03b9 -qhT!!!C[&6Q$$1hSjX%%493hd15*,hehCd2VZ9bafr9984TQb`hNM5bGG2pTd5$` -c+1j`%f6Ra'"N+8*AC#SM(mB823@&,,*"E"(2'Q`[$U%`SCY"l!h%1)kh+C*iG$T -p%&Z-*0LKDIK$#J'[[NrCbLl!ie#MCUY'Sq#CAK3cmd$!L)l809p@V@lMkYS@5Db -rc05e$6mIbkV9(6*eSH0ARZEUiZc`d#Q'S-aqM#f)A9D`"GM01j-Y`)S2"LQ-$RE -P*PrC@FRD@E9+e"5`%Fe!M$)eHMChEm"MhrJq,IeL02f$P!1j@Qj15ZlCj25,[b8 -k2`R9EXECj,0D6SV'+Qmr5$J3bQXBkIh[B8R[-Mp*ljKIT2Gm!-"+kj!!NBVi2*! -!6N6iP3XJ)3Z)&1jZiD6f2Z&Jj,-p91XH-a1*YUS'DB4UmqRh6,N0,BcdJh(rPlD -b6&aR5rSpED4-"!%@NmJZ4RD$N!$JC&HPl2,G#[RhG)H-r![)''52,IRhjHf8Z%! -KZh(S)!q[Q&km#%YK$bdN)q%6dG3X,5X9T*MZE(*1@P5lI-"XMUCbUSSST3kqMQC -FbNCf6R+1N!$(EU[-d%YMmYbY3B69FhGIAcfMTd2fkbR6$#d3$-VU&SQi2riT)qj -lkb2ZZ6N`*qj486MZYk"+#'jdA4lZ2SbK`e$@d+FMF`q6f[4!8DGVc9B"P*d(ca" -'CS,Z)%&2DZ)LlY&CrRDa##T"(HFK3aJf$h1$[jZd)2GB8P-m1)N&2BF+bq0`5#E -5mL0fDLa)ikJ6XNXkC*GN)!&5-&'EBG5'VYfc8MM0`i[i0NI8L`F`KBl)3femJkP -DmGfSjG14q%a8S,hGaiIA6VV-mlS(X!A22k2lfPTkV('$CXN%d@9aQRrR&JY*9)Z -r&%j8LfIk*kV&lAk*kSlk40Aqb-$b&DBR)kSlBlDLHMbCLG-'@e(GHG4[8Ae-%G@ -Gdm+)DUQYU1l8j+)U&e&X*(MkSMV')@mpX[Vj%&Ejl8jTP3qITVLZ-&8AekjErSN -Va0("KE9CTpFXefUYa1Tf@hD(i$U3!05)Lkmmb-U2`CQRD3QT'%PR,-i+["k4YA0 -aHa9(8B38$L%5fTS()qE8mi1PDhaD$hI-H'b24N4Er!Lj+(NR"'6LSpf(HFEl)C, -bM8"iM%`-Iaj@$1ri+BD$ISPK"F5`K"*r'&RJf&KE*`aA1f#f(@V@RGFXX$!&4Be -!EdQ5$b(H%L*i)%K&X9CHQ1XPJj(l,DqliPh5*cP1Z$J8a4lRA5b[5bEJ*IGGcQ[ --#53DQbdXQEI'Qch0p%6ZG8kQJHb&fIG9FNTj[(*h`L+Sdf*4-j5l%`akLd9V+ff -"kE[RdQrdEE1DfjS*h1SRHL`,QaFGXPMd#p3T50DQCfi*FJXCTL`@E,&EkmPXFIc -KdUEZYS9hfql5G,UbHk*6c()Ca'5cqIj$(A54rSb-h4LiqN)a(F0dNBMrf0-3!8C -Nd#I-(!`-Z($4lp",iEmD$Ud,e0fJ6N,!*SJ#QeI('AAikF`a*&d+m8F53dXN`IT -#+K1XqPeJMGBK#L8M'jUNJcle)DScRe+GSB,TT33$8Y9N9&88JL$S1[((JD#k$9K -qLT[k8()N'D[f-&Epml#XHYj29MAl`kS0QUhbCpk4+EpLB2N,JiVbAaMd@rNpe0f -J6P+92j-A,"J3N@G"Ejk8"9qUU#S,K&042#084Dk@-a%&mhNBAeS8FPF&lcLm8YC -4PK($'f3CN!$+-Z#2`fD!bmm-Z1jA"Y3j9FFG%@$i&hBC@ZCbGkd@bKacEPp9m&D -TNk3d`C9fDUaqP98$hKiCm'C+U0E&84fmmf1"&GB&phiXkL3GbpjFeE%@e(ci54a -0FPZ['`c[YZD%)3I#Q1!CjF3KTNdKkEFH!BYlU)"NS4!pL&0b9HTkRfNq)XCV0pk -,PZU(0)Xck3pRN@Q-4Iia,)ZmjLH,&2M&)MYNQF%FY,(cf(J"1A,GiE+LJ'9&8Hc -FhKL%%lT,&q8)Ll#Jf'r4MZ[DaTFUB!m'+if5S2J84r0pZ(Q(*1B!1*`A+5ShmQ5 -a$H6d+QrR!4H2,LP0J#!XP!DPlC8r-Ji&QbmJ10A"hHq%$$,N6(8)C#-5@4D9Yi8 -%N6QkQ8kh(9f04qpc%kBKR8HC&*YpLKNVm30T@ZM8Q('"6$P9Q,U8(r((e%A3NDD -FM1AJM'A+I4e"KI+E4Zl!,'F',Z8R0VVFBaPHbBbJ2*N0CaZ3!"!Cj2Ba!,#CXU! -iIl$m)VVemJQAqB5%k+jj!C&&j%6df'9(19,28I,S#&'Be@K$ibkV01KQ,PaDK!` -Q-Tk!UeFMpflj)6+5`@''Z5QC)KEFN!"-!UAPa``YQEC',6!*SFTI3fEc5r,d!Q) -&phlk56+YiFr`,HXd[X8U(KNRFi$YP)9D$bS&")h@M0+5Ah0G9Lei@0Ed1*1-%ZY -,$'PN!P*qLV[RpH4SP`DkKkC6jR$(GrPlQC*C4%*Xi'6QP(05KQE6TDKm'VP`q`A -[2T-1)@FV8VkHJ4F+#F2!"1!a(Z((IQrT`jVp[UZdKIjIha*SDA8CLA4EMH0ke%H -)000c`mHV5lGARl$d$3+hFU9E19JNa`V%eV'`%X6[YFb@c$pC@'NZe#lTce3h!YB -c`)IM"3(fK#r'Ye9X&!Ni'#lh8P'i''CE'Fc!`,H(&mpDR3B'[Teb!i2baG6daiT -l5"`iZ`!+Zj`R+@aTCEfEe4!1X(bZKB)"bcETlGSK8p)TN!#C&"6d28DAFM$FUhp -q[$Ec1J"Zi5paQ,M`4@jM5P--`@ilQ3E$f9ma0Dce))P$6'qrheakRIjIIheY5fY -c#+E"jVDM[QdJL$1kpYcFH22b2*MiG2'$I8`0Dc#(IC!!LMrDZkDN(Q&p%mAe![8 -!5'DKhILQ5cqBC%qiX,bT@3+eG1K&chX%#9#JfENmCl2-XePQfLc2fba2f5bIP5h -GY4Z[4kr(CmUIjGA25K6I,2Qe'3B05L3bAe)N+C%fdLp-5ABBJmmTipA+pd&J$9[ -Ij"ZIcN2M[$"JZ+Q%hG1Lh*J3EMbB8#EEfJ)m%9-!UiH$!5G6GVfSJ5(R14Q59jb -E@FAjF0L+Xp,2LR1YAa9R@A95i@Ip9C-+AT98S+)-*R@M+,193&UkGm%MC+iTFjX -!B*dDLjE*#e5bcEDbcAiel'Dhq,RC4Vmf@k)Bqb'CVLF9lSM3UqRYf2+j3('R''G -&X0jI#CpG&,mDh9Q0a*2!CU)mE@$jQJ3)KmAFP01"(hYi%S0hjF4HH8C9*)BTGf' -[T)k&$iC6ad+[IqTBD2"((E1p-M)5&@P&XN*1QLjD-&"Z'&Mq5lG8P,%iD1&ZB8Y -l[3@D)p4TVYSCRhDTm%,Aa@C,K&EjaUS,,dkLeq*a-Y)#Y4K5i9)IPX*h3lE(MZd --eA*!0Xc#*G+dSe+P*&2h"&2hYm1UqjLIkJljTHj-HKLUZH8--+)+"d%9LcZh3!' -XmQh5SF@jHY9mKbiaY(!L)-5R*0idUdXNM9RKV9V&dP9)m(#B6hilFfbr`!+9lCD -5L38U`X`3-(IEdMLK9ZH0+a8b!NJkrLdNX49XJ@)NM!r3#!D+q1,6%954D2S%VRB -3Qe[@R9a`ENb(-'IM5PQBmlaL5V!-C2kFDIZ(Q$%"R+%[HVNj()8kcpQD%bbMC$e -EpimdcT-1fl@G"lr)j,4A)6c5cfD64bS,KUDD1HFJ$feH`!G-`$"f'N(-lja0Y`e -U3JQ2Rki5S)!YD+U(,kcpqr'Ip!H)p5FAF,@8bY55VkJPm+'0@T!!K,ql69A,4PZ -e",J"%#9NB@S[P061Vhqma[8)'3H1UGHAF)1)a++2eHYIPPf2cVrBaC4H+#Rp"T% -dL6R&p5Jp(I(Ej'JeY8ZM6d6aiE2dL9p1KJZb6-8',5Gj!$&C%3K,(JN%9,VQj!) -fT!rYbq3X6FEFURTl&+I!UP*&[6`SLB34fJ99[4&Eam#U$&)[Udime49k-#Z&YNY -qd'Sl*p36h2KkCH0)aZP!X(48H+lK)%C"cAXFj-Pa36c1cNT69$(8`d%$ZFTjN@G -,+CM-lGRAp'pF'HYPbR!V6ScIV9193@k-PC(%JMj9'BGX(4Qrbb4P8%"h'3j#(iT -#N!$2'4)PjY3"$Akq9-#$N!!`QqGKb+153T4YYq99frC15E4X0MbZE,LbYIU'YiE -#EEMbSRc$h0@JXX#28h-J5Y+HT3hcS5Hfi5eUCC2`ZEP4qJA1S28BCeCfbKaE-&C -Cq5&c2KfcCH#(2qDEN!!D5[,)6I0X1AE[jRR9MmXVkca@@DH(VD`cr+bXNrbUV1Z -8S)qf4+UDDe6$-m16b"T[2UVi@Kk-5Q3%4`ZUp'&L)PDpVjC23,0HEFV!"*RkE1, -2Zf3A($APcSk6Qd+kV1PC0cXq"Ui6%LC8Z3[4G&h6)4RU3fND!X'j#emK"j%-q3C -$YQ'"aLHD2!S5UTKJUQKaETYI8qHMX(+E3Jb,632,pdbaT","qNPJkX##X)rYK36 -HaM,kVm0Qp(Br-hU$AaNpcBDmpr*N6caj"SL+!)iqR39c[EC*3DTYF,Ub`6HEpl, -"qfb$MiEGB)@I'jcYe`CI83p,"UCf-X['"i*mc'RC*KYZJpY"!JbG+2DAm54T%XU -LSSi!Y8U'XUZSFd#p,%-j9&358$rJE#DK0"9e(5LA$$@SSX#UM@D*i6M+TD+3!)L -dXBH,Q!m0XjBbph`VFl58d3F8-,qHV%*V05UC60IdU8YkENTGdV'fUNXk[N0GdME -Ee#A8-5HQ,U'f16Yj-)i)Scf-#*qSedQfKEQ%4d@CfB)U[e9eqAM*jH-KjeM[CH% -c6[bfV5[5J#5i'PScb"5Aa9(aJ#J@P@)R8[1Z6QT#JjDP#!3GQNY0-D,49AkPm0h -KLF1fN`'[6mq4E5V5bj&,10+6j'0AY+'Dkh3HiTb,%0`!Z!bS)l,M19'VJ$VR4,Q -GU*H"5R+L8Kf"ZbTb'T!!ef9)688H"HS9'@T349d'DVF6e88+8TkVARNG8bU[[ir -,$1GPaXR#E9YjlDE!d&BTFj4U+q8RZCHc$SDam2l1Z3[IbFU)(ZcVddAp-24f"Pi -j%03iBHP"d+U9XPiE3Z+d89%U$jJ5'iI!eXr+Ua"Q&X!c[6A0p``e59`'!i&5lX, -fQE[Je'q01rLbc@cAKJ)Z%"5Y'lM4cCcVcUjiISI86EHT!d`"-i4@@`-M4Ji"BDD -UE,%S9CTAY!RVjKEB*B"@m%`iJ&D`fMq!9Y$Y&d$E9#0TVTm9-LTbab,ZPMZGUDT -"er#N+pAh,fr0(C!!3Mi`B"l@,*20-+VSP*PM)&!4U0hJNP!JUeVR`S")VPUCkND -BkRiE9RApIUV1j*IUbRLL),jT9&Pl&#FPrJ5T)9dbEk'%2'MHc[1j&UYJL6F8`k3 -e0BKF#-iZ%5EK6Ya@`(l6SL6F8F%F919dMpB`%MS2#k@ae)aS+K-cfi(6-3cD+Qf -@'3C0Skc1V-,&4iempZJ"A"bSA$a`mYQlbE(UQlb,V2CdPk%i`KIQQ00K4Z%Fl5( -K#E`P(#pLQJCA$DPaS!)"l)H%BpNe3KHr*B,T)ae[JE4(Kqk(e'[EYDI3('D,dF8 -[q9GqKI6)6UG,MBHk2+(DA&i0ERa&@(*9JC3ae6R'9'I$-Y9P2jNUfaqQQQ153PU -rlR@'Y1Tc2IqkYkU!XZSq6h603qFH)LE$1Fi*cBbl@UXLY6Kj8e5qMK%0j%ED)6p -HZ)A6qDP@kc4j&k[@LmTA9@Rk8N,'&P5SB`IBkDC'R%YBSC''eUMCTCKP&*8hUNd -%F%+0KU@3!%*K(f[DQaBMlM'fK2P6SCi+RK++RQ&,3PQi-pLV-h'R-`ee)J-G6X( -M#5h+'0+aPiXkcIPUiJ4Xrj5D-FTa&4@cBciV1h+QcC((C8q9f$`e@12)298FqF* -H,V)pmLlCNGH6FeYaAI#N'q6JAFm[UC!!M-E+U4(epB3S[+0H(Q1)%QP4f-X1,-4 -L0Y5YZ4HZ!-!r`4+ac@C6k&LVfG6CkY5JESS0+"-l`hEfQ0Iaa!G5iqJaFS1f25B -l6)Cd'20@0V#kaN%p5'abAYjNKk+'d20%%V0V&8A%C)USN!!TSN+f,GXMHRA8E0T -XG3XmdE6T!`U&&KkZfGfmSZ0j`pA-@h0$F,RGUZpJr0QMNf5Z*ahK935L+Ta*Zd9 -QM@6fFFAe+LADCXqR`@`!eGYF0i%AAZ4"+,X`DIaj[L$"TJBH0H83"j%@m22Yp+2 -QC)AUB$EPrMSZ0F"3Q'mk5#jVb3&3@'!-CIldI66dBI`T9DANpLjmJbYqMj3KKDm -4Dj2C-*NAm`lcHBHe6,f[)9(,9VEiJH+8,jc"KRl)c%'8c'LK"1rQ3*`A"HDXYdR -X,4N3Kf6r6%+MNMAB`#PHm+GXbAFfRb"i8%'lbVDcfCR"fP8T,'!m8bqiCFBQe-3 -&6qV2'CSD)+%KPNQPf&UF-Y,UB&Qi@cC"BLZ(MPb5$MBS-H%9+4aIH(KbHSd*AR2 -!pJRj%9(pR@!9kII$9U3YIPDN-rbU5*0B4CUfPiSdcEq+G&IE`2,(KbR*-SM9[$$ -9kDM5#F44RM2jmNGG94P00ke4%K$`*M!XI-U889$LB#3$2UTF4XBY@GNRI&mZiN6 -P$4P*Q8I,$Djk#-Z3!%*B[[j+'-)bdjD`I(e#)5cTRh4!iMZ@T#"F)Yd,Ce15Rda -#ADNa30Tf'LAAQ1SSlPFq,1c$cMiml-2"2S,X`mXq1YfeRPTZF,`aMCZm`SbLNXM -&ElTimqhfiLA8p,)S`!3pA%K)lNT6aiXp3Khbe4KUUc%d9'2)8Q2S4SfKVKT$EbT -$-,j!mfp4dA3a(Uaj1,MjFI$S6Ja-G&a,me(6`++ND6e-b#DSNrEcrYQ"i[lClk2 -TEldbH+GIB&!mj1UhS($+"lX2DErUY`4)XBF@ZIVYS`VL%b$X!9,d*d"iTK6%"5! -m!9,m"5!F)`VLA5!F!FU)Gi%)`NaQ!Ui03S&eJ!`'+(-Z!HRPb"+',!(5'k!-)f3 -RhrEkA$4('pr+1mCBaaJkmLhaMP!!bpBe,&ZRR%V5NjSQB*+IechK%5r@G[+"mH) -H4@hV-*!!Tj(a%6UF3&0hr!Sh$#ST-@N(%T0f5iP$Bp19"+IP+ja*4Q0Na$*-$fS -haZrK)F06a8H3!%k"VM91i($0qI4--5@D9j+9FM!hRi'jSV"JESQIB#lK&jLlCJZ -Q[RF+)'LA(f"U9dd`Y6PqZQ"UmmfpJkQ!5`kQ!UkU`G5X0[r!9-'Yd`06N`HcI[a -N`&4$krmD-0A3qKmhQ'TS26d`e9$fT`&-0C5G(TK#FZJ+8S44BT1*pj2`lm&Bf+H -G*eLN6`p2fNHI$Z&JRd'H`*!!2Vh#bcil4HHlAi&i+8pmc"MR%FS'DV5"NRVVdB4 -$3i89B)ih(eD%IhF(!dj35-!LZSShQQEK(3*'N!#$V(0JP!`Lf86pN!$a"X#DJmK -,mq-dj5JPM)Cja+2CdY-`Dc@aj2J%3LRTr(S#""A6F#8bJ$faR9r,(`#JlKUrL3- -EU&N*p8M"+#Y3mZZ0@THcZ3J'5"pMJ25&X)"dRCq!Y03[3*TIdb4Y@GI!mRp+0V6 -mAQUf,U`a'R@53'LJT-S!#L20CFf@V6D1Fb0b0"6('jZ509a@Z%GUq'hC5Z'a*DD -PDp"F($YS`EB&5T)5H90a5fcGKl`4258*R%Gh3QNk%QDdlDcTVeTH21308ZfeH&K -Rfr#AAY"'b)M8bXf9#r3,*$-bGL6@I"9[RT-+3TE`cGF"3KmiQ%aTdMA@'+@XpFN -ReQK8`AV'9Lq&CDYjrV(9V+kUf5TdHpD$CJFk8PEH*m5X"c2(',-&!#)Ih(GSAmi -Rha[ifF"(!pmDh$6`YAdI$UB0IRr`pAdE"Zm0CJdQG9`Fr,Z"dAdIGk4dI$a`8V$ -r!*!$+aY"4%05!`"TZa"9#f5C!&PYNqr@ET4DPQB-deZ'[)aDkTcEN!$&')l!fdf -PeV'9EXK#5&UhYGedep1cke-)Ke9h23b[Mmej$"J1-BD)'03&G8iLdSJh%I%(`aJ -3BN!%3BKkHh*c2$YLl22prqrEkpZQQd$1ZArh04e@0L32%4!3!"!3!"!3)HlIe5Y -4M`Gr&088FU5%&GQP)Yq%Lpa5T@cDaeaN%2ice%ZZ'4-CTXf5B#)f+F5%8G(bk(! -3cX'Ep2@(&'GpE2"1-5'Pc6d+"-3dmh3eF-)FFrHTG,GFmRMUE5NV2*klTV'EraL -Q3Bi@-QEjKr+N1-I#qKV&Pl*#86kM@krTeXPZh4!0K0Ud'-)ZcL3T6R3$-$`!rSh -GATCMYhpeqZVdR,*pT@RTp[`MkGUpf9bmV+qI@aqMSq`#%b8b@+0FlCkJf'3ReUf -#F[T2chZ(i,!GTe5'mq#feZ&@2"MRDBdH9Xam19F`+TU6iP3#3S@YdFb9*q[*a8D -(DS03hHT'Tk@*%+RUKI9QpK++26X3aiqjhRV-A6X9d4'ME36qmE!E5fRbEU8YVp0 -BeSNI-hjXq2(LTamr2[`d4Ha"1ahejG+-dJU1'X"CCFHQb9dMKRlb0pA01L"*Y!& -P*c401MMFP8B*(38-[$*#)Xfl$LK1a8P)&HHUKN,0(-"F)9`Vl2BMkDCe'q`KVDB -R,6FM4eX@b%Q9[Mrd*lZp1+h`5,(@ATSCYMmNMlrkY$fK0%1&led0Y1m0p6aH[#A -!e-IU,Hk$8jr9T)3YKi5Tjm+0q(-jH($UZ4"8ZGF&aca(G#4kb$heT1KZQ(l0q-( -T8lX[,TRD(FeFlSXqTbK(MNR+Ph8h%$D94)dA6*GVh*cTH-jd(*L1$ih@@i`B6K$ -GhZRA2!Q'Nm"`%KK'L1%[9[XaA%i-JlG(#0(r"YpR!d1SYm&pF1ecQXTSjYTLQ[E -FF$6c-ATmJC4-0bf!65iVQlA286A"P,rb+9qDTMb2abd96[NVQe*b+ddT-CZQV-I -MfBUQP0`U65RN8il6P-1V'&NPC66PcfmC6#Q8TRc$TcaVQJ+b5[396[Q'69Pj0de -Cf@+D!V*@0P8dCHAGI$2Zi2+'d26P$@iAYR`l,bjCANHJiQSISfR[EX((T`JBeSp -R+bmZ@41MirTrA,lCm+-DNcXcPpIG%9AUf-1D'$f)Z&(2aTC#G$X*F3YLG898JZi -kPc4P-`h$-J%#NC9Prf*m(%0!X(im-rlLNV9"1UEracAc$$qU-4NN""Jjp,!fb-K -C'qb+($jP(Jd$Z!,NE)F6d8b9r%fl[C!!4-[9IU+PEJF%cYjX8c8bG3Q,%`"QK%+ -cS-j2FB%b*3S`b,I,0l0E%[piV"1rl5aAc*fP%+JGdXHRq%HRmFFeXD)IPfmfrSK -"BqMih`FSe`EPfcAcf+h%*P"dZ69MLV*H'kb!K(R'(`'N+(8prYd1Vk)%X,+U!3a -#2U*aGQaaE(IA+#1UX`b"0A9Z*5Q1[cL&6QN%iTKh)Bj(h0JJ90',2)MqL,bJDep -KF9UkeL6lrS$e5J[YQY*LEAkZaVjIPS&eKH9(8ZdjU8G+Fp,afFkk35B##H'4FL@ -b"ZiP93XMj%Jq@c$XBCY3dR*r6RmZSh#X9Z[Uk0I,4lplJpr4Vhq&4bqXN!#D`XI -Rk*0GM3FcpE4&K1@Lj8U6RaPJC1c`KD+PQIQjTQ292F4@5Xp*e4l*R$b8jHjb1q[ -X8,h6d*ARZUj0eqE3e,(J'GKIV($c,pIe"f-!e)C*YXcLq[6bY2fC4c+H'eXq5"l -a%+2FM$*YUUBiEIpB-J*#&P)A5SlJqVQSfJ&8E&e+"`+PK6E"ii%DjQh(BSjBj)" -LM[mT0RAD'bbb5(6GR2X+&TF2%Fir8RK!Fk5dH'`Bl6FaZMBYHqaKXIr99XkZkm& -B+fIA2!1&aE94VFR@dA"9&@XLBS8fh)SU&Y[bSUdk%R$C(SH0&#X%aF,f9,YBGG@ -U`L'US&KGXbQ9$m'#2,kPIP6aG6b#6C)SY[(-@A!5&1HTPhUf1TcUTGMfpDC9)M6 -Slp`TMSM19$&VYpBjUGV4JSh#@1H,l3X5A*V&RHSE%E,FZ2NP6%D)j8hEHlB*E2Y -rmSML+fZRfa!'"+2H8B$MAFIC&j3cP[V%qTJ%`(dT(8%P%"IfP,K8YJ3`#284Qi` -[4DFFk,QZ2j`HcXh*'#XekL%pBXIf'4rEKQ1E*hYXFqF)dR#k2[CQ(0aX1VB!TQB -FfPE@3T0aD$-rX0Gde%SkDK)lDRY`*(6Kl+M4JIAm`$ce`(AYiA59GL`2c+X0UKr -5+j!!JML09d1B+0S$iE6dXH()A[aC3r0,$3fII@PKE8CQ@TQfk+)(D0%dc9M9r@+ -$GIj-c-T+8bHcI&H+,CVR$G1rTF1p`l0F9&8V3(H%P"a*F6CXAd*!UU$X[DkJmMB -TpJH%BKk@%*S(YeZ9fdZhm9bj'dDh[q[S[pPbLjpLEeFqMl2eH$aqLVfk0SSpQDk -lCrpN&,[+acEMf(2*0@!ppShkQb6&0KhlHT0bffJ5$QhHEU$Dfk(Dr,"3lIJ,fie -9He0Y9(YLaNUY9EYVMSqIDRHpk0LTGLYh#!$"UNlUb!2$5F18H0Xj6)J2R%Xkaaa -ekLAcb[QI!,e'Z'HQ"p2`VcU(Z8(-2h9X3+,[cI5"MX9H`!)aNC5Y-m6UB#+h -X3mB#HZ$"hF["+2)V49-(f*65F9EKB43IJX&MEZe4pK&,fP``GAlP8U6TCf#A-U" -06U$9@Rc8$Q6hAHCrXUdJZbrle35CS[bKaJ"N[,ViJqa2Y3ECC#T+VGA5!'5R'-L --!@DJB*XNF$RTS5*`@B(eIk&@DBqA@[f50M4dT!*)6i-`A43DeTN([A3E2`aRm3@ -iMpH,#8%[8Y*dbQP0qF&bTFlc&2pc`SfY1P8l0JbH3P)#*5Y`j`9F#`Q9AR%[Ra$ -M+Ef,()TbeF'pRJRLhR[,PG1H(i548YCHlIR"(YHpDXmE520m!``Q%)1M@cq2`r! -XE"f0%h[im%R5m%Pmq'8-[icKiib'la%6a!"F4DHVcIF'2&IZcI"Fm6b*G*XR+FR -CV@M1LKrMaBr#MCc4MrDi$RlXbI$Z&K-1"V#P'q$,A-#d#jjRi!DIJ`pAHkCK1k6 -Dm`bI-Qf6#aX4hX&Rk"m2-F,8P3#9"FcpMHfG98UM'!r!4$`[m$r$!-m`dZCr#G$ -q0m"i2`$eJQF0T@CB93)G@4mhY2YJD-GcB2fhBd5-Tm28Q-@,)(Zm42CiN!"pdC- -+XZ-jJFY"hR*+`8-+GN@Np8U1H5`20pH#52bp4h(-+4+l+AYFYkU9dpbaFBDrHTQ -rH(Q25h66mM!NIqRGM9GAHplL!hl-!I)@(rCM$K!!(SU56bDRHXQlHl!C[,86P@R -G8RC,'`T*`l5"(Xfm2ir3pI2H%"`9NSZk$EFm2CdH&hYT%([%`%e*h#@+fh%!feE -2'(+E(RJ,!q"N[&md(E6TB))RQk0aYS6'Pd$N5kQ*qYe)i4R&i8Fe05"NpVAP5S2 -RG@ca[6l%RBMBe'SAMf%VM9*TXNf+1b*[8,RfDBTcdmZlUSF6#pDV*(SN3Eh8+RV -Z@rV+4FqV,Cl6(NIac0+JXaYY&U84,YLq(8XpV8NAS&5YT&3)15YCi3iL2(T!dCR --Xrk8$Kr5*+'5&KbK(f&-Hi*,eB+I[!5Hm)NYXHdA`3M*kc!3bcUaY4IaRSQkSRT -52lMS6S4Ff1ULVE-@T(pXe9j&4+Mk+$9H-ZaZcXe),br9j)bPZmk648T!+#GR4I5 -SJD-LbqUSX#)aHCi*L6P!HU89DE6TL+1fmmRcV*0K[&EkGc&*E)%YeN(SCQia)AQ -[Rd1NkSFUiJjK@kZR1!Ta6"ZP*ETrUN48hV#2K)6L#cD5Q0$B`Tk)LlB%)DM(ki" -8&(jJ"2Y51R3b`8D1Ql"A2`UKeZNq"&GVNlZ[f-H#'-RG'M-a2)k85)JqK0k(Q11 -ec1YfNIK6@3HG$TXjZe2L6YT+Z"-9cA4V0YhD"V&B"+EpVVf+Na@#!E$X"UCieF& -9C80F6KSa!U2A%%M"#S"8Bq(!0VZl99lhD)BaN!$[Ye@MF%LraSQA%3l%8ql4iM0 -q3$5HX)B%Zp+2LK1MRkpG+Y(4H4K&-JihiXAC9$2[BXk)"a#)r9%a[cRXD$Nmj,# -#1"AXKej3kTeLBLFAmmk0pFTN8$*Sa,B+D*&CjDqT9L*2%iZN1*1B,M8)A+U1SV% -,@bE*k4pmSr[kJdI4d@r@j-(aVJ`p44fjBY2d5cFNA*a)r,EKC6kf$@j4kG$CE#C -a`%331[m&[20I`%@4ac5m$S`V2C33mT&9$6"mSk3)Ni`U5b-BE+4%[RXcP1pij[1 -T'c")MjqVm20hr+b5EZC$$"%4'b5fYT31G*2[iHFQhVRI40f"T!JN5-dSI)'M0Ei -1dfLqjqqd[8%Tc%A%+!G!ie1-r-EX3EJ0XGbAJhFLlF"#)T`'hqcM*0l&MCa(SD6 -i3qQT)(i"42jG)6)9CT(4%#aAE*dlrpCEq5,50+J,@&5I9cqA$J6LCq(Q,Rk3!%5 -rBrbA$ij9Vj11J1lJ%XL2PilKFa4,JT3R1[aEDpM$MFD2B%MH"4)Ej9IIRFE61Di -(%BXk2UNf$pjCrkP-rU90r'8R%BMdAeH)A"#r`a!U41BhL"d0+H(Eb6A"#dpLJ!k -(FP4c%2BA!@"r"34@KbM0EcBChM!RE8L(JQ(kYpi9lfQqp"p1B2rF@LAqeG#pA[8 -k!9mUhf++T#'eU4j13"L(UTMN+((Q`f(!YjCb%mD4m`!Z[cakk4fP"eCB8V5`)Dj -,4CbkYD)$9HfiA09SBieAY$DQD*D0*YG01lNNk4'SehRSC3Q[D1KSj($%6QP-(r& -UpP'5T+U@0M"dHMC,VL8RN!"d!6mhK&X`l)+Q%S$Ic!hACf&mE[D8!23Pq2KX1)C -L`8Mk6l83kd3R@0r!MH@'A56!h'm[pGb!aiF`GCL+(+1)kE"L3q9jfr-HNIRl$-p -l(Jq[DZq"M"L[V"-Sm2'VjPG*e6c*50aAHkj#94p!+X#3!,c*b)qfJ4pYJhbdS4) -XprmpXcMVF@!5PSVj2S#I(1PQPL3'aNR,HRN&HJNr2q2%rDaL-6$d'CM2mMc!JDF -h!PiIIUlM`1[M`00ci%d#m25Hm3$HH(bF*!([1L2JA@F![1XNi,NNi,Qimir!pS! -%YJFJAYEK#-GPp9qmM`[!U`*aaAZYJ!NUT*)!bYQ++RlMbGXYIY8q+f%Jh2JPG91 -aM#qjH&V'+r%bL+D0*Y%dalU!$JX8G,h!k5ERlARq5mKL6EH6"0["(ClIF43YNJT -"c1&#M4HmmIbZhLBKD*%IJ[lV&!Qi6d&QcGHbB009+0LHjF93fG*6%%$H&BKM"i* -3ZX64YmS)IFrMCb0(hr-FIDXiqXB!IDZ3!%*0DFG)cTA3Yp%)I4X0d,G43YpK#Af -(6HLl5d,IACKf`P"iH8iB#DppZ@-RZE,PP$&QF*2)B"[f8&bqlE'5a!8+jARIG66 -jEei`99%j5DJCE@YG+V+a9P[cr`QC(2@5@B1GEL3TGj%8a`(C4!&2VG2aRV#+##b -cQ3@C&0EGaK-%*FHHMYrSN!$9613!DA,!DI$"E2#"`LiNT#TQ8fKb$`Y0T!&bH(+ -23AJbhdS@XB6L9abLE2BIq(Z%+FCT2+kHLX,4LF0I#NIrC0qlBq5Lm[p%U$NaGm0 -BK*UZikC3mjeA0G4m[iUKCLf53ViRSHD)FDJTT63pAU(Q5+e$c9GKbqGa#$9rCa" -UMKL(QK)3M5GX+K*U9MXD%'TZp`XeGA+SkErPpkEVHaTiMVbL`229hLkEiKGiMR# -$H*2'6#Ne--e1fM)m(S5FCk3EXiJA%$e8$*f&P'%BaZqVUY'&E')ICH&%KKJh)Uq -M3)icG%U6,R%MC6dQVIFc8(XP*CPL%)Ef3V#fA3[9mYc!Tfl"S09'BHLA2!4&J9R -*`0RL&m$p&6rrj)E#2`d-8#6BXi-fMS-*qSr*"+)53"VhX#-d[L#&SJ@'S5JRFh% -&SHJ0k")@aeFp&&dmd9$dHKcKZ(58-ii-I`1)#1C'@qrM()c@&3P''lS)4Xp@5', -Ai@L"`B4DKU166r@5`p(Y4F24'*('`Xf[B9EaMASHN!!fM0+$U4*3i`&9$dXR5ip -"@$SLKD@5fMNE6)'T0ei+6"YdRS9iGCCA2`K![l"d2Dpikj0-LQYCbXhc6E*jAL6 -Pi3*h'E%`G6X3JSe+)$8,a[SQcaUS6``,C2'L[j6m3%@-&KLCl!Yi@VR9E-IVAQc -f[+fAYRZ-JPB8IIV)m`iGiD%-ccZHKGJiH3F%T[#+r35@H-*2*-b[-'5G,i@X%Eq -3!(8,2rB@kl'(@P'Y2r(FajP2-`TDCdP"+phF*`Q0DAj"d@r`Xi),M49&K%Dla(i --AYmAG5&4FKB(lqSZ`GZ(Rh95)%[JAFh"1`AJAHejA3,[&#VFD3,[1L2`VLX#hR9 -qi$8)DaqLB*S!1`Z#DP%&3Hem",A4#S*DAm8LT2(CbB5e"3CKV9A-946@GV9%B+` -#fm@e$Qc21+Ul%*-I'BHfALp(kf+Mm,D1SrM,,P(m2(9I8V",+2k5SrKPS2K,cjX -5LPr'cjXQ&2FDSELh#)Tlr9"X%2S#aBXp#kqP2bF-K@3Y`Yk*TX-EKEdM21aPhAL -0+I"e0KL%[GX9%T%8pT,SE+K0f$Za8-3Sl(hJHa,f2V"K)Q([b#X*HhQBa-,HGak -hX2IpUSHp%pf%03jl&m+S@#JIjGTLcViK&m820%F+Y6Pb%EM#R1I#@Z*KYp1(#X- -[2eEA2mX+&aLb!P'`9`ZcFa#')kQRDij&@0kbG@)XpdqFT8X1EY!dS`eT&mI##dY -F+*9p'F,Z(NT#S"3&+YL[A[*K2M8qb"-8PR&heaceN[Yr'ID%A'kICM'UqXXKPd' -5`Kb@T-"Z+8%"dhK$'MfB+TUp0fU3!!,ai45q!"DXiBA22NqY6d5kJXZ8VZ#$N!$ -aXZ*d9&JqL%)i5!bCM53'Pbi"k5)ZeHQ`46rDD6Qqqk4VQeT"FfVE"+KSTH,N4Pi -"Eqj$CY#f$HV+Nfh3m"i2VDMaU3[ee%62KASH%T9Y4f,-+*UdK*!!IRIkr6[h+56 -%)-aMeHr@ImS+!KQRMN""el'd%BME"ph6Tij6YB6`4ih#IMSc'DV@)d5LR2aHASL -U")dIC%93,"!(`*r1Je-Rd5(3b"%+i%dG,lU4U-m,`0UAF4-$4pY&4kZ4MMD01RI -6dISJ5QeL1hrejX(-U423$81SHelRM5iJp)$`IE1V*'Cqa!J)@X0-S3S1ZBSG8KF -,pTR%F+&aHG3rrF'8bi"5Q9elQk6[Tim8NblQT+9b&p6AaB@bM[Ur-a9YCFeZm5E -B3N'[cR)l&BC,C%@c&JXP!p4YPh8'3d'%`MGpJ+4V)&G-E1Y$J'YKiA8C,k)Z0j[ -PLN0E"+8[D&qe!jK)4A)BUUPlqXSX65`dIH@H3jNVpkc-#KjFQ58H#`BL1d9,&N3 -mNZ)Y-iF4Z*XMB6-DUU%QC+e&ML1Xb,&A[H5ICb+m5e![QGN8'4D2eAL$&h8A$GR -AJ(ePSTLBp92&U6eER4Kk'Xb8qNqPiVjkhK(RX3AIePHEN5MeX5k!SX("K#F8TmB -TMML'1VB%SlUG+2lEcJS+5k)B4H%qMm1f%4Uk&FpaSSq*!5TL&rNA%1ifUF0HZlf -fSP)'*J4iH4T+HD@Le'i4-"BB(E3!B#bB#"LcLS$4"MF8Gq'0G+*j%5X)r9J$K!A -rab"m[bJ)UpK&9!a*3e#Z-MV`+S"beGL$FZF0IU$dB`e3V[UI$-VpB`R+fKFMRjP -N,8DqmZJV,dBqmaI@BZ3VXkY3M$b,'PqQ*K"3Q2SCc9(CJ6hieX8P+kI*VQdb)S0 -ZhJNB1,#a$%mMc"K$)T5@kF,TEH63jX@aRe&M!91c"BA&4p**YYVp3#dAQQ`P`"T -hN[kUPU*(8HqB62Vl363Ge-T5YfIQb`C)%%)qQMNcAjTbKVS+iq-9)EY6,[$jljP -($QMYA9-S0ce+95JS05B(NkNrdP0bS8ah5hXplk,h*SRZMJmkcI0HShp,ApXi2'[ -hpedq*IlFf[@IafNAm#4*YR'a[5`0fGYf3`RC3d8jk(rQe(bSJEhKTBScMk3I-#+ -&0I$3MN1fV0a3'$QXq%!B5,%a8Xj5F'M4plP4l%56"a)qdFlL982D1!%"kB9(-LU -QSS[P'A&M4i5U+"(r+K14NCC6HbTi%lCIam(*G5DBTTaDqdPCF&rlGUIY@+1LG6C -B(,cBHbq+ZbmV[Ml,V$4m[ml&5EK"h"NIaaZXcA9eJS5FY0a`'"@m!Pb`PDUkd0+ -*,B6SF(),3Ec"BDG,8lbGD5K8Y,iXj[9&ADIe2eQ[A551k-J0G`FBl5mYdfC8U$Q -&p2pqa9pGDF1#e"@'8$q3!(9flISbhqf@@ml!qFq%D4e#,2hDpB%il@`M"Gf&T6+ -1T+CD!pSL5PSB+14SZ&f"Nl(*eY1SP2A,`*K6h0"J9QM,J)T9`m`dKa'S+@K'[X+ -"&RRJFIdaaDG81#M2HFNEajRf,@h,$YMZMZk0rUFC@&M9ecaEb*Y+V5N@2CMc -$3p*(Tca&hih2cXQ3!#5D52qX`J&HSk-e6)D4B$63)C&a5CP5a5Q#dF#crJ0j8m` -ZD@J-6&eX-'rQ'6G[-QQQHDi#"*+53-QFC&Cf$Yq4TV63`qb6r-'XQ0q&)U+`ej1 -+'3f[,jPC4X(qi$CdecZJ'UH0`fb*Db%93HZL`ZCrA@c3F-4T@L`b$0HZ6@@$'id -C&bmM))ZTmTLTfe@$#rk0r*K@cjDF1DJiU+3q9&,GfIESD23$+F(+3pA8De%[q@- -aYMdEN!$'hYM[#P%eA5$Zj!k%b3Q$3Y*jUPe9AHD4L5e6N5M`@qE6"LbK`e*e%!U -4$VKSrEX9I'l!jdSbQb+0cbZVGjFjRfq-*!DR+Q*NUP+CUVMhJ&0hcG"A!f(c'PF -K8[hMQcY$SC2Yde$BiR&i#1aqGN!laY&Lr$'dqpNpfUAH2"aq(Jjr03kIPQ[#Rk% -TeV-h9-T%5iMq3Vk%*"(cU4IJL%"P'h"`%3G[kM6MYK+hZKVc[#[dEqQ9'iCR$93 -R'S#MUA1UST2!-FB%$N8j*bD%QXN4+Ri9hi&Qd"lh4`kJF`k[rfF1SMN%)M1"k$5 -C"4Q6Ka$T5)L,qJ!JYGqiFP%5Ja6LM%%P1iT!d4f)BeARamEeeT!!p9lr5QV%D*j -kbD1AUm#Sd-U)#[X$@@EapePYaAP8A",TZE`"J1C-R+l8DR+AiRm$8@5QKdHT#!` -*'jhaDUH[YRqXcG#Q`N+VJ2`+f%5Ub+E3'!M86"eV2JZT"Z4iGF*9Xa@AI`L&UA( -Zqf'L1[Nfbf'Ti5aANY`%N8-Aa@8ZR-b0%Q60E-ePc@`CZ&&Q5d@IV)eVlIF6Ukp -qieU",Yl*33f#!h)"dPBS'[@Ebp`TBN+%YR(G)K8QaSZZ(%IL6YjiQ'6SZlkLRNH -9mHUi9+$UK"RZqT5k%2GJQq`FKlRrZ99GikS"A)3V-ae5!aFme&bX5-9eI&,M,U+ -I$KZ#4&D%1E+*Uf20&ATYIEFJPS,`'+kDBh6f)QYJ)PSQlKK&b12Z`64rTbJ5T1k -4A+*SRQVfDUY,&!hV9HVkYKe$'1bF1@`01lHjBCBl)m8)pP%d6Q@10#HG5aM9Y*U --Zhh'$VZVkl+eK36Y3%qf#69@(0"RJNQS"lI@!"ME5GKmN!"#X5JHZU22mFEpT$! -8J5CYQ[CVmRJJZ!!IET3HEX6$$G,$$AMiKr6`$cc-PalQiq([dX2ImA#9p(!9(Uk -4(Ul"`ccTB4iHlT-HlX2$,1PK&KiHN!!H(UKGd2kBcbKSelrbS2faZif#p[86#GT -cDE13!-#V[84X9pi[IrKUA5!Z*AIJ5(jDDSkL`19b[fDlHhV"l,3c#IJM(LbB24- -&ieE1&Z'm381-q*Ma)%r`QH#H[Q)CNJ!b9ba,D4[%3hdpFbZ(JNPJfDFpA!U1B,P -L$M&E-8FmZ')1-5ZB)c0E-5F$MZd9ph!fph!fpcaj6dTZYpdZ6CI-)bp5i2[$&YF -S(0@fAGLqfYFDG!I1"mk6%+b2K@IhMX)Gbjfam@&k*)GfZ&92'eh2QVH5-++A#4P -86*%C6Qm-3L-23'4R3)cN&ZE3BUIf)9J5+qZ9##BrSGJL1HDY36GF9ZD1,6`p,$H -b-l[eRHBDLbkaT,XX%S%M("p1ePJ+F-%BR@AY*aSEUSpTH%QhGVjSDHY1$8$-fC! -!VX,*L&q&jNMi!YY!)-L,XI!f2NDG)TYkQC'ART[2laJSEJCj2KJZ684%q,YrD4C -h[[e"*"UqkbpYZp$JXN6db$re[cTAkAE281d63hH@NrP0$V(EGLUf1d2Nj-DY1A) -HblE6XPr(4iC0$`q5bU$CS[0hBK"qE1&@-D4[#bTC6bMQ3ZHf(YSFqacJ1mF),#l -0B-3TCq3`-l9e8dGiD(G(f,Rl*dLqi83&4fl5rqTmjFlPefQF`5F9fr+rDFb$cB0 -JLXD$NDTc@bNR%hp`Db0AHK+DjER!&XR0N!#@i@C!24$Ek*U+5EMJQVME29AaSUN -Yjqifh2DVE&Lk$BpC2L5Eh,EEYc8Ppf5#"%4MA(2R*CQ!eI@+lS9@hEXEqX*$qMi -jQ!XUcc[A0dGfr[1[iB9k1"Yaf5+,r&+R30Abd*6(Tl,#SBN,01f",B'RmBUK1-` -E,0@TcU,a5aYV0Z-f#0&G"&BhE9acKf,ZC40akH&L5H&EcJ#-69"#-Hc8GfMbDlB -K*6B4j0%Ph(B!01'8h1#1hf`+IrUAjR!VJA[MRNfZd@B-DGE%$VGZk9L`jmkqk&C -aEfAJLrIJp)64B3@b$VFL"2PY)h5a'mC1CYYX)LG6QkV5fY'NFMC$,N$P"B,lJFl -QL),d!RhP$L`i3a0L"$"Lp,Yh-c+FG`,dr0B-j9cZSq3hjflF"10AJL6G6k%#kc4 -$JbHk4ViK-4RD`cR-*)2!D%A+B1D+eXifmD[EGLM11r!!CF!ImE9$1eDd1Q,dTr1 -e1hD3!)RB*kN20Ei5*(F)QL2Y(&RaL@DSqEf95eDdDT`dA(a4CHjXCJ`(JI,"CR& -(d%iZNQk6!P)h"8&NbaY9&1rhKdBpRQ@+E43TJ%TC(Llad%JAB5,dDeDKiie48Jf -Fc6cC#4Y&A$&#CHcQH+V)hD,Xp@9D!%IFEmqh9[B'+[3$"(pRiqJQ9l!a(#KaP3e -P"rMamqL`MKKEl[LbT,KJ&-lfZ8a-NA!VJ5'6lc-YfiZQ!qB'i$!lj-E%"SJYjeS -kqJ+CKC9JaX"i+Yca1`2$l-9[T'iF$[$8Y%al0UbYF&TDF6SRQ5T8reIR@CA"K40 --3TH*DYe1U-3**"1d-m&-&iq$qM3rkj+Ec+9dEJP!%pL0CL-AL&MkT6,YC"Br4BZ -,#-iLGb,)K6,8+jA8e6c@p,Bq%Vdc!21P2@P8Cm',ZNiR5b+T9'S8+$95AN8NZX! -)Fchr(r-(a-3%&bk8XlZ`(),d!pejQ$j1RI[9Z3hd&A4VTcPDM&Q(qQM*!TIf%Ge -j)M[9aT*Re8Y@E(dEKAGJI!8!cUP+!qXB6ZiY29b4122GV)2,,&ZjL%-lR%N`3JT -1jVH+&Rq'`@M5X#lUEY-FMalqcK4kpHeRaXMr(+j&A',2rD[KbUJHbA6LF9`bbqc -JADQRp5XAdT,ZkFA'*j+(EGf9AHY*`m"`hKq0e-+1TB6,4R66-',lNMcK0k@& -YQ49eR($4N!"`G2P0[cTR5,i1j&G'G`%JPHH`S@2@L-&i8Ra92c8Z,*&LSdmid*c -"%i-c'!Qr0P3H2b*iT6CVmULbi[M(5Pcj0PBaIR81f`j50I[f-e3c$1M1j,`NCc% -jEZ"LZTi",FL!PZ!2Y+#LXh#f,I85NCm0"SLa4(#5j0,Ydk4U+Af#+Jl!8GP`U9' -[am(Q4&A5B-FM)-+0kMZ#p1i@PG5Be'F,3HDCS3-,Ed%cb`FJKC`J+3CA@)Z+40N -)c*Fe2*!!bMf2+)@hH)Nc-(('!@qmP0H[#FZKE!mY"aEcjF+%B-,DBZ"-5#"61"l -aLN-*He#"1pYrEfY8(YENYDp#8Q`-$c'0%`m2KejM3c4AFCFEY"HjU$N-(a"p%)( -Dp#iCaMM$KcR$KcR$Q$($rl3bc%NcBNF'`feSNP#*i)q)*#5GiY02Jj-(#8Rij)1 -M1[H+RIUjX"d*24TYUT("#G3bB(b14MUbi2DKBRflMK)M1"LM2(fZ4QQUT`ES,UA -!4!S2P9##(jU$4aLTJeSkJlKaMkVNSNbj5,$3SFN[(bi@De%509kC#9mQ"+03B31 -[82aiT-b)+*r*4BMP)NLRDp+CJ`M'9+&G2BUZ3SC$f0`b*&3J3X@j4+B"H6iVHDC -M+l*UATD4,P0%*)N%*MSU91eKMFfU41Md2EJB&bBL93+Zf%IQSJ)d&U#B6RLI(LN -Q$jUTQ4401dqHIjKBb"2#PK*AjRB[66)R+(mdijU+miCUP0X9mfjmT0FF"3d!Vq9 -E&abLTmfr&a[CC$C3SF[`QPP3`)qa,XL6E$4j5-E6D@T`'6ZAaQCGfZ&P%rNRQc% -a#B4%!"YE`K'iB,hXmcQl(Df,fFR0`!d#!-%F2Bb'k&Ph0GZ0T1e-FYY'#*c%"%V -FBXa)V[JrAja%lUrF!3di&M+3!%)8HMQLkH)&qRF)R$Y0)(Dk4kfJ*@A6m+3Ll5N -'-)5-3kRl0K'!Ak3#1+UEB6k1UNiKc"Z5`@%UKX%[eqX(0K%Z1JRa5A%b#P39)5Q -2N!!ibrbe`Jj'bSJdDe(6+5rcmh)#3d@6MB(UlC0CR9A!V-&Y8H@&B`@ZUM$L$dM -U0b%&EGcj)F9@)9+UMC!!dQmLC+Sb&mcUPEN101@#%*Ch1ID4J)3Hm#kd+Mb&JM) -CILS[!93@RpJfTJTh,+80eldm5U*jm#5UU4-0cX6a$BSQ@A3$V8j8C+QaB-DQ@m2 -PY&(+24EQK2eL042$&98kpNUZC!N+NF8q-S6DF%eAVFfiSV!AAbY-C*R3hX)'bG2 -jT65NKH#FNaUmb9r$LbF0C5Z63aKM`4K#92NBkYMREJfA+R6-4(,ZRXCa0T9LQ4e -eMEBK&-V,JlJI3YAGTMb-`1k13m)AP@&2$6VKrQdJ&DJ3YbNqqS$J)G,a'"ccfj5 -kMF1BE0(L-RYRKViH1$NJ0Y+3!'kl*NG,2CBL1bRbSq5N'*!![TY%,)`S+eJ"a$` -#085AY$`6L$+S0$U$`rZ-$ZmhK3XHA%T3!Pj8Tpc)Za5Ub+Sb'@RI+USNaYa(P5, -2jP3XQVd`#he)Sr'9aA$aLlU#UBU[d-a!kQLJPfep8$8BZNM6)l(MDm-3ZYL%-DS -GHHa4%KE(B$$Y3aG&65"%NH!!iaN1J'BZ(VaG(`0*cECGk)4N4,,2!#k9QP)N8mS -'%(YK(0DcLfhNEf#"$J'EMDYRJfabC5[l("deE`U5c#YY*KVdj9h-+6)(qTPCHlC -HZ6XX`Nb'Uc4XUARaf-!'9f@Lb[EbJ,JMp*Th0'&!X`LGf9R4%K8'K8j,MQrQNfJ -kbh,IX'YhYk['qFJ9$+m6Gb5pKJ6-+[m"fr8[h,kKlhkD(M0pA"5fE('KdXDNaIX -dLl""HTL,)Z3'&b0NcF34e*3QXq"3&1iakN,K"5e0Xm-'06QfpR'R&P3M-bqF9q* -+ik+&JKe+2e)[qD,KE6dCPET!C#6FZ%+['KTX$MHZe@2KQ+D&Ua3A2(a+6"1Mc3" -bjm%CE%NjbET[HMN!GcK*%c,hB-T-rb++jJND#59ZHUKQh3JZFN20@0RF3R`FE@m -$m9&(1ahLZhSFiKjb'Ri4c@iN3a!Q5Q'j9ST"dLMRPiYGMR$Y""KP@)#U1&f)J3R -%qRDJZjm[SBZi81MN*1q@T3X8mb$BENG$9@9@RPd`jDciCq88Bm@,mjSB[@'hldm -YKD9[iN302,mKQlkQckJkcKqGiJCYqR2TGXQU*j0abZdFPI4C-XRTF`4"!KF0j9c -J1SPYZ!(HS-6CCPl3T3%r1NHPHdpDbj!!6[P3583J+LU*$Upl6l(0p-QV*(B11I* -53A#U4fbNDN(C&eE6&i6CHPeGESYJmqRTr9#``["cKT23+!"H$p2V6"6d8[Kr&i5 -Hm9F0#epGqFpcU`H%6fBYq0N#BFZMp*rDIGGG3UVk0RA+XHqV$kQcNLmN,aILm62 -QDI92PmkD)D3+*p91YH@aj+`VDVI`KR"0mM2khLmq&$+%[`XjFj,A#MeU44lBV[j -dG[,8bqUI#e1%CFN[*hrci6FI#@(KMp*)BGR6`UcNbmN6K"2VNVqC*ka-[Lcm,hj -@#qA6K0q1&j,(#b@FYSprm1$jTmH0HhT`bjA"Z)%Vh30#3#J62RlkeeHq%Akp),P -$k&Z``b2J8R(+3qSI6"2HIr44iAmIII6MHfB)Sc1%jfF)Nai6PTiBk"EHQ#'X9aI -f,%Zq,6PrF,m`@hhdf-(Nlb4r0ILQfYBXR"YmF0Vb[42DK,p-+qQa#h(6"0Ud'Lm -i!"*lYlU-X4AHIf[4SLr`)r`lAKbj8,$L3X&bGFTJQr"EGCl`dK9K3$hcUGI9Dki -)*eHG%-je#"d&2e3I6ABN[b8F&[jPk@"LEh*1F[0J@IFh`X[5L'pqU-j*rQAbQm* -[KG5PJc8I*KFQ$kJhFXVb-Fla`bH&kF)5GD2`3q%DiIM6*eF)&iA"RY@[Ulm9[K5 -Q$Mrjc@@Kjm,2ZSAA&kPI[0)RI(c0K!Hq'G-Rr13(`XAahH1lCj`I*h3[RcC&+&` -jir8C*i@,mi@2IrhM%bm*&em6[RhQ0d*fKr$-VrYqG+jlc(N!N!-B!!!NL!!!9lJ -!N!-)!*!$)!!!2c`!"kR`!*!$#PM!!&h!!!"G`!#3"#j"9A-b!*!&!e0PCc)(Ff9 -RE@9ZG&0PCc-(Ff9RE@9ZG&0PCc3(Ff9RE@9ZG!!!'Qi!N!-"GJ"1F8U$CL*"l3! -J)$`r2!!!)MbTm!!"5N&Q"%T!C`T)3%K"))!K33!%3UG"q[r1d2`"!#m),c`!!"P -Z,`0K!!+X9)pR3%)i#Pj#Tbmm4%&836mm"0@S(h!"%F!+ANUICaK1F6!mUA#R4N2 -k!#SLL%(k!#!`2+P`TNG+JfF%F!&1G8lY!#*1F8U$CJ+Tp(!!6R9J"J#3"3&1F4m -krrC+(fB551IJi%(krqT3d%kk"Dj-h`F(,cVrhNjeB(*"6%&%4%008!!$!*!d8(* -"E8MRB2"d8*r#,dJ!)#"2)P3aD3!8!"JK3!!N-A`!!3!XdT%K33!ZS!,I`NcI$`C -1G8Si#PjR$#!U!!KR$#"!)""R"Lmkri41G8MR(`C"q[qHF!`L+J!%`VJ$'Q'NCJ! -"2NKkrij1ZJGZ@%q`H[pDCJ!"$U%D,JJ)+J"!!!4R"L"i!UDJ'b`U!!3U+J!)'#S -!"*I8PG3J1[p@S4ir1!)JCJ!!l&42,%JJ1[p%)JE#Z!-D@%&K!2p-)$Vr2-#i!aT -"q[mi))"+K@B%S5*J"#"&S#GQ!!#d+NJJ$P#!3IVr###!)$Vr#P'!3IVr!##!3QG -)HJ#m,a9)H[m#,cVqiLmkrZ)[1[l+,cVqbLmkrXTK!!e1-"pR)$m!5S9R##"0S#U -J+f!%)%fJ)b"1S"mJ4k!E-Gm#)'"J)%kJ(b"(S"Yb!")%j`RM'H34!!%!)!)"!1! -J6D"T!J!!(i!")%fJDYA8ep4"q[jf5T!!C`K`!D#BF!1JQ#"0*8J!#(!!60pJq%j -e60pJq'!!rVir!#"1S"mJ4k!E-Gm#)0A8ep3`1!)J-F!+B*()*8J!#%cIB2K1G8j -@!!")j`!i+'i!$%IkrLT&q[iU)"5`NQd%)")SJ%U!Ea)J8b*Z!!LL,L!8dC14NR! -!B!3`22rC60mF!%jH6R919[r)51FH1#BZ!!JS,J!-+'i!%%(krESY52r83Llrb+% -D,8Mrc&92U"``(cS!$%8!!'pF5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'r -F3LHTQeP2,blrl$!'8dBr!+J1)"mY32r`FJ%I!DQE)'lrm%U3!'F398m[#+QQ-"p -)`()%`)&Ra#mZrr#TSf#m%#i!&'F+@8mZZ!+Q)&qJ'cmmS2a1ZJ5'9%mY32r35S" -R!!'H,`"1ZJ2@@%p+!'F+F!%G3!!@6[S#'%KZrq4)E[rJ5'lrf%kk"@T2l`!-)#l -ri+%H,8Mrh#!)C`!"C#!Zrq5K(Le)rqJJ#'F!!93[,[rN,`K1ZJ@i8%mJ!fB!!+C -C6bmm3dp%48*RU"mJ(be!rr"+J'F!!)iJ3#*3FKM6`5m*6VS%Y&K2FJ1`3@Cf)!d -J3(!SdF!Y52rd)Qlrm#44F"M9`#e+rrJ[#Nkk",TB6be!rr`JE[r`S#P35LCZrp3 -R5J!S@8m[,[r`6VS9c#!IFZM3J9'!*d!!,&925(Vq-LmZrr4)E[rm,``["#mZrp` -[,[rJ,blrk%kk#XC86bmZrr#TSb4Zrp3PE[r3!!`PE[rF!"!PE[rJ!"3PE[rS!"J -r2+'B6VS$9P42*N!r2+LI6VS$5P42)J!J#l#"CJ4`!'!#F!%J!#9!!"`P4!!J*8` -!*%Kkqm`r2+$m2cbJr%kk![K86am!6VS98MmmSCK1ZJ--9%p+J'F%F!'JQ#"m!!! -"@M!35-$JJ()'X)&Q$%(k!+iLI!!!!c`LL"em!!(rb#"ZrmbJ'e92U"``(cS!$%8 -!!'pd5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dB -r!+J1)"mY32r`FJ%I!DQE98m[,[r`UDB`(dM!FJ6!J@F),blrm+QLB-)NE[r`5T* -R%&92,`UTTM!I5-"b"-#"CkS[#UQMB+33,[r)(8!!&NcI((K1AL"I6qm!$Nl36PE -rr%MR!$"#,[rm2cbJr%kk!La86b4!5S"RA#m!6VS"J&K25J"R8#!+*N!J3#mS!!` -r2+$m2cbJr%kk!Gj86am!6VS81#",)'J!%+!I)%XJD!!BS"mJI!!!!9S`%%M!i)" -b"V#"CJT`!#"m!!!$2##!(A`!!Irm%#lrr%cI$!"1ANje6PErk%MR(cKC6kPe)"m -U!%KZrqLSG#!0)%!J%(+'d)%Y32rm)%"F5%2Zrq`Lf#,B@8m[2%4"9%%r2!69UD! -J(bK!)%!N8$)U!!L5DJ!%2!%d+J!'P'S!!Mi#0LlrmNM$1#lrlNM%PS3i!8M%PS4 -U!P+$iS-p3rrf0Llrm%M$1#lrl%M%PS3i!NM%PS4U!P+$iS-p3rrd0LlrpYC"282 -rqM)Zrr653Me"rrKC6d+R5'lrp%Kk!'Cb!4m"FJ%r!A,r,`&#*d+RU4-J(bC!,`# -SF`D&!*!$H#m-)%Y`%0(!,`LSpPP2UA8J(l#&C!*Jp&92UA33(fB#B2C`rcm!3QF -J(k!b,`ZT&#m-UD-[,[rSU(0-haci6Pj1G3!#!!"19J!!51F!-#4Z!!JJ#LC!)%! -L+!!#$)&"6%&%CKBL+!!'$)&%3de3CJS`+!!+FJ1`3@F%F!"J!R!"60m-!%jH6R8 -[#PP22cbSER!"(`"1ZK*i)&mN5&P22cbUER!"(`"1ZK*Q)PmJ5V(*CJB`2!)!B!3 -`2!3!*&p1G8j@!!![!cBZ!!J`!dM!!S!!!!J!5S"["(!"B!*`!#BI6Pj1G8j@rra -)ja`!0Li!#$m$6VVrc&42(8$rr()"X!&Q%!*$"rp1Z[q!X%0Z"(!!B#KC6cmmU*p -`!4m!6VS4m#!I+J"C6cm$(blrr%kk%H!J(bJ!X)9Q!R!!60m!1%jH6R919J!!51F -B-$JZ!!JNEJ!+)%SJ%#C!)%!b%!a"384Q+$)S!!)-3805CKif"(,rYN&R'L!S!!4 -b'1+S!S!!N!2r-J0)`E#"C`4`!'!#F!%G3!!160m-'%jH)&pF6dl36PB!!&925'i -!#($r2`"1Z[q5%"pR%L"Z!!JJ+!!%FKMLU!*!!2pJ!R$r6Pj1G8j@!!"96dKZ!!K -`rcm!6VVrC"!ICa!JEJ!))#J!"!+!!2q3!f!#F2p1ANje6PB!!%MR'$JQEJ!)+'i -!$#",-,`$!A!!*%`NJ#Bm!!!"*0H5"T)!!!*)"T)!N!-J+$`!N!1!fC,CNLJm!!! -%N!$CNYH5fC)'NJ#3!h`'NJ!!J!"`!#4Z!"!NJ!D5!*!$*!D5!*!$)!D5!*!$5!D -5!*!$2N*!60mF'%jH6R919[rN51FI1#CZ!!JU,J!-)!XS3#e!rqK`*0R!,8crl(! -JfF!Y62r`F%MC`#e-rr4`2YR!)!b3!)Z`K@-'F'91qJ#b3N!q!%*!28$rj$B(F#5 -f3'4)F!5f3'3%F!"J$(!!-!0CJ'S#9S$NJ(J!1!-Y42rif+lrk#4%&)!J,[rid)$ -3V[r`)%!`V[rNF!%8%R)!%J,MB0&Zrq454f#`3N!q!(!"2!!f"h!IYN"N4(!"YN" -N"(!!B!a`!$!$8i"U!P+!iS"i!$J$,86rr0LZrq`N4"5!)#lrr0#!d+lrp#"!-)C -`!435FJ!5!Z0Jh%"54f#d3N"-haci6Pj1G8j@rr")jami*'i!##CZ!!`k,J!3+'i -!%N*!2!!b"A!!-!(3J$3'FJ!b!V#"Ea4#3$3'FJ!b!Y+"dS`J36#!8NCJfN*!2!" -`!Me!rr)f"VC&C!!!Z%*!2J"#3$e!rr"`!$!$jB$3LL"!)"!Y32rd-JC`!$!"d)X -J3"J3GJ!@",C(B`!!JM!ZrrCb!F""d@lrm(!!-!06J$3(FJ!b!V#"Ecii,[r`GJ! -f"#e$rrc@JpD-)%0+8'B5)#lrr0#!d)`J3$#Zrr*8E[rb-Llrm(!!-!(3J0#-)%! -`%$e!rr"J&M!&d%$34M3Zrr"b!$)#dS(5M#""-)"54b!Zrr6LL#e!rr4J!2pX8NC -J!2p%60mFq%jH6R919[rm51FF-#4Z!!Jf,J!-*Qi!$M)$F!!`!HD!1!!`!h)(`%% -k!(!!,8$rr$3%FJ!b!Y++)%%5%(!!%!%d"A)!-J,LS()"`)(4V[rm)Llrr11*dSX -J36)3F!!`!5e!rra546!&FJL`3@B'3N!k!&*%-Li!%R!!-!(3J,#ZrraM!Q#U%#l -rra)Z!"25!C!!!8cI$$K1ANje6PErr%MR(b!NEJ!)1#i!$$SZ!!ib"(!!-!(QJ$` -!-J4d"m*#2J&f!$B!eSSJ3a!3G!!8!#e#rra`!$!"0!9b!$)#d)(QJ()#X)&R$() -"X)&R)%U!Cc4J-M3'FJ!b!P5"dSSJ34)3F!!3!A)3ikL"V[rm0!Cb!$)#8S(5LL" -"%K"`!"!"iBL"V[rm)#lrr$3(FJ!b!Z+S,8$rr($rFL!f"A3!0!15JZ+S`'lrrNc -I"2K1ANje6PErf%MR(cJQEJ!)+'i!$L!m!!!"*0'Z!")J2!!!!NM4VJ!5)#i!%Le -!rqab)01Z!")L,J!5,8(rm#3m!*!$J0@Z!")N,J!5,8,rp#4,'"*f!"B%,82rq1D -$HJI'49*$282rh#BZrrMLJhS$aN983ce$rqCf!6SZrqEVBce$rqKq3-J(I!!F"$e -'rq*i!HYN8d3p42rJ+Llrq(i"bSGR#(S!1J46K@!#H[mp4IrHH!Jp42rN5NCR4Lm -Z!")[!$m$8NS[#NkkrcT2l`!1jd$4E[rN,bi!%LmZrr!r!bmZrqa1ZJX)6qm!$Lm -Zrr3r!bmZrq`[,[r`6VVmV%r[!!j#3$e!rpJ`,[rBX'i!$'3!!6S`,[rLCcSN3$m -ZrqJ[,[rd2blrj#m,6VVpMNr[!!`5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!") -!dflrj'!F2blrjMmZrq3[#dkkrI"36ce!rpS`,[rQd@lrj$!ZrpU`E[rHCKBb,[r -B8Qlrf(!!-!(3M#"!3K"J!2pk-#lrfV"Zrq"Q!!#8-#lriQFk*%!r,[rS,blrp$m -Zrq3[#dkkr3C2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($m -ZrqBr,[rN,`Y1Z[eS8%mp32rD-#lrjY&Zrq4@E[rD-#lrfP0ZrpT+3'F!r`!i,[r -BGJ!f"#e$rra6JpD-)%-3%#)Zrrc5M#""%)"5E[rBB-i3,[rGd#lrfc3ZrpK5E[r -BFJ!b!Y+-)%%3J'!!rVib,[rNF!!`!9k!jS"-haci6Pj1G8j@ria)jami*Qi!##S -Z!!`SEJ!3,#i!&#e,rmK`*0I!,8[ri(!Jem!Y5rr-F%MA`#e,rq3Y62q8*M`!!!% -NeklrP#!m!!!#50'Zrj4`)0'Zrj3S2!#3!i$CV[q8fDlrP#eZrj6rY#Jm!!!%N!$ -CV[q8,@lrP2qieklrP#eZrj6r[0QZrj3YE[q8rp4`I0'Zrj3YE[q8rk3J2!!!J!$ -4V[q8)#lrP*!!M,#&B`T`C6e!!#K1qJCkF!!Z!%*!28$rM#4Zrk69r!!!J!!Y5[q -S,@lrT2q3!#em!!#!!2rS5'lrk#mZrk3JEJ!N6T!!8%mJ,[rSCJT`Cce!!#K1qJB -d*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHl -rN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#" -Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJA!)'lrN!"5V[q3!"!3(8$rS()!%J$ -5390"28(rd$!Zrp$33$e!rp)JEJ!F)"$3VJ!J,8$rX#4!,``[,[qi2c`"*#mZrj! -!6VVlmNr[!!ib!#!+F!!`!G'Zrj!!,``[,[qd2c`"*#mZrlK1ZJHk6qm!$LmZrl` -r2!%N,blrZ#mZrl41Z[PF6qm!$L4!,``[,[qi2blrd#mZrj!!6VVlS%r[!!ib!#! -+F!!`!G'Zrj!!,``[,[qd2blrd#mZrlK1ZJGS6qm!$LmZrp3r,[r3,blrZ#mZrl4 -1Z[N+6qm!$R!!,J"#3$e!ri`YEJ!Jrk`JE[qXXHlrX'3!"+K#3$e!rjJ-EJ*)rjK -N!!$#-#lrM'B!!)`NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[q -N,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q -3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk"%)JE[q3!&+Zrj! -!%K"`!"!",J"`#$e!ri``"h)"`%(4E[qB-LlrQ(!!-!(3J0#Zrl`J3$!328$rQ#! -(iSJZ!&0ZriaJ!2mi"'i#52qB$'i"!2qBC"!JE[qX8UlrV"#ZrjPJ!2m)"'i"!2q -B1#lrQ(B!0J3Y3rrieS2@V[r-)%-`%$e!rjSL,[ridUlrb#""%K"`!"!"28$rR%T -!C`!!`JaZ!"MrM')!!*JNE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!# -4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq` -Y5[q3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!bJJE[q3!&+ -Zrj!!%K"`!"!"0#lrM()!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I -4E[qD)!IQU#i!Q@lrM%*!28$rQ$!ZrjL`E[r5C!!!`M!ZriaQ!!#-*'lrN!"55VA -ZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!K -R$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b! -Zrr#`V[rdC!T`Cce!!#K1qJ*B)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F" -"d@lrQ$)ZrjK`!$!"d)$3V[r8)%!`%$e!rjJJ"q+),J"6E[q-B!$r0M!Zrp+4E[q -B1#lrQ(B!0J3Y3rrmeS2@V[rN)%-`%$e!rjiL,[rmdUlri#""%K"`!"!"28$rR%T -!C`!!`JaZ!"MrM')!!*JNE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!# -4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq` -Y5[q3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!9SJE[q3!&+ -Zrj!!%K"`!"!"0#lrM()!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I -4E[qH)!IQU#i!Q@lrM#"Zrk`b,[qHF!!`!C(!,8MrP,(Z!#"PB#"Zrj45V[q8%"! -JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk` -3J$!ZrjT6E[qD5N"R!2[H)'lrP&+Zrj33%#"Zrka5V[qX%)"Jh&CZrjSJEJ!BdFB -b,[qHF!!`!5*Zrkb6lJ!JN!#*NF!Y52q8-#lrQQFQ)'i!'0('XHlrP'-D)'lrP&+ -Zrj33%#"Zrka5V[qX%)"6E[qDB03YEJ!Jrj3`,[qD8flrQNT!C`$lCL"Zrj45V[q -8%"!JE[qX8UlrV"#!B0`JE[qXXHlrX'F)F'Fp3!!SB"3JE[qXNHi!)#*Z!"`LL%* -!28!!+%cI(2K1AL"I6qm!)%l3!(!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA" -bCA0cD@pZ1N4PBfpYF(*PFh0TEfi`-c!a,Q-!!$`!2L!!!(JJ2M!J*LBJH#!m26- -b!!!k3fpYF(*PFh0TEfik4'9MEfe`FQ9cFfP[EM!c-$%ZB`!!6PErk%MR(cJq,J! -)+'i!$$BZ!!T`!$!$1!Gb!$)%N!#"FJ'`J@m!!E3p42rS282rkP*ZrqJ`,[rSX'i -!#Q3FFJ!b!0+-)%%3%$3(FJ!b!Y+-)%%5%,!"C!*JeP0ZrqS`,[rUX%GM(()!-J$ -5M#""%"!d"h)!-J,5M#""%K#`!@-#B0J`,[rSX'lrkQ8#B()i,[rSGJ!f"#e$rr$ -@M#4$%K*`!"!"28$rl$SZrqTi!$J&,86rp0L-*N33%a5!&Ulrl5!Zrr$3J0#Z!"! -J3$!328$rl#)Zrr65JG+Z!"!J36)3*#lrm05#e+i!%#"#-)%L,[rddS(5VJ!3)%% -`J'!!rc)`,[rUX%GQ"P*(B!$r"$J(GJ!f"#e$rrM@M#4$%K*`!"!"28$rl$`ZrqT -k!$S',8Arr0U-*N83%a5!&Ulrl5!ZrrM3J0#Z!"!J3$!328$rl#)Zrrc5JG+Z!"! -J36)3*#lrq05#e+i!%#"#-)%L,[rmdS(5VJ!3)%%`J#!Zrr`L,[riN!#"0#i!#R) -!-J)N,[rm8S+5JV#"E"i[,J!3,``r"Mm%6VVqA%r[!!``,[rU8N!q!'!!rP`[,J! -3,``r,J!+-#lrkP*!2`"1Z[if6qm!$$eZrqS!#Q!!rMK-haci6Pj1G8j@rq4)jam -i*'i!#$SZ!!`QEJ!1+'i!%Le-rr!J2!!!!56C`#e-rr4#3$`!0JDf4@3XH!!i!be -%rrMBLL"%%"!L,[ridUlrm#""%)!J,[rid)$3V[rd)%!`Je*'B-i[,[rd,blrm$m -&3QG1Z[fb6qm!$%*!2!!f"VC&C"*`!$!$d+lrm#"!5K"Q"&*'B1K`!#e!rq3f"VC -&C!!!U%T$Cc)J,[rNH!!i!be%rrcBV[r`)%38%()!%J)Q,[rm8i2@V[r`)%-@%(3 -!&!15JZ1S,8$rj$3'FJ!b!Y+Zrr!J34)3F!!3!6i!,@lrj2rXF!!Y32rS-!G64dT -!Cb!J,[rSiiJL,[rXG!(#JS#",8$rk#!ZrqcLL#e!rqaJf$3'FJ!b!Y+"dUlrp#" -"-K"`!$!"jB$3Lb"!)+lrk&*'8Ulrj'!!re4-haci6Pj1G5*I)&qJ*5k!DJ*#Pdl -4)Pm5(c!I5J&R"+G'B!+M4Lk)6Y%LAa)I-"mJAdS"C`5Q4f!#SNG1d3#3!`S!1+! -"!!8!N!B"!!!"MdN!!Bj*!!!%E&028P3!GJ#!!"`$dJ!838a59!!+!+T"9A-b!!! -",N*14%`!!3%k3dp%43!(!9*%394"!!!"XN4*9%`!$3'q4%a24`!#!QC'8N9'!!3 -#LNCPBA3!!!,'5801)`!%!Y**3dp1!!!$$P"*3e3!!!-D8(0PG!!!!bC659T&!!! -$-P088L!!!3-q8e45)`!!!eCKGA0d!!%$BQ0TBfi!!!0kD@0X1!!!!iCVD@jN!!! -$NRCPFR-!!31H!)$rrb!!",-!N!@"rrmJ!!6$!*!&J[rr)!!%F`#3"BArrb3!")- --mE"B!)Errb3!"+--mJ"`!)Irrb!!"*-!N!@)rrmJ!!66!*!%!J$rrb!!"18!N!3 -#!Irr)!!%p3#3"!3"rrmJ!!4M!*!%"+rrr`!!&"`!N!G!!!!Cc`#3"B$rr`!!'CF -!N!3"!2rr!!!CG`#3"[rr+!&cE3#3"3%!AK`!(PB-mjFF!!)!D"`!N!!I$21A#!! -$!()F!+`d$21A$!!%!(`F!21L$2(rm!!&!)BF!58[$1raR!!'!*!!(!&)6JccP`! -!"rrr!!&cb3#3"[rr+!"J'!#3"B$rr`!!!DF!N!@#rrm!!!*h!*!&KIrr*!!!J!c -aX%!!K[rr*!!"*JcY6C`!Krrr!*!$eJ#3"BMrr`!!!`%!N!@errmJ!!)&!*!%!3F -!0#!!%fi!N!3#!2rr!!!$f3#3"!)"rrm!!!3A!*!%!qMrrb!!!Y8!N!3%!Irr)!# -3"`4,!#J%!",J$2'[d!5[rrm!!"-`!*!%!3F!(#!!%5-!N!3$k2rr)!!*@!#3"!4 -,!"!%!"%+$2)!R!#!rrm!!"P!!*!&JIrr!!!C5`#3"B,rr`!!'9B!N!@$rrm!!"P -K!*!&K2rr!!!CE!#3"[rr!!'11`#3"B$rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!! -@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!%"%[rr`3!%Q8-mDr8!qMrr`!!#E3!N!@ -!rrm!!!8K!*!%rj!%!!&cL3#3"!)!N!-J!!8&!*!%!J%!"b!!"48!N!@!rrm!!!P -d!*!(6`!!'IF!N!@%rrm!!"Rc!*!%"%[rr`3!%6m-mJ!)!)6rr`!!'P)!N!@!rrm -!!A1A!*!&!Irr)!!3q!#3"3,rrb!!%0S!N!3'F(*[EA"d#-3JFh9QCQPi#dPZFf9 -bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$NphEQ9 -b)(*PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9 -RE@9ZG#!c#90PCfePER3J03P6C@GYC@jd)$B*8f9RE@9ZG#!f*-d: diff --git a/mac/tkMacRegion.c b/mac/tkMacRegion.c deleted file mode 100644 index 86e193e..0000000 --- a/mac/tkMacRegion.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - * tkMacRegion.c -- - * - * Implements X window calls for manipulating regions - * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacRegion.c,v 1.4 2002/06/14 13:35:49 dkf Exp $ - */ - -#include "tkInt.h" -#include "tkMacInt.h" -#include "X.h" -#include "Xlib.h" - -#include <Windows.h> -#include <QDOffscreen.h> - -/* - * Temporary region that can be reused. - */ -static RgnHandle tmpRgn = NULL; - - -/* - *---------------------------------------------------------------------- - * - * TkCreateRegion -- - * - * Implements the equivelent of the X window function - * XCreateRegion. See X window documentation for more details. - * - * Results: - * Returns an allocated region handle. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkRegion -TkCreateRegion() -{ - RgnHandle rgn; - - rgn = NewRgn(); - return (TkRegion) rgn; -} - -/* - *---------------------------------------------------------------------- - * - * TkDestroyRegion -- - * - * Implements the equivelent of the X window function - * XDestroyRegion. See X window documentation for more details. - * - * Results: - * None. - * - * Side effects: - * Memory is freed. - * - *---------------------------------------------------------------------- - */ - -void -TkDestroyRegion( - TkRegion r) -{ - RgnHandle rgn = (RgnHandle) r; - - DisposeRgn(rgn); -} - -/* - *---------------------------------------------------------------------- - * - * TkIntersectRegion -- - * - * Implements the equivilent of the X window function - * XIntersectRegion. See X window documentation for more details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkIntersectRegion( - TkRegion sra, - TkRegion srb, - TkRegion dr_return) -{ - RgnHandle srcRgnA = (RgnHandle) sra; - RgnHandle srcRgnB = (RgnHandle) srb; - RgnHandle destRgn = (RgnHandle) dr_return; - - SectRgn(srcRgnA, srcRgnB, destRgn); -} - -/* - *---------------------------------------------------------------------- - * - * TkUnionRectWithRegion -- - * - * Implements the equivelent of the X window function - * XUnionRectWithRegion. See X window documentation for more - * details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkUnionRectWithRegion( - XRectangle* rectangle, - TkRegion src_region, - TkRegion dest_region_return) -{ - RgnHandle srcRgn = (RgnHandle) src_region; - RgnHandle destRgn = (RgnHandle) dest_region_return; - - if (tmpRgn == NULL) { - tmpRgn = NewRgn(); - } - SetRectRgn(tmpRgn, rectangle->x, rectangle->y, - rectangle->x + rectangle->width, rectangle->y + rectangle->height); - UnionRgn(srcRgn, tmpRgn, destRgn); -} - -/* - *---------------------------------------------------------------------- - * - * TkRectInRegion -- - * - * Implements the equivelent of the X window function - * XRectInRegion. See X window documentation for more details. - * - * Results: - * Returns one of: RectangleOut, RectangleIn, RectanglePart. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkRectInRegion( - TkRegion region, - int x, - int y, - unsigned int width, - unsigned int height) -{ - RgnHandle rgn = (RgnHandle) region; - RgnHandle rectRgn, destRgn; - int result; - - rectRgn = NewRgn(); - destRgn = NewRgn(); - SetRectRgn(rectRgn, x, y, x + width, y + height); - SectRgn(rgn, rectRgn, destRgn); - if (EmptyRgn(destRgn)) { - result = RectangleOut; - } else if (EqualRgn(rgn, destRgn)) { - result = RectangleIn; - } else { - result = RectanglePart; - } - DisposeRgn(rectRgn); - DisposeRgn(destRgn); - return result; -} - -/* - *---------------------------------------------------------------------- - * - * TkClipBox -- - * - * Implements the equivelent of the X window function XClipBox. - * See X window documentation for more details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkClipBox( - TkRegion r, - XRectangle* rect_return) -{ - RgnHandle rgn = (RgnHandle) r; - - rect_return->x = (**rgn).rgnBBox.left; - rect_return->y = (**rgn).rgnBBox.top; - rect_return->width = (**rgn).rgnBBox.right - (**rgn).rgnBBox.left; - rect_return->height = (**rgn).rgnBBox.bottom - (**rgn).rgnBBox.top; -} - -/* - *---------------------------------------------------------------------- - * - * TkSubtractRegion -- - * - * Implements the equivilent of the X window function - * XSubtractRegion. See X window documentation for more details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkSubtractRegion( - TkRegion sra, - TkRegion srb, - TkRegion dr_return) -{ - RgnHandle srcRgnA = (RgnHandle) sra; - RgnHandle srcRgnB = (RgnHandle) srb; - RgnHandle destRgn = (RgnHandle) dr_return; - - DiffRgn(srcRgnA, srcRgnB, destRgn); -} diff --git a/mac/tkMacResource.r b/mac/tkMacResource.r deleted file mode 100644 index 74f469e..0000000 --- a/mac/tkMacResource.r +++ /dev/null @@ -1,437 +0,0 @@ -/* - * tkMacResources.r -- - * - * This file creates resources for use in a simple shell. - * This is designed to be an example of using the Tcl/Tk - * libraries in a Macintosh Application. - * - * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacResource.r,v 1.10 2002/09/12 17:34:16 das Exp $ - */ - -/* - * We define SystemSevenOrLater so that our dialogs may use the - * auto center feature. - */ -#define SystemSevenOrLater 1 - -#include <Types.r> -#include <SysTypes.r> - -/* - * The folowing include and defines help construct - * the version string for Tcl. - */ - -#define RC_INVOKED -#include "tcl.h" -#include "tk.h" - -/* - * The mechanisim below loads Tcl source into the resource fork of the - * application. The example below creates a TEXT resource named - * "Init" from the file "init.tcl". This allows applications to use - * Tcl to define the behavior of the application without having to - * require some predetermined file structure - all needed Tcl "files" - * are located within the application. To source a file for the - * resource fork the source command has been modified to support - * sourcing from resources. In the below case "source -rsrc {Init}" - * will load the TEXT resource named "Init". - */ - -#ifndef TCLTK_NO_LIBRARY_TEXT_RESOURCES -#include "tkMacTclCode.r" -#endif - -/* - * The following two resources define the default "About Box" for Mac Tk. - * This dialog appears if the "About Tk..." menu item is selected from - * the Apple menu. This dialog may be overridden by defining a Tcl procedure - * with the name of "tkAboutDialog". If this procedure is defined the - * default dialog will not be shown and the Tcl procedure is expected to - * create and manage an About Dialog box. - */ - -resource 'DLOG' (128, "Default About Box", purgeable) { - {85, 107, 260, 412}, dBoxProc, visible, goAway, 0, - 128, "", centerMainScreen -}; - -resource 'DITL' (128, "About Box", purgeable) { - { - {143, 147, 167, 201}, Button {enabled, "Ok"}, - { 14, 108, 137, 314}, StaticText {disabled, - "Wish - Windowing Shell" "\n" "based on Tcl " - TCL_PATCH_LEVEL " & Tk " TK_PATCH_LEVEL "\n\n" - "Jim Ingham & Ray Johnson" "\n" - "© 2001 Tcl Core Team" "\n" - "jingham@apple.com"}, - { 19, 24, 119, 92}, Picture {enabled, 128} - } -}; - -data 'PICT' (128) { - $"13A4 0000 0000 0064 0044 0011 02FF 0C00" - $"FFFE 0000 0048 0000 0048 0000 0000 0000" - $"0064 0044 0000 0000 0001 000A 0000 0000" - $"0064 0044 0099 8044 0000 0000 0064 0044" - $"0000 0000 0000 0000 0048 0000 0048 0000" - $"0000 0008 0001 0008 0000 0000 0108 00D8" - $"0000 0000 0001 5A5A 8000 00FF 3736 FF00" - $"FF00 FF00 3535 FF00 FF00 CC00 3434 FF00" - $"FF00 9900 3333 FF00 FF00 6600 3736 FF00" - $"FF00 3300 3535 FF00 FF00 0000 3434 FF00" - $"CC00 FF00 3333 FF00 CC00 CC00 3736 FF00" - $"CC00 9900 3535 FF00 CC00 6600 FAFA FF00" - $"CC00 3300 3333 FF00 CC00 0000 3130 FF00" - $"9900 FF00 2F2F FF00 9900 CC00 FAFA FF00" - $"9900 9900 F9F9 FF00 9900 6600 3130 FF00" - $"9900 3300 2F2F FF00 9900 0000 2E2E FF00" - $"6600 FF00 F9F9 FF00 6600 CC00 3130 FF00" - $"6600 9900 2F2F FF00 6600 6600 2E2E FF00" - $"6600 3300 2D2D FF00 6600 0000 3130 FF00" - $"3300 FF00 2F2F FF00 3300 CC00 2E2E FF00" - $"3300 9900 2D2D FF00 3300 6600 3130 FF00" - $"3300 3300 2F2F FF00 3300 0000 2E2E FF00" - $"0000 FF00 2D2D FF00 0000 CC00 3130 FF00" - $"0000 9900 2F2F FF00 0000 6600 2E2E FF00" - $"0000 3300 2DF8 FF00 0000 0000 2B2A CC00" - $"FF00 FF00 2929 CC00 FF00 CC00 2828 CC00" - $"FF00 9900 27F8 CC00 FF00 6600 2B2A CC00" - $"FF00 3300 2929 CC00 FF00 0000 2828 CC00" - $"CC00 FF00 2727 CC00 CC00 CC00 2B2A CC00" - $"CC00 9900 2929 CC00 CC00 6600 2828 CC00" - $"CC00 3300 2727 CC00 CC00 0000 2B2A CC00" - $"9900 FF00 2929 CC00 9900 CC00 2828 CC00" - $"9900 9900 2727 CC00 9900 6600 DBDB CC00" - $"9900 3300 4747 CC00 9900 0000 4646 CC00" - $"6600 FF00 4545 CC00 6600 CC00 DBDB CC00" - $"6600 9900 4747 CC00 6600 6600 4646 CC00" - $"6600 3300 4545 CC00 6600 0000 DBDB CC00" - $"3300 FF00 4747 CC00 3300 CC00 4646 CC00" - $"3300 9900 4545 CC00 3300 6600 DBDB CC00" - $"3300 3300 4141 CC00 3300 0000 4040 CC00" - $"0000 FF00 3F3F CC00 0000 CC00 4342 CC00" - $"0000 9900 4141 CC00 0000 6600 4040 CC00" - $"0000 3300 3F3F CC00 0000 0000 4342 9900" - $"FF00 FF00 4141 9900 FF00 CC00 4040 9900" - $"FF00 9900 3F3F 9900 FF00 6600 4342 9900" - $"FF00 3300 4141 9900 FF00 0000 4040 9900" - $"CC00 FF00 3F3F 9900 CC00 CC00 4342 9900" - $"CC00 9900 4141 9900 CC00 6600 4040 9900" - $"CC00 3300 3F3F 9900 CC00 0000 4342 9900" - $"9900 FF00 4141 9900 9900 CC00 4040 9900" - $"9900 9900 3F3F 9900 9900 6600 3D3C 9900" - $"9900 3300 3B3B 9900 9900 0000 3A3A 9900" - $"6600 FF00 3939 9900 6600 CC00 3D3C 9900" - $"6600 9900 3B3B 9900 6600 6600 3A3A 9900" - $"6600 3300 3939 9900 6600 0000 3D3C 9900" - $"3300 FF00 3B3B 9900 3300 CC00 3A3A 9900" - $"3300 9900 3939 9900 3300 6600 3D3C 9900" - $"3300 3300 3B3B 9900 3300 0000 3A3A 9900" - $"0000 FF00 3939 9900 0000 CC00 3D3C 9900" - $"0000 9900 3B3B 9900 0000 6600 3A3A 9900" - $"0000 3300 3939 9900 0000 0000 3D3C 6600" - $"FF00 FF00 3B3B 6600 FF00 CC00 3A3A 6600" - $"FF00 9900 3939 6600 FF00 6600 3D3C 6600" - $"FF00 3300 3B3B 6600 FF00 0000 3A3A 6600" - $"CC00 FF00 3939 6600 CC00 CC00 3736 6600" - $"CC00 9900 3535 6600 CC00 6600 3434 6600" - $"CC00 3300 3333 6600 CC00 0000 3736 6600" - $"9900 FF00 3535 6600 9900 CC00 3434 6600" - $"9900 9900 3333 6600 9900 6600 3736 6600" - $"9900 3300 3535 6600 9900 0000 3434 6600" - $"6600 FF00 3333 6600 6600 CC00 3736 6600" - $"6600 9900 3535 6600 6600 6600 3434 6600" - $"6600 3300 3333 6600 6600 0000 3736 6600" - $"3300 FF00 3535 6600 3300 CC00 3434 6600" - $"3300 9900 3333 6600 3300 6600 3736 6600" - $"3300 3300 3535 6600 3300 0000 3434 6600" - $"0000 FF00 3333 6600 0000 CC00 3130 6600" - $"0000 9900 2F2F 6600 0000 6600 2E2E 6600" - $"0000 3300 F9F9 6600 0000 0000 3130 3300" - $"FF00 FF00 2F2F 3300 FF00 CC00 2E2E 3300" - $"FF00 9900 F9F9 3300 FF00 6600 3130 3300" - $"FF00 3300 2F2F 3300 FF00 0000 2E2E 3300" - $"CC00 FF00 2D2D 3300 CC00 CC00 3130 3300" - $"CC00 9900 2F2F 3300 CC00 6600 2E2E 3300" - $"CC00 3300 2D2D 3300 CC00 0000 3130 3300" - $"9900 FF00 2F2F 3300 9900 CC00 2E2E 3300" - $"9900 9900 2D2D 3300 9900 6600 3130 3300" - $"9900 3300 2F2F 3300 9900 0000 2E2E 3300" - $"6600 FF00 2DF8 3300 6600 CC00 2B2A 3300" - $"6600 9900 2929 3300 6600 6600 2828 3300" - $"6600 3300 27F8 3300 6600 0000 2B2A 3300" - $"3300 FF00 2929 3300 3300 CC00 2828 3300" - $"3300 9900 2727 3300 3300 6600 2B2A 3300" - $"3300 3300 2929 3300 3300 0000 2828 3300" - $"0000 FF00 2727 3300 0000 CC00 2B2A 3300" - $"0000 9900 2929 3300 0000 6600 2828 3300" - $"0000 3300 2727 3300 0000 0000 4948 0000" - $"FF00 FF00 4747 0000 FF00 CC00 4646 0000" - $"FF00 9900 4545 0000 FF00 6600 4948 0000" - $"FF00 3300 4747 0000 FF00 0000 4646 0000" - $"CC00 FF00 4545 0000 CC00 CC00 4948 0000" - $"CC00 9900 4747 0000 CC00 6600 4646 0000" - $"CC00 3300 4545 0000 CC00 0000 4342 0000" - $"9900 FF00 4141 0000 9900 CC00 4040 0000" - $"9900 9900 3F3F 0000 9900 6600 4342 0000" - $"9900 3300 4141 0000 9900 0000 4040 0000" - $"6600 FF00 3F3F 0000 6600 CC00 4342 0000" - $"6600 9900 4141 0000 6600 6600 4040 0000" - $"6600 3300 3F3F 0000 6600 0000 4342 0000" - $"3300 FF00 4141 0000 3300 CC00 4040 0000" - $"3300 9900 3F3F 0000 3300 6600 4342 0000" - $"3300 3300 4141 0000 3300 0000 4040 0000" - $"0000 FF00 3F3F 0000 0000 CC00 4342 0000" - $"0000 9900 4141 0000 0000 6600 4040 0000" - $"0000 3300 3F3F EE00 0000 0000 3D3C DD00" - $"0000 0000 3B3B BB00 0000 0000 3A3A AA00" - $"0000 0000 3939 8800 0000 0000 3D3C 7700" - $"0000 0000 3B3B 5500 0000 0000 3A3A 4400" - $"0000 0000 3939 2200 0000 0000 3D3C 1100" - $"0000 0000 3B3B 0000 EE00 0000 3A3A 0000" - $"DD00 0000 3939 0000 BB00 0000 3D3C 0000" - $"AA00 0000 3B3B 0000 8800 0000 3A3A 0000" - $"7700 0000 3939 0000 5500 0000 3D3C 0000" - $"4400 0000 3B3B 0000 2200 0000 3A3A 0000" - $"1100 0000 3939 0000 0000 EE00 3D3C 0000" - $"0000 DD00 3B3B 0000 0000 BB00 3A3A 0000" - $"0000 AA00 3939 0000 0000 8800 3D3C 0000" - $"0000 7700 3B3B 0000 0000 5500 3A3A 0000" - $"0000 4400 3939 0000 0000 2200 3736 0000" - $"0000 1100 3535 EE00 EE00 EE00 3434 DD00" - $"DD00 DD00 3333 BB00 BB00 BB00 3736 AA00" - $"AA00 AA00 3535 8800 8800 8800 3434 7700" - $"7700 7700 3333 5500 5500 5500 3736 4400" - $"4400 4400 3535 2200 2200 2200 3434 1100" - $"1100 1100 3333 0000 0000 0000 0000 0000" - $"0064 0044 0000 0000 0064 0044 0000 000A" - $"0000 0000 0064 0044 02BD 0013 E800 01F5" - $"F6FE 07FE 0E02 3232 33FD 3900 0EE6 001D" - $"FC00 01F5 F5FE 0700 08FE 0E02 3232 33FE" - $"3900 3AFC 40F2 4102 4033 07E9 0017 0100" - $"0EFC 40DC 4102 390E F5F5 0002 F5F5 F6FE" - $"0702 0E07 0016 0100 32D5 4104 4039 0E32" - $"33FD 3900 3AFC 40FC 4101 3200 0801 000E" - $"C141 010E 0008 0100 0EC1 4101 0800 0801" - $"000E C141 0107 0008 0100 0EC1 4101 0700" - $"0901 0007 C241 0240 F500 0E01 0007 E841" - $"0147 47DD 4102 4000 0012 0100 07F0 4100" - $"47FA 4101 3B3B DD41 0240 0000 1901 0007" - $"F141 0C47 3B0B 3B47 4141 4711 0505 3B47" - $"DF41 023A 0000 1701 00F6 F041 010B 0BFE" - $"4105 473B 0505 113B DE41 0239 0000 1A02" - $"00F5 40F3 410C 473B 053B 4741 4741 0B0B" - $"3B47 47DE 4102 3900 0018 0200 F540 F341" - $"0247 110B FE41 0447 1105 4147 DC41 0233" - $"0000 1B02 0000 40F3 4103 4711 1147 FE41" - $"0205 3547 F741 FD47 E941 0232 0000 1E02" - $"0000 40F2 4106 113B 4741 4735 0BF7 4106" - $"4741 390E 0E40 47EA 4102 0E00 0021 0200" - $"0040 F241 0711 3B47 4141 0B35 47F9 4102" - $"4740 07FE 0002 F640 47EB 4102 0E00 0023" - $"0200 0040 F341 0847 3541 4147 3B05 4147" - $"FA41 0947 3AF6 00F5 4F55 F50E 47EB 4102" - $"0700 0022 0200 003A F341 0147 3BFE 4101" - $"0B0B F941 0547 3AF5 0055 C8FE CE01 5640" - $"EB41 0207 0000 1F02 0000 39F0 4104 4741" - $"053B 47FB 4104 4740 F5F5 A4FC CE01 C85D" - $"EB41 02F6 0000 1F02 0000 39F0 4104 473B" - $"0541 47FC 4104 4740 07F6 C8FA CE00 64EC" - $"4103 40F5 0000 1C02 0000 39F0 4102 4711" - $"0BFA 4103 4708 2AC8 FACE 0164 D8EC 4100" - $"40FE 0025 0200 0039 EF41 020B 3B47 FC41" - $"0347 0FF5 A4FB CE02 C887 D8FC 41FE 47FC" - $"4100 47F9 4100 3AFE 0028 0200 0039 EF41" - $"020B 3B47 FD41 0347 3900 A4FA CE00 ABFA" - $"4109 3B11 3B41 4147 3B0B 3B47 FA41 0039" - $"FE00 2402 0000 33F1 4102 4741 0BFA 4101" - $"0779 F9CE 0064 FA41 0235 050B FD41 010B" - $"0BF9 4100 39FE 0028 0200 0032 F141 0247" - $"3B0B FC41 0247 39F6 F9CE 0187 D8FB 4103" - $"4741 050B FE41 0247 110B F941 0039 FE00" - $"2C02 0000 32F1 4102 473B 11FB 4101 0879" - $"FACE 05AA 4041 4147 47FE 410A 4741 0511" - $"4741 4147 3511 47FA 4100 32FE 002F 0200" - $"000E F141 0347 3B11 47FE 4103 4740 F6C8" - $"FACE 0564 D841 4039 39FE 4104 473B 053B" - $"47FE 4102 3541 47FA 4100 0EFE 0027 0200" - $"000E F141 0347 3B3B 47FE 4102 470F 79FA" - $"CE0C 8741 4032 F500 003A 4741 473B 05F2" - $"4100 0EFE 0027 0200 000E F141 0347 3B3B" - $"47FD 4101 0EA4 FACE 01AB AAFE C808 7900" - $"3947 4147 110B 47F3 4100 07FE 001C 0200" - $"000E EA41 0240 2BC8 F5CE 0881 0033 4741" - $"410B 3B47 F341 0007 FE00 1A02 0000 08EB" - $"4102 473A 55F4 CE06 5D00 3947 4741 0BF1" - $"4100 F6FE 001C 0200 0007 EB41 0247 3979" - $"F4CE 0739 0039 4747 3511 47F3 4101 40F5" - $"FE00 1C02 0000 07EB 4102 4739 A4F5 CE08" - $"AB0E 0040 4741 1141 47F3 4100 40FD 001B" - $"0200 0007 EB41 0247 39A4 F5CE 0787 0707" - $"4147 4111 47F2 4100 40FD 001B 0200 0007" - $"EB41 0247 39C8 F5CE 0763 F532 4747 3B3B" - $"47F2 4100 3AFD 001A 0300 00F6 40EC 4102" - $"4739 C8F5 CE05 39F5 4047 413B F041 0039" - $"FD00 1C03 0000 F540 EB41 0140 C8FD CE01" - $"C8A4 FCCE 03AB 080E 47ED 4100 39FD 001A" - $"FE00 0040 EB41 0040 FCCE 01A4 C8FC CE03" - $"FA07 4047 ED41 0032 FD00 1AFE 0000 40EA" - $"4100 AAFE CE02 87F9 C8FC CE02 560F 47EC" - $"4100 32FD 0019 FE00 0040 EA41 00AB FECE" - $"0264 56C8 FDCE 01C8 32EA 4100 0EFD 001B" - $"FE00 0040 ED41 030E 4047 87FE CE01 4055" - $"FCCE 01FA 40EA 4100 08FD 001A FE00 003A" - $"ED41 0807 0740 FBCE CEAB 3979 FDCE 00AB" - $"E841 0007 FD00 1CFE 0000 3AED 4108 0700" - $"F6A4 CECE 8733 79FD CE02 4147 47EA 4100" - $"07FD 001E FE00 0039 ED41 0807 2AA4 C8CE" - $"CE88 0E9D FECE 0364 1C39 39EB 4101 40F5" - $"FD00 1CFE 0000 39ED 4101 074F FDCE 0264" - $"F7A4 FECE 03AB 80F6 07EB 4100 40FC 001C" - $"FE00 0039 ED41 0108 79FE CE03 AB40 2BA4" - $"FCCE 02F7 0E47 EC41 0040 FC00 1CFE 0000" - $"39ED 4101 0879 FECE 03AB 40F6 C8FC CE02" - $"F615 47EC 4100 40FC 001E FE00 003A EE41" - $"0247 0E79 FECE 03AB 40F5 C8FD CE03 A4F5" - $"3A47 EC41 0040 FC00 1EFE 0000 3AEE 4102" - $"470E 56FE CE03 FB3A F6C8 FDCE 0280 F540" - $"EB41 0140 F5FD 001E FE00 0040 EE41 0947" - $"0F56 CECE C888 39F6 C8FD CE02 5601 40EB" - $"4101 40F5 FD00 1CFE 0000 40EE 4109 4739" - $"32CE CEC8 8839 2AC8 FDCE 0156 07E9 4100" - $"F6FD 001B FE00 0040 EE41 0847 3A32 CECE" - $"C864 152A FCCE 0132 07E9 4100 07FD 001A" - $"FE00 0040 ED41 0740 32AB CEC8 6439 4EFC" - $"CE01 3A07 E941 0007 FD00 1D03 0000 F540" - $"ED41 0740 0EAB CECE 640F 4EFD CE03 AB40" - $"0840 EA41 0007 FD00 1B03 0000 F540 EC41" - $"060F 81CE CE64 334E FDCE 02AB 400E E941" - $"000E FD00 1C02 0000 F6EC 4107 4715 FACE" - $"CE64 334E FDCE 0387 0F0E 47EA 4100 0EFD" - $"001C 0200 0007 EC41 0747 16F9 CEC8 6433" - $"4EFD CE03 6308 4047 EA41 000E FD00 1A02" - $"0000 07EB 4106 40F9 CEC8 6439 4EFD CE02" - $"3940 47E9 4100 32FD 001B 0200 0007 EA41" - $"0539 CECE 8839 F6FE CE04 AB41 4139 40EA" - $"4100 32FD 001C 0200 0007 EB41 0E47 3AC8" - $"CE88 39F6 C8CE CE64 15F6 F540 EA41 0033" - $"FD00 1A02 0000 07EA 410C 40A4 CE87 392A" - $"C8CE AB41 40F8 F6E9 4100 39FD 001B 0200" - $"000E EB41 0D47 41AB C887 39F5 C8CE ABAB" - $"CEA4 07E9 4100 39FD 001C 0200 000E ED41" - $"0947 3939 4787 C8AB 40F5 C8FD CE01 A40E" - $"E941 0039 FD00 1D02 0000 0EED 4109 473A" - $"0007 80CE AB40 F5C8 FDCE 0255 0E47 EA41" - $"0039 FD00 1B02 0000 0EEB 4107 0779 C8CE" - $"CE40 F6A4 FDCE 022B 3947 EA41 003A FD00" - $"1C02 0000 0EEC 4102 4739 79FE CE02 6407" - $"A4FE CE02 A407 40E9 4100 40FD 001A 0200" - $"0032 EA41 0632 A4CE CE88 0879 FECE 02F9" - $"0F47 E941 0040 FD00 1A02 0000 32EB 4107" - $"4740 F7C8 CE87 0E79 FECE 0132 40E8 4100" - $"40FD 0019 0200 0033 EA41 0B47 40F8 C8AB" - $"0E55 CECE 8015 47E8 4100 40FD 0017 0200" - $"0033 E941 0847 40F9 A439 4FCE CE5D E641" - $"0140 F5FE 0014 0200 0039 E841 0647 64FB" - $"392B C8AB E441 00F6 FE00 1102 0000 39E5" - $"4103 40F6 8764 E441 0007 FE00 1E02 0000" - $"39EB 4102 3A0E 0EFD 4102 0740 47F6 4104" - $"400F 0839 47F4 4100 07FE 0027 0200 0039" - $"FB41 0147 47F2 4102 0800 40FE 4102 0839" - $"47FC 4101 4747 FC41 0339 0039 47F4 4100" - $"07FE 0029 0200 0039 FB41 0140 39F3 4109" - $"470E F540 4141 470E 3347 FC41 0139 3AFD" - $"4104 4739 0039 47F4 4100 08FE 0036 0200" - $"003A FC41 0347 0E00 40FC 4102 4741 40FC" - $"4109 470E F540 4141 4733 0E47 FE41 0447" - $"4000 0E47 FE41 0447 3900 3941 FE40 F741" - $"000E FE00 3A02 0000 3AFD 410E 4740 0700" - $"0E40 4741 4147 390E 390E 40FE 4108 470E" - $"F540 4141 4739 0EFC 4103 0F00 0739 FE41" - $"0747 3900 3940 080F 39F7 4100 0EFE 0035" - $"0200 0040 FB41 020E 0040 FE41 0D47 4000" - $"3941 0032 4741 4147 0EF5 40FE 4101 4008" - $"FC41 023A 000E FD41 0547 3900 3939 33F5" - $"4100 0EFE 0039 0200 0040 FC41 0347 0E00" - $"40FE 4106 4732 0040 4139 40FE 4103 470E" - $"F540 FD41 0108 40FE 4104 4740 000E 47FE" - $"4106 4739 0007 F540 47F6 4100 32FE 003A" - $"0200 0040 FC41 0C47 0E00 4047 4141 470E" - $"0040 4747 FD41 0347 0EF5 40FE 410A 470E" - $"3947 4141 4740 000E 47FE 4107 4739 000E" - $"0007 4147 F741 0032 FE00 3802 0000 40FC" - $"4102 470E 00FD 4106 4739 003A 4740 39FE" - $"4102 470E F5FD 410A 4733 3347 4141 4740" - $"000E 47FE 4106 4739 0039 3900 0EF6 4100" - $"33FE 003A 0200 F540 FC41 0447 3200 0E39" - $"FD41 0B0E 0E40 333A 4741 413A 07F5 39FE" - $"4102 473A 0EFD 410F 40F5 0733 4041 4140" - $"0E00 0E40 0700 0E40 F841 0039 FE00 2902" - $"00F5 40FA 4101 3939 FB41 023A 3A40 FD41" - $"FD40 FD41 0240 0E40 FD41 0240 3940 FD41" - $"FA40 F741 0039 FE00 2A01 00F6 F941 0147" - $"47FB 4101 4747 FB41 0147 47FB 4101 3940" - $"FD41 0147 47FB 4100 47FE 4100 47F6 4100" - $"39FE 000D 0100 07E1 4100 40E4 4100 3AFE" - $"0009 0100 07C3 4100 3AFE 0009 0100 07C3" - $"4100 40FE 0009 0100 07C3 4100 40FE 0009" - $"0100 07C3 4100 40FE 000A 0100 0EC3 4103" - $"40F5 0000 0901 000E C241 02F6 0000 0901" - $"000E C241 0207 0000 0901 000E C241 0207" - $"0000 1101 000E ED41 FE40 003A F940 E241" - $"0207 0000 2B01 0032 F941 FE40 FE39 0632" - $"0E0E 0707 F6F5 F800 02F5 F5F6 FB07 FB0E" - $"0332 3233 33FB 3901 3A3A FB40 0207 0000" - $"0E0A 000E 3939 320E 0E07 07F6 F5C8 0002" - $"BD00 00FF" -}; - -/* - * Here is the custom file open dialog. This dialog is used instead of - * the default file dialog if the -filetypes flag is specified. - */ - -resource 'DLOG' (130, purgeable) { - {0, 0, 195, 344}, dBoxProc, invisible, noGoAway, 0, - 130, "", noAutoCenter -}; - -resource 'DITL' (130, "File Open Box", purgeable) { - { - {135, 252, 155, 332}, Button {enabled, "Open"}, - {104, 252, 124, 332}, Button {enabled, "Cancel"}, - { 0, 0, 0, 0}, HelpItem {disabled, HMScanhdlg {130}}, - { 8, 235, 24, 337}, UserItem {enabled}, - { 32, 252, 52, 332}, Button {enabled, "Eject"}, - { 60, 252, 80, 332}, Button {enabled, "Desktop"}, - { 29, 12, 159, 230}, UserItem {enabled}, - { 6, 12, 25, 230}, UserItem {enabled}, - { 91, 251, 92, 333}, Picture {disabled, 11}, - {168, 20, 187, 300}, Control {enabled, 131} - } -}; - -resource 'CNTL' (131, "File Types menu", purgeable) { - {168, 20, 187, 300}, - popupTitleLeftJust, - visible, - 80, - 132, - popupMenuCDEFProc, - 0, - "File Type:" -}; - - -resource 'MENU' (132, preload) { - 132, - textMenuProc, - 0xFFFF, enabled, "", {} -}; diff --git a/mac/tkMacScale.c b/mac/tkMacScale.c deleted file mode 100644 index 4db06b2..0000000 --- a/mac/tkMacScale.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * tkMacScale.c -- - * - * This file implements the Macintosh specific portion of the - * scale widget. - * - * Copyright (c) 1996 by Sun Microsystems, Inc. - * Copyright (c) 1998-2000 by Scriptics Corporation. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacScale.c,v 1.7 2000/04/19 09:25:54 hobbs Exp $ - */ - -#include "tkScale.h" -#include "tkInt.h" -#include <Controls.h> -#include "tkMacInt.h" - -/* - * Defines used in this file. - */ -#define slider 1110 -#define inSlider 1 -#define inInc 2 -#define inDecr 3 - -/* - * Declaration of Macintosh specific scale structure. - */ - -typedef struct MacScale { - TkScale info; /* Generic scale info. */ - int flags; /* Flags. */ - ControlRef scaleHandle; /* Handle to the Scale control struct. */ -} MacScale; - -/* - * Globals uses locally in this file. - */ -static ControlActionUPP scaleActionProc = NULL; /* Pointer to func. */ - -/* - * Forward declarations for procedures defined later in this file: - */ - -static void MacScaleEventProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static pascal void ScaleActionProc _ANSI_ARGS_((ControlRef theControl, - ControlPartCode partCode)); - -/* - *---------------------------------------------------------------------- - * - * TkpCreateScale -- - * - * Allocate a new TkScale structure. - * - * Results: - * Returns a newly allocated TkScale structure. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkScale * -TkpCreateScale(tkwin) - Tk_Window tkwin; -{ - MacScale *macScalePtr;; - - macScalePtr = (MacScale *) ckalloc(sizeof(MacScale)); - macScalePtr->scaleHandle = NULL; - if (scaleActionProc == NULL) { - scaleActionProc = NewControlActionProc(ScaleActionProc); - } - - Tk_CreateEventHandler(tkwin, ButtonPressMask, - MacScaleEventProc, (ClientData) macScalePtr); - - return (TkScale *) macScalePtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyScale -- - * - * Free Macintosh specific resources. - * - * Results: - * None - * - * Side effects: - * The slider control is destroyed. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyScale(scalePtr) - TkScale *scalePtr; -{ - MacScale *macScalePtr = (MacScale *) scalePtr; - - /* - * Free Macintosh control. - */ - if (macScalePtr->scaleHandle != NULL) { - DisposeControl(macScalePtr->scaleHandle); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpDisplayScale -- - * - * This procedure is invoked as an idle handler to redisplay - * the contents of a scale widget. - * - * Results: - * None. - * - * Side effects: - * The scale gets redisplayed. - * - *---------------------------------------------------------------------- - */ - -void -TkpDisplayScale(clientData) - ClientData clientData; /* Widget record for scale. */ -{ - TkScale *scalePtr = (TkScale *) clientData; - Tk_Window tkwin = scalePtr->tkwin; - Tcl_Interp *interp = scalePtr->interp; - int result; - char string[PRINT_CHARS]; - MacScale *macScalePtr = (MacScale *) clientData; - Rect r; - WindowRef windowRef; - GWorldPtr destPort; - CGrafPtr saveWorld; - GDHandle saveDevice; - MacDrawable *macDraw; - - scalePtr->flags &= ~REDRAW_PENDING; - if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) { - goto done; - } - - /* - * Invoke the scale's command if needed. - */ - - Tcl_Preserve((ClientData) scalePtr); - if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) { - Tcl_Preserve((ClientData) interp); - sprintf(string, scalePtr->format, scalePtr->value); - result = Tcl_VarEval(interp, scalePtr->command, " ", string, - (char *) NULL); - if (result != TCL_OK) { - Tcl_AddErrorInfo(interp, "\n (command executed by scale)"); - Tcl_BackgroundError(interp); - } - Tcl_Release((ClientData) interp); - } - scalePtr->flags &= ~INVOKE_COMMAND; - if (scalePtr->flags & SCALE_DELETED) { - Tcl_Release((ClientData) scalePtr); - return; - } - Tcl_Release((ClientData) scalePtr); - - /* - * Now handle the part of redisplay that is the same for - * horizontal and vertical scales: border and traversal - * highlight. - */ - - if (scalePtr->highlightWidth != 0) { - GC gc; - - gc = Tk_GCForColor(scalePtr->highlightColorPtr, Tk_WindowId(tkwin)); - Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth, - Tk_WindowId(tkwin)); - } - Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), scalePtr->bgBorder, - scalePtr->highlightWidth, scalePtr->highlightWidth, - Tk_Width(tkwin) - 2*scalePtr->highlightWidth, - Tk_Height(tkwin) - 2*scalePtr->highlightWidth, - scalePtr->borderWidth, scalePtr->relief); - - /* - * Set up port for drawing Macintosh control. - */ - macDraw = (MacDrawable *) Tk_WindowId(tkwin); - destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin)); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(Tk_WindowId(tkwin)); - - /* - * Create Macintosh control. - */ - if (macScalePtr->scaleHandle == NULL) { - r.left = r.top = 0; - r.right = r.bottom = 1; - /* TODO: initial value. */ - /* 16*slider+4 */ - macScalePtr->scaleHandle = NewControl((WindowRef) destPort, - &r, "\p", false, (short) 35, 0, 1000, - 16*slider, (SInt32) macScalePtr); - - /* - * If we are foremost than make us active. - */ - if ((WindowPtr) destPort == FrontWindow()) { - macScalePtr->flags |= ACTIVE; - } - } - windowRef = (**macScalePtr->scaleHandle).contrlOwner; - - /* - * We can't use the Macintosh commands SizeControl and MoveControl as these - * calls will also cause a redraw which in our case will also cause - * flicker. To avoid this we adjust the control record directly. The - * Draw1Control command appears to just draw where ever the control says to - * draw so this seems right. - * - * NOTE: changing the control record directly may not work when - * Apple releases the Copland version of the MacOS in late 1996. - */ - - (**macScalePtr->scaleHandle).contrlRect.left = macDraw->xOff - + scalePtr->inset; - (**macScalePtr->scaleHandle).contrlRect.top = macDraw->yOff - + scalePtr->inset; - (**macScalePtr->scaleHandle).contrlRect.right = macDraw->xOff - + Tk_Width(tkwin) - scalePtr->inset; - (**macScalePtr->scaleHandle).contrlRect.bottom = macDraw->yOff - + Tk_Height(tkwin) - scalePtr->inset; - - /* - * Set the thumb and resolution etc. - */ - (**macScalePtr->scaleHandle).contrlMin = (SInt16) scalePtr->toValue; - (**macScalePtr->scaleHandle).contrlMax = (SInt16) scalePtr->fromValue; - (**macScalePtr->scaleHandle).contrlValue = (SInt16) scalePtr->value; - - /* - * Finally draw the control. - */ - (**macScalePtr->scaleHandle).contrlVis = 255; - (**macScalePtr->scaleHandle).contrlHilite = 0; - Draw1Control(macScalePtr->scaleHandle); - - SetGWorld(saveWorld, saveDevice); - - done: - scalePtr->flags &= ~REDRAW_ALL; -} - -/* - *---------------------------------------------------------------------- - * - * TkpScaleElement -- - * - * Determine which part of a scale widget lies under a given - * point. - * - * Results: - * The return value is either TROUGH1, SLIDER, TROUGH2, or - * OTHER, depending on which of the scale's active elements - * (if any) is under the point at (x,y). - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpScaleElement(scalePtr, x, y) - TkScale *scalePtr; /* Widget record for scale. */ - int x, y; /* Coordinates within scalePtr's window. */ -{ - MacScale *macScalePtr = (MacScale *) scalePtr; - ControlPartCode part; - Point where; - Rect bounds; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(Tk_WindowId(scalePtr->tkwin)); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - /* - * All of the calculations in this procedure mirror those in - * DisplayScrollbar. Be sure to keep the two consistent. - */ - - TkMacWinBounds((TkWindow *) scalePtr->tkwin, &bounds); - where.h = x + bounds.left; - where.v = y + bounds.top; - part = TestControl(macScalePtr->scaleHandle, where); - - SetGWorld(saveWorld, saveDevice); - - switch (part) { - case inSlider: - return SLIDER; - case inInc: - if (scalePtr->orient == ORIENT_VERTICAL) { - return TROUGH1; - } else { - return TROUGH2; - } - case inDecr: - if (scalePtr->orient == ORIENT_VERTICAL) { - return TROUGH2; - } else { - return TROUGH1; - } - default: - return OTHER; - } -} - -/* - *-------------------------------------------------------------- - * - * MacScaleEventProc -- - * - * This procedure is invoked by the Tk dispatcher for - * ButtonPress events on scales. - * - * Results: - * None. - * - * Side effects: - * When the window gets deleted, internal structures get - * cleaned up. When it gets exposed, it is redisplayed. - * - *-------------------------------------------------------------- - */ - -static void -MacScaleEventProc(clientData, eventPtr) - ClientData clientData; /* Information about window. */ - XEvent *eventPtr; /* Information about event. */ -{ - MacScale *macScalePtr = (MacScale *) clientData; - Point where; - Rect bounds; - int part, x, y, dummy; - unsigned int state; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - Window dummyWin; - - /* - * To call Macintosh control routines we must have the port - * set to the window containing the control. We will then test - * which part of the control was hit and act accordingly. - */ - destPort = TkMacGetDrawablePort(Tk_WindowId(macScalePtr->info.tkwin)); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(Tk_WindowId(macScalePtr->info.tkwin)); - - TkMacWinBounds((TkWindow *) macScalePtr->info.tkwin, &bounds); - where.h = eventPtr->xbutton.x + bounds.left; - where.v = eventPtr->xbutton.y + bounds.top; - part = TestControl(macScalePtr->scaleHandle, where); - if (part == 0) { - return; - } - - part = TrackControl(macScalePtr->scaleHandle, where, scaleActionProc); - - /* - * Update the value for the widget. - */ - macScalePtr->info.value = (**macScalePtr->scaleHandle).contrlValue; - /* TkScaleSetValue(&macScalePtr->info, macScalePtr->info.value, 1, 0); */ - - /* - * The TrackControl call will "eat" the ButtonUp event. We now - * generate a ButtonUp event so Tk will unset implicit grabs etc. - */ - GetMouse(&where); - XQueryPointer(NULL, None, &dummyWin, &dummyWin, &x, - &y, &dummy, &dummy, &state); - TkGenerateButtonEvent(x, y, Tk_WindowId(macScalePtr->info.tkwin), state); - - SetGWorld(saveWorld, saveDevice); -} - -/* - *-------------------------------------------------------------- - * - * ScaleActionProc -- - * - * Callback procedure used by the Macintosh toolbox call - * TrackControl. This call will update the display while - * the scrollbar is being manipulated by the user. - * - * Results: - * None. - * - * Side effects: - * May change the display. - * - *-------------------------------------------------------------- - */ - -static pascal void -ScaleActionProc(ControlRef theControl, ControlPartCode partCode) - /* ControlRef theControl; /* Handle to scrollbat control */ - /* ControlPartCode partCode; /* Part of scrollbar that was "hit" */ -{ - register int value; - register TkScale *scalePtr = (TkScale *) GetCRefCon(theControl); - - value = (**theControl).contrlValue; - TkScaleSetValue(scalePtr, value, 1, 1); - Tcl_Preserve((ClientData) scalePtr); - Tcl_DoOneEvent(TCL_IDLE_EVENTS); - Tcl_Release((ClientData) scalePtr); -} - diff --git a/mac/tkMacScrlbr.c b/mac/tkMacScrlbr.c deleted file mode 100644 index 32eb6a4..0000000 --- a/mac/tkMacScrlbr.c +++ /dev/null @@ -1,1069 +0,0 @@ -/* - * tkMacScrollbar.c -- - * - * This file implements the Macintosh specific portion of the scrollbar - * widget. The Macintosh scrollbar may also draw a windows grow - * region under certain cases. - * - * Copyright (c) 1996 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacScrlbr.c,v 1.6 2001/11/23 02:06:27 das Exp $ - */ - -#include "tkScrollbar.h" -#include "tkMacInt.h" -#include <Controls.h> -#include <ControlDefinitions.h> - -/* - * The following definitions should really be in MacOS - * header files. They are included here as this is the only - * file that needs the declarations. - */ -typedef pascal void (*ThumbActionFunc)(void); - -#if GENERATINGCFM -typedef UniversalProcPtr ThumbActionUPP; -#else -typedef ThumbActionFunc ThumbActionUPP; -#endif - -enum { - uppThumbActionProcInfo = kPascalStackBased -}; - -#if GENERATINGCFM -#define NewThumbActionProc(userRoutine) \ - (ThumbActionUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppThumbActionProcInfo, GetCurrentArchitecture()) -#else -#define NewThumbActionProc(userRoutine) \ - ((ThumbActionUPP) (userRoutine)) -#endif - -/* - * Minimum slider length, in pixels (designed to make sure that the slider - * is always easy to grab with the mouse). - */ - -#define MIN_SLIDER_LENGTH 5 - -/* - * Declaration of Windows specific scrollbar structure. - */ - -typedef struct MacScrollbar { - TkScrollbar info; /* Generic scrollbar info. */ - ControlRef sbHandle; /* Handle to the Scrollbar control struct. */ - int macFlags; /* Various flags; see below. */ -} MacScrollbar; - -/* - * Flag bits for scrollbars on the Mac: - * - * ALREADY_DEAD: Non-zero means this scrollbar has been - * destroyed, but has not been cleaned up. - * IN_MODAL_LOOP: Non-zero means this scrollbar is in the middle - * of a modal loop. - * ACTIVE: Non-zero means this window is currently - * active (in the foreground). - * FLUSH_TOP: Flush with top of Mac window. - * FLUSH_BOTTOM: Flush with bottom of Mac window. - * FLUSH_RIGHT: Flush with right of Mac window. - * FLUSH_LEFT: Flush with left of Mac window. - * SCROLLBAR_GROW: Non-zero means this window draws the grow - * region for the toplevel window. - * AUTO_ADJUST: Non-zero means we automatically adjust - * the size of the widget to align correctly - * along a Mac window. - * DRAW_GROW: Non-zero means we draw the grow region. - */ - -#define ALREADY_DEAD 1 -#define IN_MODAL_LOOP 2 -#define ACTIVE 4 -#define FLUSH_TOP 8 -#define FLUSH_BOTTOM 16 -#define FLUSH_RIGHT 32 -#define FLUSH_LEFT 64 -#define SCROLLBAR_GROW 128 -#define AUTO_ADJUST 256 -#define DRAW_GROW 512 - -/* - * Globals uses locally in this file. - */ -static ControlActionUPP scrollActionProc = NULL; /* Pointer to func. */ -static ThumbActionUPP thumbActionProc = NULL; /* Pointer to func. */ -static TkScrollbar *activeScrollPtr = NULL; /* Non-null when in thumb */ - /* proc. */ -/* - * Forward declarations for procedures defined later in this file: - */ - -static pascal void ScrollbarActionProc _ANSI_ARGS_((ControlRef theControl, - ControlPartCode partCode)); -static int ScrollbarBindProc _ANSI_ARGS_((ClientData clientData, - Tcl_Interp *interp, XEvent *eventPtr, - Tk_Window tkwin, KeySym keySym)); -static void ScrollbarEventProc _ANSI_ARGS_(( - ClientData clientData, XEvent *eventPtr)); -static pascal void ThumbActionProc _ANSI_ARGS_((void)); -static void UpdateControlValues _ANSI_ARGS_((MacScrollbar *macScrollPtr)); - -/* - * The class procedure table for the scrollbar widget. Leave the proc fields - * initialized to NULL, which should happen automatically because of the scope - * at which the variable is declared. - */ - -Tk_ClassProcs tkpScrollbarProcs = { - sizeof(Tk_ClassProcs) /* size */ -}; - -/* - *---------------------------------------------------------------------- - * - * TkpCreateScrollbar -- - * - * Allocate a new TkScrollbar structure. - * - * Results: - * Returns a newly allocated TkScrollbar structure. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkScrollbar * -TkpCreateScrollbar( - Tk_Window tkwin) /* New Tk Window. */ -{ - MacScrollbar * macScrollPtr; - TkWindow *winPtr = (TkWindow *)tkwin; - - if (scrollActionProc == NULL) { - scrollActionProc = NewControlActionProc(ScrollbarActionProc); - thumbActionProc = NewThumbActionProc(ThumbActionProc); - } - - macScrollPtr = (MacScrollbar *) ckalloc(sizeof(MacScrollbar)); - macScrollPtr->sbHandle = NULL; - macScrollPtr->macFlags = 0; - - Tk_CreateEventHandler(tkwin, ActivateMask|ExposureMask| - StructureNotifyMask|FocusChangeMask, - ScrollbarEventProc, (ClientData) macScrollPtr); - - if (!Tcl_GetAssocData(winPtr->mainPtr->interp, "TkScrollbar", NULL)) { - Tcl_SetAssocData(winPtr->mainPtr->interp, "TkScrollbar", NULL, - (ClientData)1); - TkCreateBindingProcedure(winPtr->mainPtr->interp, - winPtr->mainPtr->bindingTable, - (ClientData)Tk_GetUid("Scrollbar"), "<ButtonPress>", - ScrollbarBindProc, NULL, NULL); - } - - return (TkScrollbar *) macScrollPtr; -} - -/* - *-------------------------------------------------------------- - * - * TkpDisplayScrollbar -- - * - * This procedure redraws the contents of a scrollbar window. - * It is invoked as a do-when-idle handler, so it only runs - * when there's nothing else for the application to do. - * - * Results: - * None. - * - * Side effects: - * Information appears on the screen. - * - *-------------------------------------------------------------- - */ - -void -TkpDisplayScrollbar( - ClientData clientData) /* Information about window. */ -{ - register TkScrollbar *scrollPtr = (TkScrollbar *) clientData; - register MacScrollbar *macScrollPtr = (MacScrollbar *) clientData; - register Tk_Window tkwin = scrollPtr->tkwin; - - MacDrawable *macDraw; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - WindowRef windowRef; - - if ((scrollPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { - goto done; - } - - /* - * Draw the focus or any 3D relief we may have. - */ - if (scrollPtr->highlightWidth != 0) { - GC fgGC, bgGC; - - bgGC = Tk_GCForColor(scrollPtr->highlightBgColorPtr, - Tk_WindowId(tkwin)); - - if (scrollPtr->flags & GOT_FOCUS) { - fgGC = Tk_GCForColor(scrollPtr->highlightColorPtr, - Tk_WindowId(tkwin)); - TkpDrawHighlightBorder(tkwin, fgGC, bgGC, scrollPtr->highlightWidth, - Tk_WindowId(tkwin)); - } else { - TkpDrawHighlightBorder(tkwin, bgGC, bgGC, scrollPtr->highlightWidth, - Tk_WindowId(tkwin)); - } - } - Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), scrollPtr->bgBorder, - scrollPtr->highlightWidth, scrollPtr->highlightWidth, - Tk_Width(tkwin) - 2*scrollPtr->highlightWidth, - Tk_Height(tkwin) - 2*scrollPtr->highlightWidth, - scrollPtr->borderWidth, scrollPtr->relief); - - /* - * Set up port for drawing Macintosh control. - */ - macDraw = (MacDrawable *) Tk_WindowId(tkwin); - destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin)); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(Tk_WindowId(tkwin)); - - if (macScrollPtr->sbHandle == NULL) { - Rect r; - WindowRef frontNonFloating; - - r.left = r.top = 0; - r.right = r.bottom = 1; - macScrollPtr->sbHandle = NewControl((WindowRef) destPort, &r, "\p", - false, (short) 500, 0, 1000, - scrollBarProc, (SInt32) scrollPtr); - - /* - * If we are foremost than make us active. - */ - - if (TkMacHaveAppearance() >= 0x110) { - frontNonFloating = FrontNonFloatingWindow(); - } else { - frontNonFloating = FrontWindow(); - } - - if ((WindowPtr) destPort == FrontWindow() || TkpIsWindowFloating((WindowPtr) destPort)) { - macScrollPtr->macFlags |= ACTIVE; - } - } - - /* - * Update the control values before we draw. - */ - windowRef = (**macScrollPtr->sbHandle).contrlOwner; - UpdateControlValues(macScrollPtr); - - if (macScrollPtr->macFlags & ACTIVE) { - Draw1Control(macScrollPtr->sbHandle); - if (macScrollPtr->macFlags & DRAW_GROW) { - DrawGrowIcon(windowRef); - } - } else { - (**macScrollPtr->sbHandle).contrlHilite = 255; - Draw1Control(macScrollPtr->sbHandle); - if (macScrollPtr->macFlags & DRAW_GROW) { - DrawGrowIcon(windowRef); - Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), scrollPtr->bgBorder, - Tk_Width(tkwin) - 13, Tk_Height(tkwin) - 13, - Tk_Width(tkwin), Tk_Height(tkwin), - 0, TK_RELIEF_FLAT); - } - } - - SetGWorld(saveWorld, saveDevice); - - done: - scrollPtr->flags &= ~REDRAW_PENDING; -} - -/* - *---------------------------------------------------------------------- - * - * TkpConfigureScrollbar -- - * - * This procedure is called after the generic code has finished - * processing configuration options, in order to configure - * platform specific options. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkpConfigureScrollbar(scrollPtr) - register TkScrollbar *scrollPtr; /* Information about widget; may or - * may not already have values for - * some fields. */ -{ -} - -/* - *---------------------------------------------------------------------- - * - * TkpComputeScrollbarGeometry -- - * - * After changes in a scrollbar's size or configuration, this - * procedure recomputes various geometry information used in - * displaying the scrollbar. - * - * Results: - * None. - * - * Side effects: - * The scrollbar will be displayed differently. - * - *---------------------------------------------------------------------- - */ - -void -TkpComputeScrollbarGeometry( - register TkScrollbar *scrollPtr) /* Scrollbar whose geometry may - * have changed. */ -{ - MacScrollbar *macScrollPtr = (MacScrollbar *) scrollPtr; - int width, fieldLength, adjust = 0; - - if (scrollPtr->highlightWidth < 0) { - scrollPtr->highlightWidth = 0; - } - scrollPtr->inset = scrollPtr->highlightWidth + scrollPtr->borderWidth; - width = (scrollPtr->vertical) ? Tk_Width(scrollPtr->tkwin) - : Tk_Height(scrollPtr->tkwin); - scrollPtr->arrowLength = width - 2*scrollPtr->inset + 1; - fieldLength = (scrollPtr->vertical ? Tk_Height(scrollPtr->tkwin) - : Tk_Width(scrollPtr->tkwin)) - - 2*(scrollPtr->arrowLength + scrollPtr->inset); - if (fieldLength < 0) { - fieldLength = 0; - } - scrollPtr->sliderFirst = fieldLength*scrollPtr->firstFraction; - scrollPtr->sliderLast = fieldLength*scrollPtr->lastFraction; - - /* - * Adjust the slider so that some piece of it is always - * displayed in the scrollbar and so that it has at least - * a minimal width (so it can be grabbed with the mouse). - */ - - if (scrollPtr->sliderFirst > (fieldLength - 2*scrollPtr->borderWidth)) { - scrollPtr->sliderFirst = fieldLength - 2*scrollPtr->borderWidth; - } - if (scrollPtr->sliderFirst < 0) { - scrollPtr->sliderFirst = 0; - } - if (scrollPtr->sliderLast < (scrollPtr->sliderFirst - + MIN_SLIDER_LENGTH)) { - scrollPtr->sliderLast = scrollPtr->sliderFirst + MIN_SLIDER_LENGTH; - } - if (scrollPtr->sliderLast > fieldLength) { - scrollPtr->sliderLast = fieldLength; - } - scrollPtr->sliderFirst += scrollPtr->arrowLength + scrollPtr->inset; - scrollPtr->sliderLast += scrollPtr->arrowLength + scrollPtr->inset; - - /* - * Register the desired geometry for the window (leave enough space - * for the two arrows plus a minimum-size slider, plus border around - * the whole window, if any). Then arrange for the window to be - * redisplayed. - */ - - if (scrollPtr->vertical) { - if ((macScrollPtr->macFlags & AUTO_ADJUST) && - (macScrollPtr->macFlags & (FLUSH_RIGHT|FLUSH_LEFT))) { - adjust--; - } - Tk_GeometryRequest(scrollPtr->tkwin, - scrollPtr->width + 2*scrollPtr->inset + adjust, - 2*(scrollPtr->arrowLength + scrollPtr->borderWidth - + scrollPtr->inset)); - } else { - if ((macScrollPtr->macFlags & AUTO_ADJUST) && - (macScrollPtr->macFlags & (FLUSH_TOP|FLUSH_BOTTOM))) { - adjust--; - } - Tk_GeometryRequest(scrollPtr->tkwin, - 2*(scrollPtr->arrowLength + scrollPtr->borderWidth - + scrollPtr->inset), scrollPtr->width + 2*scrollPtr->inset + adjust); - } - Tk_SetInternalBorder(scrollPtr->tkwin, scrollPtr->inset); -} - -/* - *---------------------------------------------------------------------- - * - * TkpDestroyScrollbar -- - * - * Free data structures associated with the scrollbar control. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkpDestroyScrollbar( - TkScrollbar *scrollPtr) /* Scrollbar to destroy. */ -{ - MacScrollbar *macScrollPtr = (MacScrollbar *)scrollPtr; - - if (macScrollPtr->sbHandle != NULL) { - if (!(macScrollPtr->macFlags & IN_MODAL_LOOP)) { - DisposeControl(macScrollPtr->sbHandle); - macScrollPtr->sbHandle = NULL; - } - } - macScrollPtr->macFlags |= ALREADY_DEAD; -} - -/* - *-------------------------------------------------------------- - * - * TkpScrollbarPosition -- - * - * Determine the scrollbar element corresponding to a - * given position. - * - * Results: - * One of TOP_ARROW, TOP_GAP, etc., indicating which element - * of the scrollbar covers the position given by (x, y). If - * (x,y) is outside the scrollbar entirely, then OUTSIDE is - * returned. - * - * Side effects: - * None. - * - *-------------------------------------------------------------- - */ - -int -TkpScrollbarPosition( - TkScrollbar *scrollPtr, /* Scrollbar widget record. */ - int x, int y) /* Coordinates within scrollPtr's - * window. */ -{ - MacScrollbar *macScrollPtr = (MacScrollbar *) scrollPtr; - GWorldPtr destPort; - int length, width, tmp, inactive = false; - ControlPartCode part; - Point where; - Rect bounds; - - if (scrollPtr->vertical) { - length = Tk_Height(scrollPtr->tkwin); - width = Tk_Width(scrollPtr->tkwin); - } else { - tmp = x; - x = y; - y = tmp; - length = Tk_Width(scrollPtr->tkwin); - width = Tk_Height(scrollPtr->tkwin); - } - - if ((x < scrollPtr->inset) || (x >= (width - scrollPtr->inset)) - || (y < scrollPtr->inset) || (y >= (length - scrollPtr->inset))) { - return OUTSIDE; - } - - /* - * All of the calculations in this procedure mirror those in - * DisplayScrollbar. Be sure to keep the two consistent. On the - * Macintosh we use the OS call TestControl to do this mapping. - * For TestControl to work, the scrollbar must be active and must - * be in the current port. - */ - - destPort = TkMacGetDrawablePort(Tk_WindowId(scrollPtr->tkwin)); - SetGWorld(destPort, NULL); - UpdateControlValues(macScrollPtr); - if ((**macScrollPtr->sbHandle).contrlHilite == 255) { - inactive = true; - (**macScrollPtr->sbHandle).contrlHilite = 0; - } - - TkMacWinBounds((TkWindow *) scrollPtr->tkwin, &bounds); - where.h = x + bounds.left; - where.v = y + bounds.top; - part = TestControl(((MacScrollbar *) scrollPtr)->sbHandle, where); - if (inactive) { - (**macScrollPtr->sbHandle).contrlHilite = 255; - } - switch (part) { - case kControlUpButtonPart: - return TOP_ARROW; - case kControlPageUpPart: - return TOP_GAP; - case kControlIndicatorPart: - return SLIDER; - case kControlPageDownPart: - return BOTTOM_GAP; - case kControlDownButtonPart: - return BOTTOM_ARROW; - default: - return OUTSIDE; - } -} - -/* - *-------------------------------------------------------------- - * - * ThumbActionProc -- - * - * Callback procedure used by the Macintosh toolbox call - * TrackControl. This call is used to track the thumb of - * the scrollbar. Unlike the ScrollbarActionProc function - * this function is called once and basically takes over - * tracking the scrollbar from the control. This is done - * to avoid conflicts with what the control plans to draw. - * - * Results: - * None. - * - * Side effects: - * May change the display. - * - *-------------------------------------------------------------- - */ - -static pascal void -ThumbActionProc() -{ - register TkScrollbar *scrollPtr = activeScrollPtr; - register MacScrollbar *macScrollPtr = (MacScrollbar *) activeScrollPtr; - Tcl_DString cmdString; - Rect nullRect = {0,0,0,0}; - int origValue, trackBarPin; - double thumbWidth, newFirstFraction, trackBarSize; - char vauleString[40]; - Point currentPoint = { 0, 0 }; - Point lastPoint = { 0, 0 }; - Rect trackRect; - Tcl_Interp *interp; - - if (scrollPtr == NULL) { - return; - } - - Tcl_DStringInit(&cmdString); - - /* - * First compute values that will remain constant during the tracking - * of the thumb. The variable trackBarSize is the length of the scrollbar - * minus the 2 arrows and half the width of the thumb on both sides - * (3 * arrowLength). The variable trackBarPin is the lower starting point - * of the drag region. - * - * Note: the arrowLength is equal to the thumb width of a Mac scrollbar. - */ - origValue = GetControlValue(macScrollPtr->sbHandle); - trackRect = (**macScrollPtr->sbHandle).contrlRect; - if (scrollPtr->vertical == true) { - trackBarSize = (double) (trackRect.bottom - trackRect.top - - (scrollPtr->arrowLength * 3)); - trackBarPin = trackRect.top + scrollPtr->arrowLength - + (scrollPtr->arrowLength / 2); - InsetRect(&trackRect, -25, -113); - - } else { - trackBarSize = (double) (trackRect.right - trackRect.left - - (scrollPtr->arrowLength * 3)); - trackBarPin = trackRect.left + scrollPtr->arrowLength - + (scrollPtr->arrowLength / 2); - InsetRect(&trackRect, -113, -25); - } - - /* - * Track the mouse while the button is held down. If the mouse is moved, - * we calculate the value that should be passed to the "command" part of - * the scrollbar. - */ - while (StillDown()) { - GetMouse(¤tPoint); - if (EqualPt(currentPoint, lastPoint)) { - continue; - } - lastPoint = currentPoint; - - /* - * Calculating this value is a little tricky. We need to calculate a - * value for where the thumb would be in a Motif widget (variable - * thumb). This value is what the "command" expects and is what will - * be resent to the scrollbar to update its value. - */ - thumbWidth = scrollPtr->lastFraction - scrollPtr->firstFraction; - if (PtInRect(currentPoint, &trackRect)) { - if (scrollPtr->vertical == true) { - newFirstFraction = (1.0 - thumbWidth) * - ((double) (currentPoint.v - trackBarPin) / trackBarSize); - } else { - newFirstFraction = (1.0 - thumbWidth) * - ((double) (currentPoint.h - trackBarPin) / trackBarSize); - } - } else { - newFirstFraction = ((double) origValue / 1000.0) - * (1.0 - thumbWidth); - } - - sprintf(vauleString, "%g", newFirstFraction); - - Tcl_DStringSetLength(&cmdString, 0); - Tcl_DStringAppend(&cmdString, scrollPtr->command, - scrollPtr->commandSize); - Tcl_DStringAppendElement(&cmdString, "moveto"); - Tcl_DStringAppendElement(&cmdString, vauleString); - - interp = scrollPtr->interp; - Tcl_Preserve((ClientData) interp); - Tcl_GlobalEval(interp, cmdString.string); - Tcl_Release((ClientData) interp); - - Tcl_DStringSetLength(&cmdString, 0); - Tcl_DStringAppend(&cmdString, "update idletasks", - strlen("update idletasks")); - Tcl_Preserve((ClientData) interp); - Tcl_GlobalEval(interp, cmdString.string); - Tcl_Release((ClientData) interp); - } - - /* - * This next bit of code is a bit of a hack - but needed. The problem is - * that the control wants to draw the drag outline if the control value - * changes during the drag (which it does). What we do here is change the - * clip region to hide this drawing from the user. - */ - ClipRect(&nullRect); - - Tcl_DStringFree(&cmdString); - return; -} - -/* - *-------------------------------------------------------------- - * - * ScrollbarActionProc -- - * - * Callback procedure used by the Macintosh toolbox call - * TrackControl. This call will update the display while - * the scrollbar is being manipulated by the user. - * - * Results: - * None. - * - * Side effects: - * May change the display. - * - *-------------------------------------------------------------- - */ - -static pascal void -ScrollbarActionProc( - ControlRef theControl, /* Handle to scrollbat control */ - ControlPartCode partCode) /* Part of scrollbar that was "hit" */ -{ - register TkScrollbar *scrollPtr = (TkScrollbar *) GetControlReference(theControl); - Tcl_DString cmdString; - - Tcl_DStringInit(&cmdString); - Tcl_DStringAppend(&cmdString, scrollPtr->command, - scrollPtr->commandSize); - - if (partCode == kControlUpButtonPart || partCode == kControlDownButtonPart) { - Tcl_DStringAppendElement(&cmdString, "scroll"); - Tcl_DStringAppendElement(&cmdString, - (partCode == kControlUpButtonPart ) ? "-1" : "1"); - Tcl_DStringAppendElement(&cmdString, "unit"); - } else if (partCode == kControlPageUpPart || partCode == kControlPageDownPart) { - Tcl_DStringAppendElement(&cmdString, "scroll"); - Tcl_DStringAppendElement(&cmdString, - (partCode == kControlPageUpPart ) ? "-1" : "1"); - Tcl_DStringAppendElement(&cmdString, "page"); - } - Tcl_Preserve((ClientData) scrollPtr->interp); - Tcl_DStringAppend(&cmdString, "; update idletasks", - strlen("; update idletasks")); - Tcl_GlobalEval(scrollPtr->interp, cmdString.string); - Tcl_Release((ClientData) scrollPtr->interp); - - Tcl_DStringFree(&cmdString); -} - -/* - *-------------------------------------------------------------- - * - * ScrollbarBindProc -- - * - * This procedure is invoked when the default <ButtonPress> - * binding on the Scrollbar bind tag fires. - * - * Results: - * None. - * - * Side effects: - * The event enters a modal loop. - * - *-------------------------------------------------------------- - */ - -static int -ScrollbarBindProc( - ClientData clientData, /* Not used. */ - Tcl_Interp *interp, /* Interp with binding. */ - XEvent *eventPtr, /* X event that triggered binding. */ - Tk_Window tkwin, /* Target window for event. */ - KeySym keySym) /* The KeySym if a key event. */ -{ - TkWindow *winPtr = (TkWindow*)tkwin; - TkScrollbar *scrollPtr = (TkScrollbar *) winPtr->instanceData; - MacScrollbar *macScrollPtr = (MacScrollbar *) winPtr->instanceData; - - Tcl_Preserve((ClientData)scrollPtr); - macScrollPtr->macFlags |= IN_MODAL_LOOP; - - if (eventPtr->type == ButtonPress) { - Point where; - Rect bounds; - int part, x, y, dummy; - unsigned int state; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - Window window; - - /* - * To call Macintosh control routines we must have the port - * set to the window containing the control. We will then test - * which part of the control was hit and act accordingly. - */ - destPort = TkMacGetDrawablePort(Tk_WindowId(scrollPtr->tkwin)); - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - TkMacSetUpClippingRgn(Tk_WindowId(scrollPtr->tkwin)); - - TkMacWinBounds((TkWindow *) scrollPtr->tkwin, &bounds); - where.h = eventPtr->xbutton.x + bounds.left; - where.v = eventPtr->xbutton.y + bounds.top; - part = TestControl(macScrollPtr->sbHandle, where); - if (part == kControlIndicatorPart && scrollPtr->jump == false) { - /* - * Case 1: In thumb, no jump scrolling. Call track control - * with the thumb action proc which will do most of the work. - * Set the global activeScrollPtr to the current control - * so the callback may have access to it. - */ - activeScrollPtr = scrollPtr; - part = TrackControl(macScrollPtr->sbHandle, where, - (ControlActionUPP) thumbActionProc); - activeScrollPtr = NULL; - } else if (part == kControlIndicatorPart) { - /* - * Case 2: in thumb with jump scrolling. Call TrackControl - * with a NULL action proc. Use the new value of the control - * to set update the control. - */ - part = TrackControl(macScrollPtr->sbHandle, where, NULL); - if (part == kControlIndicatorPart) { - double newFirstFraction, thumbWidth; - Tcl_DString cmdString; - char vauleString[TCL_DOUBLE_SPACE]; - - /* - * The following calculation takes the new control - * value and maps it to what Tk needs for its variable - * thumb size representation. - */ - thumbWidth = scrollPtr->lastFraction - - scrollPtr->firstFraction; - newFirstFraction = (1.0 - thumbWidth) * - ((double) GetControlValue(macScrollPtr->sbHandle) / 1000.0); - sprintf(vauleString, "%g", newFirstFraction); - - Tcl_DStringInit(&cmdString); - Tcl_DStringAppend(&cmdString, scrollPtr->command, - strlen(scrollPtr->command)); - Tcl_DStringAppendElement(&cmdString, "moveto"); - Tcl_DStringAppendElement(&cmdString, vauleString); - Tcl_DStringAppend(&cmdString, "; update idletasks", - strlen("; update idletasks")); - - interp = scrollPtr->interp; - Tcl_Preserve((ClientData) interp); - Tcl_GlobalEval(interp, cmdString.string); - Tcl_Release((ClientData) interp); - Tcl_DStringFree(&cmdString); - } - } else if (part != 0) { - /* - * Case 3: in any other part of the scrollbar. We call - * TrackControl with the scrollActionProc which will do - * most all the work. - */ - TrackControl(macScrollPtr->sbHandle, where, scrollActionProc); - HiliteControl(macScrollPtr->sbHandle, 0); - } - - /* - * The TrackControl call will "eat" the ButtonUp event. We now - * generate a ButtonUp event so Tk will unset implicit grabs etc. - */ - GetMouse(&where); - XQueryPointer(NULL, None, &window, &window, &x, - &y, &dummy, &dummy, &state); - window = Tk_WindowId(scrollPtr->tkwin); - TkGenerateButtonEvent(x, y, window, state); - - SetGWorld(saveWorld, saveDevice); - } - - if (macScrollPtr->sbHandle && (macScrollPtr->macFlags & ALREADY_DEAD)) { - DisposeControl(macScrollPtr->sbHandle); - macScrollPtr->sbHandle = NULL; - } - macScrollPtr->macFlags &= ~IN_MODAL_LOOP; - Tcl_Release((ClientData)scrollPtr); - - return TCL_OK; -} - -/* - *-------------------------------------------------------------- - * - * ScrollbarEventProc -- - * - * This procedure is invoked by the Tk dispatcher for various - * events on scrollbars. - * - * Results: - * None. - * - * Side effects: - * When the window gets deleted, internal structures get - * cleaned up. When it gets exposed, it is redisplayed. - * - *-------------------------------------------------------------- - */ - -static void -ScrollbarEventProc( - ClientData clientData, /* Information about window. */ - XEvent *eventPtr) /* Information about event. */ -{ - TkScrollbar *scrollPtr = (TkScrollbar *) clientData; - MacScrollbar *macScrollPtr = (MacScrollbar *) clientData; - - if (eventPtr->type == UnmapNotify) { - TkMacSetScrollbarGrow((TkWindow *) scrollPtr->tkwin, false); - } else if (eventPtr->type == ActivateNotify) { - macScrollPtr->macFlags |= ACTIVE; - TkScrollbarEventuallyRedraw((ClientData) scrollPtr); - } else if (eventPtr->type == DeactivateNotify) { - macScrollPtr->macFlags &= ~ACTIVE; - TkScrollbarEventuallyRedraw((ClientData) scrollPtr); - } else { - TkScrollbarEventProc(clientData, eventPtr); - } -} - -/* - *-------------------------------------------------------------- - * - * UpdateControlValues -- - * - * This procedure updates the Macintosh scrollbar control - * to display the values defined by the Tk scrollbar. - * - * Results: - * None. - * - * Side effects: - * The Macintosh control is updated. - * - *-------------------------------------------------------------- - */ - -static void -UpdateControlValues( - MacScrollbar *macScrollPtr) /* Scrollbar data struct. */ -{ - TkScrollbar *scrollPtr = (TkScrollbar *) macScrollPtr; - Tk_Window tkwin = scrollPtr->tkwin; - MacDrawable * macDraw = (MacDrawable *) Tk_WindowId(scrollPtr->tkwin); - WindowRef windowRef = (**macScrollPtr->sbHandle).contrlOwner; - double middle; - int drawGrowRgn = false; - int flushRight = false; - int flushBottom = false; - - /* - * We can't use the Macintosh commands SizeControl and MoveControl as these - * calls will also cause a redraw which in our case will also cause - * flicker. To avoid this we adjust the control record directly. The - * Draw1Control command appears to just draw where ever the control says to - * draw so this seems right. - * - * NOTE: changing the control record directly may not work when - * Apple releases the Copland version of the MacOS (or when hell is cold). - */ - - (**macScrollPtr->sbHandle).contrlRect.left = macDraw->xOff + scrollPtr->inset; - (**macScrollPtr->sbHandle).contrlRect.top = macDraw->yOff + scrollPtr->inset; - (**macScrollPtr->sbHandle).contrlRect.right = macDraw->xOff + Tk_Width(tkwin) - - scrollPtr->inset; - (**macScrollPtr->sbHandle).contrlRect.bottom = macDraw->yOff + - Tk_Height(tkwin) - scrollPtr->inset; - - /* - * To make Tk applications look more like Macintosh applications without - * requiring additional work by the Tk developer we do some cute tricks. - * The first trick plays with the size of the widget to get it to overlap - * with the side of the window by one pixel (we don't do this if the placer - * is the geometry manager). The second trick shrinks the scrollbar if it - * it covers the area of the grow region ao the scrollbar can also draw - * the grow region if need be. - */ - if (!strcmp(macDraw->winPtr->geomMgrPtr->name, "place")) { - macScrollPtr->macFlags &= AUTO_ADJUST; - } else { - macScrollPtr->macFlags |= AUTO_ADJUST; - } - /* TODO: use accessor function!!! */ - if (windowRef->portRect.left == (**macScrollPtr->sbHandle).contrlRect.left) { - if (macScrollPtr->macFlags & AUTO_ADJUST) { - (**macScrollPtr->sbHandle).contrlRect.left--; - } - if (!(macScrollPtr->macFlags & FLUSH_LEFT)) { - macScrollPtr->macFlags |= FLUSH_LEFT; - if (scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - } else if (macScrollPtr->macFlags & FLUSH_LEFT) { - macScrollPtr->macFlags &= ~FLUSH_LEFT; - if (scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - - if (windowRef->portRect.top == (**macScrollPtr->sbHandle).contrlRect.top) { - if (macScrollPtr->macFlags & AUTO_ADJUST) { - (**macScrollPtr->sbHandle).contrlRect.top--; - } - if (!(macScrollPtr->macFlags & FLUSH_TOP)) { - macScrollPtr->macFlags |= FLUSH_TOP; - if (! scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - } else if (macScrollPtr->macFlags & FLUSH_TOP) { - macScrollPtr->macFlags &= ~FLUSH_TOP; - if (! scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - - if (windowRef->portRect.right == (**macScrollPtr->sbHandle).contrlRect.right) { - flushRight = true; - if (macScrollPtr->macFlags & AUTO_ADJUST) { - (**macScrollPtr->sbHandle).contrlRect.right++; - } - if (!(macScrollPtr->macFlags & FLUSH_RIGHT)) { - macScrollPtr->macFlags |= FLUSH_RIGHT; - if (scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - } else if (macScrollPtr->macFlags & FLUSH_RIGHT) { - macScrollPtr->macFlags &= ~FLUSH_RIGHT; - if (scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - - if (windowRef->portRect.bottom == (**macScrollPtr->sbHandle).contrlRect.bottom) { - flushBottom = true; - if (macScrollPtr->macFlags & AUTO_ADJUST) { - (**macScrollPtr->sbHandle).contrlRect.bottom++; - } - if (!(macScrollPtr->macFlags & FLUSH_BOTTOM)) { - macScrollPtr->macFlags |= FLUSH_BOTTOM; - if (! scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - } else if (macScrollPtr->macFlags & FLUSH_BOTTOM) { - macScrollPtr->macFlags &= ~FLUSH_BOTTOM; - if (! scrollPtr->vertical) { - TkpComputeScrollbarGeometry(scrollPtr); - } - } - - /* - * If the scrollbar is flush against the bottom right hand coner then - * it may need to draw the grow region for the window so we let the - * wm code know about this scrollbar. We don't actually draw the grow - * region, however, unless we are currently resizable. - */ - macScrollPtr->macFlags &= ~DRAW_GROW; - if (flushBottom && flushRight) { - TkMacSetScrollbarGrow((TkWindow *) tkwin, true); - if (TkMacResizable(macDraw->toplevel->winPtr)) { - if (scrollPtr->vertical) { - (**macScrollPtr->sbHandle).contrlRect.bottom -= 14; - } else { - (**macScrollPtr->sbHandle).contrlRect.right -= 14; - } - macScrollPtr->macFlags |= DRAW_GROW; - } - } else { - TkMacSetScrollbarGrow((TkWindow *) tkwin, false); - } - - /* - * Given the Tk parameters for the fractions of the start and - * end of the thumb, the following calculation determines the - * location for the fixed sized Macintosh thumb. - */ - middle = scrollPtr->firstFraction / (scrollPtr->firstFraction + - (1.0 - scrollPtr->lastFraction)); - - (**macScrollPtr->sbHandle).contrlValue = (short) (middle * 1000); - if ((**macScrollPtr->sbHandle).contrlHilite == 0 || - (**macScrollPtr->sbHandle).contrlHilite == 255) { - if (scrollPtr->firstFraction == 0.0 && - scrollPtr->lastFraction == 1.0) { - (**macScrollPtr->sbHandle).contrlHilite = 255; - } else { - (**macScrollPtr->sbHandle).contrlHilite = 0; - } - } - if ((**macScrollPtr->sbHandle).contrlVis != 255) { - (**macScrollPtr->sbHandle).contrlVis = 255; - } -} diff --git a/mac/tkMacSend.c b/mac/tkMacSend.c deleted file mode 100644 index e434d79..0000000 --- a/mac/tkMacSend.c +++ /dev/null @@ -1,548 +0,0 @@ -/* - * tkMacSend.c -- - * - * This file provides procedures that implement the "send" - * command, allowing commands to be passed from interpreter - * to interpreter. This current implementation for the Mac - * has most functionality stubed out. - * - * The current plan, which we have not had time to implement, is - * for the first Wish app to create a gestalt of type 'WIsH'. - * This gestalt will point to a table, in system memory, of - * Tk apps. Each Tk app, when it starts up, will register their - * name, and process ID, in this table. This will allow us to - * implement "tk appname". - * - * Then the send command will look up the process id of the target - * app in this table, and send an AppleEvent to that process. The - * AppleEvent handler is much like the do script handler, except that - * you have to specify the name of the tk app as well, since there may - * be many interps in one wish app, and you need to send it to the - * right one. - * - * Implementing this has been on our list of things to do, but what - * with the demise of Tcl at Sun, and the lack of resources at - * Scriptics it may not get done for awhile. So this sketch is - * offered for the brave to attempt if they need the functionality... - * - * Copyright (c) 1989-1994 The Regents of the University of California. - * Copyright (c) 1994-1998 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacSend.c,v 1.7 2002/10/09 11:56:54 das Exp $ - */ - -#include <Gestalt.h> -#include "tkPort.h" -#include "tkInt.h" - -EXTERN int Tk_SendObjCmd _ANSI_ARGS_((ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); - - /* - * The following structure is used to keep track of the - * interpreters registered by this process. - */ - -typedef struct RegisteredInterp { - char *name; /* Interpreter's name (malloc-ed). */ - Tcl_Interp *interp; /* Interpreter associated with - * name. */ - struct RegisteredInterp *nextPtr; - /* Next in list of names associated - * with interps in this process. - * NULL means end of list. */ -} RegisteredInterp; - -/* - * A registry of all interpreters for a display is kept in a - * property "InterpRegistry" on the root window of the display. - * It is organized as a series of zero or more concatenated strings - * (in no particular order), each of the form - * window space name '\0' - * where "window" is the hex id of the comm. window to use to talk - * to an interpreter named "name". - * - * When the registry is being manipulated by an application (e.g. to - * add or remove an entry), it is loaded into memory using a structure - * of the following type: - */ - -typedef struct NameRegistry { - TkDisplay *dispPtr; /* Display from which the registry was - * read. */ - int locked; /* Non-zero means that the display was - * locked when the property was read in. */ - int modified; /* Non-zero means that the property has - * been modified, so it needs to be written - * out when the NameRegistry is closed. */ - unsigned long propLength; /* Length of the property, in bytes. */ - char *property; /* The contents of the property, or NULL - * if none. See format description above; - * this is *not* terminated by the first - * null character. Dynamically allocated. */ - int allocedByX; /* Non-zero means must free property with - * XFree; zero means use ckfree. */ -} NameRegistry; - -static initialized = false; /* A flag to denote if we have initialized yet. */ - -static RegisteredInterp *interpListPtr = NULL; -/* List of all interpreters - * registered by this process. */ - - /* - * The information below is used for communication between processes - * during "send" commands. Each process keeps a private window, never - * even mapped, with one property, "Comm". When a command is sent to - * an interpreter, the command is appended to the comm property of the - * communication window associated with the interp's process. Similarly, - * when a result is returned from a sent command, it is also appended - * to the comm property. - * - * Each command and each result takes the form of ASCII text. For a - * command, the text consists of a zero character followed by several - * null-terminated ASCII strings. The first string consists of the - * single letter "c". Subsequent strings have the form "option value" - * where the following options are supported: - * - * -r commWindow serial - * - * This option means that a response should be sent to the window - * whose X identifier is "commWindow" (in hex), and the response should - * be identified with the serial number given by "serial" (in decimal). - * If this option isn't specified then the send is asynchronous and - * no response is sent. - * - * -n name - * "Name" gives the name of the application for which the command is - * intended. This option must be present. - * - * -s script - * - * "Script" is the script to be executed. This option must be present. - * - * The options may appear in any order. The -n and -s options must be - * present, but -r may be omitted for asynchronous RPCs. For compatibility - * with future releases that may add new features, there may be additional - * options present; as long as they start with a "-" character, they will - * be ignored. - * - * A result also consists of a zero character followed by several null- - * terminated ASCII strings. The first string consists of the single - * letter "r". Subsequent strings have the form "option value" where - * the following options are supported: - * - * -s serial - * - * Identifies the command for which this is the result. It is the - * same as the "serial" field from the -s option in the command. This - * option must be present. - * - * -c code - * - * "Code" is the completion code for the script, in decimal. If the - * code is omitted it defaults to TCL_OK. - * - * -r result - * - * "Result" is the result string for the script, which may be either - * a result or an error message. If this field is omitted then it - * defaults to an empty string. - * - * -i errorInfo - * - * "ErrorInfo" gives a string with which to initialize the errorInfo - * variable. This option may be omitted; it is ignored unless the - * completion code is TCL_ERROR. - * - * -e errorCode - * - * "ErrorCode" gives a string with with to initialize the errorCode - * variable. This option may be omitted; it is ignored unless the - * completion code is TCL_ERROR. - * - * Options may appear in any order, and only the -s option must be - * present. As with commands, there may be additional options besides - * these; unknown options are ignored. - */ - - /* - * The following variable is the serial number that was used in the - * last "send" command. It is exported only for testing purposes. - */ - -int tkSendSerial = 0; - - /* - * Maximum size property that can be read at one time by - * this module: - */ - -#define MAX_PROP_WORDS 100000 - -/* - * Forward declarations for procedures defined later in this file: - */ - -static int AppendErrorProc _ANSI_ARGS_((ClientData clientData, - XErrorEvent *errorPtr)); -static void DeleteProc _ANSI_ARGS_((ClientData clientData)); -static void RegAddName _ANSI_ARGS_((NameRegistry *regPtr, - char *name, Window commWindow)); -static void RegClose _ANSI_ARGS_((NameRegistry *regPtr)); -static void RegDeleteName _ANSI_ARGS_((NameRegistry *regPtr, - char *name)); -static Window RegFindName _ANSI_ARGS_((NameRegistry *regPtr, - char *name)); -static NameRegistry * RegOpen _ANSI_ARGS_((Tcl_Interp *interp, - TkWindow *winPtr, int lock)); -static void SendEventProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static int SendInit _ANSI_ARGS_((Tcl_Interp *interp)); -static Bool SendRestrictProc _ANSI_ARGS_((Display *display, - XEvent *eventPtr, char *arg)); -static int ServerSecure _ANSI_ARGS_((TkDisplay *dispPtr)); -static void TimeoutProc _ANSI_ARGS_((ClientData clientData)); -static int ValidateName _ANSI_ARGS_((TkDisplay *dispPtr, - char *name, Window commWindow, int oldOK)); - -/* - *-------------------------------------------------------------- - * - * Tk_SetAppName -- - * - * This procedure is called to associate an ASCII name with a Tk - * application. If the application has already been named, the - * name replaces the old one. - * - * Results: - * The return value is the name actually given to the application. - * This will normally be the same as name, but if name was already - * in use for an application then a name of the form "name #2" will - * be chosen, with a high enough number to make the name unique. - * - * Side effects: - * Registration info is saved, thereby allowing the "send" command - * to be used later to invoke commands in the application. In - * addition, the "send" command is created in the application's - * interpreter. The registration will be removed automatically - * if the interpreter is deleted or the "send" command is removed. - * - *-------------------------------------------------------------- - */ - -CONST char * -Tk_SetAppName( - Tk_Window tkwin, /* Token for any window in the application - * to be named: it is just used to identify - * the application and the display. */ - CONST char *name) /* The name that will be used to - * refer to the interpreter in later - * "send" commands. Must be globally - * unique. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - Tcl_Interp *interp = winPtr->mainPtr->interp; - int i, suffix, offset, result; - int createCommand = 0; - RegisteredInterp *riPtr, *prevPtr; - CONST char *actualName; - Tcl_DString dString; - Tcl_Obj *resultObjPtr, *interpNamePtr; - char *interpName; - - if (!initialized) { - SendInit(interp); - } - - /* - * See if the application is already registered; if so, remove its - * current name from the registry. The deletion of the command - * will take care of disposing of this entry. - */ - - for (riPtr = interpListPtr, prevPtr = NULL; riPtr != NULL; - prevPtr = riPtr, riPtr = riPtr->nextPtr) { - if (riPtr->interp == interp) { - if (prevPtr == NULL) { - interpListPtr = interpListPtr->nextPtr; - } else { - prevPtr->nextPtr = riPtr->nextPtr; - } - break; - } - } - - /* - * Pick a name to use for the application. Use "name" if it's not - * already in use. Otherwise add a suffix such as " #2", trying - * larger and larger numbers until we eventually find one that is - * unique. - */ - - actualName = name; - suffix = 1; - offset = 0; - Tcl_DStringInit(&dString); - - TkGetInterpNames(interp, tkwin); - resultObjPtr = Tcl_GetObjResult(interp); - Tcl_IncrRefCount(resultObjPtr); - for (i = 0; ; ) { - result = Tcl_ListObjIndex(NULL, resultObjPtr, i, &interpNamePtr); - if (interpNamePtr == NULL) { - break; - } - interpName = Tcl_GetStringFromObj(interpNamePtr, NULL); - if (strcmp(actualName, interpName) == 0) { - if (suffix == 1) { - Tcl_DStringAppend(&dString, name, -1); - Tcl_DStringAppend(&dString, " #", 2); - offset = Tcl_DStringLength(&dString); - Tcl_DStringSetLength(&dString, offset + 10); - actualName = Tcl_DStringValue(&dString); - } - suffix++; - sprintf(Tcl_DStringValue(&dString) + offset, "%d", suffix); - i = 0; - } else { - i++; - } - } - - Tcl_DecrRefCount(resultObjPtr); - Tcl_ResetResult(interp); - - /* - * We have found a unique name. Now add it to the registry. - */ - - riPtr = (RegisteredInterp *) ckalloc(sizeof(RegisteredInterp)); - riPtr->interp = interp; - riPtr->name = ckalloc(strlen(actualName) + 1); - riPtr->nextPtr = interpListPtr; - interpListPtr = riPtr; - strcpy(riPtr->name, actualName); - - Tcl_CreateObjCommand(interp, "send", Tk_SendObjCmd, - (ClientData) riPtr, NULL /* TODO: DeleteProc */); - if (Tcl_IsSafe(interp)) { - Tcl_HideCommand(interp, "send", "send"); - } - Tcl_DStringFree(&dString); - - return riPtr->name; -} - -/* - *-------------------------------------------------------------- - * - * Tk_SendObjCmd -- - * - * This procedure is invoked to process the "send" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *-------------------------------------------------------------- - */ - -int -Tk_SendObjCmd( - ClientData clientData, /* Used only for deletion */ - Tcl_Interp *interp, /* The interp we are sending from */ - int objc, /* Number of arguments */ - Tcl_Obj *CONST objv[]) /* The arguments */ -{ - static CONST char *sendOptions[] = {"-async", "-displayof", "-", (char *) NULL}; - char *stringRep, *destName; - int async = 0; - int i, index, firstArg; - RegisteredInterp *riPtr; - Tcl_Obj *resultPtr, *listObjPtr; - int result; - - for (i = 1; i < (objc - 1); ) { - stringRep = Tcl_GetStringFromObj(objv[i], NULL); - if (stringRep[0] == '-') { - if (Tcl_GetIndexFromObj(interp, objv[i], sendOptions, "option", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - if (index == 0) { - async = 1; - i++; - } else if (index == 1) { - i += 2; - } else { - i++; - } - } else { - break; - } - } - - if (objc < (i + 2)) { - Tcl_WrongNumArgs(interp, 1, objv, - "?options? interpName arg ?arg ...?"); - return TCL_ERROR; - } - - destName = Tcl_GetStringFromObj(objv[i], NULL); - firstArg = i + 1; - - resultPtr = Tcl_GetObjResult(interp); - - /* - * See if the target interpreter is local. If so, execute - * the command directly without going through the DDE server. - * The only tricky thing is passing the result from the target - * interpreter to the invoking interpreter. Watch out: they - * could be the same! - */ - - for (riPtr = interpListPtr; (riPtr != NULL) - && (strcmp(destName, riPtr->name)); riPtr = riPtr->nextPtr) { - /* - * Empty loop body. - */ - - } - - if (riPtr != NULL) { - /* - * This command is to a local interp. No need to go through - * the server. - */ - - Tcl_Interp *localInterp; - - Tcl_Preserve((ClientData) riPtr); - localInterp = riPtr->interp; - Tcl_Preserve((ClientData) localInterp); - if (firstArg == (objc - 1)) { - /* - * This might be one of those cases where the new - * parser is faster. - */ - - result = Tcl_EvalObjEx(localInterp, objv[firstArg], TCL_EVAL_DIRECT); - } else { - listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL); - for (i = firstArg; i < objc; i++) { - Tcl_ListObjAppendList(interp, listObjPtr, objv[i]); - } - Tcl_IncrRefCount(listObjPtr); - result = Tcl_EvalObjEx(localInterp, listObjPtr, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(listObjPtr); - } - if (interp != localInterp) { - if (result == TCL_ERROR) { - /* Tcl_Obj *errorObjPtr; */ - - /* - * An error occurred, so transfer error information from the - * destination interpreter back to our interpreter. Must clear - * interp's result before calling Tcl_AddErrorInfo, since - * Tcl_AddErrorInfo will store the interp's result in errorInfo - * before appending riPtr's $errorInfo; we've already got - * everything we need in riPtr's $errorInfo. - */ - - Tcl_ResetResult(interp); - Tcl_AddErrorInfo(interp, Tcl_GetVar2(localInterp, - "errorInfo", (char *) NULL, TCL_GLOBAL_ONLY)); - /* errorObjPtr = Tcl_GetObjVar2(localInterp, "errorCode", NULL, - TCL_GLOBAL_ONLY); - Tcl_SetObjErrorCode(interp, errorObjPtr); */ - } - Tcl_SetObjResult(interp, Tcl_GetObjResult(localInterp)); - } - Tcl_Release((ClientData) riPtr); - Tcl_Release((ClientData) localInterp); - } else { - /* - * This is a non-local request. Send the script to the server and poll - * it for a result. TODO!!! - */ - } - -done: - return result; -} - -/* - *---------------------------------------------------------------------- - * - * TkGetInterpNames -- - * - * This procedure is invoked to fetch a list of all the - * interpreter names currently registered for the display - * of a particular window. - * - * Results: - * A standard Tcl return value. Interp->result will be set - * to hold a list of all the interpreter names defined for - * tkwin's display. If an error occurs, then TCL_ERROR - * is returned and interp->result will hold an error message. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkGetInterpNames( - Tcl_Interp *interp, /* Interpreter for returning a result. */ - Tk_Window tkwin) /* Window whose display is to be used - * for the lookup. */ -{ - Tcl_Obj *listObjPtr; - RegisteredInterp *riPtr; - - listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL); - riPtr = interpListPtr; - while (riPtr != NULL) { - Tcl_ListObjAppendElement(interp, listObjPtr, - Tcl_NewStringObj(riPtr->name, -1)); - riPtr = riPtr->nextPtr; - } - - Tcl_SetObjResult(interp, listObjPtr); - return TCL_OK; -} - -/* - *-------------------------------------------------------------- - * - * SendInit -- - * - * This procedure is called to initialize the - * communication channels for sending commands and - * receiving results. - * - * Results: - * None. - * - * Side effects: - * Sets up various data structures and windows. - * - *-------------------------------------------------------------- - */ - -static int -SendInit( - Tcl_Interp *interp) /* Interpreter to use for error reporting - * (no errors are ever returned, but the - * interpreter is needed anyway). */ -{ - return TCL_OK; -} diff --git a/mac/tkMacSubwindows.c b/mac/tkMacSubwindows.c deleted file mode 100644 index a60e901..0000000 --- a/mac/tkMacSubwindows.c +++ /dev/null @@ -1,1258 +0,0 @@ -/* - * tkMacSubwindows.c -- - * - * Implements subwindows for the macintosh version of Tk. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacSubwindows.c,v 1.7 2002/06/14 22:25:12 jenglish Exp $ - */ - -#include "tkInt.h" -#include "X.h" -#include "Xlib.h" -#include <stdio.h> - -#include <Windows.h> -#include <QDOffscreen.h> -#include "tkMacInt.h" - -/* - * Temporary region that can be reused. - */ -static RgnHandle tmpRgn = NULL; - -static void UpdateOffsets _ANSI_ARGS_((TkWindow *winPtr, int deltaX, int deltaY)); - -void tkMacMoveWindow _ANSI_ARGS_((WindowRef window, int x, int y)); - -/* - *---------------------------------------------------------------------- - * - * XDestroyWindow -- - * - * Dealocates the given X Window. - * - * Results: - * The window id is returned. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XDestroyWindow( - Display* display, /* Display. */ - Window window) /* Window. */ -{ - MacDrawable *macWin = (MacDrawable *) window; - GWorldPtr destPort; - - /* - * Remove any dangling pointers that may exist if - * the window we are deleting is being tracked by - * the grab code. - */ - - TkPointerDeadWindow(macWin->winPtr); - macWin->toplevel->referenceCount--; - - - if (Tk_IsTopLevel(macWin->winPtr)) { - DisposeRgn(macWin->clipRgn); - DisposeRgn(macWin->aboveClipRgn); - - /* - * Delete the Mac window and remove it from the windowTable. - * The window could be NULL if the window was never mapped. - * However, we don't do this for embedded windows, they don't - * go in the window list, and they do not own their portPtr's. - */ - - if (!(Tk_IsEmbedded(macWin->winPtr))) { - destPort = TkMacGetDrawablePort(window); - if (destPort != NULL) { - TkMacWindowList *listPtr, *prevPtr; - - TkMacUnregisterMacWindow(destPort); - DisposeWindow((WindowRef) destPort); - - for (listPtr = tkMacWindowListPtr, prevPtr = NULL; - tkMacWindowListPtr != NULL; - prevPtr = listPtr, listPtr = listPtr->nextPtr) { - if (listPtr->winPtr == macWin->winPtr) { - if (prevPtr == NULL) { - tkMacWindowListPtr = listPtr->nextPtr; - } else { - prevPtr->nextPtr = listPtr->nextPtr; - } - ckfree((char *) listPtr); - break; - } - } - } - } - - macWin->portPtr = NULL; - - /* - * Delay deletion of a toplevel data structure untill all - * children have been deleted. - */ - if (macWin->toplevel->referenceCount == 0) { - ckfree((char *) macWin->toplevel); - } - } else { - destPort = TkMacGetDrawablePort(window); - if (destPort != NULL) { - SetGWorld(destPort, NULL); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - } - if (macWin->winPtr->parentPtr != NULL) { - TkMacInvalClipRgns(macWin->winPtr->parentPtr); - } - DisposeRgn(macWin->clipRgn); - DisposeRgn(macWin->aboveClipRgn); - - if (macWin->toplevel->referenceCount == 0) { - ckfree((char *) macWin->toplevel); - } - ckfree((char *) macWin); - } -} - -/* - *---------------------------------------------------------------------- - * - * XMapWindow -- - * - * Map the given X Window to the screen. See X window documentation - * for more details. - * - * Results: - * None. - * - * Side effects: - * The subwindow or toplevel may appear on the screen. - * - *---------------------------------------------------------------------- - */ - -void -XMapWindow( - Display* display, /* Display. */ - Window window) /* Window. */ -{ - MacDrawable *macWin = (MacDrawable *) window; - XEvent event; - GWorldPtr destPort; - - /* - * Under certain situations it's possible for this function to be - * called before the toplevel window it's associated with has actually - * been mapped. In that case we need to create the real Macintosh - * window now as this function as well as other X functions assume that - * the portPtr is valid. - */ - if (!TkMacHostToplevelExists(macWin->toplevel->winPtr)) { - TkMacMakeRealWindowExist(macWin->toplevel->winPtr); - } - destPort = TkMacGetDrawablePort(window); - - display->request++; - macWin->winPtr->flags |= TK_MAPPED; - if (Tk_IsTopLevel(macWin->winPtr)) { - if (!Tk_IsEmbedded(macWin->winPtr)) { - ShowWindow((WindowRef) destPort); - } - - /* - * We only need to send the MapNotify event - * for toplevel windows. - */ - event.xany.serial = display->request; - event.xany.send_event = False; - event.xany.display = display; - - event.xmap.window = window; - event.xmap.type = MapNotify; - event.xmap.event = window; - event.xmap.override_redirect = macWin->winPtr->atts.override_redirect; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - } else { - TkMacInvalClipRgns(macWin->winPtr->parentPtr); - } - - /* - * Generate damage for that area of the window - */ - SetGWorld(destPort, NULL); - TkMacUpdateClipRgn(macWin->winPtr); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); -} - -/* - *---------------------------------------------------------------------- - * - * XUnmapWindow -- - * - * Unmap the given X Window to the screen. See X window - * documentation for more details. - * - * Results: - * None. - * - * Side effects: - * The subwindow or toplevel may be removed from the screen. - * - *---------------------------------------------------------------------- - */ - -void -XUnmapWindow( - Display* display, /* Display. */ - Window window) /* Window. */ -{ - MacDrawable *macWin = (MacDrawable *) window; - XEvent event; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(window); - - display->request++; - macWin->winPtr->flags &= ~TK_MAPPED; - if (Tk_IsTopLevel(macWin->winPtr)) { - if (!Tk_IsEmbedded(macWin->winPtr)) { - HideWindow((WindowRef) destPort); - } - - /* - * We only need to send the UnmapNotify event - * for toplevel windows. - */ - event.xany.serial = display->request; - event.xany.send_event = False; - event.xany.display = display; - - event.xunmap.type = UnmapNotify; - event.xunmap.window = window; - event.xunmap.event = window; - event.xunmap.from_configure = false; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - } else { - /* - * Generate damage for that area of the window. - */ - SetGWorld(destPort, NULL); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); /* TODO: may not be valid */ - TkMacInvalClipRgns(macWin->winPtr->parentPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * XResizeWindow -- - * - * Resize a given X window. See X windows documentation for - * further details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XResizeWindow( - Display* display, /* Display. */ - Window window, /* Window. */ - unsigned int width, - unsigned int height) -{ - MacDrawable *macWin = (MacDrawable *) window; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(window); - if (destPort == NULL) { - return; - } - - display->request++; - SetPort((GrafPtr) destPort); - if (Tk_IsTopLevel(macWin->winPtr)) { - if (!Tk_IsEmbedded(macWin->winPtr)) { - /* - * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need - * to completely redraw anway. - */ - SizeWindow((WindowRef) destPort, - (short) width, (short) height, false); - TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacInvalClipRgns(macWin->winPtr); - } else { - int deltaX, deltaY; - - /* - * Find the Parent window - - * For an embedded window this will be its container. - */ - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(macWin->winPtr); - - if (contWinPtr != NULL) { - MacDrawable *macParent = contWinPtr->privatePtr; - - TkMacInvalClipRgns(macParent->winPtr); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - - deltaX = macParent->xOff + - macWin->winPtr->changes.x - macWin->xOff; - deltaY = macParent->yOff + - macWin->winPtr->changes.y - macWin->yOff; - - UpdateOffsets(macWin->winPtr, deltaX, deltaY); - } else { - /* - * This is the case where we are embedded in - * another app. At this point, we are assuming that - * the changes.x,y is not maintained, if you need - * the info get it from Tk_GetRootCoords, - * and that the toplevel sits at 0,0 when it is drawn. - */ - - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - UpdateOffsets(macWin->winPtr, 0, 0); - } - - } - } else { - /* TODO: update all xOff & yOffs */ - int deltaX, deltaY, parentBorderwidth; - MacDrawable *macParent = macWin->winPtr->parentPtr->privatePtr; - - if (macParent == NULL) { - return; /* TODO: Probably should be a panic */ - } - - TkMacInvalClipRgns(macParent->winPtr); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - - deltaX = - macWin->xOff; - deltaY = - macWin->yOff; - - parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; - - deltaX += macParent->xOff + parentBorderwidth + - macWin->winPtr->changes.x; - deltaY += macParent->yOff + parentBorderwidth + - macWin->winPtr->changes.y; - - UpdateOffsets(macWin->winPtr, deltaX, deltaY); - } -} - -/* - *---------------------------------------------------------------------- - * - * XMoveResizeWindow -- - * - * Move or resize a given X window. See X windows documentation - * for further details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XMoveResizeWindow( - Display* display, /* Display. */ - Window window, /* Window. */ - int x, int y, - unsigned int width, - unsigned int height) -{ - MacDrawable *macWin = (MacDrawable *) window; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(window); - if (destPort == NULL) { - return; - } - - SetPort((GrafPtr) destPort); - if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { - /* - * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need - * to completely redraw anway. - */ - - SizeWindow((WindowRef) destPort, - (short) width, (short) height, false); - tkMacMoveWindow((WindowRef) destPort, x, y); - - /* TODO: is the following right? */ - TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacInvalClipRgns(macWin->winPtr); - } else { - int deltaX, deltaY, parentBorderwidth; - Rect bounds; - MacDrawable *macParent; - - /* - * Find the Parent window - - * For an embedded window this will be its container. - */ - - if (Tk_IsEmbedded(macWin->winPtr)) { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(macWin->winPtr); - if (contWinPtr == NULL) { - panic("XMoveResizeWindow could not find container"); - } - macParent = contWinPtr->privatePtr; - - /* - * NOTE: Here we should handle out of process embedding. - */ - - - } else { - macParent = macWin->winPtr->parentPtr->privatePtr; - if (macParent == NULL) { - return; /* TODO: Probably should be a panic */ - } - } - - TkMacInvalClipRgns(macParent->winPtr); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - - deltaX = - macWin->xOff; - deltaY = - macWin->yOff; - - /* - * If macWin->winPtr is an embedded window, don't offset by its - * parent's borderwidth... - */ - - if (!Tk_IsEmbedded(macWin->winPtr)) { - parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; - } else { - parentBorderwidth = 0; - } - deltaX += macParent->xOff + parentBorderwidth + - macWin->winPtr->changes.x; - deltaY += macParent->yOff + parentBorderwidth + - macWin->winPtr->changes.y; - - UpdateOffsets(macWin->winPtr, deltaX, deltaY); - TkMacWinBounds(macWin->winPtr, &bounds); - InvalRect(&bounds); - } -} - -/* - *---------------------------------------------------------------------- - * - * XMoveWindow -- - * - * Move a given X window. See X windows documentation for further - * details. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XMoveWindow( - Display* display, /* Display. */ - Window window, /* Window. */ - int x, - int y) -{ - MacDrawable *macWin = (MacDrawable *) window; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(window); - if (destPort == NULL) { - return; - } - - SetPort((GrafPtr) destPort); - if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { - /* - * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need - * to completely redraw anway. - */ - tkMacMoveWindow((WindowRef) destPort, x, y); - - /* TODO: is the following right? */ - TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacInvalClipRgns(macWin->winPtr); - } else { - int deltaX, deltaY, parentBorderwidth; - Rect bounds; - MacDrawable *macParent; - - /* - * Find the Parent window - - * For an embedded window this will be its container. - */ - - if (Tk_IsEmbedded(macWin->winPtr)) { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(macWin->winPtr); - if (contWinPtr == NULL) { - panic("XMoveWindow could not find container"); - } - macParent = contWinPtr->privatePtr; - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } else { - macParent = macWin->winPtr->parentPtr->privatePtr; - if (macParent == NULL) { - return; /* TODO: Probably should be a panic */ - } - } - - TkMacInvalClipRgns(macParent->winPtr); - TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); - - deltaX = - macWin->xOff; - deltaY = - macWin->yOff; - - /* - * If macWin->winPtr is an embedded window, don't offset by its - * parent's borderwidth... - */ - - if (!Tk_IsEmbedded(macWin->winPtr)) { - parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; - } else { - parentBorderwidth = 0; - } - deltaX += macParent->xOff + parentBorderwidth + - macWin->winPtr->changes.x; - deltaY += macParent->yOff + parentBorderwidth + - macWin->winPtr->changes.y; - - UpdateOffsets(macWin->winPtr, deltaX, deltaY); - TkMacWinBounds(macWin->winPtr, &bounds); - InvalRect(&bounds); - } -} - -/* - *---------------------------------------------------------------------- - * - * XRaiseWindow -- - * - * Change the stacking order of a window. - * - * Results: - * None. - * - * Side effects: - * Changes the stacking order of the specified window. - * - *---------------------------------------------------------------------- - */ - -void -XRaiseWindow( - Display* display, /* Display. */ - Window window) /* Window. */ -{ - MacDrawable *macWin = (MacDrawable *) window; - - display->request++; - if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { - TkWmRestackToplevel(macWin->winPtr, Above, NULL); - } else { - /* TODO: this should generate damage */ - } -} - -/* - *---------------------------------------------------------------------- - * - * XConfigureWindow -- - * - * Change the size, position, stacking, or border of the specified - * window. - * - * Results: - * None. - * - * Side effects: - * Changes the attributes of the specified window. Note that we - * ignore the passed in values and use the values stored in the - * TkWindow data structure. - * - *---------------------------------------------------------------------- - */ - -void -XConfigureWindow( - Display* display, /* Display. */ - Window w, /* Window. */ - unsigned int value_mask, - XWindowChanges* values) -{ - MacDrawable *macWin = (MacDrawable *) w; - TkWindow *winPtr = macWin->winPtr; - - display->request++; - - /* - * Change the shape and/or position of the window. - */ - - if (value_mask & (CWX|CWY|CWWidth|CWHeight)) { - XMoveResizeWindow(display, w, winPtr->changes.x, winPtr->changes.y, - winPtr->changes.width, winPtr->changes.height); - } - - /* - * Change the stacking order of the window. Tk actuall keeps all - * the information we need for stacking order. All we need to do - * is make sure the clipping regions get updated and generate damage - * that will ensure things get drawn correctly. - */ - - if (value_mask & CWStackMode) { - Rect bounds; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(w); - if (destPort != NULL) { - SetPort((GrafPtr) destPort); - TkMacInvalClipRgns(winPtr->parentPtr); - TkMacWinBounds(winPtr, &bounds); - InvalRect(&bounds); - } - } - - /* TkGenWMMoveRequestEvent(macWin->winPtr, - macWin->winPtr->changes.x, macWin->winPtr->changes.y); */ -} - -/* - *---------------------------------------------------------------------- - * - * TkMacUpdateClipRgn -- - * - * This function updates the cliping regions for a given window - * and all of its children. Once updated the TK_CLIP_INVALID flag - * in the subwindow data structure is unset. The TK_CLIP_INVALID - * flag should always be unset before any drawing is attempted. - * - * Results: - * None. - * - * Side effects: - * The clip regions for the window and its children are updated. - * - *---------------------------------------------------------------------- - */ - -void -TkMacUpdateClipRgn( - TkWindow *winPtr) -{ - RgnHandle rgn; - int x, y; - TkWindow *win2Ptr; - - if (winPtr == NULL) { - return; - } - - if (winPtr->privatePtr->flags & TK_CLIP_INVALID) { - rgn = winPtr->privatePtr->aboveClipRgn; - if (tmpRgn == NULL) { - tmpRgn = NewRgn(); - } - - /* - * Start with a region defined by the window bounds. - */ - - x = winPtr->privatePtr->xOff; - y = winPtr->privatePtr->yOff; - SetRectRgn(rgn, (short) x, (short) y, - (short) (winPtr->changes.width + x), - (short) (winPtr->changes.height + y)); - - /* - * Clip away the area of any windows that may obscure this - * window. - * For a non-toplevel window, first, clip to the parents visable - * clip region. - * Second, clip away any siblings that are higher in the - * stacking order. - * For an embedded toplevel, just clip to the container's visible - * clip region. Remember, we only allow one contained window - * in a frame, and don't support any other widgets in the frame either. - * This is not currently enforced, however. - */ - - if (!Tk_TopWinHierarchy(winPtr)) { - TkMacUpdateClipRgn(winPtr->parentPtr); - SectRgn(rgn, - winPtr->parentPtr->privatePtr->aboveClipRgn, rgn); - - win2Ptr = winPtr->nextPtr; - while (win2Ptr != NULL) { - if (Tk_TopWinHierarchy(win2Ptr) || !Tk_IsMapped(win2Ptr)) { - win2Ptr = win2Ptr->nextPtr; - continue; - } - x = win2Ptr->privatePtr->xOff; - y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), - (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); - - win2Ptr = win2Ptr->nextPtr; - } - } else if (Tk_IsEmbedded(winPtr)) { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(winPtr); - - if (contWinPtr != NULL) { - TkMacUpdateClipRgn(contWinPtr); - SectRgn(rgn, - contWinPtr->privatePtr->aboveClipRgn, rgn); - } else if (gMacEmbedHandler != NULL) { - gMacEmbedHandler->getClipProc((Tk_Window) winPtr, tmpRgn); - SectRgn(rgn, tmpRgn, rgn); - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } - - /* - * The final clip region is the aboveClip region (or visable - * region) minus all the children of this window. - * Alternatively, if the window is a container, we must also - * subtract the region of the embedded window. - */ - - rgn = winPtr->privatePtr->clipRgn; - CopyRgn(winPtr->privatePtr->aboveClipRgn, rgn); - - win2Ptr = winPtr->childList; - while (win2Ptr != NULL) { - if (Tk_TopWinHierarchy(win2Ptr) || !Tk_IsMapped(win2Ptr)) { - win2Ptr = win2Ptr->nextPtr; - continue; - } - x = win2Ptr->privatePtr->xOff; - y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), - (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); - - win2Ptr = win2Ptr->nextPtr; - } - - if (Tk_IsContainer(winPtr)) { - win2Ptr = TkpGetOtherWindow(winPtr); - if (win2Ptr != NULL) { - if (Tk_IsMapped(win2Ptr)) { - x = win2Ptr->privatePtr->xOff; - y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), - (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); - } - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } - - winPtr->privatePtr->flags &= ~TK_CLIP_INVALID; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacVisableClipRgn -- - * - * This function returnd the Macintosh cliping region for the - * given window. A NULL Rgn means the window is not visable. - * - * Results: - * The region. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -RgnHandle -TkMacVisableClipRgn( - TkWindow *winPtr) -{ - if (winPtr->privatePtr->flags & TK_CLIP_INVALID) { - TkMacUpdateClipRgn(winPtr); - } - - return winPtr->privatePtr->clipRgn; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacInvalidateWindow -- - * - * This function makes the window as invalid will generate damage - * for the window. - * - * Results: - * None. - * - * Side effects: - * Damage is created. - * - *---------------------------------------------------------------------- - */ - -void -TkMacInvalidateWindow( - MacDrawable *macWin, /* Make window that's causing damage. */ - int flag) /* Should be TK_WINDOW_ONLY or - * TK_PARENT_WINDOW */ -{ - - if (flag == TK_WINDOW_ONLY) { - InvalRgn(macWin->clipRgn); - } else { - if (!EmptyRgn(macWin->aboveClipRgn)) { - InvalRgn(macWin->aboveClipRgn); - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGetDrawablePort -- - * - * This function returns the Graphics Port for a given X drawable. - * - * Results: - * A GWorld pointer. Either an off screen pixmap or a Window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -GWorldPtr -TkMacGetDrawablePort( - Drawable drawable) -{ - MacDrawable *macWin = (MacDrawable *) drawable; - GWorldPtr resultPort = NULL; - - if (macWin == NULL) { - return NULL; - } - - /* - * This is NULL for off-screen pixmaps. Then the portPtr - * always points to the off-screen port, and we don't - * have to worry about containment - */ - - if (macWin->clipRgn == NULL) { - return macWin->portPtr; - } - - /* - * If the Drawable is in an embedded window, use the Port of its container. - * - * TRICKY POINT: we can have cases when a toplevel is being destroyed - * where the winPtr for the toplevel has been freed, but the children - * are not all the way destroyed. The children will call this function - * as they are being destroyed, but Tk_IsEmbedded will return garbage. - * So we check the copy of the TK_EMBEDDED flag we put into the - * toplevel's macWin flags. - */ - - if (!(macWin->toplevel->flags & TK_EMBEDDED)) { - return macWin->toplevel->portPtr; - } else { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr); - - if (contWinPtr != NULL) { - resultPort = TkMacGetDrawablePort( - (Drawable) contWinPtr->privatePtr); - } else if (gMacEmbedHandler != NULL) { - resultPort = gMacEmbedHandler->getPortProc( - (Tk_Window) macWin->winPtr); - } - - if (resultPort == NULL) { - /* - * FIXME: - * - * So far as I can tell, the only time that this happens is when - * we are tearing down an embedded child interpreter, and most - * of the time, this is harmless... However, we really need to - * find why the embedding loses. - */ - DebugStr("\pTkMacGetDrawablePort couldn't find container"); - return NULL; - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } - return resultPort; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacInvalClipRgns -- - * - * This function invalidates the clipping regions for a given - * window and all of its children. This function should be - * called whenever changes are made to subwindows that would - * effect the size or position of windows. - * - * Results: - * None. - * - * Side effects: - * The cliping regions for the window and its children are - * mark invalid. (Make sure they are valid before drawing.) - * - *---------------------------------------------------------------------- - */ - -void -TkMacInvalClipRgns( - TkWindow *winPtr) -{ - TkWindow *childPtr; - - /* - * If already marked we can stop because all - * decendants will also already be marked. - */ - if (winPtr->privatePtr->flags & TK_CLIP_INVALID) { - return; - } - - winPtr->privatePtr->flags |= TK_CLIP_INVALID; - - /* - * Invalidate clip regions for all children & - * their decendants - unless the child is a toplevel. - */ - childPtr = winPtr->childList; - while (childPtr != NULL) { - if (!Tk_TopWinHierarchy(childPtr) && Tk_IsMapped(childPtr)) { - TkMacInvalClipRgns(childPtr); - } - childPtr = childPtr->nextPtr; - } - - /* - * Also, if the window is a container, mark its embedded window - */ - - if (Tk_IsContainer(winPtr)) { - childPtr = TkpGetOtherWindow(winPtr); - - if (childPtr != NULL && Tk_IsMapped(childPtr)) { - TkMacInvalClipRgns(childPtr); - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacWinBounds -- - * - * Given a Tk window this function determines the windows - * bounds in relation to the Macintosh window's coordinate - * system. This is also the same coordinate system as the - * Tk toplevel window in which this window is contained. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkMacWinBounds( - TkWindow *winPtr, - Rect *bounds) -{ - bounds->left = (short) winPtr->privatePtr->xOff; - bounds->top = (short) winPtr->privatePtr->yOff; - bounds->right = (short) (winPtr->privatePtr->xOff + - winPtr->changes.width); - bounds->bottom = (short) (winPtr->privatePtr->yOff + - winPtr->changes.height); -} - -/* - *---------------------------------------------------------------------- - * - * tkMacMoveWindow -- - * - * A replacement for the Macintosh MoveWindow function. This - * function adjusts the inputs to MoveWindow to offset the root of - * the window system. This has the effect of making the coords - * refer to the window dressing rather than the top of the content. - * - * Results: - * None. - * - * Side effects: - * Moves the Macintosh window. - * - *---------------------------------------------------------------------- - */ - -void -tkMacMoveWindow( - WindowRef window, - int x, - int y) -{ - int xOffset, yOffset; - - if (TkMacHaveAppearance() >= 0x110) { - MoveWindowStructure((WindowRef) window, (short) x, (short) y); - } else { - TkMacWindowOffset(window, &xOffset, &yOffset); - MoveWindow((WindowRef) window, - (short) (x + xOffset), (short) (y + yOffset), false); -} -} - -/* - *---------------------------------------------------------------------- - * - * UpdateOffsets -- - * - * Updates the X & Y offsets of the given TkWindow from the - * TopLevel it is a decendant of. - * - * Results: - * None. - * - * Side effects: - * The xOff & yOff fields for the Mac window datastructure - * is updated to the proper offset. - * - *---------------------------------------------------------------------- - */ - -static void -UpdateOffsets( - TkWindow *winPtr, - int deltaX, - int deltaY) -{ - TkWindow *childPtr; - - if (winPtr->privatePtr == NULL) { - /* - * We havn't called Tk_MakeWindowExist for this window yet. The - * offset information will be postponed and calulated at that - * time. (This will usually only happen when a mapped parent is - * being moved but has child windows that have yet to be mapped.) - */ - return; - } - - winPtr->privatePtr->xOff += deltaX; - winPtr->privatePtr->yOff += deltaY; - - childPtr = winPtr->childList; - while (childPtr != NULL) { - if (!Tk_TopWinHierarchy(childPtr)) { - UpdateOffsets(childPtr, deltaX, deltaY); - } - childPtr = childPtr->nextPtr; - } - - if (Tk_IsContainer(winPtr)) { - childPtr = TkpGetOtherWindow(winPtr); - if (childPtr != NULL) { - UpdateOffsets(childPtr,deltaX,deltaY); - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } -} - -/* - *---------------------------------------------------------------------- - * - * Tk_GetPixmap -- - * - * Creates an in memory drawing surface. - * - * Results: - * Returns a handle to a new pixmap. - * - * Side effects: - * Allocates a new Macintosh GWorld. - * - *---------------------------------------------------------------------- - */ - -Pixmap -Tk_GetPixmap( - Display *display, /* Display for new pixmap (can be null). */ - Drawable d, /* Drawable where pixmap will be used (ignored). */ - int width, /* Dimensions of pixmap. */ - int height, - int depth) /* Bits per pixel for pixmap. */ -{ - QDErr err; - GWorldPtr gWorld; - Rect bounds; - MacDrawable *macPix; - PixMapHandle pixels; - - if (display != NULL) { - display->request++; - } - macPix = (MacDrawable *) ckalloc(sizeof(MacDrawable)); - macPix->winPtr = NULL; - macPix->xOff = 0; - macPix->yOff = 0; - macPix->clipRgn = NULL; - macPix->aboveClipRgn = NULL; - macPix->referenceCount = 0; - macPix->toplevel = NULL; - macPix->flags = 0; - - bounds.top = bounds.left = 0; - bounds.right = (short) width; - bounds.bottom = (short) height; - if (depth != 1) { - depth = 0; - } - - /* - * Allocate memory for the off screen pixmap. If we fail - * try again from system memory. Eventually, we may have - * to panic. - */ - err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, 0); - if (err != noErr) { - err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, useTempMem); - } - if (err != noErr) { - panic("Out of memory: NewGWorld failed in Tk_GetPixmap"); - } - - /* - * Lock down the pixels so they don't move out from under us. - */ - pixels = GetGWorldPixMap(gWorld); - LockPixels(pixels); - macPix->portPtr = gWorld; - - return (Pixmap) macPix; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_FreePixmap -- - * - * Release the resources associated with a pixmap. - * - * Results: - * None. - * - * Side effects: - * Deletes the Macintosh GWorld created by Tk_GetPixmap. - * - *---------------------------------------------------------------------- - */ - -void -Tk_FreePixmap( - Display *display, /* Display. */ - Pixmap pixmap) /* Pixmap to destroy */ -{ - MacDrawable *macPix = (MacDrawable *) pixmap; - PixMapHandle pixels; - - display->request++; - pixels = GetGWorldPixMap(macPix->portPtr); - UnlockPixels(pixels); - DisposeGWorld(macPix->portPtr); - ckfree((char *) macPix); -} - diff --git a/mac/tkMacTclCode.r b/mac/tkMacTclCode.r deleted file mode 100644 index adbd0f6..0000000 --- a/mac/tkMacTclCode.r +++ /dev/null @@ -1,71 +0,0 @@ -/* - * tkMacTclCode.r -- - * - * This file creates resources from the Tcl code that is - * usually stored in the TCL_LIBRARY - * - * Copyright (c) 1996-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * SCCS: @(#) tkMacTclCode.r 1.1 98/01/21 22:22:38 - */ - -#include <Types.r> -#include <SysTypes.r> - -#define TK_LIBRARY_RESOURCES 3000 - -/* - * The mechanisim below loads Tcl source into the resource fork of the - * application. The example below creates a TEXT resource named - * "Init" from the file "init.tcl". This allows applications to use - * Tcl to define the behavior of the application without having to - * require some predetermined file structure - all needed Tcl "files" - * are located within the application. To source a file for the - * resource fork the source command has been modified to support - * sourcing from resources. In the below case "source -rsrc {Init}" - * will load the TEXT resource named "Init". - */ - -read 'TEXT' (TK_LIBRARY_RESOURCES+1, "tk", purgeable,preload) - "::library:tk.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+2, "button", purgeable) - "::library:button.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+3, "dialog", purgeable) - "::library:dialog.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+4, "entry", purgeable) - "::library:entry.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+5, "focus", purgeable) - "::library:focus.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+6, "listbox", purgeable) - "::library:listbox.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+7, "menu", purgeable) - "::library:menu.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+8, "optMenu", purgeable) - "::library:optMenu.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+9, "palette", purgeable) - "::library:palette.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+10, "scale", purgeable) - "::library:scale.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+11, "scrlbar", purgeable) - "::library:scrlbar.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+12, "tearoff", purgeable) - "::library:tearoff.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+13, "text", purgeable) - "::library:text.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+14, "bgerror", purgeable) - "::library:bgerror.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+15, "console", purgeable) - "::library:console.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+16, "msgbox", purgeable) - "::library:msgbox.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+17, "comdlg", purgeable) - "::library:comdlg.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+18, "spinbox", purgeable) - "::library:spinbox.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+19, "panedwindow", purgeable) - "::library:panedwindow.tcl"; -read 'TEXT' (TK_LIBRARY_RESOURCES+20, "msgcat", purgeable) - ":::tcl:library:msgcat:msgcat.tcl"; diff --git a/mac/tkMacTest.c b/mac/tkMacTest.c deleted file mode 100644 index 137ec44..0000000 --- a/mac/tkMacTest.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * tkMacTest.c -- - * - * Contains commands for platform specific tests for - * the Macintosh platform. - * - * Copyright (c) 1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacTest.c,v 1.4 2002/10/09 11:56:57 das Exp $ - */ - -#include <Types.h> -#include <tcl.h> - -/* - * Forward declarations of procedures defined later in this file: - */ - -int TkplatformtestInit _ANSI_ARGS_((Tcl_Interp *interp)); -static int DebuggerCmd _ANSI_ARGS_((ClientData dummy, - Tcl_Interp *interp, int argc, CONST char **argv)); - -/* - *---------------------------------------------------------------------- - * - * TkplatformtestInit -- - * - * Defines commands that test platform specific functionality for - * Unix platforms. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * Defines new commands. - * - *---------------------------------------------------------------------- - */ - -int -TkplatformtestInit( - Tcl_Interp *interp) /* Interpreter to add commands to. */ -{ - /* - * Add commands for platform specific tests on MacOS here. - */ - - Tcl_CreateCommand(interp, "debugger", DebuggerCmd, - (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * DebuggerCmd -- - * - * This procedure simply calls the low level debugger. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static int -DebuggerCmd( - ClientData clientData, /* Not used. */ - Tcl_Interp *interp, /* Not used. */ - int argc, /* Not used. */ - CONST char **argv) /* Not used. */ -{ - Debugger(); - return TCL_OK; -} diff --git a/mac/tkMacWindowMgr.c b/mac/tkMacWindowMgr.c deleted file mode 100644 index abe0c35..0000000 --- a/mac/tkMacWindowMgr.c +++ /dev/null @@ -1,1791 +0,0 @@ -/* - * tkMacWindowMgr.c -- - * - * Implements common window manager functions for the Macintosh. - * - * Copyright (c) 1995-1998 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacWindowMgr.c,v 1.10 2002/06/14 22:25:12 jenglish Exp $ - */ - -#include <Events.h> -#include <Dialogs.h> -#include <EPPC.h> -#include <Windows.h> -#include <ToolUtils.h> -#include <DiskInit.h> -#include <LowMem.h> -#include <Timer.h> -#include <Sound.h> - -#include "tkInt.h" -#include "tkPort.h" -#include "tkMacInt.h" - -#define TK_DEFAULT_ABOUT 128 - -/* - * Declarations of global variables defined in this file. - */ - -int tkMacAppInFront = true; /* Boolean variable for determining - * if we are the frontmost app. */ - -/* - * Non-standard event types that can be passed to HandleEvent. - * These are defined and used by Netscape's plugin architecture. - */ -#define getFocusEvent (osEvt + 16) -#define loseFocusEvent (osEvt + 17) -#define adjustCursorEvent (osEvt + 18) - -/* - * Declarations of static variables used in this file. - */ - -static int gEatButtonUp = 0; /* 1 if we need to eat the next - * up event */ -static Tk_Window gGrabWinPtr = NULL; /* Current grab window, NULL if no grab. */ -static Tk_Window gKeyboardWinPtr = NULL; /* Current keyboard grab window. */ -static RgnHandle gDamageRgn = NULL; /* Damage region used for handling - * screen updates. */ -/* - * Forward declarations of procedures used in this file. - */ - -static void BringWindowForward _ANSI_ARGS_((WindowRef wRef)); -static int CheckEventsAvail _ANSI_ARGS_((void)); -static int GenerateActivateEvents _ANSI_ARGS_((EventRecord *eventPtr, - Window window)); -static int GenerateFocusEvent _ANSI_ARGS_((EventRecord *eventPtr, - Window window)); -static int GenerateKeyEvent _ANSI_ARGS_((EventRecord *eventPtr, - Window window, UInt32 savedCode)); -static int GenerateUpdateEvent _ANSI_ARGS_((EventRecord *eventPtr, - Window window)); -static void GenerateUpdates _ANSI_ARGS_((RgnHandle updateRgn, - TkWindow *winPtr)); -static int GeneratePollingEvents _ANSI_ARGS_((void)); -static int GeneratePollingEvents2 _ANSI_ARGS_((Window window, - int adjustCursor)); -static OSErr TellWindowDefProcToCalcRegions _ANSI_ARGS_((WindowRef wRef)); -static int WindowManagerMouse _ANSI_ARGS_((EventRecord *theEvent, - Window window)); - - -/* - *---------------------------------------------------------------------- - * - * WindowManagerMouse -- - * - * This function determines if a button event is a "Window Manager" - * function or an event that should be passed to Tk's event - * queue. - * - * Results: - * Return true if event was placed on Tk's event queue. - * - * Side effects: - * Depends on where the button event occurs. - * - *---------------------------------------------------------------------- - */ - -static int -WindowManagerMouse( - EventRecord *eventPtr, /* Macintosh event record. */ - Window window) /* Window pointer. */ -{ - WindowRef whichWindow, frontWindow, frontNonFloating; - Tk_Window tkwin; - Point where, where2; - int xOffset, yOffset; - short windowPart; - TkDisplay *dispPtr; - - frontWindow = FrontWindow(); - if (TkMacHaveAppearance() >= 0x110) { - frontNonFloating = FrontNonFloatingWindow(); - } else { - frontNonFloating = frontWindow; - } - - /* - * The window manager only needs to know about mouse down events - * and sometimes we need to "eat" the mouse up. Otherwise, we - * just pass the event to Tk. - */ - if (eventPtr->what == mouseUp) { - if (gEatButtonUp) { - gEatButtonUp = false; - return false; - } - return TkGenerateButtonEvent(eventPtr->where.h, eventPtr->where.v, - window, TkMacButtonKeyState()); - } - - windowPart = FindWindow(eventPtr->where, &whichWindow); - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - switch (windowPart) { - case inSysWindow: - SystemClick(eventPtr, (GrafPort *) whichWindow); - return false; - case inDrag: - if (!(TkpIsWindowFloating(whichWindow)) && (whichWindow != frontNonFloating)) { - if (!(eventPtr->modifiers & cmdKey)) { - if ((gGrabWinPtr != NULL) && (gGrabWinPtr != tkwin)) { - SysBeep(1); - return false; - } - } - } - - /* - * Call DragWindow to move the window around. It will - * also eat the mouse up event. - */ - SetPort((GrafPort *) whichWindow); - where.h = where.v = 0; - LocalToGlobal(&where); - DragWindow(whichWindow, eventPtr->where, - &tcl_macQdPtr->screenBits.bounds); - gEatButtonUp = false; - - where2.h = where2.v = 0; - LocalToGlobal(&where2); - if (EqualPt(where, where2)) { - return false; - } - - TkMacWindowOffset(whichWindow, &xOffset, &yOffset); - where2.h -= xOffset; - where2.v -= yOffset; - TkGenWMConfigureEvent(tkwin, where2.h, where2.v, - -1, -1, TK_LOCATION_CHANGED); - return true; - case inGrow: - case inContent: - if (!(TkpIsWindowFloating(whichWindow)) - && (whichWindow != frontNonFloating)) { - /* - * This click moves the window forward. We don't want - * the corasponding mouse-up to be reported to the application - * or else it will mess up some Tk scripts. - */ - if ((gGrabWinPtr != NULL) && (gGrabWinPtr != tkwin)) { - SysBeep(1); - return false; - } - gEatButtonUp = true; - SetPort((GrafPort *) whichWindow); - BringWindowForward(whichWindow); - return false; - } else { - /* - * Generally the content region is the domain of Tk - * sub-windows. However, one exception is the grow - * region. A button down in this area will be handled - * by the window manager. Note: this means that Tk - * may not get button down events in this area! - */ - - if (TkMacGrowToplevel(whichWindow, eventPtr->where) == true) { - return true; - } else { - return TkGenerateButtonEvent(eventPtr->where.h, - eventPtr->where.v, window, TkMacButtonKeyState()); - } - } - case inGoAway: - if (TrackGoAway( whichWindow, eventPtr->where)) { - if (tkwin == NULL) { - return false; - } - TkGenWMDestroyEvent(tkwin); - return true; - } - return false; - case inMenuBar: - { - int oldMode; - KeyMap theKeys; - - GetKeys(theKeys); - oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL); - TkMacClearMenubarActive(); - /* - * Handle -postcommand - */ - TkMacPreprocessMenu(); - TkMacHandleMenuSelect(MenuSelect(eventPtr->where), - theKeys[1] & 4); - Tcl_SetServiceMode(oldMode); - return true; /* TODO: may not be on event on queue. */ - } - case inZoomIn: - case inZoomOut: - if (TkMacZoomToplevel(whichWindow, eventPtr->where, windowPart) - == true) { - return true; - } else { - return false; - } - default: - return false; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkAboutDlg -- - * - * Displays the default Tk About box. This code uses Macintosh - * resources to define the content of the About Box. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkAboutDlg() -{ - DialogPtr aboutDlog; - short itemHit = -9; - - aboutDlog = GetNewDialog(128, NULL, (void*)(-1)); - - if (!aboutDlog) { - return; - } - - SelectWindow((WindowRef) aboutDlog); - - while (itemHit != 1) { - ModalDialog( NULL, &itemHit); - } - DisposeDialog(aboutDlog); - aboutDlog = NULL; - - if (TkMacHaveAppearance() >= 0x110) { - SelectWindow(FrontNonFloatingWindow()); - } else { - SelectWindow(FrontWindow()); - } - - return; -} - -/* - *---------------------------------------------------------------------- - * - * GenerateUpdateEvent -- - * - * Given a Macintosh update event this function generates all the - * X update events needed by Tk. - * - * Results: - * True if event(s) are generated - false otherwise. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * - *---------------------------------------------------------------------- - */ - -static int -GenerateUpdateEvent( - EventRecord *eventPtr, /* Incoming Mac event */ - Window window) /* Root X window for event. */ -{ - WindowRef macWindow; - register TkWindow *winPtr; - TkDisplay *dispPtr; - - dispPtr = TkGetDisplayList(); - winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); - - if (winPtr == NULL) { - return false; - } - - if (gDamageRgn == NULL) { - gDamageRgn = NewRgn(); - } - - /* - * After the call to BeginUpdate the visable region (visRgn) of the - * window is equal to the intersection of the real visable region and - * the update region for this event. We use this region in all of our - * calculations. - */ - - if (eventPtr->message != NULL) { - macWindow = (WindowRef) TkMacGetDrawablePort(window); - BeginUpdate(macWindow); - GenerateUpdates(macWindow->visRgn, winPtr); - EndUpdate(macWindow); - return true; - } else { - /* - * This event didn't come from the system. This might - * occur if we are running from inside of Netscape. - * In this we shouldn't call BeginUpdate as the vis region - * may be NULL. - */ - RgnHandle rgn; - Rect bounds; - - rgn = NewRgn(); - TkMacWinBounds(winPtr, &bounds); - RectRgn(rgn, &bounds); - GenerateUpdates(rgn, winPtr); - DisposeRgn(rgn); - return true; - } -} - -/* - *---------------------------------------------------------------------- - * - * GenerateUpdates -- - * - * Given a Macintosh update region and a Tk window this function - * geneates a X damage event for the window if it is within the - * update region. The function will then recursivly have each - * damaged window generate damage events for its child windows. - * - * Results: - * None. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * - *---------------------------------------------------------------------- - */ - -static void -GenerateUpdates( - RgnHandle updateRgn, - TkWindow *winPtr) -{ - TkWindow *childPtr; - XEvent event; - Rect bounds; - - TkMacWinBounds(winPtr, &bounds); - - if (bounds.top > (*updateRgn)->rgnBBox.bottom || - (*updateRgn)->rgnBBox.top > bounds.bottom || - bounds.left > (*updateRgn)->rgnBBox.right || - (*updateRgn)->rgnBBox.left > bounds.right || - !RectInRgn(&bounds, updateRgn)) { - return; - } - - event.xany.serial = Tk_Display(winPtr)->request; - event.xany.send_event = false; - event.xany.window = Tk_WindowId(winPtr); - event.xany.display = Tk_Display(winPtr); - - event.type = Expose; - - /* - * Compute the bounding box of the area that the damage occured in. - */ - - /* - * CopyRgn(TkMacVisableClipRgn(winPtr), rgn); - * TODO: this call doesn't work doing resizes!!! - */ - RectRgn(gDamageRgn, &bounds); - SectRgn(gDamageRgn, updateRgn, gDamageRgn); - OffsetRgn(gDamageRgn, -bounds.left, -bounds.top); - event.xexpose.x = (**gDamageRgn).rgnBBox.left; - event.xexpose.y = (**gDamageRgn).rgnBBox.top; - event.xexpose.width = (**gDamageRgn).rgnBBox.right - - (**gDamageRgn).rgnBBox.left; - event.xexpose.height = (**gDamageRgn).rgnBBox.bottom - - (**gDamageRgn).rgnBBox.top; - event.xexpose.count = 0; - - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - - /* - * Generate updates for the children of this window - */ - - for (childPtr = winPtr->childList; childPtr != NULL; - childPtr = childPtr->nextPtr) { - if (!Tk_IsMapped(childPtr) || Tk_TopWinHierarchy(childPtr)) { - continue; - } - - GenerateUpdates(updateRgn, childPtr); - } - - /* - * Generate updates for any contained windows - */ - - if (Tk_IsContainer(winPtr)) { - childPtr = TkpGetOtherWindow(winPtr); - if (childPtr != NULL && Tk_IsMapped(childPtr)) { - GenerateUpdates(updateRgn, childPtr); - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } - - return; -} - -/* - *---------------------------------------------------------------------- - * - * TkGenerateButtonEvent -- - * - * Given a global x & y position and the button key status this - * procedure generates the appropiate X button event. It also - * handles the state changes needed to implement implicit grabs. - * - * Results: - * True if event(s) are generated - false otherwise. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * Grab state may also change. - * - *---------------------------------------------------------------------- - */ - -int -TkGenerateButtonEvent( - int x, /* X location of mouse */ - int y, /* Y location of mouse */ - Window window, /* X Window containing button event. */ - unsigned int state) /* Button Key state suitable for X event */ -{ - WindowRef whichWin, frontWin; - Point where; - Tk_Window tkwin; - int dummy; - TkDisplay *dispPtr; - - /* - * ButtonDown events will always occur in the front - * window. ButtonUp events, however, may occur anywhere - * on the screen. ButtonUp events should only be sent - * to Tk if in the front window or during an implicit grab. - */ - where.h = x; - where.v = y; - FindWindow(where, &whichWin); - if (TkMacHaveAppearance() >= 0x110) { - frontWin = FrontNonFloatingWindow(); - } else { - frontWin = FrontWindow(); - } - - if ((frontWin == NULL) || ((!(TkpIsWindowFloating(whichWin)) && (frontWin != whichWin)) - && gGrabWinPtr == NULL)) { - return false; - } - - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - - GlobalToLocal(&where); - if (tkwin != NULL) { - tkwin = Tk_TopCoordsToWindow(tkwin, where.h, where.v, &dummy, &dummy); - } - - Tk_UpdatePointer(tkwin, x, y, state); - - return true; -} - -/* - *---------------------------------------------------------------------- - * - * GenerateActivateEvents -- - * - * Generate Activate/Deactivate events from a Macintosh Activate - * event. Note, the activate-on-foreground bit must be set in the - * SIZE flags to ensure we get Activate/Deactivate in addition to - * Susspend/Resume events. - * - * Results: - * Returns true if events were generate. - * - * Side effects: - * Queue events on Tk's event queue. - * - *---------------------------------------------------------------------- - */ - -static int -GenerateActivateEvents( - EventRecord *eventPtr, /* Incoming Mac event */ - Window window) /* Root X window for event. */ -{ - TkWindow *winPtr; - TkDisplay *dispPtr; - - dispPtr = TkGetDisplayList(); - winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); - if (winPtr == NULL || winPtr->window == None) { - return false; - } - - TkGenerateActivateEvents(winPtr, - (eventPtr->modifiers & activeFlag) ? 1 : 0); - return true; -} - -/* - *---------------------------------------------------------------------- - * - * XSetInputFocus -- - * - * Change the focus window for the application. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XSetInputFocus( - Display* display, - Window focus, - int revert_to, - Time time) -{ - /* - * Don't need to do a thing. Tk manages the focus for us. - */ -} - -/* - *---------------------------------------------------------------------- - * - * TkpChangeFocus -- - * - * This procedure is a stub on the Mac because we always own the - * focus if we are a front most application. - * - * Results: - * The return value is the serial number of the command that - * changed the focus. It may be needed by the caller to filter - * out focus change events that were queued before the command. - * If the procedure doesn't actually change the focus then - * it returns 0. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpChangeFocus(winPtr, force) - TkWindow *winPtr; /* Window that is to receive the X focus. */ - int force; /* Non-zero means claim the focus even - * if it didn't originally belong to - * topLevelPtr's application. */ -{ - /* - * We don't really need to do anything on the Mac. Tk will - * keep all this state for us. - */ - - if (winPtr->atts.override_redirect) { - return 0; - } - - /* - * Remember the current serial number for the X server and issue - * a dummy server request. This marks the position at which we - * changed the focus, so we can distinguish FocusIn and FocusOut - * events on either side of the mark. - */ - - return NextRequest(winPtr->display); -} - -/* - *---------------------------------------------------------------------- - * - * GenerateFocusEvent -- - * - * Generate FocusIn/FocusOut events from a Macintosh Activate - * event. Note, the activate-on-foreground bit must be set in - * the SIZE flags to ensure we get Activate/Deactivate in addition - * to Susspend/Resume events. - * - * Results: - * Returns true if events were generate. - * - * Side effects: - * Queue events on Tk's event queue. - * - *---------------------------------------------------------------------- - */ - -static int -GenerateFocusEvent( - EventRecord *eventPtr, /* Incoming Mac event */ - Window window) /* Root X window for event. */ -{ - XEvent event; - Tk_Window tkwin; - TkDisplay *dispPtr; - - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - if (tkwin == NULL) { - return false; - } - - /* - * Generate FocusIn and FocusOut events. This event - * is only sent to the toplevel window. - */ - - if (eventPtr->modifiers & activeFlag) { - event.xany.type = FocusIn; - } else { - event.xany.type = FocusOut; - } - - event.xany.serial = dispPtr->display->request; - event.xany.send_event = False; - event.xfocus.display = dispPtr->display; - event.xfocus.window = window; - event.xfocus.mode = NotifyNormal; - event.xfocus.detail = NotifyDetailNone; - - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - return true; -} - -/* - *---------------------------------------------------------------------- - * - * GenerateKeyEvent -- - * - * Given Macintosh keyUp, keyDown & autoKey events this function - * generates the appropiate X key events. The window that is passed - * should represent the frontmost window - which will recieve the - * event. - * - * Results: - * True if event(s) are generated - false otherwise. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * - *---------------------------------------------------------------------- - */ - -static int -GenerateKeyEvent( - EventRecord *eventPtr, /* Incoming Mac event */ - Window window, /* Root X window for event. */ - UInt32 savedKeyCode) /* If non-zero, this is a lead byte which - * should be combined with the character - * in this event to form one multi-byte - * character. */ -{ - Point where; - Tk_Window tkwin; - XEvent event; - unsigned char byte; - char buf[16]; - TkDisplay *dispPtr; - - /* - * The focus must be in the FrontWindow on the Macintosh. - * We then query Tk to determine the exact Tk window - * that owns the focus. - */ - - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - - if (tkwin == NULL) { - return false; - } - tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr; - if (tkwin == NULL) { - return false; - } - byte = (unsigned char) (eventPtr->message & charCodeMask); - if ((savedKeyCode == 0) && - (Tcl_ExternalToUtf(NULL, NULL, (char *) &byte, 1, 0, NULL, - buf, sizeof(buf), NULL, NULL, NULL) != TCL_OK)) { - /* - * This event specifies a lead byte. Wait for the second byte - * to come in before sending the XEvent. - */ - - return false; - } - - where.v = eventPtr->where.v; - where.h = eventPtr->where.h; - - event.xany.send_event = False; - event.xkey.same_screen = true; - event.xkey.subwindow = None; - event.xkey.time = TkpGetMS(); - - event.xkey.x_root = where.h; - event.xkey.y_root = where.v; - GlobalToLocal(&where); - Tk_TopCoordsToWindow(tkwin, where.h, where.v, - &event.xkey.x, &event.xkey.y); - - event.xkey.keycode = byte | - ((savedKeyCode & charCodeMask) << 8) | - ((eventPtr->message & keyCodeMask) << 8); - - event.xany.serial = Tk_Display(tkwin)->request; - event.xkey.window = Tk_WindowId(tkwin); - event.xkey.display = Tk_Display(tkwin); - event.xkey.root = XRootWindow(Tk_Display(tkwin), 0); - event.xkey.state = TkMacButtonKeyState(); - - if (eventPtr->what == keyDown) { - event.xany.type = KeyPress; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - } else if (eventPtr->what == keyUp) { - event.xany.type = KeyRelease; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - } else { - /* - * Autokey events send multiple XKey events. - * - * Note: the last KeyRelease will always be missed with - * this scheme. However, most Tk scripts don't look for - * KeyUp events so we should be OK. - */ - event.xany.type = KeyRelease; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - event.xany.type = KeyPress; - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - } - return true; -} - -/* - *---------------------------------------------------------------------- - * - * GeneratePollingEvents -- - * - * This function polls the mouse position and generates X Motion, - * Enter & Leave events. The cursor is also updated at this - * time. - * - * Results: - * True if event(s) are generated - false otherwise. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * The cursor may be changed. - * - *---------------------------------------------------------------------- - */ - -static int -GeneratePollingEvents() -{ - Tk_Window tkwin, rootwin; - Window window; - WindowRef whichWindow, frontWin, frontNonFloating; - Point whereLocal, whereGlobal; - Boolean inContentRgn; - short part; - int local_x, local_y; - int generatedEvents = false; - TkDisplay *dispPtr; - - /* - * First we get the current mouse position and determine - * what Tk window the mouse is over (if any). - */ - frontWin = FrontWindow(); - if (frontWin == NULL) { - return false; - } - SetPort((GrafPort *) frontWin); - - GetMouse(&whereLocal); - whereGlobal = whereLocal; - LocalToGlobal(&whereGlobal); - - part = FindWindow(whereGlobal, &whichWindow); - inContentRgn = (part == inContent || part == inGrow); - - if (TkMacHaveAppearance() >= 0x110) { - /* - * If the mouse is over the front non-floating window, then we - * need to set the local coordinates relative to that window - * rather than a possibly floating window above it. - */ - - frontNonFloating = FrontNonFloatingWindow(); - if (whichWindow == frontNonFloating - && (whichWindow != frontWin)) { - SetPort((GrafPort *) frontNonFloating); - whereLocal = whereGlobal; - GlobalToLocal(&whereLocal); - } - } else { - frontNonFloating = frontWin; - } - - if ((!TkpIsWindowFloating(whichWindow) && (frontNonFloating != whichWindow)) || !inContentRgn) { - tkwin = NULL; - } else { - window = TkMacGetXWindow(whichWindow); - dispPtr = TkGetDisplayList(); - rootwin = Tk_IdToWindow(dispPtr->display, window); - if (rootwin == NULL) { - tkwin = NULL; - } else { - tkwin = Tk_TopCoordsToWindow(rootwin, whereLocal.h, whereLocal.v, - &local_x, &local_y); - } - } - - /* - * The following call will generate the appropiate X events and - * adjust any state that Tk must remember. - */ - - if ((tkwin == NULL) && (gGrabWinPtr != NULL)) { - tkwin = gGrabWinPtr; - } - Tk_UpdatePointer(tkwin, whereGlobal.h, whereGlobal.v, - TkMacButtonKeyState()); - - /* - * Finally, we make sure the proper cursor is installed. The installation - * is polled to 1) make our resize hack work, and 2) make sure we have the - * proper cursor even if someone else changed the cursor out from under - * us. - */ - if ((gGrabWinPtr == NULL) && (part == inGrow) && - TkMacResizable((TkWindow *) tkwin) && - (TkMacGetScrollbarGrowWindow((TkWindow *) tkwin) == NULL)) { - TkMacInstallCursor(1); - } else { - TkMacInstallCursor(0); - } - - return true; -} - -/* - *---------------------------------------------------------------------- - * - * GeneratePollingEvents2 -- - * - * This function polls the mouse position and generates X Motion, - * Enter & Leave events. The cursor is also updated at this - * time. NOTE: this version is for Netscape!!! - * - * Results: - * True if event(s) are generated - false otherwise. - * - * Side effects: - * Additional events may be place on the Tk event queue. - * The cursor may be changed. - * - *---------------------------------------------------------------------- - */ - -static int -GeneratePollingEvents2( - Window window, - int adjustCursor) -{ - Tk_Window tkwin, rootwin; - WindowRef whichwindow, frontWin; - Point whereLocal, whereGlobal; - int local_x, local_y; - int generatedEvents = false; - Rect bounds; - TkDisplay *dispPtr; - - /* - * First we get the current mouse position and determine - * what Tk window the mouse is over (if any). - */ - frontWin = FrontWindow(); - if (frontWin == NULL) { - return false; - } - SetPort((GrafPort *) frontWin); - - GetMouse(&whereLocal); - whereGlobal = whereLocal; - LocalToGlobal(&whereGlobal); - - /* - * Determine if we are in a Tk window or not. - */ - whichwindow = (WindowRef) TkMacGetDrawablePort(window); - if (whichwindow != frontWin) { - tkwin = NULL; - } else { - dispPtr = TkGetDisplayList(); - rootwin = Tk_IdToWindow(dispPtr->display, window); - TkMacWinBounds((TkWindow *) rootwin, &bounds); - if (!PtInRect(whereLocal, &bounds)) { - tkwin = NULL; - } else { - tkwin = Tk_TopCoordsToWindow(rootwin, whereLocal.h, whereLocal.v, - &local_x, &local_y); - } - } - - - /* - * The following call will generate the appropiate X events and - * adjust any state that Tk must remember. - */ - - if ((tkwin == NULL) && (gGrabWinPtr != NULL)) { - tkwin = gGrabWinPtr; - } - Tk_UpdatePointer(tkwin, whereGlobal.h, whereGlobal.v, - TkMacButtonKeyState()); - - /* - * Finally, we make sure the proper cursor is installed. The installation - * is polled to 1) make our resize hack work, and 2) make sure we have the - * proper cursor even if someone else changed the cursor out from under - * us. - */ - - if (adjustCursor) { - TkMacInstallCursor(0); - } - return true; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacButtonKeyState -- - * - * Returns the current state of the button & modifier keys. - * - * Results: - * A bitwise inclusive OR of a subset of the following: - * Button1Mask, ShiftMask, LockMask, ControlMask, Mod?Mask, - * Mod?Mask. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -unsigned int -TkMacButtonKeyState() -{ - unsigned int state = 0; - KeyMap theKeys; - - if (Button() & !gEatButtonUp) { - state |= Button1Mask; - } - - GetKeys(theKeys); - - if (theKeys[1] & 2) { - state |= LockMask; - } - - if (theKeys[1] & 1) { - state |= ShiftMask; - } - - if (theKeys[1] & 8) { - state |= ControlMask; - } - - if (theKeys[1] & 32768) { - state |= Mod1Mask; /* command key */ - } - - if (theKeys[1] & 4) { - state |= Mod2Mask; /* option key */ - } - - return state; -} - -/* - *---------------------------------------------------------------------- - * - * XGrabKeyboard -- - * - * Simulates a keyboard grab by setting the focus. - * - * Results: - * Always returns GrabSuccess. - * - * Side effects: - * Sets the keyboard focus to the specified window. - * - *---------------------------------------------------------------------- - */ - -int -XGrabKeyboard( - Display* display, - Window grab_window, - Bool owner_events, - int pointer_mode, - int keyboard_mode, - Time time) -{ - gKeyboardWinPtr = Tk_IdToWindow(display, grab_window); - return GrabSuccess; -} - -/* - *---------------------------------------------------------------------- - * - * XUngrabKeyboard -- - * - * Releases the simulated keyboard grab. - * - * Results: - * None. - * - * Side effects: - * Sets the keyboard focus back to the value before the grab. - * - *---------------------------------------------------------------------- - */ - -void -XUngrabKeyboard( - Display* display, - Time time) -{ - gKeyboardWinPtr = NULL; -} - -/* - *---------------------------------------------------------------------- - * - * XQueryPointer -- - * - * Check the current state of the mouse. This is not a complete - * implementation of this function. It only computes the root - * coordinates and the current mask. - * - * Results: - * Sets root_x_return, root_y_return, and mask_return. Returns - * true on success. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Bool -XQueryPointer( - Display* display, - Window w, - Window* root_return, - Window* child_return, - int* root_x_return, - int* root_y_return, - int* win_x_return, - int* win_y_return, - unsigned int* mask_return) -{ - Point where; - - GetMouse(&where); - LocalToGlobal(&where); - *root_x_return = where.h; - *root_y_return = where.v; - *mask_return = TkMacButtonKeyState(); - return True; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGenerateTime -- - * - * Returns the total number of ticks from startup This function - * is used to generate the time of generated X events. - * - * Results: - * Returns the current time (ticks from startup). - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Time -TkMacGenerateTime() -{ - return (Time) LMGetTicks(); -} - -/* - *---------------------------------------------------------------------- - * - * TkMacConvertEvent -- - * - * This function converts a Macintosh event into zero or more - * Tcl events. - * - * Results: - * Returns 1 if event added to Tcl queue, 0 otherwse. - * - * Side effects: - * May add events to Tcl's event queue. - * - *---------------------------------------------------------------------- - */ - -int -TkMacConvertEvent( - EventRecord *eventPtr) -{ - WindowRef whichWindow; - Window window; - int eventFound = false; - static UInt32 savedKeyCode; - - switch (eventPtr->what) { - case nullEvent: - case adjustCursorEvent: - if (GeneratePollingEvents()) { - eventFound = true; - } - break; - case updateEvt: - whichWindow = (WindowRef)eventPtr->message; - window = TkMacGetXWindow(whichWindow); - if (GenerateUpdateEvent(eventPtr, window)) { - eventFound = true; - } - break; - case mouseDown: - case mouseUp: - FindWindow(eventPtr->where, &whichWindow); - window = TkMacGetXWindow(whichWindow); - if (WindowManagerMouse(eventPtr, window)) { - eventFound = true; - } - break; - case autoKey: - case keyDown: - /* - * Handle menu-key events here. If it is *not* - * a menu key - just fall through to handle as a - * normal key event. - */ - if ((eventPtr->modifiers & cmdKey) == cmdKey) { - long menuResult; - int oldMode; - - oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL); - menuResult = MenuKey(eventPtr->message & charCodeMask); - Tcl_SetServiceMode(oldMode); - - if (HiWord(menuResult) != 0) { - TkMacHandleMenuSelect(menuResult, false); - break; - } - } - /* fall through */ - - case keyUp: - if (TkMacHaveAppearance() >= 0x110) { - whichWindow = FrontNonFloatingWindow(); - } else { - whichWindow = FrontWindow(); - } - if (whichWindow == NULL) { - /* - * This happens if we get a key event before Tk has had a - * chance to actually create and realize ".", if they type - * when "." is withdrawn(!), or between the time "." is - * destroyed and the app exits. - */ - - return false; - } - window = TkMacGetXWindow(whichWindow); - if (GenerateKeyEvent(eventPtr, window, savedKeyCode) == 0) { - savedKeyCode = eventPtr->message; - return false; - } - eventFound = true; - break; - - case activateEvt: - window = TkMacGetXWindow((WindowRef) eventPtr->message); - eventFound |= GenerateActivateEvents(eventPtr, window); - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case getFocusEvent: - eventPtr->modifiers |= activeFlag; - window = TkMacGetXWindow((WindowRef) eventPtr->message); - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case loseFocusEvent: - eventPtr->modifiers &= ~activeFlag; - window = TkMacGetXWindow((WindowRef) eventPtr->message); - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case kHighLevelEvent: - TkMacDoHLEvent(eventPtr); - /* TODO: should return true if events were placed on event queue. */ - break; - case osEvt: - /* - * Do clipboard conversion. - */ - switch ((eventPtr->message & osEvtMessageMask) >> 24) { - case mouseMovedMessage: - if (GeneratePollingEvents()) { - eventFound = true; - } - break; - case suspendResumeMessage: - if (!(eventPtr->message & resumeFlag)) { - TkSuspendClipboard(); - } - tkMacAppInFront = (eventPtr->message & resumeFlag); - if (TkMacHaveAppearance() >= 0x110) { - if (tkMacAppInFront) { - ShowFloatingWindows(); - } else { - HideFloatingWindows(); - } - } - break; - } - break; - case diskEvt: - /* - * Disk insertion. - */ - if (HiWord(eventPtr->message) != noErr) { - Point pt; - - DILoad(); - pt.v = pt.h = 120; /* parameter ignored in sys 7 */ - DIBadMount(pt, eventPtr->message); - DIUnload(); - } - break; - } - - savedKeyCode = 0; - return eventFound; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacConvertTkEvent -- - * - * This function converts a Macintosh event into zero or more - * Tcl events. It is intended for use in Netscape-style embedding. - * - * Results: - * Returns 1 if event added to Tcl queue, 0 otherwse. - * - * Side effects: - * May add events to Tcl's event queue. - * - *---------------------------------------------------------------------- - */ - -int -TkMacConvertTkEvent( - EventRecord *eventPtr, - Window window) -{ - int eventFound = false; - Point where; - static UInt32 savedKeyCode; - - /* - * By default, assume it is legal for us to set the cursor - */ - - Tk_MacTkOwnsCursor(1); - - switch (eventPtr->what) { - case nullEvent: - /* - * We get NULL events only when the cursor is NOT over - * the plugin. Otherwise we get updateCursor events. - * We will not generate polling events or move the cursor - * in this case. - */ - - eventFound = false; - break; - case adjustCursorEvent: - if (GeneratePollingEvents2(window, 1)) { - eventFound = true; - } - break; - case updateEvt: - /* - * It is possibly not legal for us to set the cursor - */ - - Tk_MacTkOwnsCursor(0); - if (GenerateUpdateEvent(eventPtr, window)) { - eventFound = true; - } - break; - case mouseDown: - case mouseUp: - GetMouse(&where); - LocalToGlobal(&where); - eventFound |= TkGenerateButtonEvent(where.h, where.v, - window, TkMacButtonKeyState()); - break; - case autoKey: - case keyDown: - /* - * Handle menu-key events here. If it is *not* - * a menu key - just fall through to handle as a - * normal key event. - */ - if ((eventPtr->modifiers & cmdKey) == cmdKey) { - long menuResult = MenuKey(eventPtr->message & charCodeMask); - - if (HiWord(menuResult) != 0) { - TkMacHandleMenuSelect(menuResult, false); - break; - } - } - /* fall through. */ - - case keyUp: - if (GenerateKeyEvent(eventPtr, window, savedKeyCode) == 0) { - savedKeyCode = eventPtr->message; - return false; - } - eventFound = true; - break; - - case activateEvt: - /* - * It is probably not legal for us to set the cursor - * here, since we don't know where the mouse is in the - * window that is being activated. - */ - - Tk_MacTkOwnsCursor(0); - eventFound |= GenerateActivateEvents(eventPtr, window); - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case getFocusEvent: - eventPtr->modifiers |= activeFlag; - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case loseFocusEvent: - eventPtr->modifiers &= ~activeFlag; - eventFound |= GenerateFocusEvent(eventPtr, window); - break; - case kHighLevelEvent: - TkMacDoHLEvent(eventPtr); - /* TODO: should return true if events were placed on event queue. */ - break; - case osEvt: - /* - * Do clipboard conversion. - */ - switch ((eventPtr->message & osEvtMessageMask) >> 24) { - /* - * It is possibly not legal for us to set the cursor. - * Netscape sends us these events all the time... - */ - - Tk_MacTkOwnsCursor(0); - - case mouseMovedMessage: - /* if (GeneratePollingEvents2(window, 0)) { - eventFound = true; - } NEXT LINE IS TEMPORARY */ - eventFound = false; - break; - case suspendResumeMessage: - if (!(eventPtr->message & resumeFlag)) { - TkSuspendClipboard(); - } - tkMacAppInFront = (eventPtr->message & resumeFlag); - if (TkMacHaveAppearance() >= 0x110) { - if (tkMacAppInFront) { - ShowFloatingWindows(); - } else { - HideFloatingWindows(); - } - } - break; - } - break; - case diskEvt: - /* - * Disk insertion. - */ - if (HiWord(eventPtr->message) != noErr) { - Point pt; - - DILoad(); - pt.v = pt.h = 120; /* parameter ignored in sys 7 */ - DIBadMount(pt, eventPtr->message); - DIUnload(); - } - break; - } - savedKeyCode = 0; - return eventFound; -} - -/* - *---------------------------------------------------------------------- - * - * CheckEventsAvail -- - * - * Checks to see if events are available on the Macintosh queue. - * This function looks for both queued events (eg. key & button) - * and generated events (update). - * - * Results: - * True is events exist, false otherwise. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static int -CheckEventsAvail() -{ - QHdrPtr evPtr; - WindowPeek macWinPtr; - - evPtr = GetEvQHdr(); - if (evPtr->qHead != NULL) { - return true; - } - - macWinPtr = (WindowPeek) FrontWindow(); - while (macWinPtr != NULL) { - if (!EmptyRgn(macWinPtr->updateRgn)) { - return true; - } - macWinPtr = macWinPtr->nextWindow; - } - return false; -} - -/* - *---------------------------------------------------------------------- - * - * TkpSetCapture -- - * - * This function captures the mouse so that all future events - * will be reported to this window, even if the mouse is outside - * the window. If the specified window is NULL, then the mouse - * is released. - * - * Results: - * None. - * - * Side effects: - * Sets the capture flag and captures the mouse. - * - *---------------------------------------------------------------------- - */ - -void -TkpSetCapture( - TkWindow *winPtr) /* Capture window, or NULL. */ -{ - while ((winPtr != NULL) && !Tk_TopWinHierarchy(winPtr)) { - winPtr = winPtr->parentPtr; - } - gGrabWinPtr = (Tk_Window) winPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacWindowOffset -- - * - * Determines the x and y offset from the orgin of the toplevel - * window dressing (the structure region, ie. title bar) and the - * orgin of the content area. - * - * Results: - * The x & y offset in pixels. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkMacWindowOffset( - WindowRef wRef, - int *xOffset, - int *yOffset) -{ - OSErr err = noErr; - WindowPeek wPeek = (WindowPeek) wRef; - RgnHandle strucRgn = wPeek->strucRgn; - RgnHandle contRgn = wPeek->contRgn; - Rect strucRect, contRect; - - if (!EmptyRgn(strucRgn) && !EmptyRgn(contRgn)) { - strucRect = (**strucRgn).rgnBBox; - contRect = (**contRgn).rgnBBox; - } else { - /* - * The current window's regions are not up to date. - * Probably because the window isn't visable. What we - * will do is save the old regions, have the window calculate - * what the regions should be, and then restore it self. - */ - strucRgn = NewRgn( ); - contRgn = NewRgn( ); - - if (!strucRgn || !contRgn) { - err = MemError( ); - - } else if (TkMacHaveAppearance()) { - GetWindowRegion(wRef, kWindowStructureRgn, strucRgn); - GetWindowRegion(wRef, kWindowContentRgn, contRgn); - strucRect = (**strucRgn).rgnBBox; - contRect = (**contRgn).rgnBBox; - } else { - CopyRgn(wPeek->strucRgn, strucRgn); - CopyRgn(wPeek->contRgn, contRgn); - - if (!(err = TellWindowDefProcToCalcRegions(wRef))) { - strucRect = (**(wPeek->strucRgn)).rgnBBox; - contRect = (**(wPeek->contRgn)).rgnBBox; - } - - CopyRgn(strucRgn, wPeek->strucRgn); - CopyRgn(contRgn, wPeek->contRgn); - } - - if (contRgn) { - DisposeRgn(contRgn); - } - - if (strucRgn) { - DisposeRgn(strucRgn); - } - } - - if (!err) { - *xOffset = contRect.left - strucRect.left; - *yOffset = contRect.top - strucRect.top; - } else { - *xOffset = 0; - *yOffset = 0; - } - - return; -} - -/* - *---------------------------------------------------------------------- - * - * TellWindowDefProcToCalcRegions -- - * - * Force a Macintosh window to recalculate it's content and - * structure regions. - * - * Results: - * An OS error. - * - * Side effects: - * The windows content and structure regions may be updated. - * - *---------------------------------------------------------------------- - */ - -static OSErr -TellWindowDefProcToCalcRegions( - WindowRef wRef) -{ - OSErr err = noErr; - SInt8 hState; - Handle wdef = ((WindowPeek) wRef)->windowDefProc; - - /* - * Load and lock the window definition procedure for - * the window. - */ - hState = HGetState(wdef); - if (!(err = MemError())) { - LoadResource(wdef); - if (!(err = ResError())) { - MoveHHi(wdef); - err = MemError(); - if (err == memLockedErr) { - err = noErr; - } else if (!err) { - HLock(wdef); - err = MemError(); - } - } - } - - /* - * Assuming there are no errors we now call the window definition - * procedure to tell it to calculate the regions for the window. - */ - if (err == noErr) { - (void) CallWindowDefProc((UniversalProcPtr) *wdef, - GetWVariant(wRef), wRef, wCalcRgns, 0); - - HSetState(wdef, hState); - if (!err) { - err = MemError(); - } - } - - return err; -} - -/* - *---------------------------------------------------------------------- - * - * BringWindowForward -- - * - * Bring this background window to the front. We also set state - * so Tk thinks the button is currently up. - * - * Results: - * None. - * - * Side effects: - * The window is brought forward. - * - *---------------------------------------------------------------------- - */ - -static void -BringWindowForward( - WindowRef wRef) -{ - if (!TkpIsWindowFloating(wRef)) { - if ((TkMacHaveAppearance() < 0x110) || IsValidWindowPtr(wRef)) - SelectWindow(wRef); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetMS -- - * - * Return a relative time in milliseconds. It doesn't matter - * when the epoch was. - * - * Results: - * Number of milliseconds. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -unsigned long -TkpGetMS() -{ - long long * int64Ptr; - UnsignedWide micros; - - Microseconds(µs); - int64Ptr = (long long *) µs; - - /* - * We need 64 bit math to do this. This is available in CW 11 - * and on. Other's will need to use a different scheme. - */ - - *int64Ptr /= 1000; - - return (long) *int64Ptr; -} -/* - *---------------------------------------------------------------------- - * - * TkpIsWindowFloating -- - * - * Returns 1 if a window is floating, 0 otherwise. - * - * Results: - * 1 or 0 depending on window's floating attribute. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpIsWindowFloating(WindowRef wRef) -{ - WindowClass class; - - if (TkMacHaveAppearance() < 0x110) { - return 0; - } - - GetWindowClass(wRef, &class); - - return (class == kFloatingWindowClass); - -} diff --git a/mac/tkMacWm.c b/mac/tkMacWm.c deleted file mode 100644 index 17dd539..0000000 --- a/mac/tkMacWm.c +++ /dev/null @@ -1,5787 +0,0 @@ -/* - * tkMacWm.c -- - * - * This module takes care of the interactions between a Tk-based - * application and the window manager. Among other things, it - * implements the "wm" command and passes geometry information - * to the window manager. - * - * Copyright (c) 1994-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacWm.c,v 1.24.2.1 2005/12/01 18:31:43 dgp Exp $ - */ - -#include <Gestalt.h> -#include <QDOffscreen.h> -#include <Windows.h> -#include <ToolUtils.h> - -#include <tclMac.h> -#include "tkPort.h" -#include "tkInt.h" -#include "tkMacInt.h" -#include <errno.h> -#include "tkScrollbar.h" - -/* - * We now require the Appearance headers. They come with CodeWarrior Pro, - * and are on the SDK CD. However, we do not require the Appearance - * extension - */ - -#include <Appearance.h> - -/* - * A data structure of the following type holds information for - * each window manager protocol (such as WM_DELETE_WINDOW) for - * which a handler (i.e. a Tcl command) has been defined for a - * particular top-level window. - */ - -typedef struct ProtocolHandler { - Atom protocol; /* Identifies the protocol. */ - struct ProtocolHandler *nextPtr; - /* Next in list of protocol handlers for - * the same top-level window, or NULL for - * end of list. */ - Tcl_Interp *interp; /* Interpreter in which to invoke command. */ - char command[4]; /* Tcl command to invoke when a client - * message for this protocol arrives. - * The actual size of the structure varies - * to accommodate the needs of the actual - * command. THIS MUST BE THE LAST FIELD OF - * THE STRUCTURE. */ -} ProtocolHandler; - -#define HANDLER_SIZE(cmdLength) \ -((unsigned) (sizeof(ProtocolHandler) - 3 + cmdLength)) - -/* - * A data structure of the following type holds window-manager-related - * information for each top-level window in an application. - */ - -typedef struct TkWmInfo { - TkWindow *winPtr; /* Pointer to main Tk information for - * this window. */ - Window reparent; /* If the window has been reparented, this - * gives the ID of the ancestor of the window - * that is a child of the root window (may - * not be window's immediate parent). If - * the window isn't reparented, this has the - * value None. */ - char *title; /* Title to display in window caption. If - * NULL, use name of widget. Malloced. */ - char *iconName; /* Name to display in icon. Malloced. */ - Window master; /* Master window for TRANSIENT_FOR property, - * or None. */ - XWMHints hints; /* Various pieces of information for - * window manager. */ - char *leaderName; /* Path name of leader of window group - * (corresponds to hints.window_group). - * Malloc-ed. Note: this field doesn't - * get updated if leader is destroyed. */ - char *masterWindowName; /* Path name of window specified as master - * in "wm transient" command, or NULL. - * Malloc-ed. Note: this field doesn't - * get updated if masterWindowName is - * destroyed. */ - Tk_Window icon; /* Window to use as icon for this window, - * or NULL. */ - Tk_Window iconFor; /* Window for which this window is icon, or - * NULL if this isn't an icon for anyone. */ - - /* - * Information used to construct an XSizeHints structure for - * the window manager: - */ - - int sizeHintsFlags; /* Flags word for XSizeHints structure. - * If the PBaseSize flag is set then the - * window is gridded; otherwise it isn't - * gridded. */ - int minWidth, minHeight; /* Minimum dimensions of window, in - * grid units, not pixels. */ - int maxWidth, maxHeight; /* Maximum dimensions of window, in - * grid units, not pixels. */ - Tk_Window gridWin; /* Identifies the window that controls - * gridding for this top-level, or NULL if - * the top-level isn't currently gridded. */ - int widthInc, heightInc; /* Increments for size changes (# pixels - * per step). */ - struct { - int x; /* numerator */ - int y; /* denominator */ - } minAspect, maxAspect; /* Min/max aspect ratios for window. */ - int reqGridWidth, reqGridHeight; - /* The dimensions of the window (in - * grid units) requested through - * the geometry manager. */ - int gravity; /* Desired window gravity. */ - - /* - * Information used to manage the size and location of a window. - */ - - int width, height; /* Desired dimensions of window, specified - * in grid units. These values are - * set by the "wm geometry" command and by - * ConfigureNotify events (for when wm - * resizes window). -1 means user hasn't - * requested dimensions. */ - int x, y; /* Desired X and Y coordinates for window. - * These values are set by "wm geometry", - * plus by ConfigureNotify events (when wm - * moves window). These numbers are - * different than the numbers stored in - * winPtr->changes because (a) they could be - * measured from the right or bottom edge - * of the screen (see WM_NEGATIVE_X and - * WM_NEGATIVE_Y flags) and (b) if the window - * has been reparented then they refer to the - * parent rather than the window itself. */ - int parentWidth, parentHeight; - /* Width and height of reparent, in pixels - * *including border*. If window hasn't been - * reparented then these will be the outer - * dimensions of the window, including - * border. */ - int xInParent, yInParent; /* Offset of window within reparent, measured - * from upper-left outer corner of parent's - * border to upper-left outer corner of child's - * border. If not reparented then these are - * zero. */ - int configWidth, configHeight; - /* Dimensions passed to last request that we - * issued to change geometry of window. Used - * to eliminate redundant resize operations. */ - - /* - * Information about the virtual root window for this top-level, - * if there is one. - */ - - Window vRoot; /* Virtual root window for this top-level, - * or None if there is no virtual root - * window (i.e. just use the screen's root). */ - int vRootX, vRootY; /* Position of the virtual root inside the - * root window. If the WM_VROOT_OFFSET_STALE - * flag is set then this information may be - * incorrect and needs to be refreshed from - * the X server. If vRoot is None then these - * values are both 0. */ - unsigned int vRootWidth, vRootHeight; - /* Dimensions of the virtual root window. - * If vRoot is None, gives the dimensions - * of the containing screen. This information - * is never stale, even though vRootX and - * vRootY can be. */ - - /* - * List of children of the toplevel which have private colormaps. - */ - - TkWindow **cmapList; /* Array of window with private colormaps. */ - int cmapCount; /* Number of windows in array. */ - - /* - * Miscellaneous information. - */ - - ProtocolHandler *protPtr; /* First in list of protocol handlers for - * this window (NULL means none). */ - int cmdArgc; /* Number of elements in cmdArgv below. */ - CONST char **cmdArgv; /* Array of strings to store in the - * WM_COMMAND property. NULL means nothing - * available. */ - char *clientMachine; /* String to store in WM_CLIENT_MACHINE - * property, or NULL. */ - int flags; /* Miscellaneous flags, defined below. */ - - /* - * Macintosh information. - */ - int style; /* Native window style. */ - int macClass; - int attributes; - TkWindow *scrollWinPtr; /* Ptr to scrollbar handling grow widget. */ -} WmInfo; - - -/* - * Flag values for WmInfo structures: - * - * WM_NEVER_MAPPED - non-zero means window has never been - * mapped; need to update all info when - * window is first mapped. - * WM_UPDATE_PENDING - non-zero means a call to UpdateGeometryInfo - * has already been scheduled for this - * window; no need to schedule another one. - * WM_NEGATIVE_X - non-zero means x-coordinate is measured in - * pixels from right edge of screen, rather - * than from left edge. - * WM_NEGATIVE_Y - non-zero means y-coordinate is measured in - * pixels up from bottom of screen, rather than - * down from top. - * WM_UPDATE_SIZE_HINTS - non-zero means that new size hints need to be - * propagated to window manager. - * WM_SYNC_PENDING - set to non-zero while waiting for the window - * manager to respond to some state change. - * WM_VROOT_OFFSET_STALE - non-zero means that (x,y) offset information - * about the virtual root window is stale and - * needs to be fetched fresh from the X server. - * WM_ABOUT_TO_MAP - non-zero means that the window is about to - * be mapped by TkWmMapWindow. This is used - * by UpdateGeometryInfo to modify its behavior. - * WM_MOVE_PENDING - non-zero means the application has requested - * a new position for the window, but it hasn't - * been reflected through the window manager - * yet. - * WM_COLORMAPS_EXPLICIT - non-zero means the colormap windows were - * set explicitly via "wm colormapwindows". - * WM_ADDED_TOPLEVEL_COLORMAP - non-zero means that when "wm colormapwindows" - * was called the top-level itself wasn't - * specified, so we added it implicitly at - * the end of the list. - * WM_WIDTH_NOT_RESIZABLE - non-zero means that we're not supposed to - * allow the user to change the width of the - * window (controlled by "wm resizable" - * command). - * WM_HEIGHT_NOT_RESIZABLE - non-zero means that we're not supposed to - * allow the user to change the height of the - * window (controlled by "wm resizable" - * command). - */ - -#define WM_NEVER_MAPPED 1 -#define WM_UPDATE_PENDING 2 -#define WM_NEGATIVE_X 4 -#define WM_NEGATIVE_Y 8 -#define WM_UPDATE_SIZE_HINTS 0x10 -#define WM_SYNC_PENDING 0x20 -#define WM_VROOT_OFFSET_STALE 0x40 -#define WM_ABOUT_TO_MAP 0x100 -#define WM_MOVE_PENDING 0x200 -#define WM_COLORMAPS_EXPLICIT 0x400 -#define WM_ADDED_TOPLEVEL_COLORMAP 0x800 -#define WM_WIDTH_NOT_RESIZABLE 0x1000 -#define WM_HEIGHT_NOT_RESIZABLE 0x2000 - -/* - * This is a list of all of the toplevels that have been mapped so far. It is - * used by the menu code to inval windows that were damaged by menus, and will - * eventually also be used to keep track of floating windows. - */ - -TkMacWindowList *tkMacWindowListPtr = NULL; - -/* - * The variable below is used to enable or disable tracing in this - * module. If tracing is enabled, then information is printed on - * standard output about interesting interactions with the window - * manager. - */ - -static int wmTracing = 0; - -/* - * The following structure is the official type record for geometry - * management of top-level windows. - */ - -static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy, - Tk_Window tkwin)); - -static Tk_GeomMgr wmMgrType = { - "wm", /* name */ - TopLevelReqProc, /* requestProc */ - (Tk_GeomLostSlaveProc *) NULL, /* lostSlaveProc */ -}; - -/* - * Hash table for Mac Window -> TkWindow mapping. - */ - -static Tcl_HashTable windowTable; -static int windowHashInit = false; - -void tkMacMoveWindow(WindowRef window, int x, int y); - -/* - * Forward declarations for procedures defined in this file: - */ - -static void InitialWindowBounds _ANSI_ARGS_((TkWindow *winPtr, - Rect *geometry)); -static int ParseGeometry _ANSI_ARGS_((Tcl_Interp *interp, - char *string, TkWindow *winPtr)); -static void TopLevelEventProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static void TkWmStackorderToplevelWrapperMap _ANSI_ARGS_(( - TkWindow *winPtr, - Tcl_HashTable *reparentTable)); -static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy, - Tk_Window tkwin)); -static void UpdateGeometryInfo _ANSI_ARGS_(( - ClientData clientData)); -static void UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr)); -static void UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr)); -static int WmAspectCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmAttributesCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmClientCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmColormapwindowsCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmCommandCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmDeiconifyCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmFocusmodelCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmFrameCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmGeometryCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmGridCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmGroupCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconbitmapCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconifyCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconmaskCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconnameCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconpositionCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmIconwindowCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmMaxsizeCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmMinsizeCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmOverrideredirectCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmPositionfromCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmProtocolCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmResizableCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmSizefromCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmStackorderCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmStateCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmTitleCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmTransientCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static int WmWithdrawCmd _ANSI_ARGS_((Tk_Window tkwin, - TkWindow *winPtr, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[])); -static void WmUpdateGeom _ANSI_ARGS_((WmInfo *wmPtr, - TkWindow *winPtr)); - -/* - *-------------------------------------------------------------- - * - * TkWmNewWindow -- - * - * This procedure is invoked whenever a new top-level - * window is created. Its job is to initialize the WmInfo - * structure for the window. - * - * Results: - * None. - * - * Side effects: - * A WmInfo structure gets allocated and initialized. - * - *-------------------------------------------------------------- - */ - -void -TkWmNewWindow( - TkWindow *winPtr) /* Newly-created top-level window. */ -{ - register WmInfo *wmPtr; - - wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo)); - wmPtr->winPtr = winPtr; - wmPtr->reparent = None; - wmPtr->title = NULL; - wmPtr->iconName = NULL; - wmPtr->master = None; - wmPtr->hints.flags = InputHint | StateHint; - wmPtr->hints.input = True; - wmPtr->hints.initial_state = NormalState; - wmPtr->hints.icon_pixmap = None; - wmPtr->hints.icon_window = None; - wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0; - wmPtr->hints.icon_mask = None; - wmPtr->hints.window_group = None; - wmPtr->leaderName = NULL; - wmPtr->masterWindowName = NULL; - wmPtr->icon = NULL; - wmPtr->iconFor = NULL; - wmPtr->sizeHintsFlags = 0; - wmPtr->minWidth = wmPtr->minHeight = 1; - - /* - * Default the maximum dimensions to the size of the display, minus - * a guess about how space is needed for window manager decorations. - */ - - wmPtr->maxWidth = DisplayWidth(winPtr->display, winPtr->screenNum) - 15; - wmPtr->maxHeight = DisplayHeight(winPtr->display, winPtr->screenNum) - 30; - wmPtr->gridWin = NULL; - wmPtr->widthInc = wmPtr->heightInc = 1; - wmPtr->minAspect.x = wmPtr->minAspect.y = 1; - wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1; - wmPtr->reqGridWidth = wmPtr->reqGridHeight = -1; - wmPtr->gravity = NorthWestGravity; - wmPtr->width = -1; - wmPtr->height = -1; - wmPtr->x = winPtr->changes.x; - wmPtr->y = winPtr->changes.y; - wmPtr->parentWidth = winPtr->changes.width - + 2*winPtr->changes.border_width; - wmPtr->parentHeight = winPtr->changes.height - + 2*winPtr->changes.border_width; - wmPtr->xInParent = 0; - wmPtr->yInParent = 0; - wmPtr->cmapList = NULL; - wmPtr->cmapCount = 0; - wmPtr->configWidth = -1; - wmPtr->configHeight = -1; - wmPtr->vRoot = None; - wmPtr->protPtr = NULL; - wmPtr->cmdArgv = NULL; - wmPtr->clientMachine = NULL; - wmPtr->flags = WM_NEVER_MAPPED; - if (TkMacHaveAppearance() >= 0x110) { - wmPtr->style = -1; - } else { - wmPtr->style = documentProc; - } - wmPtr->macClass = kDocumentWindowClass; - wmPtr->attributes = kWindowStandardDocumentAttributes; - wmPtr->scrollWinPtr = NULL; - winPtr->wmInfoPtr = wmPtr; - - UpdateVRootGeometry(wmPtr); - - /* - * Tk must monitor structure events for top-level windows, in order - * to detect size and position changes caused by window managers. - */ - - Tk_CreateEventHandler((Tk_Window) winPtr, StructureNotifyMask, - TopLevelEventProc, (ClientData) winPtr); - - /* - * Arrange for geometry requests to be reflected from the window - * to the window manager. - */ - - Tk_ManageGeometry((Tk_Window) winPtr, &wmMgrType, (ClientData) 0); -} - -/* - *-------------------------------------------------------------- - * - * TkWmMapWindow -- - * - * This procedure is invoked to map a top-level window. This - * module gets a chance to update all window-manager-related - * information in properties before the window manager sees - * the map event and checks the properties. It also gets to - * decide whether or not to even map the window after all. - * - * Results: - * None. - * - * Side effects: - * Properties of winPtr may get updated to provide up-to-date - * information to the window manager. The window may also get - * mapped, but it may not be if this procedure decides that - * isn't appropriate (e.g. because the window is withdrawn). - * - *-------------------------------------------------------------- - */ - -void -TkWmMapWindow( - TkWindow *winPtr) /* Top-level window that's about to - * be mapped. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Point where = {0, 0}; - int xOffset, yOffset; - int firstMap = false; - MacDrawable *macWin; - - if (wmPtr->flags & WM_NEVER_MAPPED) { - wmPtr->flags &= ~WM_NEVER_MAPPED; - firstMap = true; - - /* - * Create the underlying Mac window for this Tk window. - */ - macWin = (MacDrawable *) winPtr->window; - if (!TkMacHostToplevelExists(winPtr)) { - TkMacMakeRealWindowExist(winPtr); - } - - /* - * Generate configure event when we first map the window. - */ - LocalToGlobal(&where); - TkMacWindowOffset((WindowRef) TkMacGetDrawablePort((Drawable) macWin), - &xOffset, &yOffset); - where.h -= xOffset; - where.v -= yOffset; - TkGenWMConfigureEvent((Tk_Window) winPtr, - where.h, where.v, -1, -1, TK_LOCATION_CHANGED); - - /* - * This is the first time this window has ever been mapped. - * Store all the window-manager-related information for the - * window. - */ - - if (!Tk_IsEmbedded(winPtr)) { - TkSetWMName(winPtr, ((wmPtr->title != NULL) ? - wmPtr->title : winPtr->nameUid)); - } - - TkWmSetClass(winPtr); - - if (wmPtr->iconName != NULL) { - XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName); - } - - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - } - if (wmPtr->hints.initial_state == WithdrawnState) { - return; - } - - /* - * TODO: we need to display a window if it's iconic on creation. - */ - - if (wmPtr->hints.initial_state == IconicState) { - return; - } - - /* - * Update geometry information. - */ - wmPtr->flags |= WM_ABOUT_TO_MAP; - if (wmPtr->flags & WM_UPDATE_PENDING) { - Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr); - } - UpdateGeometryInfo((ClientData) winPtr); - wmPtr->flags &= ~WM_ABOUT_TO_MAP; - - /* - * Map the window. - */ - - XMapWindow(winPtr->display, winPtr->window); - - /* - * Now that the window is visable we can determine the offset - * from the window's content orgin to the window's decorative - * orgin (structure orgin). - */ - TkMacWindowOffset((WindowRef) TkMacGetDrawablePort(Tk_WindowId(winPtr)), - &wmPtr->xInParent, &wmPtr->yInParent); -} - -/* - *-------------------------------------------------------------- - * - * TkWmUnmapWindow -- - * - * This procedure is invoked to unmap a top-level window. - * On the Macintosh all we do is call XUnmapWindow. - * - * Results: - * None. - * - * Side effects: - * Unmaps the window. - * - *-------------------------------------------------------------- - */ - -void -TkWmUnmapWindow( - TkWindow *winPtr) /* Top-level window that's about to - * be mapped. */ -{ - XUnmapWindow(winPtr->display, winPtr->window); -} - -/* - *-------------------------------------------------------------- - * - * TkWmDeadWindow -- - * - * This procedure is invoked when a top-level window is - * about to be deleted. It cleans up the wm-related data - * structures for the window. - * - * Results: - * None. - * - * Side effects: - * The WmInfo structure for winPtr gets freed up. - * - *-------------------------------------------------------------- - */ - -void -TkWmDeadWindow(winPtr) - TkWindow *winPtr; /* Top-level window that's being deleted. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - WmInfo *wmPtr2; - - if (wmPtr == NULL) { - return; - } - if (wmPtr->title != NULL) { - ckfree(wmPtr->title); - } - if (wmPtr->iconName != NULL) { - ckfree(wmPtr->iconName); - } - if (wmPtr->hints.flags & IconPixmapHint) { - Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap); - } - if (wmPtr->hints.flags & IconMaskHint) { - Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask); - } - if (wmPtr->leaderName != NULL) { - ckfree(wmPtr->leaderName); - } - if (wmPtr->masterWindowName != NULL) { - ckfree(wmPtr->masterWindowName); - } - if (wmPtr->icon != NULL) { - wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; - wmPtr2->iconFor = NULL; - } - if (wmPtr->iconFor != NULL) { - wmPtr2 = ((TkWindow *) wmPtr->iconFor)->wmInfoPtr; - wmPtr2->icon = NULL; - wmPtr2->hints.flags &= ~IconWindowHint; - } - while (wmPtr->protPtr != NULL) { - ProtocolHandler *protPtr; - - protPtr = wmPtr->protPtr; - wmPtr->protPtr = protPtr->nextPtr; - Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC); - } - if (wmPtr->cmdArgv != NULL) { - ckfree((char *) wmPtr->cmdArgv); - } - if (wmPtr->clientMachine != NULL) { - ckfree((char *) wmPtr->clientMachine); - } - if (wmPtr->flags & WM_UPDATE_PENDING) { - Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr); - } - ckfree((char *) wmPtr); - winPtr->wmInfoPtr = NULL; -} - -/* - *-------------------------------------------------------------- - * - * TkWmSetClass -- - * - * This procedure is invoked whenever a top-level window's - * class is changed. If the window has been mapped then this - * procedure updates the window manager property for the - * class. If the window hasn't been mapped, the update is - * deferred until just before the first mapping. - * - * Results: - * None. - * - * Side effects: - * A window property may get updated. - * - *-------------------------------------------------------------- - */ - -void -TkWmSetClass( - TkWindow *winPtr) /* Newly-created top-level window. */ -{ - return; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_WmObjCmd -- - * - * This procedure is invoked to process the "wm" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - - /* ARGSUSED */ -int -Tk_WmObjCmd( - ClientData clientData, /* Main window associated with - * interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *CONST objv[]) /* Argument objects. */ -{ - Tk_Window tkwin = (Tk_Window) clientData; - static CONST char *optionStrings[] = { - "aspect", "attributes", "client", "colormapwindows", - "command", "deiconify", "focusmodel", "frame", - "geometry", "grid", "group", "iconbitmap", - "iconify", "iconmask", "iconname", "iconposition", - "iconwindow", "maxsize", "minsize", "overrideredirect", - "positionfrom", "protocol", "resizable", "sizefrom", - "stackorder", "state", "title", "transient", - "withdraw", (char *) NULL }; - enum options { - WMOPT_ASPECT, WMOPT_ATTRIBUTES, WMOPT_CLIENT, WMOPT_COLORMAPWINDOWS, - WMOPT_COMMAND, WMOPT_DEICONIFY, WMOPT_FOCUSMODEL, WMOPT_FRAME, - WMOPT_GEOMETRY, WMOPT_GRID, WMOPT_GROUP, WMOPT_ICONBITMAP, - WMOPT_ICONIFY, WMOPT_ICONMASK, WMOPT_ICONNAME, WMOPT_ICONPOSITION, - WMOPT_ICONWINDOW, WMOPT_MAXSIZE, WMOPT_MINSIZE, WMOPT_OVERRIDEREDIRECT, - WMOPT_POSITIONFROM, WMOPT_PROTOCOL, WMOPT_RESIZABLE, WMOPT_SIZEFROM, - WMOPT_STACKORDER, WMOPT_STATE, WMOPT_TITLE, WMOPT_TRANSIENT, - WMOPT_WITHDRAW }; - int index, length; - char *argv1; - TkWindow *winPtr; - TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; - - if (objc < 2) { - wrongNumArgs: - Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg ...?"); - return TCL_ERROR; - } - - argv1 = Tcl_GetStringFromObj(objv[1], &length); - if ((argv1[0] == 't') && (strncmp(argv1, "tracing", length) == 0) - && (length >= 3)) { - if ((objc != 2) && (objc != 3)) { - Tcl_WrongNumArgs(interp, 2, objv, "?boolean?"); - return TCL_ERROR; - } - if (objc == 2) { - Tcl_SetResult(interp, ((wmTracing) ? "on" : "off"), TCL_STATIC); - return TCL_OK; - } - return Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing); - } - - if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - - if (objc < 3) { - goto wrongNumArgs; - } - - if (TkGetWindowFromObj(interp, tkwin, objv[2], (Tk_Window *) &winPtr) - != TCL_OK) { - return TCL_ERROR; - } - if (!Tk_IsTopLevel(winPtr)) { - Tcl_AppendResult(interp, "window \"", winPtr->pathName, - "\" isn't a top-level window", (char *) NULL); - return TCL_ERROR; - } - - switch ((enum options) index) { - case WMOPT_ASPECT: - return WmAspectCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ATTRIBUTES: - return WmAttributesCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_CLIENT: - return WmClientCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_COLORMAPWINDOWS: - return WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_COMMAND: - return WmCommandCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_DEICONIFY: - return WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_FOCUSMODEL: - return WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_FRAME: - return WmFrameCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_GEOMETRY: - return WmGeometryCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_GRID: - return WmGridCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_GROUP: - return WmGroupCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONBITMAP: - return WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONIFY: - return WmIconifyCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONMASK: - return WmIconmaskCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONNAME: - return WmIconnameCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONPOSITION: - return WmIconpositionCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_ICONWINDOW: - return WmIconwindowCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_MAXSIZE: - return WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_MINSIZE: - return WmMinsizeCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_OVERRIDEREDIRECT: - return WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_POSITIONFROM: - return WmPositionfromCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_PROTOCOL: - return WmProtocolCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_RESIZABLE: - return WmResizableCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_SIZEFROM: - return WmSizefromCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_STACKORDER: - return WmStackorderCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_STATE: - return WmStateCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_TITLE: - return WmTitleCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_TRANSIENT: - return WmTransientCmd(tkwin, winPtr, interp, objc, objv); - case WMOPT_WITHDRAW: - return WmWithdrawCmd(tkwin, winPtr, interp, objc, objv); - } - - /* This should not happen */ - return TCL_ERROR; -} - -/* - *---------------------------------------------------------------------- - * - * WmAspectCmd -- - * - * This procedure is invoked to process the "wm aspect" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmAspectCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int numer1, denom1, numer2, denom2; - - if ((objc != 3) && (objc != 7)) { - Tcl_WrongNumArgs(interp, 2, objv, - "window ?minNumer minDenom maxNumer maxDenom?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->sizeHintsFlags & PAspect) { - char buf[TCL_INTEGER_SPACE * 4]; - - sprintf(buf, "%d %d %d %d", wmPtr->minAspect.x, - wmPtr->minAspect.y, wmPtr->maxAspect.x, - wmPtr->maxAspect.y); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - } - return TCL_OK; - } - if (*Tcl_GetString(objv[3]) == '\0') { - wmPtr->sizeHintsFlags &= ~PAspect; - } else { - if ((Tcl_GetIntFromObj(interp, objv[3], &numer1) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[4], &denom1) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[5], &numer2) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[6], &denom2) != TCL_OK)) { - return TCL_ERROR; - } - if ((numer1 <= 0) || (denom1 <= 0) || (numer2 <= 0) || - (denom2 <= 0)) { - Tcl_SetResult(interp, "aspect number can't be <= 0", - TCL_STATIC); - return TCL_ERROR; - } - wmPtr->minAspect.x = numer1; - wmPtr->minAspect.y = denom1; - wmPtr->maxAspect.x = numer2; - wmPtr->maxAspect.y = denom2; - wmPtr->sizeHintsFlags |= PAspect; - } - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmAttributesCmd -- - * - * This procedure is invoked to process the "wm attributes" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmAttributesCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - if (objc != 3) { - Tcl_WrongNumArgs(interp, 2, objv, "window"); - return TCL_ERROR; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmClientCmd -- - * - * This procedure is invoked to process the "wm client" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmClientCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char *argv3; - int length; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?name?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->clientMachine != NULL) { - Tcl_SetResult(interp, wmPtr->clientMachine, TCL_STATIC); - } - return TCL_OK; - } - argv3 = Tcl_GetStringFromObj(objv[3], &length); - if (argv3[0] == 0) { - if (wmPtr->clientMachine != NULL) { - ckfree((char *) wmPtr->clientMachine); - wmPtr->clientMachine = NULL; - } - return TCL_OK; - } - if (wmPtr->clientMachine != NULL) { - ckfree((char *) wmPtr->clientMachine); - } - wmPtr->clientMachine = (char *) - ckalloc((unsigned) (length + 1)); - strcpy(wmPtr->clientMachine, argv3); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmColormapwindowsCmd -- - * - * This procedure is invoked to process the "wm colormapwindows" - * Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - TkWindow **cmapList; - TkWindow *winPtr2; - int i, windowObjc, gotToplevel = 0; - Tcl_Obj **windowObjv; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?windowList?"); - return TCL_ERROR; - } - if (objc == 3) { - Tk_MakeWindowExist((Tk_Window) winPtr); - for (i = 0; i < wmPtr->cmapCount; i++) { - if ((i == (wmPtr->cmapCount-1)) - && (wmPtr->flags & WM_ADDED_TOPLEVEL_COLORMAP)) { - break; - } - Tcl_AppendElement(interp, wmPtr->cmapList[i]->pathName); - } - return TCL_OK; - } - if (Tcl_ListObjGetElements(interp, objv[3], &windowObjc, &windowObjv) - != TCL_OK) { - return TCL_ERROR; - } - cmapList = (TkWindow **) ckalloc((unsigned) - ((windowObjc+1)*sizeof(TkWindow*))); - for (i = 0; i < windowObjc; i++) { - if (TkGetWindowFromObj(interp, tkwin, windowObjv[i], - (Tk_Window *) &winPtr2) != TCL_OK) - { - ckfree((char *) cmapList); - return TCL_ERROR; - } - if (winPtr2 == winPtr) { - gotToplevel = 1; - } - if (winPtr2->window == None) { - Tk_MakeWindowExist((Tk_Window) winPtr2); - } - cmapList[i] = winPtr2; - } - if (!gotToplevel) { - wmPtr->flags |= WM_ADDED_TOPLEVEL_COLORMAP; - cmapList[windowObjc] = winPtr; - windowObjc++; - } else { - wmPtr->flags &= ~WM_ADDED_TOPLEVEL_COLORMAP; - } - wmPtr->flags |= WM_COLORMAPS_EXPLICIT; - if (wmPtr->cmapList != NULL) { - ckfree((char *)wmPtr->cmapList); - } - wmPtr->cmapList = cmapList; - wmPtr->cmapCount = windowObjc; - - /* - * On the Macintosh all of this is just an excercise - * in compatability as we don't support colormaps. If - * we did they would be installed here. - */ - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmCommandCmd -- - * - * This procedure is invoked to process the "wm command" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmCommandCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char *argv3; - int cmdArgc; - CONST char **cmdArgv; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?value?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->cmdArgv != NULL) { - Tcl_SetResult(interp, - Tcl_Merge(wmPtr->cmdArgc, wmPtr->cmdArgv), - TCL_DYNAMIC); - } - return TCL_OK; - } - argv3 = Tcl_GetString(objv[3]); - if (argv3[0] == 0) { - if (wmPtr->cmdArgv != NULL) { - ckfree((char *) wmPtr->cmdArgv); - wmPtr->cmdArgv = NULL; - } - return TCL_OK; - } - if (Tcl_SplitList(interp, argv3, &cmdArgc, &cmdArgv) != TCL_OK) { - return TCL_ERROR; - } - if (wmPtr->cmdArgv != NULL) { - ckfree((char *) wmPtr->cmdArgv); - } - wmPtr->cmdArgc = cmdArgc; - wmPtr->cmdArgv = cmdArgv; - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmDeiconifyCmd -- - * - * This procedure is invoked to process the "wm deiconify" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - - if (objc != 3) { - Tcl_WrongNumArgs(interp, 2, objv, "window"); - return TCL_ERROR; - } - if (wmPtr->iconFor != NULL) { - Tcl_AppendResult(interp, "can't deiconify ", Tcl_GetString(objv[2]), - ": it is an icon for ", Tk_PathName(wmPtr->iconFor), - (char *) NULL); - return TCL_ERROR; - } - if (winPtr->flags & TK_EMBEDDED) { - Tcl_AppendResult(interp, "can't deiconify ", winPtr->pathName, - ": it is an embedded window", (char *) NULL); - return TCL_ERROR; - } - - /* - * TODO: may not want to call this function - look at Map events gened. - */ - - TkpWmSetState(winPtr, NormalState); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmFocusmodelCmd -- - * - * This procedure is invoked to process the "wm focusmodel" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - static CONST char *optionStrings[] = { - "active", "passive", (char *) NULL }; - enum options { - OPT_ACTIVE, OPT_PASSIVE }; - int index; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?active|passive?"); - return TCL_ERROR; - } - if (objc == 3) { - Tcl_SetResult(interp, (wmPtr->hints.input ? "passive" : "active"), - TCL_STATIC); - return TCL_OK; - } - - if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - if (index == OPT_ACTIVE) { - wmPtr->hints.input = False; - } else { /* OPT_PASSIVE */ - wmPtr->hints.input = True; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmFrameCmd -- - * - * This procedure is invoked to process the "wm frame" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmFrameCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Window window; - char buf[TCL_INTEGER_SPACE]; - - if (objc != 3) { - Tcl_WrongNumArgs(interp, 2, objv, "window"); - return TCL_ERROR; - } - window = wmPtr->reparent; - if (window == None) { - window = Tk_WindowId((Tk_Window) winPtr); - } - sprintf(buf, "0x%x", (unsigned int) window); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmGeometryCmd -- - * - * This procedure is invoked to process the "wm geometry" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmGeometryCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char xSign, ySign; - int width, height; - char *argv3; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?newGeometry?"); - return TCL_ERROR; - } - if (objc == 3) { - char buf[16 + TCL_INTEGER_SPACE * 4]; - - xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+'; - ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+'; - if (wmPtr->gridWin != NULL) { - width = wmPtr->reqGridWidth + (winPtr->changes.width - - winPtr->reqWidth)/wmPtr->widthInc; - height = wmPtr->reqGridHeight + (winPtr->changes.height - - winPtr->reqHeight)/wmPtr->heightInc; - } else { - width = winPtr->changes.width; - height = winPtr->changes.height; - } - sprintf(buf, "%dx%d%c%d%c%d", width, height, xSign, wmPtr->x, - ySign, wmPtr->y); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return TCL_OK; - } - argv3 = Tcl_GetString(objv[3]); - if (*argv3 == '\0') { - wmPtr->width = -1; - wmPtr->height = -1; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; - } - return ParseGeometry(interp, argv3, winPtr); -} - -/* - *---------------------------------------------------------------------- - * - * WmGridCmd -- - * - * This procedure is invoked to process the "wm grid" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmGridCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int reqWidth, reqHeight, widthInc, heightInc; - - if ((objc != 3) && (objc != 7)) { - Tcl_WrongNumArgs(interp, 2, objv, - "window ?baseWidth baseHeight widthInc heightInc?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->sizeHintsFlags & PBaseSize) { - char buf[TCL_INTEGER_SPACE * 4]; - - sprintf(buf, "%d %d %d %d", wmPtr->reqGridWidth, - wmPtr->reqGridHeight, wmPtr->widthInc, - wmPtr->heightInc); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - } - return TCL_OK; - } - if (*Tcl_GetString(objv[3]) == '\0') { - /* - * Turn off gridding and reset the width and height - * to make sense as ungridded numbers. - */ - - wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc); - if (wmPtr->width != -1) { - wmPtr->width = winPtr->reqWidth + (wmPtr->width - - wmPtr->reqGridWidth)*wmPtr->widthInc; - wmPtr->height = winPtr->reqHeight + (wmPtr->height - - wmPtr->reqGridHeight)*wmPtr->heightInc; - } - wmPtr->widthInc = 1; - wmPtr->heightInc = 1; - } else { - if ((Tcl_GetIntFromObj(interp, objv[3], &reqWidth) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[4], &reqHeight) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[5], &widthInc) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[6], &heightInc) != TCL_OK)) { - return TCL_ERROR; - } - if (reqWidth < 0) { - Tcl_SetResult(interp, "baseWidth can't be < 0", TCL_STATIC); - return TCL_ERROR; - } - if (reqHeight < 0) { - Tcl_SetResult(interp, "baseHeight can't be < 0", TCL_STATIC); - return TCL_ERROR; - } - if (widthInc <= 0) { - Tcl_SetResult(interp, "widthInc can't be <= 0", TCL_STATIC); - return TCL_ERROR; - } - if (heightInc <= 0) { - Tcl_SetResult(interp, "heightInc can't be <= 0", TCL_STATIC); - return TCL_ERROR; - } - Tk_SetGrid((Tk_Window) winPtr, reqWidth, reqHeight, widthInc, - heightInc); - } - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmGroupCmd -- - * - * This procedure is invoked to process the "wm group" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmGroupCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Tk_Window tkwin2; - char *argv3; - int length; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->hints.flags & WindowGroupHint) { - Tcl_SetResult(interp, wmPtr->leaderName, TCL_STATIC); - } - return TCL_OK; - } - argv3 = Tcl_GetStringFromObj(objv[3], &length); - if (*argv3 == '\0') { - wmPtr->hints.flags &= ~WindowGroupHint; - if (wmPtr->leaderName != NULL) { - ckfree(wmPtr->leaderName); - } - wmPtr->leaderName = NULL; - } else { - if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) { - return TCL_ERROR; - } - Tk_MakeWindowExist(tkwin2); - if (wmPtr->leaderName != NULL) { - ckfree(wmPtr->leaderName); - } - wmPtr->hints.window_group = Tk_WindowId(tkwin2); - wmPtr->hints.flags |= WindowGroupHint; - wmPtr->leaderName = ckalloc((unsigned) (length + 1)); - strcpy(wmPtr->leaderName, argv3); - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconbitmapCmd -- - * - * This procedure is invoked to process the "wm iconbitmap" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char *argv3; - Pixmap pixmap; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->hints.flags & IconPixmapHint) { - Tcl_SetResult(interp, (char *) - Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_pixmap), - TCL_STATIC); - } - return TCL_OK; - } - argv3 = Tcl_GetString(objv[3]); - if (*argv3 == '\0') { - if (wmPtr->hints.icon_pixmap != None) { - Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap); - wmPtr->hints.icon_pixmap = None; - } - wmPtr->hints.flags &= ~IconPixmapHint; - } else { - pixmap = Tk_GetBitmap(interp, (Tk_Window) winPtr, argv3); - if (pixmap == None) { - return TCL_ERROR; - } - wmPtr->hints.icon_pixmap = pixmap; - wmPtr->hints.flags |= IconPixmapHint; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconifyCmd -- - * - * This procedure is invoked to process the "wm iconify" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconifyCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - if (objc != 3) { - Tcl_WrongNumArgs(interp, 2, objv, "window"); - return TCL_ERROR; - } - if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { - Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName, - "\": override-redirect flag is set", (char *) NULL); - return TCL_ERROR; - } - if (wmPtr->master != None) { - Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName, - "\": it is a transient", (char *) NULL); - return TCL_ERROR; - } - if (wmPtr->iconFor != NULL) { - Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName, - ": it is an icon for ", Tk_PathName(wmPtr->iconFor), - (char *) NULL); - return TCL_ERROR; - } - if (winPtr->flags & TK_EMBEDDED) { - Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName, - ": it is an embedded window", (char *) NULL); - return TCL_ERROR; - } - TkpWmSetState(winPtr, IconicState); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconmaskCmd -- - * - * This procedure is invoked to process the "wm iconmask" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconmaskCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Pixmap pixmap; - char *argv3; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->hints.flags & IconMaskHint) { - Tcl_SetResult(interp, (char *) - Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_mask), - TCL_STATIC); - } - return TCL_OK; - } - argv3 = Tcl_GetString(objv[3]); - if (*argv3 == '\0') { - if (wmPtr->hints.icon_mask != None) { - Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask); - } - wmPtr->hints.flags &= ~IconMaskHint; - } else { - pixmap = Tk_GetBitmap(interp, tkwin, argv3); - if (pixmap == None) { - return TCL_ERROR; - } - wmPtr->hints.icon_mask = pixmap; - wmPtr->hints.flags |= IconMaskHint; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconnameCmd -- - * - * This procedure is invoked to process the "wm iconname" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconnameCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char *argv3; - int length; - - if (objc > 4) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?newName?"); - return TCL_ERROR; - } - if (objc == 3) { - Tcl_SetResult(interp, - ((wmPtr->iconName != NULL) ? wmPtr->iconName : ""), - TCL_STATIC); - return TCL_OK; - } else { - if (wmPtr->iconName != NULL) { - ckfree((char *) wmPtr->iconName); - } - argv3 = Tcl_GetStringFromObj(objv[3], &length); - wmPtr->iconName = ckalloc((unsigned) (length + 1)); - strcpy(wmPtr->iconName, argv3); - if (!(wmPtr->flags & WM_NEVER_MAPPED)) { - XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName); - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconpositionCmd -- - * - * This procedure is invoked to process the "wm iconposition" - * Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconpositionCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int x, y; - - if ((objc != 3) && (objc != 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?x y?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->hints.flags & IconPositionHint) { - char buf[TCL_INTEGER_SPACE * 2]; - - sprintf(buf, "%d %d", wmPtr->hints.icon_x, - wmPtr->hints.icon_y); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - } - return TCL_OK; - } - if (*Tcl_GetString(objv[3]) == '\0') { - wmPtr->hints.flags &= ~IconPositionHint; - } else { - if ((Tcl_GetIntFromObj(interp, objv[3], &x) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[4], &y) != TCL_OK)){ - return TCL_ERROR; - } - wmPtr->hints.icon_x = x; - wmPtr->hints.icon_y = y; - wmPtr->hints.flags |= IconPositionHint; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmIconwindowCmd -- - * - * This procedure is invoked to process the "wm iconwindow" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmIconwindowCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Tk_Window tkwin2; - WmInfo *wmPtr2; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->icon != NULL) { - Tcl_SetResult(interp, Tk_PathName(wmPtr->icon), TCL_STATIC); - } - return TCL_OK; - } - if (*Tcl_GetString(objv[3]) == '\0') { - wmPtr->hints.flags &= ~IconWindowHint; - if (wmPtr->icon != NULL) { - wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; - wmPtr2->iconFor = NULL; - wmPtr2->hints.initial_state = WithdrawnState; - } - wmPtr->icon = NULL; - } else { - if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) { - return TCL_ERROR; - } - if (!Tk_IsTopLevel(tkwin2)) { - Tcl_AppendResult(interp, "can't use ", Tcl_GetString(objv[3]), - " as icon window: not at top level", (char *) NULL); - return TCL_ERROR; - } - wmPtr2 = ((TkWindow *) tkwin2)->wmInfoPtr; - if (wmPtr2->iconFor != NULL) { - Tcl_AppendResult(interp, Tcl_GetString(objv[3]), - " is already an icon for ", - Tk_PathName(wmPtr2->iconFor), (char *) NULL); - return TCL_ERROR; - } - if (wmPtr->icon != NULL) { - WmInfo *wmPtr3 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; - wmPtr3->iconFor = NULL; - } - Tk_MakeWindowExist(tkwin2); - wmPtr->hints.icon_window = Tk_WindowId(tkwin2); - wmPtr->hints.flags |= IconWindowHint; - wmPtr->icon = tkwin2; - wmPtr2->iconFor = (Tk_Window) winPtr; - if (!(wmPtr2->flags & WM_NEVER_MAPPED)) { - /* - * Don't have iconwindows on the Mac. We just withdraw. - */ - - Tk_UnmapWindow(tkwin2); - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmMaxsizeCmd -- - * - * This procedure is invoked to process the "wm maxsize" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int width, height; - - if ((objc != 3) && (objc != 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?"); - return TCL_ERROR; - } - if (objc == 3) { - char buf[TCL_INTEGER_SPACE * 2]; - - sprintf(buf, "%d %d", wmPtr->maxWidth, wmPtr->maxHeight); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return TCL_OK; - } - if ((Tcl_GetIntFromObj(interp, objv[3], &width) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) { - return TCL_ERROR; - } - wmPtr->maxWidth = width; - wmPtr->maxHeight = height; - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmMinsizeCmd -- - * - * This procedure is invoked to process the "wm minsize" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmMinsizeCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int width, height; - - if ((objc != 3) && (objc != 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?"); - return TCL_ERROR; - } - if (objc == 3) { - char buf[TCL_INTEGER_SPACE * 2]; - - sprintf(buf, "%d %d", wmPtr->minWidth, wmPtr->minHeight); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return TCL_OK; - } - if ((Tcl_GetIntFromObj(interp, objv[3], &width) != TCL_OK) - || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) { - return TCL_ERROR; - } - wmPtr->minWidth = width; - wmPtr->minHeight = height; - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmOverrideredirectCmd -- - * - * This procedure is invoked to process the "wm overrideredirect" - * Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int boolean; - XSetWindowAttributes atts; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?boolean?"); - return TCL_ERROR; - } - if (objc == 3) { - Tcl_SetBooleanObj(Tcl_GetObjResult(interp), - Tk_Attributes((Tk_Window) winPtr)->override_redirect); - return TCL_OK; - } - if (Tcl_GetBooleanFromObj(interp, objv[3], &boolean) != TCL_OK) { - return TCL_ERROR; - } - atts.override_redirect = (boolean) ? True : False; - Tk_ChangeWindowAttributes((Tk_Window) winPtr, CWOverrideRedirect, - &atts); - wmPtr->style = (boolean) ? plainDBox : documentProc; - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmPositionfromCmd -- - * - * This procedure is invoked to process the "wm positionfrom" - * Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmPositionfromCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - static CONST char *optionStrings[] = { - "program", "user", (char *) NULL }; - enum options { - OPT_PROGRAM, OPT_USER }; - int index; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?user/program?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->sizeHintsFlags & USPosition) { - Tcl_SetResult(interp, "user", TCL_STATIC); - } else if (wmPtr->sizeHintsFlags & PPosition) { - Tcl_SetResult(interp, "program", TCL_STATIC); - } - return TCL_OK; - } - if (*Tcl_GetString(objv[3]) == '\0') { - wmPtr->sizeHintsFlags &= ~(USPosition|PPosition); - } else { - if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - if (index == OPT_USER) { - wmPtr->sizeHintsFlags &= ~PPosition; - wmPtr->sizeHintsFlags |= USPosition; - } else { - wmPtr->sizeHintsFlags &= ~USPosition; - wmPtr->sizeHintsFlags |= PPosition; - } - } - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmProtocolCmd -- - * - * This procedure is invoked to process the "wm protocol" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmProtocolCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - register ProtocolHandler *protPtr, *prevPtr; - Atom protocol; - char *cmd; - int cmdLength; - - if ((objc < 3) || (objc > 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?name? ?command?"); - return TCL_ERROR; - } - if (objc == 3) { - /* - * Return a list of all defined protocols for the window. - */ - for (protPtr = wmPtr->protPtr; protPtr != NULL; - protPtr = protPtr->nextPtr) { - Tcl_AppendElement(interp, - Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol)); - } - return TCL_OK; - } - protocol = Tk_InternAtom((Tk_Window) winPtr, Tcl_GetString(objv[3])); - if (objc == 4) { - /* - * Return the command to handle a given protocol. - */ - for (protPtr = wmPtr->protPtr; protPtr != NULL; - protPtr = protPtr->nextPtr) { - if (protPtr->protocol == protocol) { - Tcl_SetResult(interp, protPtr->command, TCL_STATIC); - return TCL_OK; - } - } - return TCL_OK; - } - - /* - * Delete any current protocol handler, then create a new - * one with the specified command, unless the command is - * empty. - */ - - for (protPtr = wmPtr->protPtr, prevPtr = NULL; protPtr != NULL; - prevPtr = protPtr, protPtr = protPtr->nextPtr) { - if (protPtr->protocol == protocol) { - if (prevPtr == NULL) { - wmPtr->protPtr = protPtr->nextPtr; - } else { - prevPtr->nextPtr = protPtr->nextPtr; - } - Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC); - break; - } - } - cmd = Tcl_GetStringFromObj(objv[4], &cmdLength); - if (cmdLength > 0) { - protPtr = (ProtocolHandler *) ckalloc(HANDLER_SIZE(cmdLength)); - protPtr->protocol = protocol; - protPtr->nextPtr = wmPtr->protPtr; - wmPtr->protPtr = protPtr; - protPtr->interp = interp; - strcpy(protPtr->command, cmd); - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmResizableCmd -- - * - * This procedure is invoked to process the "wm resizable" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmResizableCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int width, height; - - if ((objc != 3) && (objc != 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?"); - return TCL_ERROR; - } - if (objc == 3) { - char buf[TCL_INTEGER_SPACE * 2]; - - sprintf(buf, "%d %d", - (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) ? 0 : 1, - (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) ? 0 : 1); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return TCL_OK; - } - if ((Tcl_GetBooleanFromObj(interp, objv[3], &width) != TCL_OK) - || (Tcl_GetBooleanFromObj(interp, objv[4], &height) != TCL_OK)) { - return TCL_ERROR; - } - if (width) { - wmPtr->flags &= ~WM_WIDTH_NOT_RESIZABLE; - } else { - wmPtr->flags |= WM_WIDTH_NOT_RESIZABLE; - } - if (height) { - wmPtr->flags &= ~WM_HEIGHT_NOT_RESIZABLE; - } else { - wmPtr->flags |= WM_HEIGHT_NOT_RESIZABLE; - } - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - if (wmPtr->scrollWinPtr != NULL) { - TkScrollbarEventuallyRedraw( - (TkScrollbar *) wmPtr->scrollWinPtr->instanceData); - } - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmSizefromCmd -- - * - * This procedure is invoked to process the "wm sizefrom" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmSizefromCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - static CONST char *optionStrings[] = { - "program", "user", (char *) NULL }; - enum options { - OPT_PROGRAM, OPT_USER }; - int index; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?user|program?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->sizeHintsFlags & USSize) { - Tcl_SetResult(interp, "user", TCL_STATIC); - } else if (wmPtr->sizeHintsFlags & PSize) { - Tcl_SetResult(interp, "program", TCL_STATIC); - } - return TCL_OK; - } - - if (*Tcl_GetString(objv[3]) == '\0') { - wmPtr->sizeHintsFlags &= ~(USSize|PSize); - } else { - if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - if (index == OPT_USER) { - wmPtr->sizeHintsFlags &= ~PSize; - wmPtr->sizeHintsFlags |= USSize; - } else { /* OPT_PROGRAM */ - wmPtr->sizeHintsFlags &= ~USSize; - wmPtr->sizeHintsFlags |= PSize; - } - } - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - WmUpdateGeom(wmPtr, winPtr); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmStackorderCmd -- - * - * This procedure is invoked to process the "wm stackorder" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmStackorderCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - TkWindow **windows, **window_ptr; - static CONST char *optionStrings[] = { - "isabove", "isbelow", (char *) NULL }; - enum options { - OPT_ISABOVE, OPT_ISBELOW }; - int index; - - if ((objc != 3) && (objc != 5)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?isabove|isbelow window?"); - return TCL_ERROR; - } - - if (objc == 3) { - windows = TkWmStackorderToplevel(winPtr); - if (windows == NULL) { - panic("TkWmStackorderToplevel failed"); - } else { - for (window_ptr = windows; *window_ptr ; window_ptr++) { - Tcl_AppendElement(interp, (*window_ptr)->pathName); - } - ckfree((char *) windows); - return TCL_OK; - } - } else { - TkWindow *winPtr2; - int index1=-1, index2=-1, result; - - if (TkGetWindowFromObj(interp, tkwin, objv[4], (Tk_Window *) &winPtr2) - != TCL_OK) { - return TCL_ERROR; - } - - if (!Tk_IsTopLevel(winPtr2)) { - Tcl_AppendResult(interp, "window \"", winPtr2->pathName, - "\" isn't a top-level window", (char *) NULL); - return TCL_ERROR; - } - - if (!Tk_IsMapped(winPtr)) { - Tcl_AppendResult(interp, "window \"", winPtr->pathName, - "\" isn't mapped", (char *) NULL); - return TCL_ERROR; - } - - if (!Tk_IsMapped(winPtr2)) { - Tcl_AppendResult(interp, "window \"", winPtr2->pathName, - "\" isn't mapped", (char *) NULL); - return TCL_ERROR; - } - - /* - * Lookup stacking order of all toplevels that are children - * of "." and find the position of winPtr and winPtr2 - * in the stacking order. - */ - - windows = TkWmStackorderToplevel(winPtr->mainPtr->winPtr); - - if (windows == NULL) { - Tcl_AppendResult(interp, "TkWmStackorderToplevel failed", - (char *) NULL); - return TCL_ERROR; - } else { - for (window_ptr = windows; *window_ptr ; window_ptr++) { - if (*window_ptr == winPtr) - index1 = (window_ptr - windows); - if (*window_ptr == winPtr2) - index2 = (window_ptr - windows); - } - if (index1 == -1) - panic("winPtr window not found"); - if (index2 == -1) - panic("winPtr2 window not found"); - - ckfree((char *) windows); - } - - if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - if (index == OPT_ISABOVE) { - result = index1 > index2; - } else { /* OPT_ISBELOW */ - result = index1 < index2; - } - Tcl_SetIntObj(Tcl_GetObjResult(interp), result); - return TCL_OK; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmStateCmd -- - * - * This procedure is invoked to process the "wm state" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmStateCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - static CONST char *optionStrings[] = { - "normal", "iconic", "withdrawn", "zoomed", (char *) NULL }; - enum options { - OPT_NORMAL, OPT_ICONIC, OPT_WITHDRAWN, OPT_ZOOMED }; - int index; - - if ((objc < 3) || (objc > 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?state?"); - return TCL_ERROR; - } - if (objc == 4) { - if (wmPtr->iconFor != NULL) { - Tcl_AppendResult(interp, "can't change state of ", - Tcl_GetString(objv[2]), - ": it is an icon for ", Tk_PathName(wmPtr->iconFor), - (char *) NULL); - return TCL_ERROR; - } - if (winPtr->flags & TK_EMBEDDED) { - Tcl_AppendResult(interp, "can't change state of ", - winPtr->pathName, ": it is an embedded window", - (char *) NULL); - return TCL_ERROR; - } - - if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0, - &index) != TCL_OK) { - return TCL_ERROR; - } - - if (index == OPT_NORMAL) { - TkpWmSetState(winPtr, NormalState); - /* - * This varies from 'wm deiconify' because it does not - * force the window to be raised and receive focus - */ - } else if (index == OPT_ICONIC) { - if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { - Tcl_AppendResult(interp, "can't iconify \"", - winPtr->pathName, - "\": override-redirect flag is set", - (char *) NULL); - return TCL_ERROR; - } - if (wmPtr->master != NULL) { - Tcl_AppendResult(interp, "can't iconify \"", - winPtr->pathName, - "\": it is a transient", (char *) NULL); - return TCL_ERROR; - } - TkpWmSetState(winPtr, IconicState); - } else if (index == OPT_WITHDRAWN) { - TkpWmSetState(winPtr, WithdrawnState); - } else { /* OPT_ZOOMED */ - TkpWmSetState(winPtr, ZoomState); - } - } else { - if (wmPtr->iconFor != NULL) { - Tcl_SetResult(interp, "icon", TCL_STATIC); - } else { - switch (wmPtr->hints.initial_state) { - case NormalState: - Tcl_SetResult(interp, "normal", TCL_STATIC); - break; - case IconicState: - Tcl_SetResult(interp, "iconic", TCL_STATIC); - break; - case WithdrawnState: - Tcl_SetResult(interp, "withdrawn", TCL_STATIC); - break; - case ZoomState: - Tcl_SetResult(interp, "zoomed", TCL_STATIC); - break; - } - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmTitleCmd -- - * - * This procedure is invoked to process the "wm title" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmTitleCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - char *argv3; - int length; - - if (objc > 4) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?newTitle?"); - return TCL_ERROR; - } - if (objc == 3) { - Tcl_SetResult(interp, (char *) - ((wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid), - TCL_STATIC); - return TCL_OK; - } else { - if (wmPtr->title != NULL) { - ckfree((char *) wmPtr->title); - } - argv3 = Tcl_GetStringFromObj(objv[3], &length); - wmPtr->title = ckalloc((unsigned) (length + 1)); - strcpy(wmPtr->title, argv3); - if (!(wmPtr->flags & WM_NEVER_MAPPED) && !Tk_IsEmbedded(winPtr)) { - TkSetWMName(winPtr, wmPtr->title); - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmTransientCmd -- - * - * This procedure is invoked to process the "wm transient" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmTransientCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - Tk_Window master; - WmInfo *wmPtr2; - char *argv3; - int length; - - if ((objc != 3) && (objc != 4)) { - Tcl_WrongNumArgs(interp, 2, objv, "window ?master?"); - return TCL_ERROR; - } - if (objc == 3) { - if (wmPtr->master != None) { - Tcl_SetResult(interp, wmPtr->masterWindowName, TCL_STATIC); - } - return TCL_OK; - } - if (Tcl_GetString(objv[3])[0] == '\0') { - wmPtr->master = None; - if (wmPtr->masterWindowName != NULL) { - ckfree(wmPtr->masterWindowName); - } - wmPtr->masterWindowName = NULL; - wmPtr->style = documentProc; - } else { - if (TkGetWindowFromObj(interp, tkwin, objv[3], &master) != TCL_OK) { - return TCL_ERROR; - } - Tk_MakeWindowExist(master); - - if (wmPtr->iconFor != NULL) { - Tcl_AppendResult(interp, "can't make \"", - Tcl_GetString(objv[2]), - "\" a transient: it is an icon for ", - Tk_PathName(wmPtr->iconFor), - (char *) NULL); - return TCL_ERROR; - } - - wmPtr2 = ((TkWindow *) master)->wmInfoPtr; - - if (wmPtr2->iconFor != NULL) { - Tcl_AppendResult(interp, "can't make \"", - Tcl_GetString(objv[3]), - "\" a master: it is an icon for ", - Tk_PathName(wmPtr2->iconFor), - (char *) NULL); - return TCL_ERROR; - } - - argv3 = Tcl_GetStringFromObj(objv[3], &length); - wmPtr->master = Tk_WindowId(master); - wmPtr->masterWindowName = ckalloc((unsigned) length+1); - strcpy(wmPtr->masterWindowName, argv3); - wmPtr->style = plainDBox; - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * WmWithdrawCmd -- - * - * This procedure is invoked to process the "wm withdraw" Tcl command. - * See the user documentation for details on what it does. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * See the user documentation. - * - *---------------------------------------------------------------------- - */ - -static int -WmWithdrawCmd(tkwin, winPtr, interp, objc, objv) - Tk_Window tkwin; /* Main window of the application. */ - TkWindow *winPtr; /* Toplevel to work with */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - - if (objc != 3) { - Tcl_WrongNumArgs(interp, 2, objv, "window"); - return TCL_ERROR; - } - if (wmPtr->iconFor != NULL) { - Tcl_AppendResult(interp, "can't withdraw ", Tcl_GetString(objv[2]), - ": it is an icon for ", Tk_PathName(wmPtr->iconFor), - (char *) NULL); - return TCL_ERROR; - } - TkpWmSetState(winPtr, WithdrawnState); - return TCL_OK; -} - -/* - * Invoked by those wm subcommands that affect geometry. - * Schedules a geometry update. - */ -static void -WmUpdateGeom(wmPtr, winPtr) - WmInfo *wmPtr; - TkWindow *winPtr; -{ - if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) { - Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr); - wmPtr->flags |= WM_UPDATE_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * Tk_SetGrid -- - * - * This procedure is invoked by a widget when it wishes to set a grid - * coordinate system that controls the size of a top-level window. - * It provides a C interface equivalent to the "wm grid" command and - * is usually asscoiated with the -setgrid option. - * - * Results: - * None. - * - * Side effects: - * Grid-related information will be passed to the window manager, so - * that the top-level window associated with tkwin will resize on - * even grid units. If some other window already controls gridding - * for the top-level window then this procedure call has no effect. - * - *---------------------------------------------------------------------- - */ - -void -Tk_SetGrid( - Tk_Window tkwin, /* Token for window. New window mgr info - * will be posted for the top-level window - * associated with this window. */ - int reqWidth, /* Width (in grid units) corresponding to - * the requested geometry for tkwin. */ - int reqHeight, /* Height (in grid units) corresponding to - * the requested geometry for tkwin. */ - int widthInc, int heightInc)/* Pixel increments corresponding to a - * change of one grid unit. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - register WmInfo *wmPtr; - - /* - * Find the top-level window for tkwin, plus the window manager - * information. - */ - - while (!(winPtr->flags & TK_TOP_HIERARCHY)) { - winPtr = winPtr->parentPtr; - } - wmPtr = winPtr->wmInfoPtr; - if (wmPtr == NULL) { - return; - } - - if ((wmPtr->gridWin != NULL) && (wmPtr->gridWin != tkwin)) { - return; - } - - if ((wmPtr->reqGridWidth == reqWidth) - && (wmPtr->reqGridHeight == reqHeight) - && (wmPtr->widthInc == widthInc) - && (wmPtr->heightInc == heightInc) - && ((wmPtr->sizeHintsFlags & (PBaseSize|PResizeInc)) - == (PBaseSize|PResizeInc))) { - return; - } - - /* - * If gridding was previously off, then forget about any window - * size requests made by the user or via "wm geometry": these are - * in pixel units and there's no easy way to translate them to - * grid units since the new requested size of the top-level window in - * pixels may not yet have been registered yet (it may filter up - * the hierarchy in DoWhenIdle handlers). However, if the window - * has never been mapped yet then just leave the window size alone: - * assume that it is intended to be in grid units but just happened - * to have been specified before this procedure was called. - */ - - if ((wmPtr->gridWin == NULL) && !(wmPtr->flags & WM_NEVER_MAPPED)) { - wmPtr->width = -1; - wmPtr->height = -1; - } - - /* - * Set the new gridding information, and start the process of passing - * all of this information to the window manager. - */ - - wmPtr->gridWin = tkwin; - wmPtr->reqGridWidth = reqWidth; - wmPtr->reqGridHeight = reqHeight; - wmPtr->widthInc = widthInc; - wmPtr->heightInc = heightInc; - wmPtr->sizeHintsFlags |= PBaseSize|PResizeInc; - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) { - Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr); - wmPtr->flags |= WM_UPDATE_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * Tk_UnsetGrid -- - * - * This procedure cancels the effect of a previous call - * to Tk_SetGrid. - * - * Results: - * None. - * - * Side effects: - * If tkwin currently controls gridding for its top-level window, - * gridding is cancelled for that top-level window; if some other - * window controls gridding then this procedure has no effect. - * - *---------------------------------------------------------------------- - */ - -void -Tk_UnsetGrid( - Tk_Window tkwin) /* Token for window that is currently - * controlling gridding. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - register WmInfo *wmPtr; - - /* - * Find the top-level window for tkwin, plus the window manager - * information. - */ - - while (!(winPtr->flags & TK_TOP_HIERARCHY)) { - winPtr = winPtr->parentPtr; - } - wmPtr = winPtr->wmInfoPtr; - if (wmPtr == NULL) { - return; - } - - if (tkwin != wmPtr->gridWin) { - return; - } - - wmPtr->gridWin = NULL; - wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc); - if (wmPtr->width != -1) { - wmPtr->width = winPtr->reqWidth + (wmPtr->width - - wmPtr->reqGridWidth)*wmPtr->widthInc; - wmPtr->height = winPtr->reqHeight + (wmPtr->height - - wmPtr->reqGridHeight)*wmPtr->heightInc; - } - wmPtr->widthInc = 1; - wmPtr->heightInc = 1; - - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) { - Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr); - wmPtr->flags |= WM_UPDATE_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * TopLevelEventProc -- - * - * This procedure is invoked when a top-level (or other externally- - * managed window) is restructured in any way. - * - * Results: - * None. - * - * Side effects: - * Tk's internal data structures for the window get modified to - * reflect the structural change. - * - *---------------------------------------------------------------------- - */ - -static void -TopLevelEventProc( - ClientData clientData, /* Window for which event occurred. */ - XEvent *eventPtr) /* Event that just happened. */ -{ - register TkWindow *winPtr = (TkWindow *) clientData; - - winPtr->wmInfoPtr->flags |= WM_VROOT_OFFSET_STALE; - if (eventPtr->type == DestroyNotify) { - Tk_ErrorHandler handler; - - if (!(winPtr->flags & TK_ALREADY_DEAD)) { - /* - * A top-level window was deleted externally (e.g., by the window - * manager). This is probably not a good thing, but cleanup as - * best we can. The error handler is needed because - * Tk_DestroyWindow will try to destroy the window, but of course - * it's already gone. - */ - - handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1, - (Tk_ErrorProc *) NULL, (ClientData) NULL); - Tk_DestroyWindow((Tk_Window) winPtr); - Tk_DeleteErrorHandler(handler); - } - if (wmTracing) { - printf("TopLevelEventProc: %s deleted\n", winPtr->pathName); - } - } else if (eventPtr->type == ReparentNotify) { - panic("recieved unwanted reparent event"); - } -} - -/* - *---------------------------------------------------------------------- - * - * TopLevelReqProc -- - * - * This procedure is invoked by the geometry manager whenever - * the requested size for a top-level window is changed. - * - * Results: - * None. - * - * Side effects: - * Arrange for the window to be resized to satisfy the request - * (this happens as a when-idle action). - * - *---------------------------------------------------------------------- - */ - - /* ARGSUSED */ -static void -TopLevelReqProc( - ClientData dummy, /* Not used. */ - Tk_Window tkwin) /* Information about window. */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - WmInfo *wmPtr; - - wmPtr = winPtr->wmInfoPtr; - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) { - Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr); - wmPtr->flags |= WM_UPDATE_PENDING; - } -} - -/* - *---------------------------------------------------------------------- - * - * UpdateGeometryInfo -- - * - * This procedure is invoked when a top-level window is first - * mapped, and also as a when-idle procedure, to bring the - * geometry and/or position of a top-level window back into - * line with what has been requested by the user and/or widgets. - * This procedure doesn't return until the window manager has - * responded to the geometry change. - * - * Results: - * None. - * - * Side effects: - * The window's size and location may change, unless the WM prevents - * that from happening. - * - *---------------------------------------------------------------------- - */ - -static void -UpdateGeometryInfo( - ClientData clientData) /* Pointer to the window's record. */ -{ - register TkWindow *winPtr = (TkWindow *) clientData; - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int x, y, width, height; - unsigned long serial; - - wmPtr->flags &= ~WM_UPDATE_PENDING; - - /* - * Compute the new size for the top-level window. See the - * user documentation for details on this, but the size - * requested depends on (a) the size requested internally - * by the window's widgets, (b) the size requested by the - * user in a "wm geometry" command or via wm-based interactive - * resizing (if any), and (c) whether or not the window is - * gridded. Don't permit sizes <= 0 because this upsets - * the X server. - */ - - if (wmPtr->width == -1) { - width = winPtr->reqWidth; - } else if (wmPtr->gridWin != NULL) { - width = winPtr->reqWidth - + (wmPtr->width - wmPtr->reqGridWidth)*wmPtr->widthInc; - } else { - width = wmPtr->width; - } - if (width <= 0) { - width = 1; - } - if (wmPtr->height == -1) { - height = winPtr->reqHeight; - } else if (wmPtr->gridWin != NULL) { - height = winPtr->reqHeight - + (wmPtr->height - wmPtr->reqGridHeight)*wmPtr->heightInc; - } else { - height = wmPtr->height; - } - if (height <= 0) { - height = 1; - } - - /* - * Compute the new position for the upper-left pixel of the window's - * decorative frame. This is tricky, because we need to include the - * border widths supplied by a reparented parent in this calculation, - * but can't use the parent's current overall size since that may - * change as a result of this code. - */ - - if (wmPtr->flags & WM_NEGATIVE_X) { - x = wmPtr->vRootWidth - wmPtr->x - - (width + (wmPtr->parentWidth - winPtr->changes.width)); - } else { - x = wmPtr->x; - } - if (wmPtr->flags & WM_NEGATIVE_Y) { - y = wmPtr->vRootHeight - wmPtr->y - - (height + (wmPtr->parentHeight - winPtr->changes.height)); - } else { - y = wmPtr->y; - } - - /* - * If the window's size is going to change and the window is - * supposed to not be resizable by the user, then we have to - * update the size hints. There may also be a size-hint-update - * request pending from somewhere else, too. - */ - - if (((width != winPtr->changes.width) - || (height != winPtr->changes.height)) - && (wmPtr->gridWin == NULL) - && ((wmPtr->sizeHintsFlags & (PMinSize|PMaxSize)) == 0)) { - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - } - if (wmPtr->flags & WM_UPDATE_SIZE_HINTS) { - UpdateSizeHints(winPtr); - } - - /* - * Reconfigure the window if it isn't already configured correctly. - * A few tricky points: - * - * 1. If the window is embedded and the container is also in this - * process, don't actually reconfigure the window; just pass the - * desired size on to the container. Also, zero out any position - * information, since embedded windows are not allowed to move. - * 2. Sometimes the window manager will give us a different size - * than we asked for (e.g. mwm has a minimum size for windows), so - * base the size check on what we *asked for* last time, not what we - * got. - * 3. Don't move window unless a new position has been requested for - * it. This is because of "features" in some window managers (e.g. - * twm, as of 4/24/91) where they don't interpret coordinates - * according to ICCCM. Moving a window to its current location may - * cause it to shift position on the screen. - */ - - if (Tk_IsEmbedded(winPtr)) { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(winPtr); - - /* - * NOTE: Here we should handle out of process embedding. - */ - - if (contWinPtr != NULL) { - /* - * This window is embedded and the container is also in this - * process, so we don't need to do anything special about the - * geometry, except to make sure that the desired size is known - * by the container. Also, zero out any position information, - * since embedded windows are not allowed to move. - */ - - wmPtr->x = wmPtr->y = 0; - wmPtr->flags &= ~(WM_NEGATIVE_X|WM_NEGATIVE_Y); - Tk_GeometryRequest((Tk_Window) contWinPtr, width, height); - } - return; - } - serial = NextRequest(winPtr->display); - if (wmPtr->flags & WM_MOVE_PENDING) { - wmPtr->configWidth = width; - wmPtr->configHeight = height; - if (wmTracing) { - printf( - "UpdateGeometryInfo moving to %d %d, resizing to %d x %d,\n", - x, y, width, height); - } - Tk_MoveResizeWindow((Tk_Window) winPtr, x, y, (unsigned) width, - (unsigned) height); - } else if ((width != wmPtr->configWidth) - || (height != wmPtr->configHeight)) { - wmPtr->configWidth = width; - wmPtr->configHeight = height; - if (wmTracing) { - printf("UpdateGeometryInfo resizing to %d x %d\n", width, height); - } - Tk_ResizeWindow((Tk_Window) winPtr, (unsigned) width, - (unsigned) height); - } else { - return; - } -} - -/* - *-------------------------------------------------------------- - * - * UpdateSizeHints -- - * - * This procedure is called to update the window manager's - * size hints information from the information in a WmInfo - * structure. - * - * Results: - * None. - * - * Side effects: - * Properties get changed for winPtr. - * - *-------------------------------------------------------------- - */ - -static void -UpdateSizeHints( - TkWindow *winPtr) -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - XSizeHints *hintsPtr; - - wmPtr->flags &= ~WM_UPDATE_SIZE_HINTS; - - hintsPtr = XAllocSizeHints(); - if (hintsPtr == NULL) { - return; - } - - /* - * Compute the pixel-based sizes for the various fields in the - * size hints structure, based on the grid-based sizes in - * our structure. - */ - - if (wmPtr->gridWin != NULL) { - hintsPtr->base_width = winPtr->reqWidth - - (wmPtr->reqGridWidth * wmPtr->widthInc); - if (hintsPtr->base_width < 0) { - hintsPtr->base_width = 0; - } - hintsPtr->base_height = winPtr->reqHeight - - (wmPtr->reqGridHeight * wmPtr->heightInc); - if (hintsPtr->base_height < 0) { - hintsPtr->base_height = 0; - } - hintsPtr->min_width = hintsPtr->base_width - + (wmPtr->minWidth * wmPtr->widthInc); - hintsPtr->min_height = hintsPtr->base_height - + (wmPtr->minHeight * wmPtr->heightInc); - hintsPtr->max_width = hintsPtr->base_width - + (wmPtr->maxWidth * wmPtr->widthInc); - hintsPtr->max_height = hintsPtr->base_height - + (wmPtr->maxHeight * wmPtr->heightInc); - } else { - hintsPtr->min_width = wmPtr->minWidth; - hintsPtr->min_height = wmPtr->minHeight; - hintsPtr->max_width = wmPtr->maxWidth; - hintsPtr->max_height = wmPtr->maxHeight; - hintsPtr->base_width = 0; - hintsPtr->base_height = 0; - } - hintsPtr->width_inc = wmPtr->widthInc; - hintsPtr->height_inc = wmPtr->heightInc; - hintsPtr->min_aspect.x = wmPtr->minAspect.x; - hintsPtr->min_aspect.y = wmPtr->minAspect.y; - hintsPtr->max_aspect.x = wmPtr->maxAspect.x; - hintsPtr->max_aspect.y = wmPtr->maxAspect.y; - hintsPtr->win_gravity = wmPtr->gravity; - hintsPtr->flags = wmPtr->sizeHintsFlags | PMinSize | PMaxSize; - - /* - * If the window isn't supposed to be resizable, then set the - * minimum and maximum dimensions to be the same. - */ - - if (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) { - if (wmPtr->width >= 0) { - hintsPtr->min_width = wmPtr->width; - } else { - hintsPtr->min_width = winPtr->reqWidth; - } - hintsPtr->max_width = hintsPtr->min_width; - } - if (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) { - if (wmPtr->height >= 0) { - hintsPtr->min_height = wmPtr->height; - } else { - hintsPtr->min_height = winPtr->reqHeight; - } - hintsPtr->max_height = hintsPtr->min_height; - } - - XSetWMNormalHints(winPtr->display, winPtr->window, hintsPtr); - - XFree((char *) hintsPtr); -} - -/* - *-------------------------------------------------------------- - * - * ParseGeometry -- - * - * This procedure parses a geometry string and updates - * information used to control the geometry of a top-level - * window. - * - * Results: - * A standard Tcl return value, plus an error message in - * the interp's result if an error occurs. - * - * Side effects: - * The size and/or location of winPtr may change. - * - *-------------------------------------------------------------- - */ - -static int -ParseGeometry( - Tcl_Interp *interp, /* Used for error reporting. */ - char *string, /* String containing new geometry. Has the - * standard form "=wxh+x+y". */ - TkWindow *winPtr) /* Pointer to top-level window whose - * geometry is to be changed. */ -{ - register WmInfo *wmPtr = winPtr->wmInfoPtr; - int x, y, width, height, flags; - char *end; - register char *p = string; - - /* - * The leading "=" is optional. - */ - - if (*p == '=') { - p++; - } - - /* - * Parse the width and height, if they are present. Don't - * actually update any of the fields of wmPtr until we've - * successfully parsed the entire geometry string. - */ - - width = wmPtr->width; - height = wmPtr->height; - x = wmPtr->x; - y = wmPtr->y; - flags = wmPtr->flags; - if (isdigit(UCHAR(*p))) { - width = strtoul(p, &end, 10); - p = end; - if (*p != 'x') { - goto error; - } - p++; - if (!isdigit(UCHAR(*p))) { - goto error; - } - height = strtoul(p, &end, 10); - p = end; - } - - /* - * Parse the X and Y coordinates, if they are present. - */ - - if (*p != '\0') { - flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y); - if (*p == '-') { - flags |= WM_NEGATIVE_X; - } else if (*p != '+') { - goto error; - } - x = strtol(p+1, &end, 10); - p = end; - if (*p == '-') { - flags |= WM_NEGATIVE_Y; - } else if (*p != '+') { - goto error; - } - y = strtol(p+1, &end, 10); - if (*end != '\0') { - goto error; - } - - /* - * Assume that the geometry information came from the user, - * unless an explicit source has been specified. Otherwise - * most window managers assume that the size hints were - * program-specified and they ignore them. - */ - - if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) { - wmPtr->sizeHintsFlags |= USPosition; - flags |= WM_UPDATE_SIZE_HINTS; - } - } - - /* - * Everything was parsed OK. Update the fields of *wmPtr and - * arrange for the appropriate information to be percolated out - * to the window manager at the next idle moment. - */ - - wmPtr->width = width; - wmPtr->height = height; - if ((x != wmPtr->x) || (y != wmPtr->y) - || ((flags & (WM_NEGATIVE_X|WM_NEGATIVE_Y)) - != (wmPtr->flags & (WM_NEGATIVE_X|WM_NEGATIVE_Y)))) { - wmPtr->x = x; - wmPtr->y = y; - flags |= WM_MOVE_PENDING; - } - wmPtr->flags = flags; - - if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) { - Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr); - wmPtr->flags |= WM_UPDATE_PENDING; - } - return TCL_OK; - - error: - Tcl_AppendResult(interp, "bad geometry specifier \"", - string, "\"", (char *) NULL); - return TCL_ERROR; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_GetRootCoords -- - * - * Given a token for a window, this procedure traces through the - * window's lineage to find the (virtual) root-window coordinates - * corresponding to point (0,0) in the window. - * - * Results: - * The locations pointed to by xPtr and yPtr are filled in with - * the root coordinates of the (0,0) point in tkwin. If a virtual - * root window is in effect for the window, then the coordinates - * in the virtual root are returned. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -Tk_GetRootCoords( - Tk_Window tkwin, /* Token for window. */ - int *xPtr, /* Where to store x-displacement of (0,0). */ - int *yPtr) /* Where to store y-displacement of (0,0). */ -{ - int x, y; - register TkWindow *winPtr = (TkWindow *) tkwin; - - /* - * Search back through this window's parents all the way to a - * top-level window, combining the offsets of each window within - * its parent. - */ - - x = y = 0; - while (1) { - x += winPtr->changes.x + winPtr->changes.border_width; - y += winPtr->changes.y + winPtr->changes.border_width; - if (winPtr->flags & TK_TOP_HIERARCHY) { - if (!(Tk_IsEmbedded(winPtr))) { - x += winPtr->wmInfoPtr->xInParent; - y += winPtr->wmInfoPtr->yInParent; - break; - } else { - TkWindow *otherPtr; - - otherPtr = TkpGetOtherWindow(winPtr); - if (otherPtr != NULL) { - /* - * The container window is in the same application. - * Query its coordinates. - */ - winPtr = otherPtr; - - /* - * Remember to offset by the container window here, - * since at the end of this if branch, we will - * pop out to the container's parent... - */ - - x += winPtr->changes.x + winPtr->changes.border_width; - y += winPtr->changes.y + winPtr->changes.border_width; - - } else { - Point theOffset; - - if (gMacEmbedHandler->getOffsetProc != NULL) { - /* - * We do not require that the changes.x & changes.y for - * a non-Tk master window be kept up to date. So we - * first subtract off the possibly bogus values that have - * been added on at the top of this pass through the loop, - * and then call out to the getOffsetProc to give us - * the correct offset. - */ - - x -= winPtr->changes.x + winPtr->changes.border_width; - y -= winPtr->changes.y + winPtr->changes.border_width; - - gMacEmbedHandler->getOffsetProc((Tk_Window) winPtr, &theOffset); - - x += theOffset.h; - y += theOffset.v; - } - break; - } - } - } - if (winPtr->flags & TK_TOP_HIERARCHY) { - break; /* Punt */ - } - winPtr = winPtr->parentPtr; - } - *xPtr = x; - *yPtr = y; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_CoordsToWindow -- - * - * This is a Macintosh specific implementation of this function. - * Given the root coordinates of a point, this procedure returns - * the token for the top-most window covering that point, if - * there exists such a window in this application. - * - * Results: - * The return result is either a token for the window corresponding - * to rootX and rootY, or else NULL to indicate that there is no such - * window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Tk_Window -Tk_CoordsToWindow( - int rootX, int rootY, /* Coordinates of point in root window. If - * a virtual-root window manager is in use, - * these coordinates refer to the virtual - * root, not the real root. */ - Tk_Window tkwin) /* Token for any window in application; - * used to identify the display. */ -{ - WindowPtr whichWin; - Point where; - Window rootChild; - register TkWindow *winPtr, *childPtr; - TkWindow *nextPtr; /* Coordinates of highest child found so - * far that contains point. */ - int x, y; /* Coordinates in winPtr. */ - int tmpx, tmpy, bd; - TkDisplay *dispPtr; - - /* - * Step 1: find the top-level window that contains the desired point. - */ - - where.h = rootX; - where.v = rootY; - FindWindow(where, &whichWin); - if (whichWin == NULL) { - return NULL; - } - rootChild = TkMacGetXWindow(whichWin); - dispPtr = TkGetDisplayList(); - winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, rootChild); - if (winPtr == NULL) { - return NULL; - } - - /* - * Step 2: work down through the hierarchy underneath this window. - * At each level, scan through all the children to find the highest - * one in the stacking order that contains the point. Then repeat - * the whole process on that child. - */ - - x = rootX - winPtr->wmInfoPtr->xInParent; - y = rootY - winPtr->wmInfoPtr->yInParent; - while (1) { - x -= winPtr->changes.x; - y -= winPtr->changes.y; - nextPtr = NULL; - - /* - * Container windows cannot have children. So if it is a container, - * look there, otherwise inspect the children. - */ - - if (Tk_IsContainer(winPtr)) { - childPtr = TkpGetOtherWindow(winPtr); - if (childPtr != NULL) { - if (Tk_IsMapped(childPtr)) { - tmpx = x - childPtr->changes.x; - tmpy = y - childPtr->changes.y; - bd = childPtr->changes.border_width; - - if ((tmpx >= -bd) && (tmpy >= -bd) - && (tmpx < (childPtr->changes.width + bd)) - && (tmpy < (childPtr->changes.height + bd))) { - nextPtr = childPtr; - } - } - } - - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } else { - for (childPtr = winPtr->childList; childPtr != NULL; - childPtr = childPtr->nextPtr) { - if (!Tk_IsMapped(childPtr) || - (childPtr->flags & TK_TOP_HIERARCHY)) { - continue; - } - tmpx = x - childPtr->changes.x; - tmpy = y - childPtr->changes.y; - bd = childPtr->changes.border_width; - if ((tmpx >= -bd) && (tmpy >= -bd) - && (tmpx < (childPtr->changes.width + bd)) - && (tmpy < (childPtr->changes.height + bd))) { - nextPtr = childPtr; - } - } - } - if (nextPtr == NULL) { - break; - } - winPtr = nextPtr; - } - return (Tk_Window) winPtr; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_TopCoordsToWindow -- - * - * Given a Tk Window, and coordinates of a point relative to that window - * this procedure returns the top-most child of the window (excluding - * toplevels) covering that point, if there exists such a window in this - * application. - * It also sets newX, and newY to the coords of the point relative to the - * window returned. - * - * Results: - * The return result is either a token for the window corresponding - * to rootX and rootY, or else NULL to indicate that there is no such - * window. newX and newY are also set to the coords of the point relative - * to the returned window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Tk_Window -Tk_TopCoordsToWindow( - Tk_Window tkwin, /* Token for a Tk Window which defines the; - * coordinates for rootX & rootY */ - int rootX, int rootY, /* Coordinates of a point in tkWin. */ - int *newX, int *newY) /* Coordinates of point in the upperMost child of - * tkWin containing (rootX,rootY) */ -{ - register TkWindow *winPtr, *childPtr; - TkWindow *nextPtr; /* Coordinates of highest child found so - * far that contains point. */ - int x, y; /* Coordinates in winPtr. */ - Window *children; /* Children of winPtr, or NULL. */ - - winPtr = (TkWindow *) tkwin; - x = rootX; - y = rootY; - while (1) { - nextPtr = NULL; - children = NULL; - - /* - * Container windows cannot have children. So if it is a container, - * look there, otherwise inspect the children. - */ - - if (Tk_IsContainer(winPtr)) { - childPtr = TkpGetOtherWindow(winPtr); - if (childPtr != NULL) { - if (Tk_IsMapped(childPtr) && - (x > childPtr->changes.x && - x < childPtr->changes.x + - childPtr->changes.width) && - (y > childPtr->changes.y && - y < childPtr->changes.y + - childPtr->changes.height)) { - nextPtr = childPtr; - } - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } else { - - for (childPtr = winPtr->childList; childPtr != NULL; - childPtr = childPtr->nextPtr) { - if (!Tk_IsMapped(childPtr) || - (childPtr->flags & TK_TOP_HIERARCHY)) { - continue; - } - if (x < childPtr->changes.x || y < childPtr->changes.y) { - continue; - } - if (x > childPtr->changes.x + childPtr->changes.width || - y > childPtr->changes.y + childPtr->changes.height) { - continue; - } - nextPtr = childPtr; - } - } - if (nextPtr == NULL) { - break; - } - winPtr = nextPtr; - x -= winPtr->changes.x; - y -= winPtr->changes.y; - } - *newX = x; - *newY = y; - return (Tk_Window) winPtr; -} - -/* - *---------------------------------------------------------------------- - * - * UpdateVRootGeometry -- - * - * This procedure is called to update all the virtual root - * geometry information in wmPtr. - * - * Results: - * None. - * - * Side effects: - * The vRootX, vRootY, vRootWidth, and vRootHeight fields in - * wmPtr are filled with the most up-to-date information. - * - *---------------------------------------------------------------------- - */ - -static void -UpdateVRootGeometry( - WmInfo *wmPtr) /* Window manager information to be - * updated. The wmPtr->vRoot field must - * be valid. */ -{ - TkWindow *winPtr = wmPtr->winPtr; - unsigned int bd, dummy; - Window dummy2; - Status status; - Tk_ErrorHandler handler; - - /* - * If this isn't a virtual-root window manager, just return information - * about the screen. - */ - - wmPtr->flags &= ~WM_VROOT_OFFSET_STALE; - if (wmPtr->vRoot == None) { - noVRoot: - wmPtr->vRootX = wmPtr->vRootY = 0; - wmPtr->vRootWidth = DisplayWidth(winPtr->display, winPtr->screenNum); - wmPtr->vRootHeight = DisplayHeight(winPtr->display, winPtr->screenNum); - return; - } - - /* - * Refresh the virtual root information if it's out of date. - */ - - handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1, - (Tk_ErrorProc *) NULL, (ClientData) NULL); - status = XGetGeometry(winPtr->display, wmPtr->vRoot, - &dummy2, &wmPtr->vRootX, &wmPtr->vRootY, - &wmPtr->vRootWidth, &wmPtr->vRootHeight, &bd, &dummy); - if (wmTracing) { - printf("UpdateVRootGeometry: x = %d, y = %d, width = %d, ", - wmPtr->vRootX, wmPtr->vRootY, wmPtr->vRootWidth); - printf("height = %d, status = %d\n", wmPtr->vRootHeight, status); - } - Tk_DeleteErrorHandler(handler); - if (status == 0) { - /* - * The virtual root is gone! Pretend that it never existed. - */ - - wmPtr->vRoot = None; - goto noVRoot; - } -} - -/* - *---------------------------------------------------------------------- - * - * Tk_GetVRootGeometry -- - * - * This procedure returns information about the virtual root - * window corresponding to a particular Tk window. - * - * Results: - * The values at xPtr, yPtr, widthPtr, and heightPtr are set - * with the offset and dimensions of the root window corresponding - * to tkwin. If tkwin is being managed by a virtual root window - * manager these values correspond to the virtual root window being - * used for tkwin; otherwise the offsets will be 0 and the - * dimensions will be those of the screen. - * - * Side effects: - * Vroot window information is refreshed if it is out of date. - * - *---------------------------------------------------------------------- - */ - -void -Tk_GetVRootGeometry( - Tk_Window tkwin, /* Window whose virtual root is to be - * queried. */ - int *xPtr, int *yPtr, /* Store x and y offsets of virtual root - * here. */ - int *widthPtr, /* Store dimensions of virtual root here. */ - int *heightPtr) -{ - WmInfo *wmPtr; - TkWindow *winPtr = (TkWindow *) tkwin; - - /* - * Find the top-level window for tkwin, and locate the window manager - * information for that window. - */ - - while (!(winPtr->flags & TK_TOP_HIERARCHY)) { - winPtr = winPtr->parentPtr; - } - wmPtr = winPtr->wmInfoPtr; - if (wmPtr == NULL) { - return; /* Punt */ - } - - /* - * Make sure that the geometry information is up-to-date, then copy - * it out to the caller. - */ - - if (wmPtr->flags & WM_VROOT_OFFSET_STALE) { - UpdateVRootGeometry(wmPtr); - } - *xPtr = wmPtr->vRootX; - *yPtr = wmPtr->vRootY; - *widthPtr = wmPtr->vRootWidth; - *heightPtr = wmPtr->vRootHeight; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_MoveToplevelWindow -- - * - * This procedure is called instead of Tk_MoveWindow to adjust - * the x-y location of a top-level window. It delays the actual - * move to a later time and keeps window-manager information - * up-to-date with the move - * - * Results: - * None. - * - * Side effects: - * The window is eventually moved so that its upper-left corner - * (actually, the upper-left corner of the window's decorative - * frame, if there is one) is at (x,y). - * - *---------------------------------------------------------------------- - */ - -void -Tk_MoveToplevelWindow( - Tk_Window tkwin, /* Window to move. */ - int x, int y) /* New location for window (within - * parent). */ -{ - TkWindow *winPtr = (TkWindow *) tkwin; - register WmInfo *wmPtr = winPtr->wmInfoPtr; - - if (!(winPtr->flags & TK_TOP_LEVEL)) { - panic("Tk_MoveToplevelWindow called with non-toplevel window"); - } - wmPtr->x = x; - wmPtr->y = y; - wmPtr->flags |= WM_MOVE_PENDING; - wmPtr->flags &= ~(WM_NEGATIVE_X|WM_NEGATIVE_Y); - if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) { - wmPtr->sizeHintsFlags |= USPosition; - wmPtr->flags |= WM_UPDATE_SIZE_HINTS; - } - - /* - * If the window has already been mapped, must bring its geometry - * up-to-date immediately, otherwise an event might arrive from the - * server that would overwrite wmPtr->x and wmPtr->y and lose the - * new position. - */ - - if (!(wmPtr->flags & WM_NEVER_MAPPED)) { - if (wmPtr->flags & WM_UPDATE_PENDING) { - Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr); - } - UpdateGeometryInfo((ClientData) winPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkWmProtocolEventProc -- - * - * This procedure is called by the Tk_HandleEvent whenever a - * ClientMessage event arrives whose type is "WM_PROTOCOLS". - * This procedure handles the message from the window manager - * in an appropriate fashion. - * - * Results: - * None. - * - * Side effects: - * Depends on what sort of handler, if any, was set up for the - * protocol. - * - *---------------------------------------------------------------------- - */ - -void -TkWmProtocolEventProc( - TkWindow *winPtr, /* Window to which the event was sent. */ - XEvent *eventPtr) /* X event. */ -{ - WmInfo *wmPtr; - register ProtocolHandler *protPtr; - Tcl_Interp *interp; - Atom protocol; - int result; - - wmPtr = winPtr->wmInfoPtr; - if (wmPtr == NULL) { - return; - } - protocol = (Atom) eventPtr->xclient.data.l[0]; - for (protPtr = wmPtr->protPtr; protPtr != NULL; - protPtr = protPtr->nextPtr) { - if (protocol == protPtr->protocol) { - Tcl_Preserve((ClientData) protPtr); - interp = protPtr->interp; - Tcl_Preserve((ClientData) interp); - result = Tcl_GlobalEval(interp, protPtr->command); - if (result != TCL_OK) { - Tcl_AddErrorInfo(interp, "\n (command for \""); - Tcl_AddErrorInfo(interp, - Tk_GetAtomName((Tk_Window) winPtr, protocol)); - Tcl_AddErrorInfo(interp, "\" window manager protocol)"); - Tk_BackgroundError(interp); - } - Tcl_Release((ClientData) interp); - Tcl_Release((ClientData) protPtr); - return; - } - } - - /* - * No handler was present for this protocol. If this is a - * WM_DELETE_WINDOW message then just destroy the window. - */ - - if (protocol == Tk_InternAtom((Tk_Window) winPtr, "WM_DELETE_WINDOW")) { - Tk_DestroyWindow((Tk_Window) winPtr); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkWmStackorderToplevelWrapperMap -- - * - * This procedure will create a table that maps the reparent wrapper - * X id for a toplevel to the TkWindow structure that is wraps. - * Tk keeps track of a mapping from the window X id to the TkWindow - * structure but that does us no good here since we only get the X - * id of the wrapper window. Only those toplevel windows that are - * mapped have a position in the stacking order. - * - * Results: - * None. - * - * Side effects: - * Adds entries to the passed hashtable. - * - *---------------------------------------------------------------------- - */ -void -TkWmStackorderToplevelWrapperMap(winPtr, table) - TkWindow *winPtr; /* TkWindow to recurse on */ - Tcl_HashTable *table; /* Maps mac window to TkWindow */ -{ - TkWindow *childPtr; - Tcl_HashEntry *hPtr; - WindowPeek wrapper; - int newEntry; - - if (Tk_IsMapped(winPtr) && Tk_IsTopLevel(winPtr) && - !Tk_IsEmbedded(winPtr)) { - wrapper = (WindowPeek) TkMacGetDrawablePort(winPtr->window); - - hPtr = Tcl_CreateHashEntry(table, - (char *) wrapper, &newEntry); - Tcl_SetHashValue(hPtr, winPtr); - } - - for (childPtr = winPtr->childList; childPtr != NULL; - childPtr = childPtr->nextPtr) { - TkWmStackorderToplevelWrapperMap(childPtr, table); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkWmStackorderToplevel -- - * - * This procedure returns the stack order of toplevel windows. - * - * Results: - * An array of pointers to tk window objects in stacking order - * or else NULL if there was an error. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkWindow ** -TkWmStackorderToplevel(parentPtr) - TkWindow *parentPtr; /* Parent toplevel window. */ -{ - WindowPeek frontWindow; - TkWindow *childWinPtr, **windows, **window_ptr; - Tcl_HashTable table; - Tcl_HashEntry *hPtr; - Tcl_HashSearch search; - - /* - * Map mac windows to a TkWindow of the wrapped toplevel. - */ - - Tcl_InitHashTable(&table, TCL_ONE_WORD_KEYS); - TkWmStackorderToplevelWrapperMap(parentPtr, &table); - - windows = (TkWindow **) ckalloc((table.numEntries+1) - * sizeof(TkWindow *)); - - /* - * Special cases: If zero or one toplevels were mapped - * there is no need to enumerate Windows. - */ - - switch (table.numEntries) { - case 0: - windows[0] = NULL; - goto done; - case 1: - hPtr = Tcl_FirstHashEntry(&table, &search); - windows[0] = (TkWindow *) Tcl_GetHashValue(hPtr); - windows[1] = NULL; - goto done; - } - - if (TkMacHaveAppearance() >= 0x110) { - frontWindow = (WindowPeek) FrontNonFloatingWindow(); - } else { - frontWindow = (WindowPeek) FrontWindow(); - } - - if (frontWindow == NULL) { - ckfree((char *) windows); - windows = NULL; - } else { - window_ptr = windows + table.numEntries; - *window_ptr-- = NULL; - while (frontWindow != NULL) { - hPtr = Tcl_FindHashEntry(&table, (char *) frontWindow); - if (hPtr != NULL) { - childWinPtr = (TkWindow *) Tcl_GetHashValue(hPtr); - *window_ptr-- = childWinPtr; - } - frontWindow = frontWindow->nextWindow; - } - if (window_ptr != (windows-1)) - panic("num matched toplevel windows does not equal num children"); - } - - done: - Tcl_DeleteHashTable(&table); - return windows; -} - -/* - *---------------------------------------------------------------------- - * - * TkWmRestackToplevel -- - * - * This procedure restacks a top-level window. - * - * Results: - * None. - * - * Side effects: - * WinPtr gets restacked as specified by aboveBelow and otherPtr. - * This procedure doesn't return until the restack has taken - * effect and the ConfigureNotify event for it has been received. - * - *---------------------------------------------------------------------- - */ - -void -TkWmRestackToplevel( - TkWindow *winPtr, /* Window to restack. */ - int aboveBelow, /* Gives relative position for restacking; - * must be Above or Below. */ - TkWindow *otherPtr) /* Window relative to which to restack; - * if NULL, then winPtr gets restacked - * above or below *all* siblings. */ -{ - WmInfo *wmPtr; - WindowPeek macWindow, otherMacWindow, frontWindow; - - wmPtr = winPtr->wmInfoPtr; - - /* - * Get the mac window. Make sure it exists & is mapped. - */ - - if (winPtr->window == None) { - Tk_MakeWindowExist((Tk_Window) winPtr); - } - if (winPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) { - - /* - * Can't set stacking order properly until the window is on the - * screen (mapping it may give it a reparent window), so make sure - * it's on the screen. - */ - - TkWmMapWindow(winPtr); - } - macWindow = (WindowPeek) TkMacGetDrawablePort(winPtr->window); - - /* - * Get the window in which a raise or lower is in relation to. - */ - if (otherPtr != NULL) { - if (otherPtr->window == None) { - Tk_MakeWindowExist((Tk_Window) otherPtr); - } - if (otherPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) { - TkWmMapWindow(otherPtr); - } - otherMacWindow = (WindowPeek) TkMacGetDrawablePort(otherPtr->window); - } else { - otherMacWindow = NULL; - } - - if (TkMacHaveAppearance() >= 0x110) { - frontWindow = (WindowPeek) FrontNonFloatingWindow(); - } else { - frontWindow = (WindowPeek) FrontWindow(); - } - - if (aboveBelow == Above) { - if (macWindow == frontWindow) { - /* - * Do nothing - it's already at the top. - */ - } else if (otherMacWindow == frontWindow || otherMacWindow == NULL) { - /* - * Raise the window to the top. If the window is visable then - * we also make it the active window. - */ - - if (wmPtr->hints.initial_state == WithdrawnState) { - BringToFront((WindowPtr) macWindow); - } else { - SelectWindow((WindowPtr) macWindow); - } - } else { - /* - * Find the window to be above. (Front window will actually be the - * window to be behind.) Front window is NULL if no other windows. - */ - while (frontWindow != NULL && - frontWindow->nextWindow != otherMacWindow) { - frontWindow = frontWindow->nextWindow; - } - if (frontWindow != NULL) { - SendBehind((WindowPtr) macWindow, (WindowPtr) frontWindow); - } - } - } else { - /* - * Send behind. If it was in front find another window to make active. - */ - if (macWindow == frontWindow) { - if (macWindow->nextWindow != NULL) { - SelectWindow((WindowPtr) macWindow->nextWindow); - } - } - SendBehind((WindowPtr) macWindow, (WindowPtr) otherMacWindow); - } -} - -/* - *---------------------------------------------------------------------- - * - * TkWmAddToColormapWindows -- - * - * This procedure is called to add a given window to the - * WM_COLORMAP_WINDOWS property for its top-level, if it - * isn't already there. It is invoked by the Tk code that - * creates a new colormap, in order to make sure that colormap - * information is propagated to the window manager by default. - * - * Results: - * None. - * - * Side effects: - * WinPtr's window gets added to the WM_COLORMAP_WINDOWS - * property of its nearest top-level ancestor, unless the - * colormaps have been set explicitly with the - * "wm colormapwindows" command. - * - *---------------------------------------------------------------------- - */ - -void -TkWmAddToColormapWindows( - TkWindow *winPtr) /* Window with a non-default colormap. - * Should not be a top-level window. */ -{ - TkWindow *topPtr; - TkWindow **oldPtr, **newPtr; - int count, i; - - if (winPtr->window == None) { - return; - } - - for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) { - if (topPtr == NULL) { - /* - * Window is being deleted. Skip the whole operation. - */ - - return; - } - if (topPtr->flags & TK_TOP_HIERARCHY) { - break; - } - } - if (topPtr->wmInfoPtr == NULL) { - return; - } - - if (topPtr->wmInfoPtr->flags & WM_COLORMAPS_EXPLICIT) { - return; - } - - /* - * Make sure that the window isn't already in the list. - */ - - count = topPtr->wmInfoPtr->cmapCount; - oldPtr = topPtr->wmInfoPtr->cmapList; - - for (i = 0; i < count; i++) { - if (oldPtr[i] == winPtr) { - return; - } - } - - /* - * Make a new bigger array and use it to reset the property. - * Automatically add the toplevel itself as the last element - * of the list. - */ - - newPtr = (TkWindow **) ckalloc((unsigned) ((count+2)*sizeof(TkWindow*))); - if (count > 0) { - memcpy(newPtr, oldPtr, count * sizeof(TkWindow*)); - } - if (count == 0) { - count++; - } - newPtr[count-1] = winPtr; - newPtr[count] = topPtr; - if (oldPtr != NULL) { - ckfree((char *) oldPtr); - } - - topPtr->wmInfoPtr->cmapList = newPtr; - topPtr->wmInfoPtr->cmapCount = count+1; - - /* - * On the Macintosh all of this is just an excercise - * in compatability as we don't support colormaps. If - * we did they would be installed here. - */ -} - -/* - *---------------------------------------------------------------------- - * - * TkWmRemoveFromColormapWindows -- - * - * This procedure is called to remove a given window from the - * WM_COLORMAP_WINDOWS property for its top-level. It is invoked - * when windows are deleted. - * - * Results: - * None. - * - * Side effects: - * WinPtr's window gets removed from the WM_COLORMAP_WINDOWS - * property of its nearest top-level ancestor, unless the - * top-level itself is being deleted too. - * - *---------------------------------------------------------------------- - */ - -void -TkWmRemoveFromColormapWindows( - TkWindow *winPtr) /* Window that may be present in - * WM_COLORMAP_WINDOWS property for its - * top-level. Should not be a top-level - * window. */ -{ - TkWindow *topPtr; - TkWindow **oldPtr; - int count, i, j; - - for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) { - if (topPtr == NULL) { - /* - * Ancestors have been deleted, so skip the whole operation. - * Seems like this can't ever happen? - */ - - return; - } - if (topPtr->flags & TK_TOP_HIERARCHY) { - break; - } - } - if (topPtr->flags & TK_ALREADY_DEAD) { - /* - * Top-level is being deleted, so there's no need to cleanup - * the WM_COLORMAP_WINDOWS property. - */ - - return; - } - - /* - * Find the window and slide the following ones down to cover - * it up. - */ - - if (topPtr->wmInfoPtr == NULL) { - return; - } - - count = topPtr->wmInfoPtr->cmapCount; - oldPtr = topPtr->wmInfoPtr->cmapList; - for (i = 0; i < count; i++) { - if (oldPtr[i] == winPtr) { - for (j = i ; j < count-1; j++) { - oldPtr[j] = oldPtr[j+1]; - } - topPtr->wmInfoPtr->cmapCount = count - 1; - break; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * TkGetPointerCoords -- - * - * Fetch the position of the mouse pointer. - * - * Results: - * *xPtr and *yPtr are filled in with the (virtual) root coordinates - * of the mouse pointer for tkwin's display. If the pointer isn't - * on tkwin's screen, then -1 values are returned for both - * coordinates. The argument tkwin must be a toplevel window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkGetPointerCoords( - Tk_Window tkwin, /* Toplevel window that identifies screen - * on which lookup is to be done. */ - int *xPtr, int *yPtr) /* Store pointer coordinates here. */ -{ - Point where; - - GetMouse(&where); - LocalToGlobal(&where); - *xPtr = where.h; - *yPtr = where.v; -} - -/* - *---------------------------------------------------------------------- - * - * InitialWindowBounds -- - * - * This function calculates the initial bounds for a new Mac - * toplevel window. Unless the geometry is specified by the user - * this code will auto place the windows in a cascade diagonially - * across the main monitor of the Mac. - * - * Results: - * The bounds are returned in geometry. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -InitialWindowBounds( - TkWindow *winPtr, /* Window to get initial bounds for. */ - Rect *geometry) /* On return the initial bounds. */ -{ - int x, y; - static int defaultX = 5; - static int defaultY = 45; - - if (!(winPtr->wmInfoPtr->sizeHintsFlags & (USPosition | PPosition))) { - /* - * We will override the program & hopefully place the - * window in a "better" location. - */ - - if (((tcl_macQdPtr->screenBits.bounds.right - defaultX) < 30) || - ((tcl_macQdPtr->screenBits.bounds.bottom - defaultY) < 30)) { - defaultX = 5; - defaultY = 45; - } - x = defaultX; - y = defaultY; - defaultX += 20; - defaultY += 20; - } else { - x = winPtr->wmInfoPtr->x; - y = winPtr->wmInfoPtr->y; - } - - geometry->left = x; - geometry->top = y; - geometry->right = x + winPtr->changes.width; - geometry->bottom = y + winPtr->changes.height; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacResizable -- - * - * This function determines if the passed in window is part of - * a toplevel window that is resizable. If the window is - * resizable in the x, y or both directions, true is returned. - * - * Results: - * True if resizable, false otherwise. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkMacResizable( - TkWindow *winPtr) /* Tk window or NULL. */ -{ - WmInfo *wmPtr; - - if (winPtr == NULL) { - return false; - } - while (winPtr->wmInfoPtr == NULL) { - winPtr = winPtr->parentPtr; - } - - wmPtr = winPtr->wmInfoPtr; - if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) && - (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) { - return false; - } else { - return true; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGrowToplevel -- - * - * The function is invoked when the user clicks in the grow region - * of a Tk window. The function will handle the dragging - * procedure and not return until completed. Finally, the function - * may place information Tk's event queue is the window was resized. - * - * Results: - * True if events were placed on event queue, false otherwise. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkMacGrowToplevel( - WindowPtr whichWindow, - Point start) -{ - Point where = start; - TkDisplay *dispPtr; - - GlobalToLocal(&where); - if (where.h > (whichWindow->portRect.right - 16) && - where.v > (whichWindow->portRect.bottom - 16)) { - - Window window; - TkWindow *winPtr; - WmInfo *wmPtr; - Rect bounds; - long growResult; - - window = TkMacGetXWindow(whichWindow); - dispPtr = TkGetDisplayList(); - winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); - wmPtr = winPtr->wmInfoPtr; - - /* TODO: handle grid size options. */ - if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) && - (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) { - return false; - } - if (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) { - bounds.left = bounds.right = winPtr->changes.width; - } else { - bounds.left = (wmPtr->minWidth < 64) ? 64 : wmPtr->minWidth; - bounds.right = (wmPtr->maxWidth < 64) ? 64 : wmPtr->maxWidth; - } - if (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) { - bounds.top = bounds.bottom = winPtr->changes.height; - } else { - bounds.top = (wmPtr->minHeight < 64) ? 64 : wmPtr->minHeight; - bounds.bottom = (wmPtr->maxHeight < 64) ? 64 : wmPtr->maxHeight; - } - - growResult = GrowWindow(whichWindow, start, &bounds); - - if (growResult != 0) { - SizeWindow(whichWindow, - LoWord(growResult), HiWord(growResult), true); - SetPort(whichWindow); - InvalRect(&whichWindow->portRect); /* TODO: may not be needed */ - TkMacInvalClipRgns(winPtr); - TkGenWMConfigureEvent((Tk_Window) winPtr, -1, -1, - (int) LoWord(growResult), (int) HiWord(growResult), - TK_SIZE_CHANGED); - return true; - } - return false; - } - return false; -} - -/* - *---------------------------------------------------------------------- - * - * TkSetWMName -- - * - * Set the title for a toplevel window. If the window is embedded, - * do not change the window title. - * - * Results: - * None. - * - * Side effects: - * The title of the window is changed. - * - *---------------------------------------------------------------------- - */ - -void -TkSetWMName( - TkWindow *winPtr, - CONST char *title) -{ - Str255 pTitle; - GWorldPtr macWin; - int destWrote; - - if (Tk_IsEmbedded(winPtr)) { - return; - } - Tcl_UtfToExternal(NULL, NULL, title, - strlen(title), 0, NULL, - (char *) &pTitle[1], - 255, NULL, &destWrote, NULL); /* Internalize native */ - pTitle[0] = destWrote; - - macWin = TkMacGetDrawablePort(winPtr->window); - - SetWTitle((WindowPtr) macWin, pTitle); -} - -void -TkGenWMDestroyEvent( - Tk_Window tkwin) -{ - XEvent event; - - event.xany.serial = Tk_Display(tkwin)->request; - event.xany.send_event = False; - event.xany.display = Tk_Display(tkwin); - - event.xclient.window = Tk_WindowId(tkwin); - event.xclient.type = ClientMessage; - event.xclient.message_type = Tk_InternAtom(tkwin, "WM_PROTOCOLS"); - event.xclient.format = 32; - event.xclient.data.l[0] = Tk_InternAtom(tkwin, "WM_DELETE_WINDOW"); - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); -} - -/* - *---------------------------------------------------------------------- - * - * TkGenWMConfigureEvent -- - * - * Generate a ConfigureNotify event for Tk. Depending on the - * value of flag the values of width/height, x/y, or both may - * be changed. - * - * Results: - * None. - * - * Side effects: - * A ConfigureNotify event is sent to Tk. - * - *---------------------------------------------------------------------- - */ - -void -TkGenWMConfigureEvent( - Tk_Window tkwin, - int x, - int y, - int width, - int height, - int flags) -{ - XEvent event; - WmInfo *wmPtr; - TkWindow *winPtr = (TkWindow *) tkwin; - - if (tkwin == NULL) { - return; - } - - event.type = ConfigureNotify; - event.xconfigure.serial = Tk_Display(tkwin)->request; - event.xconfigure.send_event = False; - event.xconfigure.display = Tk_Display(tkwin); - event.xconfigure.event = Tk_WindowId(tkwin); - event.xconfigure.window = Tk_WindowId(tkwin); - event.xconfigure.border_width = winPtr->changes.border_width; - event.xconfigure.override_redirect = winPtr->atts.override_redirect; - if (winPtr->changes.stack_mode == Above) { - event.xconfigure.above = winPtr->changes.sibling; - } else { - event.xconfigure.above = None; - } - - if (flags & TK_LOCATION_CHANGED) { - event.xconfigure.x = x; - event.xconfigure.y = y; - } else { - event.xconfigure.x = Tk_X(tkwin); - event.xconfigure.y = Tk_Y(tkwin); - x = Tk_X(tkwin); - y = Tk_Y(tkwin); - } - if (flags & TK_SIZE_CHANGED) { - event.xconfigure.width = width; - event.xconfigure.height = height; - } else { - event.xconfigure.width = Tk_Width(tkwin); - event.xconfigure.height = Tk_Height(tkwin); - width = Tk_Width(tkwin); - height = Tk_Height(tkwin); - } - - Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - - /* - * Update window manager information. - */ - if (Tk_IsTopLevel(winPtr)) { - wmPtr = winPtr->wmInfoPtr; - if (flags & TK_LOCATION_CHANGED) { - wmPtr->x = x; - wmPtr->y = y; - wmPtr->flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y); - } - if ((flags & TK_SIZE_CHANGED) && - ((width != Tk_Width(tkwin)) || (height != Tk_Height(tkwin)))) { - if ((wmPtr->width == -1) && (width == winPtr->reqWidth)) { - /* - * Don't set external width, since the user didn't change it - * from what the widgets asked for. - */ - } else { - if (wmPtr->gridWin != NULL) { - wmPtr->width = wmPtr->reqGridWidth - + (width - winPtr->reqWidth)/wmPtr->widthInc; - if (wmPtr->width < 0) { - wmPtr->width = 0; - } - } else { - wmPtr->width = width; - } - } - if ((wmPtr->height == -1) && (height == winPtr->reqHeight)) { - /* - * Don't set external height, since the user didn't change it - * from what the widgets asked for. - */ - } else { - if (wmPtr->gridWin != NULL) { - wmPtr->height = wmPtr->reqGridHeight - + (height - winPtr->reqHeight)/wmPtr->heightInc; - if (wmPtr->height < 0) { - wmPtr->height = 0; - } - } else { - wmPtr->height = height; - } - } - wmPtr->configWidth = width; - wmPtr->configHeight = height; - } - } - - /* - * Now set up the changes structure. Under X we wait for the - * ConfigureNotify to set these values. On the Mac we know imediatly that - * this is what we want - so we just set them. However, we need to - * make sure the windows clipping region is marked invalid so the - * change is visable to the subwindow. - */ - winPtr->changes.x = x; - winPtr->changes.y = y; - winPtr->changes.width = width; - winPtr->changes.height = height; - TkMacInvalClipRgns(winPtr); -} - -/* - *---------------------------------------------------------------------- - * - * TkGetTransientMaster -- - * - * If the passed window has the TRANSIENT_FOR property set this - * will return the master window. Otherwise it will return None. - * - * Results: - * The master window or None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Window -TkGetTransientMaster( - TkWindow *winPtr) -{ - if (winPtr->wmInfoPtr != NULL) { - return winPtr->wmInfoPtr->master; - } - return None; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGetXWindow -- - * - * Returns the X window Id associated with the given WindowRef. - * - * Results: - * The window id is returned. None is returned if not a Tk window. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Window -TkMacGetXWindow( - WindowRef macWinPtr) -{ - register Tcl_HashEntry *hPtr; - - if ((macWinPtr == NULL) || !windowHashInit) { - return None; - } - hPtr = Tcl_FindHashEntry(&windowTable, (char *) macWinPtr); - if (hPtr == NULL) { - return None; - } - return (Window) Tcl_GetHashValue(hPtr); -} - -/* - *---------------------------------------------------------------------- - * - * TkMacZoomToplevel -- - * - * The function is invoked when the user clicks in the zoom region - * of a Tk window. The function will handle the mouse tracking - * for the interaction. If the window is to be zoomed the window - * size is changed and events are generated to let Tk know what - * happened. - * - * Results: - * True if events were placed on event queue, false otherwise. - * - * Side effects: - * The window may be resized & events placed on Tk's queue. - * - *---------------------------------------------------------------------- - */ - -int -TkMacZoomToplevel( - WindowPtr whichWindow, /* The Macintosh window to zoom. */ - Point where, /* The current mouse position. */ - short zoomPart) /* Either inZoomIn or inZoomOut */ -{ - Window window; - Tk_Window tkwin; - Point location = {0, 0}; - int xOffset, yOffset; - WmInfo *wmPtr; - TkDisplay *dispPtr; - - SetPort(whichWindow); - if (!TrackBox(whichWindow, where, zoomPart)) { - return false; - } - - /* - * We should now zoom the window (as long as it's one of ours). We - * also need to generate an event to let Tk know that the window size - * has changed. - */ - window = TkMacGetXWindow(whichWindow); - dispPtr = TkGetDisplayList(); - tkwin = Tk_IdToWindow(dispPtr->display, window); - if (tkwin == NULL) { - return false; - } - - /* - * The following block of code works around a bug in the window - * definition for Apple's floating windows. The zoom behavior is - * broken - we must manually set the standard state (by default - * it's something like 1x1) and we must swap the zoomPart manually - * otherwise we always get the same zoomPart and nothing happens. - */ - wmPtr = ((TkWindow *) tkwin)->wmInfoPtr; - if (wmPtr->style >= floatProc && wmPtr->style <= floatSideZoomGrowProc) { - if (zoomPart == inZoomIn) { - Rect zoomRect = tcl_macQdPtr->screenBits.bounds; - InsetRect(&zoomRect, 60, 60); - SetWindowStandardState(whichWindow, &zoomRect); - zoomPart = inZoomOut; - } else { - zoomPart = inZoomIn; - } - } - - ZoomWindow(whichWindow, zoomPart, false); - InvalRect(&whichWindow->portRect); - TkMacInvalClipRgns((TkWindow *) tkwin); - - LocalToGlobal(&location); - TkMacWindowOffset(whichWindow, &xOffset, &yOffset); - location.h -= xOffset; - location.v -= yOffset; - TkGenWMConfigureEvent(tkwin, location.h, location.v, - whichWindow->portRect.right - whichWindow->portRect.left, - whichWindow->portRect.bottom - whichWindow->portRect.top, - TK_BOTH_CHANGED); - return true; -} - -/* - *---------------------------------------------------------------------- - * - * TkUnsupported1Cmd -- - * - * This procedure is invoked to process the - * "::tk::unsupported::MacWindowStyle" Tcl command. This command - * allows you to set the style of decoration for a Macintosh window. - * - * Results: - * A standard Tcl result. - * - * Side effects: - * Changes the style of a new Mac window. - * - *---------------------------------------------------------------------- - */ - - /* ARGSUSED */ -int -TkUnsupported1Cmd( - ClientData clientData, /* Main window associated with - * interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - CONST char **argv) /* Argument strings. */ -{ - Tk_Window tkwin = (Tk_Window) clientData; - TkWindow *winPtr; - register WmInfo *wmPtr; - int c; - size_t length; - - if (argc < 3) { - wrongNumArgs: - Tcl_AppendResult(interp, "wrong # args: should be \"", - argv[0], " option window ?arg ...?\"", (char *) NULL); - return TCL_ERROR; - } - - winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin); - if (winPtr == NULL) { - return TCL_ERROR; - } - if (!Tk_IsTopLevel(winPtr)) { - Tcl_AppendResult(interp, "window \"", winPtr->pathName, - "\" isn't a top-level window", (char *) NULL); - return TCL_ERROR; - } - wmPtr = winPtr->wmInfoPtr; - c = argv[1][0]; - length = strlen(argv[1]); - if ((c == 's') && (strncmp(argv[1], "style", length) == 0)) { - if (TkMacHaveAppearance() >= 0x110) { - if ((argc < 3) || (argc > 5)) { - Tcl_AppendResult(interp, "wrong # arguments: must be \"", - argv[0], " style window ?windowStyle?\"", - " or \"", argv[0], "style window ?class attributes?\"", - (char *) NULL); - return TCL_ERROR; - } - } else { - if ((argc != 3) && (argc != 4)) { - Tcl_AppendResult(interp, "wrong # arguments: must be \"", - argv[0], " style window ?windowStyle?\"", - (char *) NULL); - return TCL_ERROR; - } - } - - if (argc == 3) { - int appearanceSpec = 0; - - switch (wmPtr->style) { - case -1: - appearanceSpec = 1; - break; - case noGrowDocProc: - case documentProc: - Tcl_SetResult(interp, "documentProc", TCL_STATIC); - break; - case dBoxProc: - Tcl_SetResult(interp, "dBoxProc", TCL_STATIC); - break; - case plainDBox: - Tcl_SetResult(interp, "plainDBox", TCL_STATIC); - break; - case altDBoxProc: - Tcl_SetResult(interp, "altDBoxProc", TCL_STATIC); - break; - case movableDBoxProc: - Tcl_SetResult(interp, "movableDBoxProc", TCL_STATIC); - break; - case zoomDocProc: - case zoomNoGrow: - Tcl_SetResult(interp, "zoomDocProc", TCL_STATIC); - break; - case rDocProc: - Tcl_SetResult(interp, "rDocProc", TCL_STATIC); - break; - case floatProc: - case floatGrowProc: - Tcl_SetResult(interp, "floatProc", TCL_STATIC); - break; - case floatZoomProc: - case floatZoomGrowProc: - Tcl_SetResult(interp, "floatZoomProc", TCL_STATIC); - break; - case floatSideProc: - case floatSideGrowProc: - Tcl_SetResult(interp, "floatSideProc", TCL_STATIC); - break; - case floatSideZoomProc: - case floatSideZoomGrowProc: - Tcl_SetResult(interp, "floatSideZoomProc", TCL_STATIC); - break; - default: - panic("invalid style"); - } - if (appearanceSpec) { - Tcl_Obj *attributeList, *newResult; - - switch (wmPtr->macClass) { - case kAlertWindowClass: - newResult = Tcl_NewStringObj("alert", -1); - break; - case kMovableAlertWindowClass: - newResult = Tcl_NewStringObj("moveableAlert", -1); - break; - case kModalWindowClass: - newResult = Tcl_NewStringObj("modal", -1); - break; - case kMovableModalWindowClass: - newResult = Tcl_NewStringObj("moveableModal", -1); - break; - case kFloatingWindowClass: - newResult = Tcl_NewStringObj("floating", -1); - break; - case kDocumentWindowClass: - newResult = Tcl_NewStringObj("document", -1); - break; - default: - panic("invalid class"); - } - - attributeList = Tcl_NewListObj(0, NULL); - if (wmPtr->attributes == kWindowNoAttributes) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("none", -1)); - } else if (wmPtr->attributes == kWindowStandardDocumentAttributes) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("standardDocument", -1)); - } else if (wmPtr->attributes == kWindowStandardFloatingAttributes) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("standardFloating", -1)); - } else { - if (wmPtr->attributes & kWindowCloseBoxAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("closeBox", -1)); - } - if (wmPtr->attributes & kWindowHorizontalZoomAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("horizontalZoom", -1)); - } - if (wmPtr->attributes & kWindowVerticalZoomAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("verticalZoom", -1)); - } - if (wmPtr->attributes & kWindowCollapseBoxAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("collapseBox", -1)); - } - if (wmPtr->attributes & kWindowResizableAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("resizable", -1)); - } - if (wmPtr->attributes & kWindowSideTitlebarAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("sideTitlebar", -1)); - } - if (wmPtr->attributes & kWindowNoUpdatesAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("noUpdates", -1)); - } - if (wmPtr->attributes & kWindowNoActivatesAttribute) { - Tcl_ListObjAppendElement(interp, attributeList, - Tcl_NewStringObj("noActivates", -1)); - } - } - Tcl_ListObjAppendElement(interp, newResult, attributeList); - Tcl_SetObjResult(interp, newResult); - } - return TCL_OK; - } else if (argc == 4) { - if (strcmp(argv[3], "documentProc") == 0) { - wmPtr->style = documentProc; - } else if (strcmp(argv[3], "noGrowDocProc") == 0) { - wmPtr->style = documentProc; - } else if (strcmp(argv[3], "dBoxProc") == 0) { - wmPtr->style = dBoxProc; - } else if (strcmp(argv[3], "plainDBox") == 0) { - wmPtr->style = plainDBox; - } else if (strcmp(argv[3], "altDBoxProc") == 0) { - wmPtr->style = altDBoxProc; - } else if (strcmp(argv[3], "movableDBoxProc") == 0) { - wmPtr->style = movableDBoxProc; - } else if (strcmp(argv[3], "zoomDocProc") == 0) { - wmPtr->style = zoomDocProc; - } else if (strcmp(argv[3], "zoomNoGrow") == 0) { - wmPtr->style = zoomNoGrow; - } else if (strcmp(argv[3], "rDocProc") == 0) { - wmPtr->style = rDocProc; - } else if (strcmp(argv[3], "floatProc") == 0) { - wmPtr->style = floatGrowProc; - } else if (strcmp(argv[3], "floatGrowProc") == 0) { - wmPtr->style = floatGrowProc; - } else if (strcmp(argv[3], "floatZoomProc") == 0) { - wmPtr->style = floatZoomGrowProc; - } else if (strcmp(argv[3], "floatZoomGrowProc") == 0) { - wmPtr->style = floatZoomGrowProc; - } else if (strcmp(argv[3], "floatSideProc") == 0) { - wmPtr->style = floatSideGrowProc; - } else if (strcmp(argv[3], "floatSideGrowProc") == 0) { - wmPtr->style = floatSideGrowProc; - } else if (strcmp(argv[3], "floatSideZoomProc") == 0) { - wmPtr->style = floatSideZoomGrowProc; - } else if (strcmp(argv[3], "floatSideZoomGrowProc") == 0) { - wmPtr->style = floatSideZoomGrowProc; - } else { - Tcl_AppendResult(interp, "bad style: should be documentProc, ", - "dBoxProc, plainDBox, altDBoxProc, movableDBoxProc, ", - "zoomDocProc, rDocProc, floatProc, floatZoomProc, ", - "floatSideProc, or floatSideZoomProc", - (char *) NULL); - return TCL_ERROR; - } - } else if (argc == 5) { - int oldClass = wmPtr->macClass; - int oldAttributes = wmPtr->attributes; - - if (strcmp(argv[3], "alert") == 0) { - wmPtr->macClass = kAlertWindowClass; - } else if (strcmp(argv[3], "moveableAlert") == 0) { - wmPtr->macClass = kMovableAlertWindowClass; - } else if (strcmp(argv[3], "modal") == 0) { - wmPtr->macClass = kModalWindowClass; - } else if (strcmp(argv[3], "moveableModal") == 0) { - wmPtr->macClass = kMovableModalWindowClass; - } else if (strcmp(argv[3], "floating") == 0) { - wmPtr->macClass = kFloatingWindowClass; - } else if (strcmp(argv[3], "document") == 0) { - wmPtr->macClass = kDocumentWindowClass; - } else { - wmPtr->macClass = oldClass; - Tcl_AppendResult(interp, "bad class: should be alert, ", - "moveableAlert, modal, moveableModal, floating, ", - "or document", - (char *) NULL); - return TCL_ERROR; - } - - if (strcmp(argv[4], "none") == 0) { - wmPtr->attributes = kWindowNoAttributes; - } else if (strcmp(argv[4], "standardDocument") == 0) { - wmPtr->attributes = kWindowStandardDocumentAttributes; - } else if (strcmp(argv[4], "standardFloating") == 0) { - wmPtr->attributes = kWindowStandardFloatingAttributes; - } else { - int foundOne = 0; - int attrArgc, i; - CONST char **attrArgv = NULL; - - if (Tcl_SplitList(interp, argv[4], &attrArgc, &attrArgv) != TCL_OK) { - wmPtr->macClass = oldClass; - Tcl_AppendResult(interp, "Ill-formed attributes list: \"", - argv[4], "\".", (char *) NULL); - return TCL_ERROR; - } - - wmPtr->attributes = kWindowNoAttributes; - - for (i = 0; i < attrArgc; i++) { - if ((*attrArgv[i] == 'c') - && (strcmp(attrArgv[i], "closeBox") == 0)) { - wmPtr->attributes |= kWindowCloseBoxAttribute; - foundOne = 1; - } else if ((*attrArgv[i] == 'h') - && (strcmp(attrArgv[i], "horizontalZoom") == 0)) { - wmPtr->attributes |= kWindowHorizontalZoomAttribute; - foundOne = 1; - } else if ((*attrArgv[i] == 'v') - && (strcmp(attrArgv[i], "verticalZoom") == 0)) { - wmPtr->attributes |= kWindowVerticalZoomAttribute; - foundOne = 1; - } else if ((*attrArgv[i] == 'c') - && (strcmp(attrArgv[i], "collapseBox") == 0)) { - wmPtr->attributes |= kWindowCollapseBoxAttribute; - foundOne = 1; - } else if ((*attrArgv[i] == 'r') - && (strcmp(attrArgv[i], "resizable") == 0)) { - wmPtr->attributes |= kWindowResizableAttribute; - foundOne = 1; - } else if ((*attrArgv[i] == 's') - && (strcmp(attrArgv[i], "sideTitlebar") == 0)) { - wmPtr->attributes |= kWindowSideTitlebarAttribute; - foundOne = 1; - } else { - foundOne = 0; - break; - } - } - - if (attrArgv != NULL) { - ckfree ((char *) attrArgv); - } - - if (foundOne != 1) { - wmPtr->macClass = oldClass; - wmPtr->attributes = oldAttributes; - - Tcl_AppendResult(interp, "bad attribute: \"", argv[4], - "\", should be standardDocument, ", - "standardFloating, or some combination of ", - "closeBox, horizontalZoom, verticalZoom, ", - "collapseBox, resizable, or sideTitlebar.", - (char *) NULL); - return TCL_ERROR; - } - } - - wmPtr->style = -1; - } - } else { - Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[1], - "\": must be style", - (char *) NULL); - return TCL_ERROR; - } - - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * TkpMakeMenuWindow -- - * - * Configure the window to be either a undecorated pull-down - * (or pop-up) menu, or as a toplevel floating menu (palette). - * - * Results: - * None. - * - * Side effects: - * Changes the style bit used to create a new Mac toplevel. - * - *---------------------------------------------------------------------- - */ - -void -TkpMakeMenuWindow( - Tk_Window tkwin, /* New window. */ - int transient) /* 1 means menu is only posted briefly as - * a popup or pulldown or cascade. 0 means - * menu is always visible, e.g. as a - * floating menu. */ -{ - if (transient) { - ((TkWindow *) tkwin)->wmInfoPtr->style = plainDBox; - } else { - ((TkWindow *) tkwin)->wmInfoPtr->style = floatProc; - ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_WIDTH_NOT_RESIZABLE; - ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_HEIGHT_NOT_RESIZABLE; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacMakeRealWindowExist -- - * - * This function finally creates the real Macintosh window that - * the Mac actually understands. - * - * Results: - * None. - * - * Side effects: - * A new Macintosh toplevel is created. - * - *---------------------------------------------------------------------- - */ - -void -TkMacMakeRealWindowExist( - TkWindow *winPtr) /* Tk window. */ -{ - WmInfo *wmPtr = winPtr->wmInfoPtr; - WindowRef newWindow = NULL; - MacDrawable *macWin; - Rect geometry = {0,0,0,0}; - Tcl_HashEntry *valueHashPtr; - int new; - TkMacWindowList *listPtr; - - if (TkMacHostToplevelExists(winPtr)) { - return; - } - - macWin = (MacDrawable *) winPtr->window; - - /* - * If this is embedded, make sure its container's toplevel exists, - * then return... - */ - - if (Tk_IsEmbedded(winPtr)) { - TkWindow *contWinPtr; - - contWinPtr = TkpGetOtherWindow(winPtr); - if (contWinPtr != NULL) { - TkMacMakeRealWindowExist(contWinPtr->privatePtr->toplevel->winPtr); - macWin->flags |= TK_HOST_EXISTS; - return; - } else if (gMacEmbedHandler != NULL) { - if (gMacEmbedHandler->containerExistProc != NULL) { - if (gMacEmbedHandler->containerExistProc((Tk_Window) winPtr) != TCL_OK) { - panic("ContainerExistProc could not make container"); - } - } - return; - } else { - panic("TkMacMakeRealWindowExist could not find container"); - } - - /* - * NOTE: Here we should handle out of process embedding. - */ - - } - - InitialWindowBounds(winPtr, &geometry); - - if (TkMacHaveAppearance() >= 0x110 && wmPtr->style == -1) { - OSStatus err; - /* - * There seems to be a bug in CreateNewWindow: If I set the - * window geometry to be the too small for the structure region, - * then the whole window is positioned incorrectly. - * Adding this here makes the positioning work, and the size will - * get overwritten when you actually map the contents of the window. - */ - - geometry.right += 64; - geometry.bottom += 24; - err = CreateNewWindow(wmPtr->macClass, wmPtr->attributes, - &geometry, &newWindow); - if (err != noErr) { - newWindow = NULL; - } - - } else { - newWindow = NewCWindow(NULL, &geometry, "\ptemp", false, - (short) wmPtr->style, (WindowRef) -1, true, 0); - } - - if (newWindow == NULL) { - panic("couldn't allocate new Mac window"); - } - - /* - * Add this window to the list of toplevel windows. - */ - - listPtr = (TkMacWindowList *) ckalloc(sizeof(TkMacWindowList)); - listPtr->nextPtr = tkMacWindowListPtr; - listPtr->winPtr = winPtr; - tkMacWindowListPtr = listPtr; - - macWin->portPtr = (GWorldPtr) newWindow; - tkMacMoveWindow(newWindow, (int) geometry.left, (int) geometry.top); - SetPort((GrafPtr) newWindow); - - if (!windowHashInit) { - Tcl_InitHashTable(&windowTable, TCL_ONE_WORD_KEYS); - windowHashInit = true; - } - valueHashPtr = Tcl_CreateHashEntry(&windowTable, - (char *) newWindow, &new); - if (!new) { - panic("same macintosh window allocated twice!"); - } - Tcl_SetHashValue(valueHashPtr, macWin); - - macWin->flags |= TK_HOST_EXISTS; -} - -/* - *---------------------------------------------------------------------- - * - * TkMacRegisterOffScreenWindow -- - * - * This function adds the passed in Off Screen Port to the - * hash table that maps Mac windows to root X windows. - * - * Results: - * None. - * - * Side effects: - * An entry is added to the windowTable hash table. - * - *---------------------------------------------------------------------- - */ - -void -TkMacRegisterOffScreenWindow( - Window window, /* Window structure. */ - GWorldPtr portPtr) /* Pointer to a Mac GWorld. */ -{ - WindowRef newWindow = NULL; - MacDrawable *macWin; - Tcl_HashEntry *valueHashPtr; - int new; - - macWin = (MacDrawable *) window; - if (!windowHashInit) { - Tcl_InitHashTable(&windowTable, TCL_ONE_WORD_KEYS); - windowHashInit = true; - } - valueHashPtr = Tcl_CreateHashEntry(&windowTable, - (char *) portPtr, &new); - if (!new) { - panic("same macintosh window allocated twice!"); - } - Tcl_SetHashValue(valueHashPtr, macWin); -} - -/* - *---------------------------------------------------------------------- - * - * TkMacUnregisterMacWindow -- - * - * Given a macintosh port window, this function removes the - * association between this window and the root X window that - * Tk cares about. - * - * Results: - * None. - * - * Side effects: - * An entry is removed from the windowTable hash table. - * - *---------------------------------------------------------------------- - */ - -void -TkMacUnregisterMacWindow( - GWorldPtr portPtr) /* Pointer to a Mac GWorld. */ -{ - if (!windowHashInit) { - panic("TkMacUnregisterMacWindow: unmapping before inited");; - } - Tcl_DeleteHashEntry(Tcl_FindHashEntry(&windowTable, - (char *) portPtr)); -} - -/* - *---------------------------------------------------------------------- - * - * TkMacSetScrollbarGrow -- - * - * Sets a flag for a toplevel window indicating that the passed - * Tk scrollbar window will display the grow region for the - * toplevel window. - * - * Results: - * None. - * - * Side effects: - * A flag is set int windows toplevel parent. - * - *---------------------------------------------------------------------- - */ - -void -TkMacSetScrollbarGrow( - TkWindow *winPtr, /* Tk scrollbar window. */ - int flag) /* Boolean value true or false. */ -{ - if (flag) { - winPtr->privatePtr->toplevel->flags |= TK_SCROLLBAR_GROW; - winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr = winPtr; - } else if (winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr - == winPtr) { - winPtr->privatePtr->toplevel->flags &= ~TK_SCROLLBAR_GROW; - winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr = NULL; - } -} - -/* - *---------------------------------------------------------------------- - * - * TkMacGetScrollbarGrowWindow -- - * - * Tests to see if a given window's toplevel window contains a - * scrollbar that will draw the GrowIcon for the window. - * - * Results: - * Boolean value. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkWindow * -TkMacGetScrollbarGrowWindow( - TkWindow *winPtr) /* Tk window. */ -{ - TkWindow *scrollWinPtr; - - if (winPtr == NULL) { - return NULL; - } - scrollWinPtr = - winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr; - if (winPtr != NULL) { - /* - * We need to confirm the window exists. - */ - if ((Tk_Window) scrollWinPtr != - Tk_IdToWindow(winPtr->display, winPtr->window)) { - scrollWinPtr = NULL; - } - } - return scrollWinPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkWmFocusToplevel -- - * - * This is a utility procedure invoked by focus-management code. It - * exists because of the extra wrapper windows that exist under - * Unix; its job is to map from wrapper windows to the - * corresponding toplevel windows. On PCs and Macs there are no - * wrapper windows so no mapping is necessary; this procedure just - * determines whether a window is a toplevel or not. - * - * Results: - * If winPtr is a toplevel window, returns the pointer to the - * window; otherwise returns NULL. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkWindow * -TkWmFocusToplevel( - TkWindow *winPtr) /* Window that received a focus-related - * event. */ -{ - if (!(winPtr->flags & TK_TOP_HIERARCHY)) { - return NULL; - } - return winPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpGetWrapperWindow -- - * - * This is a utility procedure invoked by focus-management code. It - * maps to the wrapper for a top-level, which is just the same - * as the top-level on Macs and PCs. - * - * Results: - * If winPtr is a toplevel window, returns the pointer to the - * window; otherwise returns NULL. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -TkWindow * -TkpGetWrapperWindow( - TkWindow *winPtr) /* Window that received a focus-related - * event. */ -{ - if (!(winPtr->flags & TK_TOP_LEVEL)) { - return NULL; - } - return winPtr; -} - -/* - *---------------------------------------------------------------------- - * - * TkpWmSetState -- - * - * Sets the window manager state for the wrapper window of a - * given toplevel window. - * - * Results: - * None. - * - * Side effects: - * May maximize, minimize, restore, or withdraw a window. - * - *---------------------------------------------------------------------- - */ - -void -TkpWmSetState(winPtr, state) - TkWindow *winPtr; /* Toplevel window to operate on. */ - int state; /* One of IconicState, ZoomState, NormalState, - * or WithdrawnState. */ -{ - WmInfo *wmPtr = winPtr->wmInfoPtr; - GWorldPtr macWin; - - wmPtr->hints.initial_state = state; - if (wmPtr->flags & WM_NEVER_MAPPED) { - return; - } - - macWin = TkMacGetDrawablePort(winPtr->window); - - if (state == WithdrawnState) { - Tk_UnmapWindow((Tk_Window) winPtr); - } else if (state == IconicState) { - Tk_UnmapWindow((Tk_Window) winPtr); - if (TkMacHaveAppearance()) { - /* - * The window always gets unmapped. However, if we can show the - * icon version of the window (collapsed) we make the window visable - * and then collapse it. - * - * TODO: This approach causes flashing! - */ - - if (IsWindowCollapsable((WindowRef) macWin)) { - ShowWindow((WindowRef) macWin); - CollapseWindow((WindowPtr) macWin, true); - } - } - } else if (state == NormalState) { - Tk_MapWindow((Tk_Window) winPtr); - if (TkMacHaveAppearance()) { - CollapseWindow((WindowPtr) macWin, false); - } - } else if (state == ZoomState) { - /* TODO: need to support zoomed windows */ - } -} -/* - *---------------------------------------------------------------------- - * - * TkMacHaveAppearance -- - * - * Determine if the appearance manager is available on this Mac. - * We cache the result so future calls are fast. Return a different - * value if 1.0.1 is present, since many interfaces were added in - * 1.0.1 - * - * Results: - * 1 if the appearance manager is present, 2 if the appearance - * manager version is 1.0.1 or greater, 0 if it is not present. - * - * Side effects: - * Calls Gestalt to query system values. - * - *---------------------------------------------------------------------- - */ - -int -TkMacHaveAppearance() -{ - static initialized = false; - static int TkMacHaveAppearance = 0; - long response = 0; - OSErr err = noErr; - - if (!initialized) { - err = Gestalt(gestaltAppearanceAttr, &response); - if (err == noErr) { - TkMacHaveAppearance = 1; - } -/* even if AppearanceManager 1.1 routines are present, -we can't call them from 68K code, so we pretend -to be running Apperarance Mgr 1.0 */ -#if !(GENERATING68K && !GENERATINGCFM) - err = Gestalt(gestaltAppearanceVersion, &response); -#endif - if (err == noErr) { - TkMacHaveAppearance = (int) response; - } - } - - return TkMacHaveAppearance; -} diff --git a/mac/tkMacXCursors.r b/mac/tkMacXCursors.r deleted file mode 100644 index f04def6..0000000 --- a/mac/tkMacXCursors.r +++ /dev/null @@ -1,961 +0,0 @@ -/* - * tkMacXCursors.r -- - * - * This file defines a set of Macintosh cursor resources that - * emulate the X cursor set. All of these cursors were - * constructed and donated by Grant Neufeld. (gneufeld@ccs.carleton.ca) - * - * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacXCursors.r,v 1.2 1998/09/14 18:23:40 stanton Exp $ - */ - -/* - * All of the X cursors are defined as 'CURS' resources. However, a - * subset of the X cursors are also defined as 'crsr' resources. Tk - * will attempt to first use the color cursors ('crsr') if it doesn't - * exist it will attempt to use the black & white cursor ('CURS'). - */ - -data 'CURS' (3000, "X_cursor") { - $"E007 F00F F81F 7C3E 3E7C 1FF8 0FF0 07E0" - $"07E0 0FF0 1FF8 3E7C 7C3E F81F F00F E007" - $"0000 6006 700E 381C 1C38 0E70 07E0 03C0" - $"03C0 07E0 0E70 1C38 381C 700E 6006 0000" - $"0007 0007" -}; - -data 'CURS' (3001, "arrow") { - $"0000 0006 001E 007C 01FC 07F8 00F8 01F0" - $"03B0 0720 0E20 1C00 3800 7000 2000 0000" - $"0007 001F 007F 01FE 07FE 1FFC 7FFC 03F8" - $"07F8 0FF0 1F70 3E60 7C60 F840 7040 2000" - $"0001 000E" -}; - -data 'CURS' (3002, "based_arrow_down") { - $"0000 0000 0000 1FE0 0000 1FE0 0300 0300" - $"0300 0B40 0780 0300 0000 0000 0000 0000" - $"0000 0000 0000 1FE0 0000 1FE0 0780 0780" - $"3FF0 1FE0 0FC0 0780 0300 0000 0000 0000" - $"000B 0006" -}; - -data 'CURS' (3003, "based_arrow_up") { - $"0000 0000 0000 0000 0300 0780 0B40 0300" - $"0300 0300 1FE0 0000 1FE0 0000 0000 0000" - $"0000 0000 0000 0300 0780 0FC0 1FE0 3FF0" - $"0780 0780 1FE0 0000 1FE0 0000 0000 0000" - $"0004 0006" -}; - -data 'CURS' (3004, "boat") { - $"0000 0000 0000 0000 0100 03C0 8460 FFFF" - $"0018 0020 0040 FFC0 0000 0000 0000 0000" - $"0000 0000 0000 0000 0100 03C0 87E0 FFFF" - $"FFF8 FFE0 FFC0 FFC0 0000 0000 0000 0000" - $"0007 000F" -}; - -data 'CURS' (3005, "bogosity") { - $"0000 711C 1110 1110 1110 7FFC 5114 5114" - $"5114 5114 7FFC 1110 1110 1110 711C 0000" - $"0000 0000 0000 0000 0000 7FFC 7FFC 7FFC" - $"7FFC 7FFC 7FFC 0000 0000 0000 0000 0000" - $"0001 0007" -}; - -data 'CURS' (3006, "bottom_left_corner") { - $"0000 0000 0000 0000 C000 C020 C840 C880" - $"C900 CA00 CC00 CFC0 C000 C000 FFF0 FFF0" - $"0000 0000 0000 0000 0000 0020 0840 0880" - $"0900 0A00 0C00 0FC0 0000 0000 0000 0000" - $"000F 0000" -}; - -data 'CURS' (3007, "bottom_right_corner") { - $"0000 0000 0000 0000 0003 0403 0213 0113" - $"0093 0053 0033 03F3 0003 0003 0FFF 0FFF" - $"0000 0000 0000 0000 0000 0400 0210 0110" - $"0090 0050 0030 03F0 0000 0000 0000 0000" - $"000F 000F" -}; - -data 'CURS' (3008, "bottom_side") { - $"0000 0000 0100 0100 0100 0100 0100 1110" - $"0920 0540 0380 0100 0000 7FFC 7FFC 0000" - $"0000 0000 0100 0100 0100 0100 0100 1110" - $"0920 0540 0380 0100 0000 0000 0000 0000" - $"000B 0007" -}; - -data 'CURS' (3009, "bottom_tee") { - $"0000 0000 0000 0180 0180 0180 0180 0180" - $"0180 0180 7FFE 7FFE 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"000B 0007" -}; - -data 'CURS' (3010, "box_spiral") { - $"FFFE 8000 BFFE A002 AFFA A80A ABEA AA2A" - $"AAAA ABAA A82A AFEA A00A BFFA 8002 FFFE" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0008 0008" -}; - -data 'CURS' (3011, "center_ptr") { - $"0000 0300 0300 0780 0780 0FC0 0FC0 1FE0" - $"1FE0 3330 2310 0300 0300 0300 0300 0000" - $"0300 0780 0780 0FC0 0FC0 1FE0 1FE0 3FF0" - $"3FF0 7FF8 77B8 6798 0780 0780 0780 0780" - $"0001 0006" -}; - -data 'CURS' (3012, "circle") { - $"0000 03C0 0FF0 1FF8 3C3C 381C 700E 700E" - $"700E 700E 381C 3C3C 1FF8 0FF0 03C0 0000" - $"03C0 0FF0 1FF8 3FFC 7FFE 7C3E F81F F81F" - $"F81F F81F 7C3E 7FFE 3FFC 1FF8 0FF0 03C0" - $"0007 0007" -}; - -data 'CURS' (3013, "clock") { - $"1FF8 33CC 6466 4992 4F12 4422 63C6 3FFC" - $"2994 2994 2994 2BD4 6996 781E 7FFE 7FFE" - $"1FF8 3FFC 7FFE 7FFE 7FFE 7FFE 7FFE 3FFC" - $"3FFC 3FFC 3FFC 3FFC 7FFE 7FFE 7FFE 7FFE" - $"0004 0008" -}; - -data 'CURS' (3014, "coffee_mug") { - $"03F8 0C06 1001 1C07 33F9 7001 D001 9001" - $"960D DA55 7A55 36ED 10A1 1001 0802 07FC" - $"03F8 0FFE 1FFF 1FFF 3FFF 7FFF FFFF FFFF" - $"FFFF FFFF 7FFF 3FFF 1FFF 1FFF 0FFE 07FC" - $"0004 0003" -}; - -data 'CURS' (3015, "cross") { - $"0280 0280 0280 0280 0280 0280 FEFE 0000" - $"FEFE 0280 0280 0280 0280 0280 0280 0000" - $"0380 0380 0380 0380 0380 0380 FFFE FFFE" - $"FFFE 0380 0380 0380 0380 0380 0380 0000" - $"0007 0007" -}; - -data 'CURS' (3016, "cross_reverse") { - $"4284 A28A 5294 2AA8 16D0 0AA0 FD7E 0280" - $"FD7E 0AA0 16D0 2AA8 5294 A28A 4284 0000" - $"4384 E38E 739C 3BB8 1FF0 0FE0 FFFE FFFE" - $"FFFE 0FE0 1FF0 3BB8 739C E38E 4384 0000" - $"0007 0007" -}; - -data 'CURS' (3017, "crosshair") { - $"0100 0100 0100 0100 0100 0100 0100 FEFE" - $"0100 0100 0100 0100 0100 0100 0100 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3018, "diamond_cross") { - $"0280 06C0 0AA0 1290 2288 4284 FEFE 0000" - $"FEFE 4284 2288 1290 0AA0 06C0 0280 0000" - $"0280 06C0 0EE0 1EF0 3EF8 7EFC FEFE 0000" - $"FEFE 7EFC 3EF8 1EF0 0EE0 06C0 0280 0000" - $"0007 0007" -}; - -data 'CURS' (3019, "dot") { - $"0000 0000 0780 1FE0 1FE0 3FF0 3FF0 3FF0" - $"3FF0 1FE0 1FE0 0780 0000 0000 0000 0000" - $"0000 0780 1FE0 3FF0 3FF0 7FF8 7FF8 7FF8" - $"7FF8 3FF0 3FF0 1FE0 0780 0000 0000 0000" - $"0006 0006" -}; - -data 'CURS' (3020, "dotbox") { - $"0000 0000 3FFC 2004 2004 2004 2004 2184" - $"2184 2004 2004 2004 2004 3FFC 0000 0000" - $"0000 0000 3FFC 3FFC 300C 300C 318C 33CC" - $"33CC 318C 300C 300C 3FFC 3FFC 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3021, "double_arrow") { - $"0000 0180 03C0 07E0 0DB0 1998 0180 0180" - $"0180 0180 1998 0DB0 07E0 03C0 0180 0000" - $"0180 03C0 07E0 0FF0 1FF8 3FFC 3BDC 03C0" - $"03C0 3BDC 3FFC 1FF8 0FF0 07E0 03C0 0180" - $"0007 0007" -}; - -data 'CURS' (3022, "draft_large") { - $"0000 0002 000C 003C 00F8 03F8 0FF0 00F0" - $"0160 0260 0440 0840 1000 2000 4000 0000" - $"0003 000F 003E 00FE 03FC 0FFC 3FF8 FFF8" - $"03F0 07F0 0EE0 1CE0 38C0 70C0 E080 4080" - $"0001 000E" -}; - -data 'CURS' (3023, "draft_small") { - $"0000 0002 000C 003C 00F8 03F8 0070 00B0" - $"0120 0220 0400 0800 1000 2000 4000 0000" - $"0003 000F 003E 00FE 03FC 0FFC 3FF8 01F8" - $"03F0 0770 0E60 1C60 3840 7040 E000 4000" - $"0001 000E" -}; - -data 'CURS' (3024, "draped_box") { - $"0000 0000 3FFC 2244 2664 2C34 381C 2184" - $"2184 381C 2C34 2664 2244 3FFC 0000 0000" - $"0000 0000 3FFC 3E7C 3E7C 3C3C 399C 23C4" - $"23C4 399C 3C3C 3E7C 3E7C 3FFC 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3025, "exchange") { - $"0000 47C0 6FE0 7C30 4810 4C00 7E00 0000" - $"0000 00FC 0064 1024 187C 0FEC 07C4 0000" - $"C7C0 EFE0 FFF0 FFF8 FC38 FE10 FF00 FF80" - $"03FE 01FE 10FE 387E 3FFE 1FFE 0FEE 07C6" - $"0007 0007" -}; - -data 'CURS' (3026, "fleur") { - $"0000 0180 03C0 07E0 0180 1188 318C 7FFE" - $"7FFE 318C 1188 0180 07E0 03C0 0180 0000" - $"0180 03C0 07E0 0FF0 17E8 3BDC 7FFE FFFF" - $"FFFF 7FFE 3BDC 17E8 0FF0 07E0 03C0 0180" - $"0007 0007" -}; - -data 'CURS' (3027, "gobbler") { - $"0000 0078 0070 4036 4FB0 7FF0 7E30 7C30" - $"3038 00F0 0FE0 0400 0400 0400 0F00 0000" - $"00FC 00FC E0FF FFFF FFFF FFF8 FFF8 FFF8" - $"FFFC 7FFC 3FF8 1FF0 0E00 1F80 1F80 1F80" - $"0003 000E" -}; - -data 'CURS' (3028, "gumby") { - $"3F00 10C0 C820 EAA0 C820 CBA0 F838 383E" - $"0826 0826 092E 0926 0920 1110 2108 3EF8" - $"3F00 1FC0 CFE0 EFE0 CFE0 CFE0 FFF8 3FFE" - $"0FE6 0FE6 0FEE 0FE6 0FE0 1FF0 3FF8 3EF8" - $"0000 0002" -}; - -data 'CURS' (3029, "hand1") { - $"000C 003C 00F0 01E0 03C0 07E0 0FF0 2FE0" - $"7FF0 5FF0 07E0 07C0 4A00 6200 3400 1800" - $"000C 003C 00F0 01E0 03C0 07E0 0FF0 2FE0" - $"7FF0 7FF0 7FE0 7FC0 7E00 7E00 3C00 1800" - $"0000 000D" -}; - -data 'CURS' (3030, "hand2") { - $"0000 3FC0 4020 3F10 0808 0708 0808 0714" - $"0822 0641 0182 0124 0088 0050 0020 0000" - $"0000 3FC0 7FE0 3FF0 0FF8 07F8 0FF8 07FC" - $"0FFE 07FF 01FE 01FC 00F8 0070 0020 0000" - $"0002 0001" -}; - -data 'CURS' (3031, "heart") { - $"0000 3EF8 638C C106 8002 8002 8002 8002" - $"C006 600C 3018 1830 0C60 06C0 0380 0000" - $"0000 3EF8 7FFC FFFE FFFE FFFE FFFE FFFE" - $"FFFE 7FFC 3FF8 1FF0 0FE0 07C0 0380 0000" - $"0003 0007" -}; - -data 'CURS' (3032, "icon") { - $"FFFF D555 AAAB D555 A00B D005 A00B D005" - $"A00B D005 A00B D005 AAAB D555 AAAB FFFF" - $"FFFF FFFF FFFF FFFF F00F F00F F00F F00F" - $"F00F F00F F00F F00F FFFF FFFF FFFF FFFF" - $"0007 0007" -}; - -data 'CURS' (3033, "iron_cross") { - $"0000 3FFC 1FF8 4FF2 67E6 73CE 799E 7FFE" - $"7FFE 799E 73CE 67E6 4FF2 1FF8 3FFC 0000" - $"7FFE 7FFE FFFF FFFF FFFF FFFF FFFF FFFF" - $"FFFF FFFF FFFF FFFF FFFF FFFF 7FFE 7FFE" - $"0007 0006" -}; - -data 'CURS' (3034, "left_ptr") { - $"0000 0800 0C00 0E00 0F00 0F80 0FC0 0FE0" - $"0FF0 0F80 0D80 08C0 00C0 0060 0060 0000" - $"1800 1C00 1E00 1F00 1F80 1FC0 1FE0 1FF0" - $"1FF8 1FFC 1FC0 1DE0 19E0 10F0 00F0 0070" - $"0001 0004" -}; - -data 'CURS' (3035, "left_side") { - $"0000 6000 6000 6080 6100 6200 6400 6FFC" - $"6400 6200 6100 6080 6000 6000 0000 0000" - $"0000 0000 0000 0080 0100 0200 0400 0FFC" - $"0400 0200 0100 0080 0000 0000 0000 0000" - $"0007 0004" -}; - -data 'CURS' (3036, "left_tee") { - $"0000 0C00 0C00 0C00 0C00 0C00 0C00 0FF8" - $"0FF8 0C00 0C00 0C00 0C00 0C00 0C00 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0007 0004" -}; - -data 'CURS' (3037, "leftbutton") { - $"8002 7FFC 7FFC 4444 4554 4554 4554 4554" - $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"0004 0003" -}; - -data 'CURS' (3038, "ll_angle") { - $"0000 0000 0000 0C00 0C00 0C00 0C00 0C00" - $"0C00 0C00 0FF8 0FF8 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"000B 0004" -}; - -data 'CURS' (3039, "lr_angle") { - $"0000 0000 0000 0030 0030 0030 0030 0030" - $"0030 0030 1FF0 1FF0 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"000B 000B" -}; - -data 'CURS' (3040, "man") { - $"0380 1EF0 0280 8100 4387 244B 1D70 0540" - $"0440 0280 0440 0920 1290 1450 783C F83F" - $"0380 1FF0 0380 8100 4387 27CB 1FF0 07C0" - $"07C0 0380 07C0 0FE0 1EF0 1C70 783C F83F" - $"0001 0007" -}; - -data 'CURS' (3041, "middlebutton") { - $"8002 7FFC 7FFC 4444 5454 5454 5454 5454" - $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"0004 0007" -}; - -data 'CURS' (3042, "mouse") { - $"0600 0100 0180 0FF0 1008 17E8 1428 1428" - $"17E8 1008 1008 1008 1008 1008 1008 0FF0" - $"0600 0100 0180 0FF0 1FF8 1FF8 1FF8 1FF8" - $"1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 0FF0" - $"0000 0000" -}; - -data 'CURS' (3043, "pencil") { - $"0000 00F0 0088 0108 0190 0270 0220 0440" - $"0440 0880 0880 1100 1E00 1C00 1800 1000" - $"0000 00F0 00F8 01F8 01F0 03F0 03E0 07C0" - $"07C0 0F80 0F80 1F00 1E00 1C00 1800 1000" - $"000F 0003" -}; - -data 'CURS' (3044, "pirate") { - $"03C0 07E0 0FF0 1998 1998 0FF0 07E0 03C0" - $"43C2 43C3 2184 1C38 03C0 0FF1 781F 4002" - $"07E0 0FF0 1FF8 3FFC 3FFC 1FF8 0FF0 47E2" - $"E7E7 E7E7 7FFF 3FFC 1FF9 7FFF FFFF F81F" - $"000A 0007" -}; - -data 'CURS' (3045, "plus") { - $"0000 0000 0000 0180 0180 0180 0180 1FF8" - $"1FF8 0180 0180 0180 0180 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3046, "question_arrow") { - $"07C0 0FE0 1C70 1830 1C30 0C70 00E0 03C0" - $"0380 0280 0280 0EE0 06C0 0380 0100 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 3FF8 1FF0 0FE0 07C0 0380 0100" - $"000E 0007" -}; - -data 'CURS' (3047, "right_ptr") { - $"0000 0010 0030 0070 00F0 01F0 03F0 07F0" - $"0FF0 01F0 01B0 0310 0300 0600 0600 0000" - $"0018 0038 0078 00F8 01F8 03F8 07F8 0FF8" - $"1FF8 3FF8 03F8 07B8 0798 0F08 0F00 0E00" - $"0001 000B" -}; - -data 'CURS' (3048, "right_side") { - $"0000 0000 0006 0006 0106 0086 0046 0026" - $"3FF6 0026 0046 0086 0106 0006 0006 0000" - $"0000 0000 0000 0000 0100 0080 0040 0020" - $"3FF0 0020 0040 0080 0100 0000 0000 0000" - $"0008 000B" -}; - -data 'CURS' (3049, "right_tee") { - $"0000 0030 0030 0030 0030 0030 0030 1FF0" - $"1FF0 0030 0030 0030 0030 0030 0030 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0007 000A" -}; - -data 'CURS' (3050, "rightbutton") { - $"8002 7FFC 7FFC 4444 5544 5544 5544 5544" - $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE" - $"0004 0003" -}; - -data 'CURS' (3051, "rtl_logo") { - $"0000 7FFE 4022 4022 4022 7FE2 4422 4422" - $"4422 4422 47FE 4402 4402 4402 7FFE 0000" - $"0000 7FFE 7FFE 6076 7FF6 7FF6 7C36 6C36" - $"6C36 6C3E 6FFE 6FFE 6E06 7FFE 7FFE 0000" - $"0007 0007" -}; - -data 'CURS' (3052, "sailboat") { - $"0000 0040 0040 0160 0160 0360 0370 0770" - $"0770 0F78 0F78 1F78 1F7C 3E38 0000 0000" - $"0040 00E0 01E0 03F0 03F0 07F0 07F8 0FF8" - $"0FF8 1FFC 1FFC 3FFC 3FFE 7F7C 7E38 0000" - $"000C 0008" -}; - -data 'CURS' (3053, "sb_down_arrow") { - $"0280 0280 0280 0280 0280 0280 0280 0280" - $"0280 0280 0280 0FE0 07C0 0380 0100 0000" - $"0380 0380 0380 0380 0380 0380 0380 0380" - $"0380 0380 0380 1FF0 0FE0 07C0 0380 0100" - $"000E 0007" -}; - -data 'CURS' (3054, "sb_h_double_arrow") { - $"0000 0000 0000 0000 0810 1818 3FFC 781E" - $"3FFC 1818 0810 0000 0000 0000 0000 0000" - $"0000 0000 0000 0810 1818 381C 7FFE FFFF" - $"7FFE 381C 1818 0810 0000 0000 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3055, "sb_left_arrow") { - $"0000 0000 0000 0000 0800 1800 3FFF 7800" - $"3FFF 1800 0800 0000 0000 0000 0000 0000" - $"0000 0000 0000 0800 1800 3800 7FFF FFFF" - $"7FFF 3800 1800 0800 0000 0000 0000 0000" - $"0007 0001" -}; - -data 'CURS' (3056, "sb_right_arrow") { - $"0000 0000 0000 0000 0000 0010 0018 FFFC" - $"001E FFFC 0018 0010 0000 0000 0000 0000" - $"0000 0000 0000 0000 0010 0018 001C FFFE" - $"FFFF FFFE 001C 0018 0010 0000 0000 0000" - $"0008 000E" -}; - -data 'CURS' (3057, "sb_up_arrow") { - $"0000 0080 01C0 03E0 07F0 0140 0140 0140" - $"0140 0140 0140 0140 0140 0140 0140 0140" - $"0080 01C0 03E0 07F0 0FF8 01C0 01C0 01C0" - $"01C0 01C0 01C0 01C0 01C0 01C0 01C0 01C0" - $"0001 0008" -}; - -data 'CURS' (3058, "sb_v_double_arrow") { - $"0000 0100 0380 07C0 0FE0 0280 0280 0280" - $"0280 0280 0280 0FE0 07C0 0380 0100 0000" - $"0100 0380 07C0 0FE0 1FF0 0380 0380 0380" - $"0380 0380 0380 1FF0 0FE0 07C0 0380 0100" - $"0007 0007" -}; - -data 'CURS' (3059, "shuttle") { - $"0020 0070 00F8 01DE 05DE 09DE 11DE 11DE" - $"11DE 11DE 31DE 71DE FDDE 1888 0078 0030" - $"0020 0070 00F8 01FE 07FE 0FFE 1FFE 1FFE" - $"1FFE 1FFE 3FFE 7FFE FFFE 18F8 0078 0030" - $"0000 000A" -}; - -data 'CURS' (3060, "sizing") { - $"0000 7F80 4000 4000 4000 47E0 4420 4422" - $"4422 0422 07E2 0012 000A 0006 01FE 0000" - $"FFC0 FFC0 FFC0 E000 EFF0 EFF0 EC37 EC37" - $"EC37 EC37 0FF7 0FFF 001F 03FF 03FF 03FF" - $"000E 000E" -}; - -data 'CURS' (3061, "spider") { - $"2010 1020 1020 0840 0840 8787 6798 1FE0" - $"1FE0 6798 8787 0840 0840 1020 1020 2010" - $"7038 3870 3870 1CE0 9FE7 EFDF FFFF 7FF8" - $"7FF8 FFFF EFDF 9FE7 1CE0 3870 3870 7038" - $"0007 0007" -}; - -data 'CURS' (3062, "spraycan") { - $"0018 0040 0D18 1E40 1A18 3F00 2100 3900" - $"2900 3900 2900 3900 3900 2100 2100 3F00" - $"0000 0000 0C00 1E00 1E00 3F00 3F00 3F00" - $"3F00 3F00 3F00 3F00 3F00 3F00 3F00 3F00" - $"0002 0007" -}; - -data 'CURS' (3063, "star") { - $"0100 0280 0280 0280 0440 0440 0440 3938" - $"C006 3838 0920 1290 2448 2828 3018 2008" - $"0100 0380 0380 0380 07C0 07C0 07C0 3FF8" - $"FFFE 3FF8 0FE0 1EF0 3C78 3838 3018 2008" - $"0007 0007" -}; - -data 'CURS' (3064, "target") { - $"0000 0380 0FE0 1C70 3018 600C C106 C286" - $"C106 600C 3018 1C70 0FE0 0380 0000 0000" - $"0000 0380 0FE0 1FF0 3C78 701C E38E E38E" - $"E38E 701C 3C78 1FF0 0FE0 0380 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3065, "tcross") { - $"0100 0100 0100 0100 0100 0100 0100 FFFE" - $"0100 0100 0100 0100 0100 0100 0100 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0007 0007" -}; - -data 'CURS' (3066, "top_left_arrow") { - $"0000 6000 7800 3E00 3F80 1FE0 1E00 0D00" - $"0C80 0440 0420 0010 0008 0004 0000 0000" - $"E000 F800 FE00 7F80 7FE0 3FF8 3FFE 1F80" - $"1FC0 0EE0 0E70 0638 061C 020E 0204 0000" - $"0001 0001" -}; - -data 'CURS' (3067, "top_left_corner") { - $"FFF0 FFF0 C000 C000 CFC0 CC00 CA00 C900" - $"C880 C840 C020 C000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0FC0 0C00 0A00 0900" - $"0880 0840 0020 0000 0000 0000 0000 0000" - $"0000 0000" -}; - -data 'CURS' (3068, "top_right_corner") { - $"0FFF 0FFF 0003 0003 03F3 0033 0053 0093" - $"0113 0213 0403 0003 0000 0000 0000 0000" - $"0000 0000 0000 0000 03F0 0030 0050 0090" - $"0110 0210 0400 0000 0000 0000 0000 0000" - $"0000 000F" -}; - -data 'CURS' (3069, "top_side") { - $"0000 7FFC 7FFC 0000 0100 0380 0540 0920" - $"1110 0100 0100 0100 0100 0100 0000 0000" - $"0000 0000 0000 0000 0100 0380 0540 0920" - $"1110 0100 0100 0100 0100 0100 0000 0000" - $"0004 0007" -}; - -data 'CURS' (3070, "top_tee") { - $"0000 0000 0000 0000 7FFE 7FFE 0180 0180" - $"0180 0180 0180 0180 0180 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0004 0007" -}; - -data 'CURS' (3071, "trek") { - $"0100 0000 0380 07C0 0FE0 0EE0 0FE0 07C0" - $"0380 0100 0BA0 0D60 0920 0820 0820 0000" - $"0000 0380 07C0 0FE0 1FF0 1FF0 1FF0 0FE0" - $"07C0 0BA0 1FF0 1FF0 1FF0 1D70 1C70 0820" - $"0000 0007" -}; - -data 'CURS' (3072, "ul_angle") { - $"0000 0000 0000 0FF8 0FF8 0C00 0C00 0C00" - $"0C00 0C00 0C00 0C00 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0003 0004" -}; - -data 'CURS' (3073, "umbrella") { - $"0000 0890 0228 49A6 27C8 1930 610C 0100" - $"0100 0100 0100 0100 0140 0140 0080 0000" - $"0000 0FF0 1FF8 7FFE 7FFC FFFE FBBE E38E" - $"0380 0380 0380 03C0 03E0 03E0 01C0 0080" - $"0004 0007" -}; - -data 'CURS' (3074, "ur_angle") { - $"0000 0000 0000 0000 1FF0 1FF0 0030 0030" - $"0030 0030 0030 0030 0030 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0004 000B" -}; - -data 'CURS' (3075, "watch") { - $"07E0 07E0 07E0 07E0 0810 1088 1088 108C" - $"138C 1008 1008 0810 07E0 07E0 07E0 07E0" - $"07E0 07E0 07E0 07E0 0FF0 1FF8 1FF8 1FFC" - $"1FFC 1FF8 1FF8 0FF0 07E0 07E0 07E0 07E0" - $"0008 000D" -}; - -data 'CURS' (3076, "xterm") { - $"0C60 0280 0100 0100 0100 0100 0100 0100" - $"0100 0100 0100 0100 0100 0100 0280 0C60" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"000B 0007" -}; - -/* - * The following are color versions of some of the - * cursors defined above. The color cursors will be - * used if the exist in preference to the black & white - * cursors. - */ - -data 'crsr' (3004, "boat", purgeable) { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0100 03C0" - $"8460 FFFF 0018 0020 0040 FFC0 0000 0000" - $"0000 0000 0000 0000 0000 0000 0100 03C0" - $"87E0 FFFF FFF8 FFE0 FFC0 FFC0 0000 0000" - $"0000 0000 0007 000F 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 000F 0000 0000 0000 00FF FF00" - $"0000 F000 0F32 25F0 0000 6FFF FFFF FFFF" - $"FFFF 2222 2222 221F F000 2222 2222 21F0" - $"0000 3333 3333 4F00 0000 FFFF FFFF FF00" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0007 0000 FFFF FFFF" - $"FFFF 0001 BBBB BBBB BBBB 0002 EEEE EEEE" - $"EEEE 0003 DDDD DDDD DDDD 0004 CCCC CCCC" - $"CCCC 0005 4444 4444 4444 0006 1111 1111" - $"1111 000F 0000 0000 0000" -}; - -data 'crsr' (3013, "clock") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 1FF8 33CC 6466 4992 4F12 4422" - $"63C6 3FFC 2994 2994 2994 2BD4 6996 781E" - $"7FFE 7FFE 1FF8 3FFC 7FFE 7FFE 7FFE 7FFE" - $"7FFE 3FFC 3FFC 3FFC 3FFC 3FFC 7FFE 7FFE" - $"7FFE 7FFE 0004 0008 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 000F FFFF FFFF F000 00F6 05FF FF50" - $"6F00 0F60 5F00 56F5 06F0 0F00 F021 F30F" - $"00F0 0F00 F6F1 000F 00F0 0F00 5F00 00F5" - $"00F0 0F60 05FF FF50 06F0 00FF FFFF FFFF" - $"FF00 00F0 F001 100F 0F00 00F0 F001 100F" - $"0F00 00F0 F021 120F 0F00 00F0 F01F F10F" - $"0F00 0FF0 F021 120F 0FF0 0FF4 F500 005F" - $"4FF0 0FFF FFFF FFFF FFF0 0FFF FFFF FFFF" - $"FFF0 0000 0000 0000 0007 0000 FFFF FFFF" - $"FFFF 0001 4444 4444 4444 0002 AAAA AAAA" - $"AAAA 0003 EEEE EEEE EEEE 0004 5555 5555" - $"5555 0005 DDDD DDDD DDDD 0006 7777 7777" - $"7777 000F 0000 0000 0000" -}; - -data 'crsr' (3014, "coffee_mug") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 03F8 0C06 1001 1C07 33F9 7001" - $"D001 9001 960D DA55 7A55 36ED 10A1 1001" - $"0802 07FC 03F8 0FFE 1FFF 1FFF 3FFF 7FFF" - $"FFFF FFFF FFFF FFFF 7FFF 3FFF 1FFF 1FFF" - $"0FFE 07FC 0004 0003 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 00FF FFFF F000 0000 FF42 2222" - $"4FF0 000F 4221 1111 224F 000F FF11 1111" - $"1FFF 00FF 24FF FFFF F42F 0F5F 2222 2222" - $"222F F52F 2222 2222 222F F40F 2222 2222" - $"222F F40F 4FF2 2224 FF2F F52F F2F2 2F2F" - $"2F2F 0F5F F2F2 535F 2F2F 00FF 4FF2 F3F4" - $"FF2F 000F 2222 F2F2 222F 000F 4222 2222" - $"224F 0000 F422 2222 24F0 0000 0FFF FFFF" - $"FF00 0000 0000 0000 0006 0000 FFFF FFFF" - $"FFFF 0001 CCCC 9999 6666 0002 CCCC CCCC" - $"FFFF 0003 3333 3333 6666 0004 9999 9999" - $"FFFF 0005 6666 6666 CCCC 000F 0000 0000" - $"0000" -}; - -data 'crsr' (3027, "gobbler") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0000 0078 0070 4036 4FB0 7FF0" - $"7E30 7C30 3038 00F0 0FE0 0400 0400 0400" - $"0F00 0000 00FC 00FC E0FF FFFF FFFF FFF8" - $"FFF8 FFF8 FFFC 7FFC 3FF8 1FF0 0E00 1F80" - $"1F80 1F80 0003 000E 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0000 0000 0000 0000 0000 0222" - $"2000 0000 0000 0111 0000 0300 0000 0011" - $"0220 0100 1616 1011 0000 0361 6111 1111" - $"0000 0111 1114 4415 0000 0311 1144 4451" - $"0000 0011 4444 4415 1000 0004 4444 5151" - $"0000 0000 1515 1510 0000 0000 0200 0000" - $"0000 0000 0300 0000 0000 0000 0200 0000" - $"0000 0000 2323 0000 0000 0000 0000 0000" - $"0000 0000 0000 0000 0006 0000 FFFF FFFF" - $"FFFF 0001 CCCC 9999 6666 0002 DDDD 0000" - $"0000 0003 FFFF 6666 3333 0004 CCCC CCCC" - $"CCCC 0005 8888 8888 8888 0006 FFFF CCCC" - $"9999" -}; - -data 'crsr' (3028, "gumby") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 3F00 10C0 C820 EAA0 C820 CBA0" - $"F838 383E 0826 0826 092E 0926 0920 1110" - $"2108 3EF8 3F00 1FC0 CFE0 EFE0 CFE0 CFE0" - $"FFF8 3FFE 0FE6 0FE6 0FEE 0FE6 0FE0 1FF0" - $"3FF8 3EF8 0000 0002 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 00FF FFFF 0000 0000 000F 1212 FF00" - $"0000 FF00 F131 31F0 0000 FFF0 F3F3 F3F0" - $"0000 FF00 F131 31F0 0000 FF00 F2FF F2F0" - $"0000 4FFF F121 21FF F000 00FF F212 12FF" - $"FF40 0000 F121 21F0 0FF0 0000 F212 12F0" - $"0FF0 0000 F12F 21F0 FFF0 0000 F21F 12F0" - $"0FF0 0000 F12F 21F0 0000 000F 121F 121F" - $"0000 00F1 212F 2121 F000 00FF FFF0 FFFF" - $"F000 0000 0000 0000 0005 0000 FFFF FFFF" - $"FFFF 0001 0000 BBBB 0000 0002 CCCC CCCC" - $"CCCC 0003 AAAA AAAA AAAA 0004 4444 4444" - $"4444 000F 0000 0000 0000" -}; - -data 'crsr' (3031, "heart") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0000 3EF8 638C C106 8002 8002" - $"8002 8002 C006 600C 3018 1830 0C60 06C0" - $"0380 0000 0000 3EF8 7FFC FFFE FFFE FFFE" - $"FFFE FFFE FFFE 7FFC 3FF8 1FF0 0FE0 07C0" - $"0380 0000 0003 0007 0000 0000 0000 0000" - $"0000 0000 8004 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0002 0001 0002 0000 0000 0000 00D2 0000" - $"0000 0000 0000 0FFC FFC0 3AAB AA70 E99B" - $"999C E665 A65C E999 999C E666 665C E999" - $"999C D666 665C 3599 9970 0D66 65C0 0359" - $"9700 00D6 5C00 0035 7000 000F C000 0000" - $"0000 0000 0000 0000 0003 0000 FFFF FFFF" - $"FFFF 0001 DDDD 0000 0000 0002 FFFF 6666" - $"CCCC 0003 0000 0000 0000" -}; - -data 'crsr' (3042, "mouse", purgeable) { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 BE00 0100 0180 0FF0 1008 17E8" - $"1428 1428 17E8 1008 1008 1008 1008 1008" - $"1008 0FF0 FE00 0100 0180 0FF0 1FF8 1FF8" - $"1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8" - $"1FF8 0FF0 0001 0007 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 1379 4AF0 0000 0000 0000 000F 0000" - $"0000 0000 000F F000 0000 0000 FFFF FFFF" - $"0000 000F 2111 1112 F000 000F 3655 5563" - $"F000 000F 3513 1351 F000 000F 3533 3351" - $"F000 000F 3655 5561 F000 000F 3311 1111" - $"F000 000F 3333 3333 F000 000F 3333 3333" - $"F000 000F 2222 2222 F000 000F 8888 8888" - $"F000 000F 7888 8887 F000 0000 FFFF FFFF" - $"0000 0000 0000 0000 000B 0000 FFFF FFFF" - $"FFFF 0001 EEEE EEEE EEEE 0002 CCCC CCCC" - $"CCCC 0003 DDDD DDDD DDDD 0004 4444 4444" - $"4444 0005 2222 2222 2222 0006 5555 5555" - $"5555 0007 AAAA AAAA AAAA 0008 BBBB BBBB" - $"BBBB 0009 7777 7777 7777 000A 1111 1111" - $"1111 000F 0000 0000 0000" -}; - -data 'crsr' (3043, "pencil", purgeable) { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0000 00F0 0088 0108 0190 0270" - $"0220 0440 0440 0880 0880 1100 1E00 1C00" - $"1800 1000 0000 00F0 00F8 01F8 01F0 03F0" - $"03E0 07C0 07C0 0F80 0F80 1F00 1E00 1C00" - $"1800 1000 000F 0003 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0000 0000 0000 0000 0000 FFFF" - $"0000 0000 0000 F404 F000 0000 000F 4042" - $"F000 0000 000F F42F 0000 0000 00F5 3FFF" - $"0000 0000 00F3 52F0 0000 0000 0F35 1F00" - $"0000 0000 0F53 2F00 0000 0000 F532 F000" - $"0000 0000 F312 F000 0000 000F 352F 0000" - $"0000 000F FFF0 0000 0000 000F FF00 0000" - $"0000 000F F000 0000 0000 000F 0000 0000" - $"0000 0000 0000 0000 0006 0000 FFFF FFFF" - $"FFFF 0001 CCCC CCCC CCCC 0002 8888 8888" - $"8888 0003 FFFF FFFF 0000 0004 DDDD 0000" - $"0000 0005 FFFF 6666 3333 000F 0000 0000" - $"0000" -}; - -data 'crsr' (3059, "shuttle") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0020 0070 00F8 01DE 05DE 09DE" - $"11DE 11DE 11DE 11DE 31DE 71DE FDDE 1888" - $"0078 0030 0020 0070 00F8 01FE 07FE 0FFE" - $"1FFE 1FFE 1FFE 1FFE 3FFE 7FFE FFFE 18F8" - $"0078 0030 0000 000A 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0000 00F0 0000 0000 0000 0F3F" - $"0000 0000 0000 F343 F000 0000 000F 3404" - $"3FF0 0000 0F4F 3404 3FF0 0000 F55F 3404" - $"3FF0 000F 505F 3404 3FF0 000F 005F 3404" - $"3FF0 000F 005F 3404 3FF0 000F 005F 3404" - $"3FF0 00F3 005F 3404 3FF0 0F33 505F 3404" - $"3FF0 FFF3 3F4F 3404 3FF0 000F F000 1222" - $"1000 0000 0000 0111 1000 0000 0000 0011" - $"0000 0000 0000 0000 0006 0000 FFFF FFFF" - $"FFFF 0001 FFFF 6666 3333 0002 DDDD 0000" - $"0000 0003 4444 4444 4444 0004 8888 8888" - $"8888 0005 DDDD DDDD DDDD 000F 0000 0000" - $"0000" -}; - -data 'crsr' (3062, "spraycan") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0018 0040 0D18 1E40 1A18 3F00" - $"2100 3900 2900 3900 2900 3900 3900 2100" - $"2100 3F00 0000 0000 0C00 1E00 1E00 3F00" - $"3F00 3F00 3F00 3F00 3F00 3F00 3F00 3F00" - $"3F00 3F00 0002 0007 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0000 0005 2000 0000 0000 0460" - $"0000 0000 FF1F 6005 2000 000F 33F0 0460" - $"0000 000F 10F0 0005 2000 00FF FFFF 0000" - $"0000 00F8 170F 0000 0000 00F5 F70F 0000" - $"0000 00FA F70F 0000 0000 00F9 F70F 0000" - $"0000 00FA F70F 0000 0000 00F9 F70F 0000" - $"0000 00F5 F70F 0000 0000 00F8 170F 0000" - $"0000 00F8 170F 0000 0000 00FF FFFF 0000" - $"0000 0000 0000 0000 000B 0000 FFFF FFFF" - $"FFFF 0001 AAAA AAAA AAAA 0002 7777 7777" - $"7777 0003 5555 5555 5555 0004 2222 2222" - $"2222 0005 4444 4444 4444 0006 BBBB BBBB" - $"BBBB 0007 DDDD DDDD DDDD 0008 EEEE EEEE" - $"EEEE 0009 6666 6666 CCCC 000A CCCC CCCC" - $"FFFF 000F 0000 0000 0000" -}; - -data 'crsr' (3063, "star") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0100 0280 0280 0280 0440 0440" - $"0440 3938 C006 3838 0920 1290 2448 2828" - $"3018 2008 0100 0380 0380 0380 07C0 07C0" - $"07C0 3FF8 FFFE 3FF8 0FE0 1EF0 3C78 3838" - $"3018 2008 0007 0007 0000 0000 0000 0000" - $"0000 0000 8004 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0002 0001 0002 0000 0000 0000 00D2 0000" - $"0000 0003 0000 000D C000 000D C000 000D" - $"C000 0035 7000 0035 7000 0035 7000 0FD7" - $"5FC0 F555 557C 0FD5 5FC0 00D7 5C00 035C" - $"D700 0D70 35C0 0DC0 0DC0 0F00 03C0 0C00" - $"00C0 0000 0000 0000 0002 0000 FFFF FFFF" - $"FFFF 0001 FFFF FFFF 0000 0003 0000 0000" - $"0000" -}; - -data 'crsr' (3071, "trek") { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 0100 0000 0380 07C0 0FE0 0EE0" - $"0FE0 07C0 0380 0100 0BA0 0D60 0920 0820" - $"0820 0000 0000 0380 07C0 0FE0 1FF0 1FF0" - $"1FF0 0FE0 07C0 0BA0 1FF0 1FF0 1FF0 1D70" - $"1C70 0820 0000 0007 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0005 0000 0000 0000 0005 0000" - $"0000 0000 00FF F000 0000 0000 0F31 3F00" - $"0000 0000 F322 23F0 0000 0000 F110 11F0" - $"0000 0000 F311 13F0 0000 0000 0F31 3F00" - $"0000 0000 00FF F000 0000 0000 000F 0000" - $"0000 0000 F0FF F0F0 0000 0000 FF0F 0FF0" - $"0000 0000 400F 0040 0000 0000 4000 0040" - $"0000 0000 4000 0040 0000 0000 0000 0000" - $"0000 0000 0000 0000 0006 0000 FFFF FFFF" - $"FFFF 0001 EEEE EEEE EEEE 0002 9999 9999" - $"FFFF 0003 DDDD DDDD DDDD 0004 3333 3333" - $"6666 0005 DDDD 0000 0000 000F 0000 0000" - $"0000" -}; - -data 'crsr' (3075, "watch", purgeable) { - $"8001 0000 0060 0000 0092 0000 0000 0000" - $"0000 0000 07E0 07E0 07E0 07E0 0810 1088" - $"1088 108C 138C 1008 1008 0810 07E0 07E0" - $"07E0 07E0 07E0 07E0 07E0 07E0 0FF0 1FF8" - $"1FF8 1FF8 1FF8 1FF8 1FF8 0FF0 07E0 07E0" - $"07E0 07E0 0008 000D 0000 0000 0000 0000" - $"0000 0000 8008 0000 0000 0010 0010 0000" - $"0000 0000 0000 0048 0000 0048 0000 0000" - $"0004 0001 0004 0000 0000 0000 0112 0000" - $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0" - $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0" - $"0000 0000 F020 202F 0000 000F 0222 F221" - $"F000 000F 2222 F123 F000 000F 0222 F121" - $"FF00 000F 22FF F123 FF00 000F 0222 2221" - $"F000 000F 2222 2213 F000 0000 F131 313F" - $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0" - $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0" - $"0000 0000 0000 0000 0004 0000 FFFF FFFF" - $"FFFF 0001 CCCC CCCC CCCC 0002 EEEE EEEE" - $"EEEE 0003 BBBB BBBB BBBB 000F 0000 0000" - $"0000" -}; - diff --git a/mac/tkMacXStubs.c b/mac/tkMacXStubs.c deleted file mode 100644 index e49d622..0000000 --- a/mac/tkMacXStubs.c +++ /dev/null @@ -1,877 +0,0 @@ -/* - * tkMacXStubs.c -- - * - * This file contains most of the X calls called by Tk. Many of - * these calls are just stubs and either don't make sense on the - * Macintosh or thier implamentation just doesn't do anything. Other - * calls will eventually be moved into other files. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacXStubs.c,v 1.16.2.1 2004/05/03 22:23:09 hobbs Exp $ - */ - -#include "tkInt.h" -#include <X.h> -#include <Xlib.h> -#include <stdio.h> -#include <tcl.h> - -#include <Xatom.h> - -#include <Windows.h> -#include <Fonts.h> -#include <QDOffscreen.h> -#include <ToolUtils.h> -#include <Sound.h> -#include "tkMacInt.h" -#include "tkPort.h" - -/* - * Because this file is still under major development Debugger statements are - * used through out this file. The define TCL_DEBUG will decide whether - * the debugger statements actually call the debugger or not. - */ - -#ifndef TCL_DEBUG -# define Debugger() -#endif - -#define ROOT_ID 10 - -/* - * Declarations of static variables used in this file. - */ - -static TkDisplay *gMacDisplay = NULL; /* Macintosh display. */ -static char *macScreenName = ":0"; - /* Default name of macintosh display. */ - -/* - * Forward declarations of procedures used in this file. - */ - -static XID MacXIdAlloc _ANSI_ARGS_((Display *display)); -static int DefaultErrorHandler _ANSI_ARGS_((Display* display, - XErrorEvent* err_evt)); - -/* - * Other declrations - */ - -int TkMacXDestroyImage _ANSI_ARGS_((XImage *image)); -unsigned long TkMacXGetPixel _ANSI_ARGS_((XImage *image, int x, int y)); -int TkMacXPutPixel _ANSI_ARGS_((XImage *image, int x, int y, - unsigned long pixel)); -XImage *TkMacXSubImage _ANSI_ARGS_((XImage *image, int x, int y, - unsigned int width, unsigned int height)); -int TkMacXAddPixel _ANSI_ARGS_((XImage *image, long value)); -int _XInitImageFuncPtrs _ANSI_ARGS_((XImage *image)); - -/* - *---------------------------------------------------------------------- - * - * TkpOpenDisplay -- - * - * Create the Display structure and fill it with device - * specific information. - * - * Results: - * Returns a Display structure on success or NULL on failure. - * - * Side effects: - * Allocates a new Display structure. - * - *---------------------------------------------------------------------- - */ - -TkDisplay * -TkpOpenDisplay( - CONST char *display_name) -{ - Display *display; - Screen *screen; - GDHandle graphicsDevice; - - if (gMacDisplay != NULL) { - if (strcmp(gMacDisplay->display->display_name, display_name) == 0) { - return gMacDisplay; - } else { - return NULL; - } - } - - graphicsDevice = GetMainDevice(); - display = (Display *) ckalloc(sizeof(Display)); - memset(display, 0, sizeof(Display)); - display->resource_alloc = MacXIdAlloc; - screen = (Screen *) ckalloc(sizeof(Screen) * 2); - display->default_screen = 0; - display->request = 0; - display->nscreens = 1; - display->screens = screen; - display->display_name = macScreenName; - display->qlen = 0; - - screen->root = ROOT_ID; - screen->display = display; - screen->root_depth = (*(*graphicsDevice)->gdPMap)->cmpSize * - (*(*graphicsDevice)->gdPMap)->cmpCount; - screen->height = (*graphicsDevice)->gdRect.bottom - - (*graphicsDevice)->gdRect.top; - screen->width = (*graphicsDevice)->gdRect.right - - (*graphicsDevice)->gdRect.left; - - screen->mwidth = (screen->width * 254 + 360) / 720; - screen->mheight = (screen->height * 254 + 360) / 720; - screen->black_pixel = 0x00000000; - screen->white_pixel = 0x00FFFFFF; - screen->root_visual = (Visual *) ckalloc(sizeof(Visual)); - screen->root_visual->visualid = 0; - screen->root_visual->class = TrueColor; - screen->root_visual->red_mask = 0x00FF0000; - screen->root_visual->green_mask = 0x0000FF00; - screen->root_visual->blue_mask = 0x000000FF; - screen->root_visual->bits_per_rgb = 24; - screen->root_visual->map_entries = 2 ^ 8; - - gMacDisplay = (TkDisplay *) ckalloc(sizeof(TkDisplay)); - memset(gMacDisplay, 0, sizeof(TkDisplay)); - gMacDisplay->display = display; - return gMacDisplay; -} - -/* - *---------------------------------------------------------------------- - * - * TkpCloseDisplay -- - * - * Deallocates a display structure created by TkpOpenDisplay. - * - * Results: - * None. - * - * Side effects: - * Frees memory. - * - *---------------------------------------------------------------------- - */ - -void -TkpCloseDisplay( - TkDisplay *displayPtr) -{ - Display *display = displayPtr->display; - if (gMacDisplay != displayPtr) { - panic("TkpCloseDisplay: tried to call TkpCloseDisplay on bad display"); - } - - gMacDisplay = NULL; - if (display->screens != (Screen *) NULL) { - if (display->screens->root_visual != (Visual *) NULL) { - ckfree((char *) display->screens->root_visual); - } - ckfree((char *) display->screens); - } - ckfree((char *) display); -} - -/* - *---------------------------------------------------------------------- - * - * TkClipCleanup -- - * - * This procedure is called to cleanup resources associated with - * claiming clipboard ownership and for receiving selection get - * results. This function is called in tkWindow.c. This has to be - * called by the display cleanup function because we still need the - * access display elements. - * - * Results: - * None. - * - * Side effects: - * Resources are freed - the clipboard may no longer be used. - * - *---------------------------------------------------------------------- - */ - -void -TkClipCleanup(dispPtr) - TkDisplay *dispPtr; /* display associated with clipboard */ -{ - /* - * Make sure that the local scrap is transfered to the global - * scrap if needed. - */ - - TkSuspendClipboard(); - - if (dispPtr->clipWindow != NULL) { - Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom, - dispPtr->applicationAtom); - Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom, - dispPtr->windowAtom); - - Tk_DestroyWindow(dispPtr->clipWindow); - Tcl_Release((ClientData) dispPtr->clipWindow); - dispPtr->clipWindow = NULL; - } -} - -/* - *---------------------------------------------------------------------- - * - * MacXIdAlloc -- - * - * This procedure is invoked by Xlib as the resource allocator - * for a display. - * - * Results: - * The return value is an X resource identifier that isn't currently - * in use. - * - * Side effects: - * The identifier is removed from the stack of free identifiers, - * if it was previously on the stack. - * - *---------------------------------------------------------------------- - */ - -static XID -MacXIdAlloc( - Display *display) /* Display for which to allocate. */ -{ - static long int cur_id = 100; - /* - * Some special XIds are reserved - * - this is why we start at 100 - */ - - return ++cur_id; -} - -/* - *---------------------------------------------------------------------- - * - * TkpWindowWasRecentlyDeleted -- - * - * Tries to determine whether the given window was recently deleted. - * Called from the generic code error handler to attempt to deal with - * async BadWindow errors under some circumstances. - * - * Results: - * Always 0, we do not keep this information on the Mac, so we do not - * know whether the window was destroyed. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TkpWindowWasRecentlyDeleted( - Window win, - TkDisplay *dispPtr) -{ - return 0; -} - -/* - *---------------------------------------------------------------------- - * - * DefaultErrorHandler -- - * - * This procedure is the default X error handler. Tk uses it's - * own error handler so this call should never be called. - * - * Results: - * None. - * - * Side effects: - * This function will call panic and exit. - * - *---------------------------------------------------------------------- - */ - -static int -DefaultErrorHandler( - Display* display, - XErrorEvent* err_evt) -{ - /* - * This call should never be called. Tk replaces - * it with its own error handler. - */ - panic("Warning hit bogus error handler!"); - return 0; -} - - -char * -XGetAtomName( - Display * display, - Atom atom) -{ - display->request++; - return NULL; -} - -int -_XInitImageFuncPtrs(XImage *image) -{ - return 0; -} - -XErrorHandler -XSetErrorHandler( - XErrorHandler handler) -{ - return DefaultErrorHandler; -} - -Window -XRootWindow(Display *display, int screen_number) -{ - display->request++; - return ROOT_ID; -} - -XImage * -XGetImage(display, d, x, y, width, height, plane_mask, format) - Display *display; - Drawable d; - int x; - int y; - unsigned int width; - unsigned int height; - unsigned long plane_mask; - int format; -{ - Debugger(); - return NULL; -} - -int -XGetGeometry(display, d, root_return, x_return, y_return, width_return, - height_return, border_width_return, depth_return) - Display* display; - Drawable d; - Window* root_return; - int* x_return; - int* y_return; - unsigned int* width_return; - unsigned int* height_return; - unsigned int* border_width_return; - unsigned int* depth_return; -{ - /* Used in tkCanvPs.c & wm code */ - Debugger(); - return 0; -} - -void -XChangeProperty( - Display* display, - Window w, - Atom property, - Atom type, - int format, - int mode, - _Xconst unsigned char* data, - int nelements) -{ - Debugger(); -} - -void -XSelectInput( - Display* display, - Window w, - long event_mask) -{ - Debugger(); -} - -void -XBell( - Display* display, - int percent) -{ - SysBeep(percent); -} - -void -XSetWMNormalHints( - Display* display, - Window w, - XSizeHints* hints) -{ - /* - * Do nothing. Shouldn't even be called. - */ -} - -XSizeHints * -XAllocSizeHints() -{ - /* - * Always return NULL. Tk code checks to see if NULL - * is returned & does nothing if it is. - */ - - return NULL; -} - -XImage * -XCreateImage( - Display* display, - Visual* visual, - unsigned int depth, - int format, - int offset, - char* data, - unsigned int width, - unsigned int height, - int bitmap_pad, - int bytes_per_line) -{ - XImage *ximage; - - display->request++; - ximage = (XImage *) ckalloc(sizeof(XImage)); - - ximage->height = height; - ximage->width = width; - ximage->depth = depth; - ximage->xoffset = offset; - ximage->format = format; - ximage->data = data; - ximage->bitmap_pad = bitmap_pad; - if (bytes_per_line == 0) { - ximage->bytes_per_line = width * 4; /* assuming 32 bits per pixel */ - } else { - ximage->bytes_per_line = bytes_per_line; - } - - if (format == ZPixmap) { - ximage->bits_per_pixel = 32; - ximage->bitmap_unit = 32; - } else { - ximage->bits_per_pixel = 1; - ximage->bitmap_unit = 8; - } - ximage->byte_order = LSBFirst; - ximage->bitmap_bit_order = LSBFirst; - ximage->red_mask = 0x00FF0000; - ximage->green_mask = 0x0000FF00; - ximage->blue_mask = 0x000000FF; - - ximage->f.destroy_image = TkMacXDestroyImage; - ximage->f.get_pixel = TkMacXGetPixel; - ximage->f.put_pixel = TkMacXPutPixel; - ximage->f.sub_image = TkMacXSubImage; - ximage->f.add_pixel = TkMacXAddPixel; - - return ximage; -} - -GContext -XGContextFromGC( - GC gc) -{ - /* TODO - currently a no-op */ - return 0; -} - -Status -XSendEvent( - Display* display, - Window w, - Bool propagate, - long event_mask, - XEvent* event_send) -{ - Debugger(); - return 0; -} - -void -XClearWindow( - Display* display, - Window w) -{ -} - -/* -void -XDrawPoint( - Display* display, - Drawable d, - GC gc, - int x, - int y) -{ -} - -void -XDrawPoints( - Display* display, - Drawable d, - GC gc, - XPoint* points, - int npoints, - int mode) -{ -} -*/ - -void -XWarpPointer( - Display* display, - Window src_w, - Window dest_w, - int src_x, - int src_y, - unsigned int src_width, - unsigned int src_height, - int dest_x, - int dest_y) -{ -} - -void -XQueryColor( - Display* display, - Colormap colormap, - XColor* def_in_out) -{ -} - -void -XQueryColors( - Display* display, - Colormap colormap, - XColor* defs_in_out, - int ncolors) -{ -} - -int -XQueryTree(display, w, root_return, parent_return, children_return, - nchildren_return) - Display* display; - Window w; - Window* root_return; - Window* parent_return; - Window** children_return; - unsigned int* nchildren_return; -{ - return 0; -} - -int -XGetWindowProperty( - Display *display, - Window w, - Atom property, - long long_offset, - long long_length, - Bool delete, - Atom req_type, - Atom *actual_type_return, - int *actual_format_return, - unsigned long *nitems_return, - unsigned long *bytes_after_return, - unsigned char ** prop_return) -{ - display->request++; - *actual_type_return = None; - *actual_format_return = *bytes_after_return = 0; - *nitems_return = 0; - return 0; -} - -void -XRefreshKeyboardMapping() -{ - /* used by tkXEvent.c */ - Debugger(); -} - -void -XSetIconName( - Display* display, - Window w, - const char *icon_name) -{ - /* - * This is a no-op, no icon name for Macs. - */ - display->request++; -} - -void -XForceScreenSaver( - Display* display, - int mode) -{ - /* - * This function is just a no-op. It is defined to - * reset the screen saver. However, there is no real - * way to do this on a Mac. Let me know if there is! - */ - display->request++; -} - -void -Tk_FreeXId ( - Display *display, - XID xid) -{ - /* no-op function needed for stubs implementation. */ -} - -/* - *---------------------------------------------------------------------- - * - * TkGetServerInfo -- - * - * Given a window, this procedure returns information about - * the window server for that window. This procedure provides - * the guts of the "winfo server" command. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -TkGetServerInfo( - Tcl_Interp *interp, /* The server information is returned in - * this interpreter's result. */ - Tk_Window tkwin) /* Token for window; this selects a - * particular display and server. */ -{ - char buffer[8 + TCL_INTEGER_SPACE * 2]; - char buffer2[TCL_INTEGER_SPACE]; - - sprintf(buffer, "X%dR%d ", ProtocolVersion(Tk_Display(tkwin)), - ProtocolRevision(Tk_Display(tkwin))); - sprintf(buffer2, " %d", VendorRelease(Tk_Display(tkwin))); - Tcl_AppendResult(interp, buffer, ServerVendor(Tk_Display(tkwin)), - buffer2, (char *) NULL); -} -/* - * Image stuff - */ - -int -TkMacXDestroyImage( - XImage *image) -{ - Debugger(); - return 0; -} - -unsigned long -TkMacXGetPixel( - XImage *image, - int x, - int y) -{ - Debugger(); - return 0; -} - -int -TkMacXPutPixel( - XImage *image, - int x, - int y, - unsigned long pixel) -{ - /* Debugger(); */ - return 0; -} - -XImage * -TkMacXSubImage( - XImage *image, - int x, - int y, - unsigned int width, - unsigned int height) -{ - Debugger(); - return NULL; -} - -int -TkMacXAddPixel( - XImage *image, - long value) -{ - Debugger(); - return 0; -} - -/* - *---------------------------------------------------------------------- - * - * XChangeWindowAttributes, XSetWindowBackground, - * XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap, - * XSetWindowBorderWidth, XSetWindowColormap - * - * These functions are all no-ops. They all have equivilent - * Tk calls that should always be used instead. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -void -XChangeWindowAttributes( - Display* display, - Window w, - unsigned long value_mask, - XSetWindowAttributes* attributes) -{ -} - -void -XSetWindowBackground( - Display *display, - Window window, - unsigned long value) -{ -} - -void -XSetWindowBackgroundPixmap( - Display* display, - Window w, - Pixmap background_pixmap) -{ -} - -void -XSetWindowBorder( - Display* display, - Window w, - unsigned long border_pixel) -{ -} - -void -XSetWindowBorderPixmap( - Display* display, - Window w, - Pixmap border_pixmap) -{ -} - -void -XSetWindowBorderWidth( - Display* display, - Window w, - unsigned int width) -{ -} - -void -XSetWindowColormap( - Display* display, - Window w, - Colormap colormap) -{ - Debugger(); -} - -Status -XStringListToTextProperty( - char** list, - int count, - XTextProperty* text_prop_return) -{ - Debugger(); - return (Status) 0; -} -void -XSetWMClientMachine( - Display* display, - Window w, - XTextProperty* text_prop) -{ - Debugger(); -} -XIC -XCreateIC( - void) -{ - Debugger(); - return (XIC) 0; -} - -/* - *---------------------------------------------------------------------- - * - * TkGetDefaultScreenName -- - * - * Returns the name of the screen that Tk should use during - * initialization. - * - * Results: - * Returns a statically allocated string. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -CONST char * -TkGetDefaultScreenName( - Tcl_Interp *interp, /* Not used. */ - CONST char *screenName) /* If NULL, use default string. */ -{ - if ((screenName == NULL) || (screenName[0] == '\0')) { - screenName = macScreenName; - } - return screenName; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_SetCaretPos -- - * - * This indicates the cursor position to Tk. - * This is currently a noop stub for MacX. - * - *---------------------------------------------------------------------- - */ - -void -Tk_SetCaretPos(Tk_Window tkwin, int x, int y, int height) -{ - TkCaret *caretPtr = &(((TkWindow *) tkwin)->dispPtr->caret); - - caretPtr->winPtr = ((TkWindow *) tkwin); - caretPtr->x = x; - caretPtr->y = y; - caretPtr->height = height; -} diff --git a/mac/widget.r b/mac/widget.r deleted file mode 100644 index d28cadc..0000000 --- a/mac/widget.r +++ /dev/null @@ -1,18 +0,0 @@ -/* - * widget.r -- - * - */ - -type 'TEXT' -{ - string; -}; - -#define TK_LIBRARY_RESOURCES 3000 - -resource 'TEXT' (TK_LIBRARY_RESOURCES+114, "tclshrc", purgeable) -{ -"# read widgets demo script\n" -"console hide\n" -"source [file join $tk_library demos widget]\n" -};
\ No newline at end of file |